ó
    Ö›‘hñ  ã                   ó  • S r SSKrSSKrSSKJrJrJrJr  SSKJ	r	  SSK
JrJr  SSKJr  SSKJr  SSKJr  S	S
KJrJr  S	SKJrJrJrJr   " S S\5      r " S S\5      rSrSrSrSr \	" \RB                  5       " S S5      5       r"g)zD
IProxyParser implementation for version two of the PROXY protocol.
é    N)ÚCallableÚTupleÚTypeÚUnion)Úimplementer)ÚValueConstantÚValues)ÚLiteral)Úaddress)Úcompaté   )Ú_infoÚ_interfaces)ÚInvalidNetworkProtocolÚInvalidProxyHeaderÚMissingAddressDataÚconvertErrorc                   óX   • \ rS rSrSr\" S5      r\" S5      r\" S5      r\" S5      r	Sr
g)	Ú	NetFamilyé   z 
Values for the 'family' field.
r   é   é    é0   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚUNSPECÚINETÚINET6ÚUNIXÚ__static_attributes__r   ó    ÚgC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/protocols/haproxy/_v2parser.pyr   r      s1   † ññ ˜4Ó €FÙ˜Ó€DÙ˜$Ó€EÙ˜ÓƒDr%   r   c                   óH   • \ rS rSrSr\" S5      r\" S5      r\" S5      rSr	g)ÚNetProtocolé)   z
Values for 'protocol' field.
r   r   é   r   N)
r   r   r   r   r   r   r    ÚSTREAMÚDGRAMr$   r   r%   r&   r(   r(   )   s'   † ññ ˜1Ó€FÙ˜1Ó€FÙ˜!ÓƒEr%   r(   éð   é   ÚLOCALÚPROXYc                   óð   • \ rS rSrSrSrS/r\\S.r	SSSSSSS	.r
SS jrS\S
\\\R                   \4   \S   4   4S jr\S\S
\4S j5       r\S\S
\4S j5       r\S\S
\R                   4S j5       rSrg)ÚV2Parseré9   zb
PROXY protocol version two header parser.

