netpackager.go 9.5 KB

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