protocol.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package shadowsocks
  2. import (
  3. "io"
  4. "github.com/v2ray/v2ray-core/common/alloc"
  5. "github.com/v2ray/v2ray-core/common/log"
  6. v2net "github.com/v2ray/v2ray-core/common/net"
  7. "github.com/v2ray/v2ray-core/transport"
  8. )
  9. const (
  10. AddrTypeIPv4 = 1
  11. AddrTypeIPv6 = 4
  12. AddrTypeDomain = 3
  13. )
  14. type Request struct {
  15. Address v2net.Address
  16. Port v2net.Port
  17. OTA bool
  18. }
  19. func ReadRequest(reader io.Reader) (*Request, error) {
  20. buffer := alloc.NewSmallBuffer()
  21. defer buffer.Release()
  22. _, err := io.ReadFull(reader, buffer.Value[:1])
  23. if err != nil {
  24. log.Error("Shadowsocks: Failed to read address type: ", err)
  25. return nil, transport.CorruptedPacket
  26. }
  27. request := new(Request)
  28. addrType := (buffer.Value[0] & 0x0F)
  29. if (buffer.Value[0] & 0x10) == 0x10 {
  30. request.OTA = true
  31. }
  32. switch addrType {
  33. case AddrTypeIPv4:
  34. _, err := io.ReadFull(reader, buffer.Value[:4])
  35. if err != nil {
  36. log.Error("Shadowsocks: Failed to read IPv4 address: ", err)
  37. return nil, transport.CorruptedPacket
  38. }
  39. request.Address = v2net.IPAddress(buffer.Value[:4])
  40. case AddrTypeIPv6:
  41. _, err := io.ReadFull(reader, buffer.Value[:16])
  42. if err != nil {
  43. log.Error("Shadowsocks: Failed to read IPv6 address: ", err)
  44. return nil, transport.CorruptedPacket
  45. }
  46. request.Address = v2net.IPAddress(buffer.Value[:16])
  47. case AddrTypeDomain:
  48. _, err := io.ReadFull(reader, buffer.Value[:1])
  49. if err != nil {
  50. log.Error("Shadowsocks: Failed to read domain lenth: ", err)
  51. return nil, transport.CorruptedPacket
  52. }
  53. domainLength := int(buffer.Value[0])
  54. _, err = io.ReadFull(reader, buffer.Value[:domainLength])
  55. if err != nil {
  56. log.Error("Shadowsocks: Failed to read domain: ", err)
  57. return nil, transport.CorruptedPacket
  58. }
  59. request.Address = v2net.DomainAddress(string(buffer.Value[:domainLength]))
  60. default:
  61. log.Error("Shadowsocks: Unknown address type: ", addrType)
  62. return nil, transport.CorruptedPacket
  63. }
  64. _, err = io.ReadFull(reader, buffer.Value[:2])
  65. if err != nil {
  66. log.Error("Shadowsocks: Failed to read port: ", err)
  67. return nil, transport.CorruptedPacket
  68. }
  69. request.Port = v2net.PortFromBytes(buffer.Value[:2])
  70. return request, nil
  71. }