Version two of the PROXY protocol is a binary format.
s   

 
QUIT
r   )r   r   z!4s4s2Hz	!16s16s2Hz	!108s108s)é   é   é!   é"   é1   é2   ÚreturnNc                 ó   • SU l         g )Nr%   ©Úbuffer)Úselfs    r&   Ú__init__ÚV2Parser.__init__P   s	   € Øˆ�r%   Údata©NNc                 ój  • U =R                   U-  sl         [        U R                   5      S:  a
  [        5       e[        R                  " SU R                   SS 5      S   S-   n[        U R                   5      U:  a  gU R                   SU U R                   US pCSU l         U R                  U5      nXT4$ )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.
r   z!Hé   r   rB   Nr%   )r=   Úlenr   ÚstructÚunpackÚparse)r>   rA   ÚsizeÚheaderÚ	remainingÚinfos         r&   ÚfeedÚV2Parser.feedS   s    € ð" 	�Š�tÑ�Üˆt�{‰{Ó˜bÓ Ü$Ó&Ð&ä�}Š}˜T 4§;¡;¨r°"Ð#5Ó6°qÑ9¸BÑ>ˆÜˆt�{‰{Ó˜dÓ"Øà ŸK™K¨¨Ð.°·±¸D¸EÐ0B�	ØˆŒØ�z‰z˜&Ó!ˆØÐ Ð r%   Ú
bytestringc                 óZ   • SR                  S [        R                  " U 5       5       5      $ )zÿ
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}
ó   .c              3   ó^   #   • U  H#  nS [        U5      4-  R                  S5      v •  M%     g7f)z%iÚasciiN)ÚordÚencode)Ú.0Úbs     r&   Ú	<genexpr>Ú(V2Parser._bytesToIPv4.<locals>.<genexpr>}   s-   é € ð 
Ú8T°1ˆT”S˜“V�IÑ×%Ñ% g×.Ð.Ò8Tùs   ‚+-)Újoinr   Ú	iterbytes)rO   s    r&   Ú_bytesToIPv4ÚV2Parser._bytesToIPv4q   s-   € ð �y‰yñ 
Ü8>×8HÒ8HÈÔ8Tó
ó 
ð 	
r%   c                 ó|   ^• [         R                  " U 5      mSR                  U4S j[        SSS5       5       5      $ )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}
ó   :c              3   óh   >#   • U  H'  n[        TXS -    S5      S R                  S5      v •  M)     g7f)é   r   ÚxrS   N)ÚintrU   )rV   rW   Ú	hexStrings     €r&   rX   Ú(V2Parser._bytesToIPv6.<locals>.<genexpr>Ž   s;   øé € ð 
â$�ô �I˜a a¡%Ð(¨"Ó-¨aÐ0×9Ñ9¸'×BÐBÚ$ùs   ƒ/2r   r   ra   )ÚbinasciiÚb2a_hexrZ   Úrange)rO   rd   s    @r&   Ú_bytesToIPv6ÚV2Parser._bytesToIPv6�   s;   ø€ ô ×$Ò$ ZÓ0ˆ	Ø�y‰yô 
ä˜1˜b !”_ó
ó 
ð 	
r%   Úlinec           
      óÚ  • USS nSn[        [        [        5         [        USS 5      n[        USS 5      nSSS5        X R                  :w  a
  [        5       eW[
        -  U[        -  pvX`R                  ;  d  XpR                  ;  a
  [        5       eU R                  U   [        :X  a  [        R                  " USS5      $ W[
        -  U[        -  p˜[        [        [        5         [        R                  U5      n[         R                  U	5      n	SSS5        U[        R"                  L d  U	[         R"                  L a  [        R                  " USS5      $ U R$                  U   n
USS[&        R(                  " U
5      -    nU[        R*                  L a�  [        [&        R,                  [.        5         [&        R0                  " X£5      u  p¼SSS5        [        R                  " U[2        R4                  " WR7                  S5      5      [2        R4                  " WR7                  S5      5      5      $ SnU	[         R8                  L a  Sn[2        R:                  nU R<                  nU[        R>                  L a  [2        R@                  nU RB                  n[        [&        R,                  [.        5         [&        R0                  " X£5      nUu  p¼nnSSS5        [        R                  " UU" Xß" W5      RE                  5       W5      U" Xß" W5      RE                  5       W5      5      $ ! , (       d  f       GNô= f! , (       d  f       GN-= f! , (       d  f       GN„= f! , (       d  f       N’= f)	aI  
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é   é   rD   r   ó    ÚTCPÚUDP)#r   Ú
IndexErrorr   rT   ÚPREFIXÚ_HIGHÚ_LOWÚVERSIONSÚCOMMANDSÚ_LOCALCOMMANDr   Ú	ProxyInfoÚ
ValueErrorr   r   ÚlookupByValuer(   r    ÚADDRESSFORMATSrF   Úcalcsizer#   Úerrorr   rG   r   ÚUNIXAddressÚrstripr,   ÚIPv4Addressr\   r"   ÚIPv6Addressri   Údecode)Úclsrk   ÚprefixÚaddrInfoÚversionCommandÚfamilyProtoÚversionÚcommandÚfamilyÚnetprotoÚaddressFormatÚsourceÚdestÚaddrTypeÚaddrClsÚ
addrParserrL   ÚsPortÚdPorts                      r&   rH   ÚV2Parser.parse“   s²  € ð �c�r�ˆØˆÜœ*Ô&8Õ9ô !  b¨ Ó-ˆNÜ˜d 2 b˜kÓ*ˆK÷	 :ð —Z‘ZÓÜ$Ó&Ð&à)¬EÑ1°>ÄDÑ3H�ØŸ,™,Ó&¨'¿¹Ó*EÜ$Ó&Ð&à�<‰<˜Ñ ¤MÓ1Ü—?’? 4¨¨tÓ4Ð4à&¬Ñ.°¼dÑ0B�Üœ*Ô&<Õ=Ü×,Ñ,¨VÓ4ˆFÜ"×0Ñ0°Ó:ˆH÷ >ð ”Y×%Ñ%Ò%¨´[×5GÑ5GÒ)GÜ—?’? 4¨¨tÓ4Ð4à×*Ñ*¨;Ñ7ˆØ˜˜R¤&§/¢/°-Ó"@Ñ@ÐAˆØ”Y—^‘^Ò#ÜœfŸl™lÔ,>Õ?Ü%Ÿ}š}¨]ÓE‘�÷ @ä—?’?ØÜ×#Ò# F§M¡M°'Ó$:Ó;Ü×#Ò# D§K¡K°Ó$8Ó9óð ð ;@ˆØ”{×(Ñ(Ò(ØˆHô ×Ñð 	ð 03×/?Ñ/?ˆ
Ø”Y—_‘_Ò$Ü×)Ñ)ˆGØ×)Ñ)ˆJäœ&Ÿ,™,Ô(:Õ;Ü—=’= Ó9ˆDØ)-Ñ&ˆF˜% ÷ <ô �ŠØÙ�H˜j¨Ó0×7Ñ7Ó9¸5ÓAÙ�H˜j¨Ó.×5Ñ5Ó7¸Ó?ó
ð 	
÷c :Ö9ú÷" >Ö=ú÷ @Ö?ú÷& <Õ;ús/   œL&Ã'+L8Æ4M
Ê3MÌ&
L5Ì8
MÍ

MÍ
M*r<   )r:   N)r   r   r   r   r   rs   rv   rx   Ú_PROXYCOMMANDrw   r|   r?   Úbytesr   r   r   ry   rM   Ústaticmethodr\   ri   ÚclassmethodrH   r$   r   r%   r&   r2   r2   9   sà   † ñð A€FØˆt€HØ  ]Ñ3€Hð ØàØàØñ
€Nôð!Øð!à	ˆu�U—_‘_ eÐ+Ñ,¨e°JÑ.?Ð?Ñ	@ô!ð< ð
 ð 
¨5ó 
ó ð
ð ð
 ð 
¨5ó 
ó ð
ð" ðE
˜ð E
 5§?¡?ó E
ó óE
r%   r2   )#r   rf   rF   Útypingr   r   r   r   Úzope.interfacer   Ú
constantlyr   r	   Útyping_extensionsr
   Útwisted.internetr   Útwisted.pythonr   Ú r   r   Ú_exceptionsr   r   r   r   r   r(   rt   ru   rx   r–   ÚIProxyParserr2   r   r%   r&   Ú<module>r£      s‰   ðñó Û ß /Ó /å &ç ,Ý %å $Ý !ß  ÷ó ô�ô ô�&ô ð 	€Ø€Ø€Ø€ñ ˆ[×%Ñ%Ó&÷_
ð _
ó 'ñ_
r%   