netpackager.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. package common
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "encoding/json"
  6. "errors"
  7. "io"
  8. "io/ioutil"
  9. "net"
  10. "strconv"
  11. "strings"
  12. )
  13. type NetPackager interface {
  14. Pack(writer io.Writer) (err error)
  15. UnPack(reader io.Reader) (err error)
  16. }
  17. type BasePackager struct {
  18. Length uint16
  19. Content []byte
  20. }
  21. func (Self *BasePackager) NewPac(contents ...interface{}) (err error) {
  22. Self.clean()
  23. for _, content := range contents {
  24. switch content.(type) {
  25. case nil:
  26. Self.Content = Self.Content[:0]
  27. case []byte:
  28. err = Self.appendByte(content.([]byte))
  29. case string:
  30. err = Self.appendByte([]byte(content.(string)))
  31. if err != nil {
  32. return
  33. }
  34. err = Self.appendByte([]byte(CONN_DATA_SEQ))
  35. default:
  36. err = Self.marshal(content)
  37. }
  38. }
  39. Self.setLength()
  40. if Self.Length > MAXIMUM_SEGMENT_SIZE {
  41. err = errors.New("mux:packer: newpack content segment too large")
  42. }
  43. return
  44. }
  45. func (Self *BasePackager) appendByte(data []byte) (err error) {
  46. m := len(Self.Content)
  47. n := m + len(data)
  48. if n <= cap(Self.Content) {
  49. Self.Content = Self.Content[0:n] // grow the length for copy
  50. copy(Self.Content[m:n], data)
  51. return nil
  52. } else {
  53. return errors.New("pack content too large")
  54. }
  55. }
  56. //似乎这里涉及到父类作用域问题,当子类调用父类的方法时,其struct仅仅为父类的
  57. func (Self *BasePackager) Pack(writer io.Writer) (err error) {
  58. err = binary.Write(writer, binary.LittleEndian, Self.Length)
  59. if err != nil {
  60. return
  61. }
  62. err = binary.Write(writer, binary.LittleEndian, Self.Content)
  63. return
  64. }
  65. //Unpack 会导致传入的数字类型转化成float64!!
  66. //主要原因是json unmarshal并未传入正确的数据类型
  67. func (Self *BasePackager) UnPack(reader io.Reader) (n uint16, err error) {
  68. Self.clean()
  69. n += 2 // uint16
  70. err = binary.Read(reader, binary.LittleEndian, &Self.Length)
  71. if err != nil {
  72. return
  73. }
  74. if int(Self.Length) > cap(Self.Content) {
  75. err = errors.New("unpack err, content length too large")
  76. return
  77. }
  78. if Self.Length > MAXIMUM_SEGMENT_SIZE {
  79. err = errors.New("mux:packer: unpack content segment too large")
  80. return
  81. }
  82. Self.Content = Self.Content[:int(Self.Length)]
  83. //n, err := io.ReadFull(reader, Self.Content)
  84. //if n != int(Self.Length) {
  85. // err = io.ErrUnexpectedEOF
  86. //}
  87. err = binary.Read(reader, binary.LittleEndian, Self.Content)
  88. n += Self.Length
  89. return
  90. }
  91. func (Self *BasePackager) marshal(content interface{}) (err error) {
  92. tmp, err := json.Marshal(content)
  93. if err != nil {
  94. return err
  95. }
  96. err = Self.appendByte(tmp)
  97. return
  98. }
  99. func (Self *BasePackager) Unmarshal(content interface{}) (err error) {
  100. err = json.Unmarshal(Self.Content, content)
  101. if err != nil {
  102. return err
  103. }
  104. return
  105. }
  106. func (Self *BasePackager) setLength() {
  107. Self.Length = uint16(len(Self.Content))
  108. return
  109. }
  110. func (Self *BasePackager) clean() {
  111. Self.Length = 0
  112. Self.Content = Self.Content[:0] // reset length
  113. }
  114. func (Self *BasePackager) Split() (strList []string) {
  115. n := bytes.IndexByte(Self.Content, 0)
  116. strList = strings.Split(string(Self.Content[:n]), CONN_DATA_SEQ)
  117. strList = strList[0 : len(strList)-1]
  118. return
  119. }
  120. type ConnPackager struct {
  121. // Todo
  122. ConnType uint8
  123. BasePackager
  124. }
  125. func (Self *ConnPackager) NewPac(connType uint8, content ...interface{}) (err error) {
  126. Self.ConnType = connType
  127. err = Self.BasePackager.NewPac(content...)
  128. return
  129. }
  130. func (Self *ConnPackager) Pack(writer io.Writer) (err error) {
  131. err = binary.Write(writer, binary.LittleEndian, Self.ConnType)
  132. if err != nil {
  133. return
  134. }
  135. err = Self.BasePackager.Pack(writer)
  136. return
  137. }
  138. func (Self *ConnPackager) UnPack(reader io.Reader) (n uint16, err error) {
  139. err = binary.Read(reader, binary.LittleEndian, &Self.ConnType)
  140. if err != nil && err != io.EOF {
  141. return
  142. }
  143. n, err = Self.BasePackager.UnPack(reader)
  144. n += 2
  145. return
  146. }
  147. type MuxPackager struct {
  148. Flag uint8
  149. Id int32
  150. Window uint32
  151. ReadLength uint32
  152. BasePackager
  153. }
  154. func (Self *MuxPackager) NewPac(flag uint8, id int32, content ...interface{}) (err error) {
  155. Self.Flag = flag
  156. Self.Id = id
  157. switch flag {
  158. case MUX_PING_FLAG, MUX_PING_RETURN, MUX_NEW_MSG, MUX_NEW_MSG_PART:
  159. Self.Content = WindowBuff.Get()
  160. err = Self.BasePackager.NewPac(content...)
  161. //logs.Warn(Self.Length, string(Self.Content))
  162. case MUX_MSG_SEND_OK:
  163. // MUX_MSG_SEND_OK contains two data
  164. switch content[0].(type) {
  165. case int:
  166. Self.Window = uint32(content[0].(int))
  167. case uint32:
  168. Self.Window = content[0].(uint32)
  169. }
  170. switch content[1].(type) {
  171. case int:
  172. Self.ReadLength = uint32(content[1].(int))
  173. case uint32:
  174. Self.ReadLength = content[1].(uint32)
  175. }
  176. }
  177. return
  178. }
  179. func (Self *MuxPackager) Pack(writer io.Writer) (err error) {
  180. err = binary.Write(writer, binary.LittleEndian, Self.Flag)
  181. if err != nil {
  182. return
  183. }
  184. err = binary.Write(writer, binary.LittleEndian, Self.Id)
  185. if err != nil {
  186. return
  187. }
  188. switch Self.Flag {
  189. case MUX_NEW_MSG, MUX_NEW_MSG_PART, MUX_PING_FLAG, MUX_PING_RETURN:
  190. err = Self.BasePackager.Pack(writer)
  191. WindowBuff.Put(Self.Content)
  192. case MUX_MSG_SEND_OK:
  193. err = binary.Write(writer, binary.LittleEndian, Self.Window)
  194. if err != nil {
  195. return
  196. }
  197. err = binary.Write(writer, binary.LittleEndian, Self.ReadLength)
  198. }
  199. return
  200. }
  201. func (Self *MuxPackager) UnPack(reader io.Reader) (n uint16, err error) {
  202. err = binary.Read(reader, binary.LittleEndian, &Self.Flag)
  203. if err != nil {
  204. return
  205. }
  206. err = binary.Read(reader, binary.LittleEndian, &Self.Id)
  207. if err != nil {
  208. return
  209. }
  210. switch Self.Flag {
  211. case MUX_NEW_MSG, MUX_NEW_MSG_PART, MUX_PING_FLAG, MUX_PING_RETURN:
  212. Self.Content = WindowBuff.Get() // need get a window buf from pool
  213. Self.BasePackager.clean() // also clean the content
  214. n, err = Self.BasePackager.UnPack(reader)
  215. //logs.Warn("unpack", Self.Length, string(Self.Content))
  216. case MUX_MSG_SEND_OK:
  217. err = binary.Read(reader, binary.LittleEndian, &Self.Window)
  218. if err != nil {
  219. return
  220. }
  221. n += 4 // uint32
  222. err = binary.Read(reader, binary.LittleEndian, &Self.ReadLength)
  223. n += 4 // uint32
  224. }
  225. n += 5 //uint8 int32
  226. return
  227. }
  228. func (Self *MuxPackager) reset() {
  229. Self.Id = 0
  230. Self.Flag = 0
  231. Self.Length = 0
  232. Self.Content = nil
  233. Self.ReadLength = 0
  234. Self.Window = 0
  235. }
  236. const (
  237. ipV4 = 1
  238. domainName = 3
  239. ipV6 = 4
  240. )
  241. type UDPHeader struct {
  242. Rsv uint16
  243. Frag uint8
  244. Addr *Addr
  245. }
  246. func NewUDPHeader(rsv uint16, frag uint8, addr *Addr) *UDPHeader {
  247. return &UDPHeader{
  248. Rsv: rsv,
  249. Frag: frag,
  250. Addr: addr,
  251. }
  252. }
  253. type Addr struct {
  254. Type uint8
  255. Host string
  256. Port uint16
  257. }
  258. func (addr *Addr) String() string {
  259. return net.JoinHostPort(addr.Host, strconv.Itoa(int(addr.Port)))
  260. }
  261. func (addr *Addr) Decode(b []byte) error {
  262. addr.Type = b[0]
  263. pos := 1
  264. switch addr.Type {
  265. case ipV4:
  266. addr.Host = net.IP(b[pos : pos+net.IPv4len]).String()
  267. pos += net.IPv4len
  268. case ipV6:
  269. addr.Host = net.IP(b[pos : pos+net.IPv6len]).String()
  270. pos += net.IPv6len
  271. case domainName:
  272. addrlen := int(b[pos])
  273. pos++
  274. addr.Host = string(b[pos : pos+addrlen])
  275. pos += addrlen
  276. default:
  277. return errors.New("decode error")
  278. }
  279. addr.Port = binary.BigEndian.Uint16(b[pos:])
  280. return nil
  281. }
  282. func (addr *Addr) Encode(b []byte) (int, error) {
  283. b[0] = addr.Type
  284. pos := 1
  285. switch addr.Type {
  286. case ipV4:
  287. ip4 := net.ParseIP(addr.Host).To4()
  288. if ip4 == nil {
  289. ip4 = net.IPv4zero.To4()
  290. }
  291. pos += copy(b[pos:], ip4)
  292. case domainName:
  293. b[pos] = byte(len(addr.Host))
  294. pos++
  295. pos += copy(b[pos:], []byte(addr.Host))
  296. case ipV6:
  297. ip16 := net.ParseIP(addr.Host).To16()
  298. if ip16 == nil {
  299. ip16 = net.IPv6zero.To16()
  300. }
  301. pos += copy(b[pos:], ip16)
  302. default:
  303. b[0] = ipV4
  304. copy(b[pos:pos+4], net.IPv4zero.To4())
  305. pos += 4
  306. }
  307. binary.BigEndian.PutUint16(b[pos:], addr.Port)
  308. pos += 2
  309. return pos, nil
  310. }
  311. func (h *UDPHeader) Write(w io.Writer) error {
  312. b := BufPoolUdp.Get().([]byte)
  313. defer BufPoolUdp.Put(b)
  314. binary.BigEndian.PutUint16(b[:2], h.Rsv)
  315. b[2] = h.Frag
  316. addr := h.Addr
  317. if addr == nil {
  318. addr = &Addr{}
  319. }
  320. length, _ := addr.Encode(b[3:])
  321. _, err := w.Write(b[:3+length])
  322. return err
  323. }
  324. type UDPDatagram struct {
  325. Header *UDPHeader
  326. Data []byte
  327. }
  328. func ReadUDPDatagram(r io.Reader) (*UDPDatagram, error) {
  329. b := BufPoolUdp.Get().([]byte)
  330. defer BufPoolUdp.Put(b)
  331. // when r is a streaming (such as TCP connection), we may read more than the required data,
  332. // but we don't know how to handle it. So we use io.ReadFull to instead of io.ReadAtLeast
  333. // to make sure that no redundant data will be discarded.
  334. n, err := io.ReadFull(r, b[:5])
  335. if err != nil {
  336. return nil, err
  337. }
  338. header := &UDPHeader{
  339. Rsv: binary.BigEndian.Uint16(b[:2]),
  340. Frag: b[2],
  341. }
  342. atype := b[3]
  343. hlen := 0
  344. switch atype {
  345. case ipV4:
  346. hlen = 10
  347. case ipV6:
  348. hlen = 22
  349. case domainName:
  350. hlen = 7 + int(b[4])
  351. default:
  352. return nil, errors.New("addr not support")
  353. }
  354. dlen := int(header.Rsv)
  355. if dlen == 0 { // standard SOCKS5 UDP datagram
  356. extra, err := ioutil.ReadAll(r) // we assume no redundant data
  357. if err != nil {
  358. return nil, err
  359. }
  360. copy(b[n:], extra)
  361. n += len(extra) // total length
  362. dlen = n - hlen // data length
  363. } else { // extended feature, for UDP over TCP, using reserved field as data length
  364. if _, err := io.ReadFull(r, b[n:hlen+dlen]); err != nil {
  365. return nil, err
  366. }
  367. n = hlen + dlen
  368. }
  369. header.Addr = new(Addr)
  370. if err := header.Addr.Decode(b[3:hlen]); err != nil {
  371. return nil, err
  372. }
  373. data := make([]byte, dlen)
  374. copy(data, b[hlen:n])
  375. d := &UDPDatagram{
  376. Header: header,
  377. Data: data,
  378. }
  379. return d, nil
  380. }
  381. func NewUDPDatagram(header *UDPHeader, data []byte) *UDPDatagram {
  382. return &UDPDatagram{
  383. Header: header,
  384. Data: data,
  385. }
  386. }
  387. func (d *UDPDatagram) Write(w io.Writer) error {
  388. h := d.Header
  389. if h == nil {
  390. h = &UDPHeader{}
  391. }
  392. buf := bytes.Buffer{}
  393. if err := h.Write(&buf); err != nil {
  394. return err
  395. }
  396. if _, err := buf.Write(d.Data); err != nil {
  397. return err
  398. }
  399. _, err := buf.WriteTo(w)
  400. return err
  401. }
  402. func ToSocksAddr(addr net.Addr) *Addr {
  403. host := "0.0.0.0"
  404. port := 0
  405. if addr != nil {
  406. h, p, _ := net.SplitHostPort(addr.String())
  407. host = h
  408. port, _ = strconv.Atoi(p)
  409. }
  410. return &Addr{
  411. Type: ipV4,
  412. Host: host,
  413. Port: uint16(port),
  414. }
  415. }