@@ -33,62 +33,68 @@ func parseVersion1(reader *bufio.Reader) (*Header, error) {
3333 }
3434 // Check full signature.
3535 tokens := strings .Split (line [:len (line )- 2 ], separator )
36- transportProtocol := UNSPEC // doesn't exist in v1 but fits UNKNOWN.
37- if len (tokens ) > 0 {
38- // Read address family and protocol
39- switch tokens [1 ] {
40- case "TCP4" :
41- transportProtocol = TCPv4
42- case "TCP6" :
43- transportProtocol = TCPv6
44- case "UNKNOWN" : // no-op as UNSPEC is set already
45- default :
46- return nil , ErrCantReadAddressFamilyAndProtocol
47- }
48-
49- // Expect 6 tokens only when UNKNOWN is not present.
50- if ! transportProtocol .IsUnspec () && len (tokens ) < 6 {
51- return nil , ErrCantReadAddressFamilyAndProtocol
52- }
53- }
54-
55- // Allocation only happens when a signature is found.
36+
37+ // Expect at least 2 tokens: "PROXY" and the transport protocol.
38+ if len (tokens ) < 2 {
39+ return nil , ErrCantReadAddressFamilyAndProtocol
40+ }
41+
42+ // Read address family and protocol
43+ var transportProtocol AddressFamilyAndProtocol
44+ switch tokens [1 ] {
45+ case "TCP4" :
46+ transportProtocol = TCPv4
47+ case "TCP6" :
48+ transportProtocol = TCPv6
49+ case "UNKNOWN" :
50+ transportProtocol = UNSPEC // doesn't exist in v1 but fits UNKNOWN
51+ default :
52+ return nil , ErrCantReadAddressFamilyAndProtocol
53+ }
54+
55+ // Expect 6 tokens only when UNKNOWN is not present.
56+ if transportProtocol != UNSPEC && len (tokens ) < 6 {
57+ return nil , ErrCantReadAddressFamilyAndProtocol
58+ }
59+
60+ // When a signature is found, allocate a v1 header with Command set to PROXY.
61+ // Command doesn't exist in v1 but set it for other parts of this library
62+ // to rely on it for determining connection details.
5663 header := initVersion1 ()
57- // If UNKNOWN is present, set Command to LOCAL.
58- // Command is not present in v1 but set it for other parts of
59- // this library to rely on it for determining connection details.
60- header .Command = LOCAL
6164
6265 // Transport protocol has been processed already.
6366 header .TransportProtocol = transportProtocol
6467
65- // Only process further if UNKNOWN is not present.
66- if header .TransportProtocol != UNSPEC {
67- // Read addresses and ports
68- sourceIP , err := parseV1IPAddress (header .TransportProtocol , tokens [2 ])
69- if err != nil {
70- return nil , err
71- }
72- destIP , err := parseV1IPAddress (header .TransportProtocol , tokens [3 ])
73- if err != nil {
74- return nil , err
75- }
76- sourcePort , err := parseV1PortNumber (tokens [4 ])
77- if err != nil {
78- return nil , err
79- }
80- destPort , err := parseV1PortNumber (tokens [5 ])
81- if err != nil {
82- return nil , err
83- }
84- header .SourceAddr = & net.TCPAddr {
85- IP : sourceIP ,
86- Port : sourcePort ,
87- }
88- header .DestinationAddr = & net.TCPAddr {
89- IP : destIP ,
90- Port : destPort ,
91- }
68+ // When UNKNOWN, set the command to LOCAL and return early
69+ if header .TransportProtocol == UNSPEC {
70+ header .Command = LOCAL
71+ return header , nil
72+ }
73+
74+ // Otherwise, continue to read addresses and ports
75+ sourceIP , err := parseV1IPAddress (header .TransportProtocol , tokens [2 ])
76+ if err != nil {
77+ return nil , err
78+ }
79+ destIP , err := parseV1IPAddress (header .TransportProtocol , tokens [3 ])
80+ if err != nil {
81+ return nil , err
82+ }
83+ sourcePort , err := parseV1PortNumber (tokens [4 ])
84+ if err != nil {
85+ return nil , err
86+ }
87+ destPort , err := parseV1PortNumber (tokens [5 ])
88+ if err != nil {
89+ return nil , err
90+ }
91+ header .SourceAddr = & net.TCPAddr {
92+ IP : sourceIP ,
93+ Port : sourcePort ,
94+ }
95+ header .DestinationAddr = & net.TCPAddr {
96+ IP : destIP ,
97+ Port : destPort ,
9298 }
9399
94100 return header , nil
0 commit comments