ϪfdZddlZddlZddlmZmZmZmZddlm Z ddl m Z m Z ddlm Z ddlmZddlmZd d lmZmZd d lmZmZmZmZGd d e ZGdde ZdZdZdZdZe ej@GddZ!y)zD IProxyParser implementation for version two of the PROXY protocol. N)CallableTupleTypeUnion) implementer) ValueConstantValues)Literal)address)compat)_info _interfaces)InvalidNetworkProtocolInvalidProxyHeaderMissingAddressData convertErrorcPeZdZdZedZedZedZedZy) NetFamilyz( Values for the 'family' field. r 0N) __name__ __module__ __qualname____doc__rUNSPECINETINET6UNIXE/usr/lib/python3/dist-packages/twisted/protocols/haproxy/_v2parser.pyrrs14 F  D $ E  Dr"rc@eZdZdZedZedZedZy) NetProtocolz& Values for 'protocol' field. rr N)rrrrrrSTREAMDGRAMr!r"r#r%r%)s'1 F 1 F ! Er"r%LOCALPROXYceZdZdZdZdgZeedZdddddddZ dd Z d e d e e eje fe d ffdZede d e fdZede d e fdZede d ejfdZy )V2Parserzn PROXY protocol version two header parser. Version two of the PROXY protocol is a binary format. s QUIT r)rr z!4s4s2Hz !16s16s2Hz !108s108s)!"12returnNcd|_y)Nr")buffer)selfs r#__init__zV2Parser.__init__Ps  r"dataNNch|xj|z c_t|jdkr ttjd|jddddz}t|j|kry|jd||j|d}}d|_|j |}||fS)a Consume a chunk of data and attempt to parse it. @param data: A bytestring. @type data: bytes @return: A two-tuple containing, in order, a L{_interfaces.IProxyInfo} and any bytes fed to the parser that followed the end of the header. Both of these values are None until a complete header is parsed. @raises InvalidProxyHeader: If the bytes fed to the parser create an invalid PROXY header. rz!Hrr;Nr")r7lenrstructunpackparse)r8r:sizeheader remaininginfos r#feedz V2Parser.feedSs" t t{{ b $& &}}T4;;r"#56q9B> t{{ d " KK. DE0B  zz&!i  r" bytestringcXdjdtj|DS)a7 Convert packed 32-bit IPv4 address bytes into a dotted-quad ASCII bytes representation of that address. @param bytestring: 4 octets representing an IPv4 address. @type bytestring: L{bytes} @return: a dotted-quad notation IPv4 address. @rtype: L{bytes} .c3XK|]"}dt|fzjd$yw)z%iasciiN)ordencode).0bs r# z(V2Parser._bytesToIPv4..}s+ 34TSVI  % %g . s(*)joinr iterbytes)rGs r# _bytesToIPv4zV2Parser._bytesToIPv4qs-yy 8>8H8H8T   r"cxtj|djfdtdddDS)a= Convert packed 128-bit IPv6 address bytes into a colon-separated ASCII bytes representation of that address. @param bytestring: 16 octets representing an IPv6 address. @type bytestring: L{bytes} @return: a dotted-quad notation IPv6 address. @rtype: L{bytes} :c3dK|]'}t||dzddjd)yw)rxrKN)intrM)rNrO hexStrings r#rPz(V2Parser._bytesToIPv6..s; Ia!a%("-a0 9 9' B s-0rrrW)binasciib2a_hexrQrange)rGrZs @r# _bytesToIPv6zV2Parser._bytesToIPv6s;$$Z0 yy 1b!_   r"linec |dd}d}ttt5t|dd}t|dd}ddd||jk7r tt z|t z}}||jvs||jvr t|j|tk(rtj|ddSt z|t z} }ttt5tj|}t j| } ddd|tj"us| t j"urtj|ddS|j$|} |ddt'j(| z}|tj*urtt&j,t.5t'j0| |\} } dddtj|t3j4 j7dt3j4 j7dSd} | t j8urd} t2j:}|j<}|tj>urt2j@}|jB}tt&j,t.5t'j0| |}|\} } }}dddtj||| | jE|| | jES#1swYxYw#1swYxYw#1swYrxYw#1swYxYw) a Parse a bytestring as a full PROXY protocol header. @param line: A bytestring that represents a valid HAProxy PROXY protocol version 2 header. @type line: bytes @return: A L{_interfaces.IProxyInfo} containing the parsed data. @raises InvalidProxyHeader: If the bytestring does not represent a valid PROXY header. N r=rTCPUDP)#r IndexErrorrrLPREFIX_HIGH_LOWVERSIONSCOMMANDS _LOCALCOMMANDr ProxyInfo ValueErrorrr lookupByValuer%rADDRESSFORMATSr?calcsizer errorrr@r UNIXAddressrstripr( IPv4AddressrSr IPv6Addressr^decode)clsr_prefixaddrInfoversionCommand familyProtoversioncommandfamilynetproto addressFormatsourcedestaddrTypeaddrCls addrParserrEsPortdPorts r#rAzV2Parser.parsescr *&8 9 +!b-Nd2bk*K  + SZZ $& &)E1>D3H #,, &'*E$& & << M 1??4t4 4&. d0B *&< = ;,,V4F"00:H ; Y%% %[5G5G)G??4t4 4**;7 R&//-"@@A Y^^ #fll,>? F%}}]HE  F??##FMM'$:;##DKK$89  ;@ {(( (H    03/?/? Y__ $))G))J &,,(: ; .==9D)- &FD% .  Hj07795 A Hj.557 ?  c + +" ; ; F F& . .s/L%+L*-L7(ML'*L47MM )r5N)rrrrrgrjrl _PROXYCOMMANDrkrpr9bytesrrrrmrF staticmethodrSr^ classmethodrAr!r"r#r.r.9s AFtH ]3H       N!! uU__e+,eJ.?? @!<    5      5  "E E 5??E E r"r.)"rr[r?typingrrrrzope.interfacer constantlyrr r twisted.internetr twisted.pythonr rr _exceptionsrrrrrr%rhrirlr IProxyParserr.r!r"r#rs  //&,$! &    [ % %&_ _ '_ r"