Ë
    ojæ  ã                   ó  — d Z ddlZddlZddlmZmZmZmZ ddlm	Z	 ddl
mZmZ ddlmZ ddlmZ ddlmZ d	d
lmZmZ d	dlmZmZmZmZ  G d„ de«      Z G d„ de«      ZdZdZdZdZ e	ej@                  «       G d„ d«      «       Z!y)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                   óP   — e Zd ZdZ ed«      Z ed«      Z ed«      Z ed«      Zy)Ú	NetFamilyz(
    Values for the 'family' field.
    r   é   é    é0   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚUNSPECÚINETÚINET6ÚUNIX© ó    úE/usr/lib/python3/dist-packages/twisted/protocols/haproxy/_v2parser.pyr   r      s1   „ ññ ˜4Ó €FÙ˜Ó€DÙ˜$Ó€EÙ˜Ó�Dr"   r   c                   ó@   — e Zd ZdZ ed«      Z ed«      Z ed«      Zy)ÚNetProtocolz&
    Values for 'protocol' field.
    r   r   é   N)r   r   r   r   r   r   ÚSTREAMÚDGRAMr!   r"   r#   r%   r%   )   s'   „ ññ ˜1Ó€FÙ˜1Ó€FÙ˜!Ó�Er"   r%   éð   é   ÚLOCALÚPROXYc                   óÞ   — e Zd ZdZdZdgZeedœZdddddddœZ	dd„Z
ded	eeej                  ef   ed   f   fd„Zeded	efd„«       Zeded	efd„«       Zeded	ej                  fd„«       Zy
)ÚV2Parserzn
    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                 ó   — d| _         y )Nr"   )Úbuffer)Úselfs    r#   Ú__init__zV2Parser.__init__P   s	   € Øˆ�r"   Údata©NNc                 óh  — | xj                   |z  c_         t        | j                   «      dk  r
t        «       ‚t        j                  d| j                   dd «      d   dz   }t        | j                   «      |k  ry| j                   d| | j                   |d }}d| _         | j                  |«      }||fS )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   r;   Nr"   )r7   Úlenr   ÚstructÚunpackÚparse)r8   r:   ÚsizeÚheaderÚ	remainingÚinfos         r#   ÚfeedzV2Parser.feedS   s¤   € ð" 	�Š�tÑ�Üˆt�{‰{Ó˜bÒ Ü$Ó&Ð&ä�}‰}˜T 4§;¡;¨r°"Ð#5Ó6°qÑ9¸BÑ>ˆÜˆt�{‰{Ó˜dÒ"Øà ŸK™K¨¨Ð.°·±¸D¸EÐ0B�	ˆØˆŒØ�z‰z˜&Ó!ˆØ�iÐ Ð r"   Ú
bytestringc                 óX   — dj                  d„ t        j                  | «      D «       «      S )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}
        ó   .c              3   óX   K  — | ]"  }d t        |«      fz  j                  d«      –— Œ$ y­w)z%iÚasciiN)ÚordÚencode)Ú.0Úbs     r#   ú	<genexpr>z(V2Parser._bytesToIPv4.<locals>.<genexpr>}   s+   è ø€ ò 
Ø34ˆT”S˜“V�IÑ×%Ñ% g×.ñ
ùs   ‚(*)Újoinr   Ú	iterbytes)rG   s    r#   Ú_bytesToIPv4zV2Parser._bytesToIPv4q   s-   € ð �y‰yñ 
Ü8>×8HÑ8HÈÓ8Tô
ó 
ð 	
r"   c                 óx   ‡— t        j                  | «      Šdj                  ˆfd„t        ddd«      D «       «      S )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   ód   •K  — | ]'  }t        ‰||d z    d«      d›j                  d«      –— Œ) y­w)é   r   ÚxrK   N)ÚintrM   )rN   rO   Ú	hexStrings     €r#   rP   z(V2Parser._bytesToIPv6.<locals>.<genexpr>Ž   s;   øè ø€ ò 
àô �I˜a ! a¡%Ð(¨"Ó-¨aÐ0×9Ñ9¸'×Bñ
ùs   ƒ-0r   r   rW   )ÚbinasciiÚb2a_hexrQ   Úrange)rG   rZ   s    @r#   Ú_bytesToIPv6zV2Parser._bytesToIPv6�   s;   ø€ ô ×$Ñ$ ZÓ0ˆ	Ø�y‰yó 
ä˜1˜b !“_ô
ó 
ð 	
r"   Úlinec           
      ó   — |dd }d}t        t        t        «      5  t        |dd «      }t        |dd «      }ddd«       || j                  k7  r
