]>
git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.dnsdist/proxyprotocol.py
6 class ProxyProtocol(object):
7 MAGIC
= b
'\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A'
8 # Header is magic + versioncommand (1) + family (1) + content length (2)
9 HEADER_SIZE
= len(MAGIC
) + 1 + 1 + 2
15 def parseHeader(self
, data
):
16 if len(data
) < self
.HEADER_SIZE
:
19 if data
[:len(self
.MAGIC
)] != self
.MAGIC
:
22 value
= struct
.unpack('!B', bytes(bytearray([data
[12]])))[0]
23 self
.version
= value
>> 4
24 if self
.version
!= 0x02:
27 self
.command
= value
& ~
0x20
29 self
.offset
= self
.HEADER_SIZE
31 if self
.command
== 0x00:
33 elif self
.command
== 0x01:
34 value
= struct
.unpack('!B', bytes(bytearray([data
[13]])))[0]
35 self
.family
= value
>> 4
36 if self
.family
== 0x01:
38 elif self
.family
== 0x02:
43 self
.protocol
= value
& ~
0xF0
44 if self
.protocol
== 0x01:
46 elif self
.protocol
== 0x02:
53 self
.contentLen
= struct
.unpack("!H", data
[14:16])[0]
56 if self
.contentLen
< (self
.addrSize
* 2 + self
.PORT_SIZE
* 2):
61 def getAddr(self
, data
):
62 if len(data
) < (self
.consumed() + self
.addrSize
):
66 if self
.family
== 0x01:
67 value
= socket
.inet_ntop(socket
.AF_INET
, data
[self
.offset
:self
.offset
+ self
.addrSize
])
69 value
= socket
.inet_ntop(socket
.AF_INET6
, data
[self
.offset
:self
.offset
+ self
.addrSize
])
71 self
.offset
= self
.offset
+ self
.addrSize
74 def getPort(self
, data
):
75 if len(data
) < (self
.consumed() + self
.PORT_SIZE
):
78 value
= struct
.unpack('!H', data
[self
.offset
:self
.offset
+ self
.PORT_SIZE
])[0]
79 self
.offset
= self
.offset
+ self
.PORT_SIZE
82 def parseAddressesAndPorts(self
, data
):
86 if len(data
) < (self
.consumed() + self
.addrSize
* 2 + self
.PORT_SIZE
* 2):
89 self
.source
= self
.getAddr(data
)
90 self
.destination
= self
.getAddr(data
)
91 self
.sourcePort
= self
.getPort(data
)
92 self
.destinationPort
= self
.getPort(data
)
95 def parseAdditionalValues(self
, data
):
100 if len(data
) < (self
.HEADER_SIZE
+ self
.contentLen
):
103 remaining
= self
.HEADER_SIZE
+ self
.contentLen
- self
.consumed()
104 if len(data
) < remaining
:
107 while remaining
>= 3:
108 valueType
= struct
.unpack("!B", bytes(bytearray([data
[self
.offset
]])))[0]
109 self
.offset
= self
.offset
+ 1
110 valueLen
= struct
.unpack("!H", data
[self
.offset
:self
.offset
+2])[0]
111 self
.offset
= self
.offset
+ 2
113 remaining
= remaining
- 3
115 if valueLen
> remaining
:
117 self
.values
.append([valueType
, data
[self
.offset
:self
.offset
+valueLen
]])
118 self
.offset
= self
.offset
+ valueLen
119 remaining
= remaining
- valueLen
122 self
.values
.append([valueType
, ""])