protocol.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. }
  18. func ReadRequest(reader io.Reader) (*Request, error) {
  19. buffer := alloc.NewSmallBuffer()
  20. defer buffer.Release()
  21. _, err := io.ReadFull(reader, buffer.Value[:1])
  22. if err != nil {
  23. log.Error("Shadowsocks: Failed to read address type: ", err)
  24. return nil, transport.CorruptedPacket
  25. }
  26. request := new(Request)
  27. addrType := buffer.Value[0]
  28. switch addrType {
  29. case AddrTypeIPv4:
  30. _, err := io.ReadFull(reader, buffer.Value[:4])
  31. if err != nil {
  32. log.Error("Shadowsocks: Failed to read IPv4 address: ", err)
  33. return nil, transport.CorruptedPacket
  34. }
  35. request.Address = v2net.IPAddress(buffer.Value[:4])
  36. case AddrTypeIPv6:
  37. _, err := io.ReadFull(reader, buffer.Value[:16])
  38. if err != nil {
  39. log.Error("Shadowsocks: Failed to read IPv6 address: ", err)
  40. return nil, transport.CorruptedPacket
  41. }
  42. request.Address = v2net.IPAddress(buffer.Value[:16])
  43. case AddrTypeDomain:
  44. _, err := io.ReadFull(reader, buffer.Value[:1])
  45. if err != nil {
  46. log.Error("Shadowsocks: Failed to read domain lenth: ", err)
  47. return nil, transport.CorruptedPacket
  48. }
  49. domainLength := int(buffer.Value[0])
  50. _, err = io.ReadFull(reader, buffer.Value[:domainLength])
  51. if err != nil {
  52. log.Error("Shadowsocks: Failed to read domain: ", err)
  53. return nil, transport.CorruptedPacket
  54. }
  55. request.Address = v2net.DomainAddress(string(buffer.Value[:domainLength]))
  56. default:
  57. log.Error("Shadowsocks: Unknown address type: ", addrType)
  58. return nil, transport.CorruptedPacket
  59. }
  60. _, err = io.ReadFull(reader, buffer.Value[:2])
  61. if err != nil {
  62. log.Error("Shadowsocks: Failed to read port: ", err)
  63. return nil, transport.CorruptedPacket
  64. }
  65. request.Port = v2net.PortFromBytes(buffer.Value[:2])
  66. return request, nil
  67. }