t        «       ‚t
        z  |t        z  }}|| j                  vs|| j                  vr
t        «       ‚| j                  |   t        k(  rt        j                  |dd«      S t
        z  |t        z  }	}t        t        t        «      5  t        j                  |«      }t         j                  |	«      }	ddd«       |t        j"                  u s|	t         j"                  u rt        j                  |dd«      S | j$                  |   }
|ddt'        j(                  |
«      z    }|t        j*                  u r›t        t&        j,                  t.        «      5  t'        j0                  |
|«      \  }}ddd«       t        j                  |t3        j4                  j7                  d«      «      t3        j4                  j7                  d«      «      «      S d}|	t         j8                  u rd}t2        j:                  }| j<                  }|t        j>                  u rt2        j@                  }| jB                  }t        t&        j,                  t.        «      5  t'        j0                  |
|«      }|\  }}}}ddd«       t        j                  | || |«      jE                  «       «       || |«      jE                  «       «      «      S # 1 sw Y   �ŒæxY w# 1 sw Y   �ŒxY w# 1 sw Y   �ŒrxY w# 1 sw Y   ŒxY w)	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=   r   ó    ÚTCPÚUDP)#r   Ú
IndexErrorr   rL   ÚPREFIXÚ_HIGHÚ_LOWÚVERSIONSÚCOMMANDSÚ_LOCALCOMMANDr   Ú	ProxyInfoÚ
ValueErrorr   r   ÚlookupByValuer%   r   ÚADDRESSFORMATSr?   Úcalcsizer    Úerrorr   r@   r   ÚUNIXAddressÚrstripr(   ÚIPv4AddressrS   r   ÚIPv6Addressr^   Údecode)Úclsr_   ÚprefixÚaddrInfoÚversionCommandÚfamilyProtoÚversionÚcommandÚfamilyÚnetprotoÚaddressFormatÚsourceÚdestÚaddrTypeÚaddrClsÚ
addrParserrE   ÚsPortÚdPorts                      r#   rA   zV2Parser.parse“   sâ  € ð �c�r�ˆØˆÜœ*Ô&8Ó9ñ 	+ô !  b¨ Ó-ˆNÜ˜d 2 b˜kÓ*ˆK÷		+ð �S—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Ô,>Ó?ñ FÜ%Ÿ}™}¨]¸HÓE‘�˜÷Fä—?‘?ØÜ×#Ñ# F§M¡M°'Ó$:Ó;Ü×#Ñ# D§K¡K°Ó$8Ó9óð ð ;@ˆØ”{×(Ñ(Ñ(ØˆHô ×Ñð 	ð 03×/?Ñ/?ˆ
Ø”Y—_‘_Ñ$Ü×)Ñ)ˆGØ×)Ñ)ˆJäœ&Ÿ,™,Ô(:Ó;ñ 	.Ü—=‘= °Ó9ˆDØ)-Ñ&ˆF�D˜% ÷	.ô �‰ØÙ�H™j¨Ó0×7Ñ7Ó9¸5ÓAÙ�H™j¨Ó.×5Ñ5Ó7¸Ó?ó
ð 	
÷c	+ñ 	+ú÷"	;ñ 	;ú÷Fñ Fú÷&	.ð 	.ús/   œLÃ%+L*Æ-L7Ê(MÌL'Ì*L4Ì7MÍM)r5   N)r   r   r   r   rg   rj   rl   Ú_PROXYCOMMANDrk   rp   r9   Úbytesr   r   r   rm   rF   ÚstaticmethodrS   r^   ÚclassmethodrA   r!   r"   r#   r.   r.   9   sà   „ ñð A€FØˆt€HØ  ]Ñ3€Hð ØàØàØñ
€Nóð!Øð!à	ˆu�U—_‘_ eÐ+Ñ,¨e°JÑ.?Ð?Ñ	@ó!ð< ð
 ð 
¨5ò 
ó ð
ð ð
 ð 
¨5ò 
ó ð
ð" ðE
˜ð E
 5§?¡?ò E
ó ñE
r"   r.   )"r   r[   r?   Útypingr   r   r   r   Úzope.interfacer   Ú
constantlyr   r	   r
   Útwisted.internetr   Útwisted.pythonr   Ú r   r   Ú_exceptionsr   r   r   r   r   r%   rh   ri   rl   r‰   ÚIProxyParserr.   r!   r"   r#   ú<module>r•      s‰   ðñó Û ß /Ó /å &ç ,Ý å $Ý !ß  ÷ó ô�ô ô�&ô ð 	€Ø€Ø€Ø€ñ ˆ[×%Ñ%Ó&÷_
ð _
ó 'ñ_
r"   