Ë
    oj‹  ã                   ó–   — d Z ddlmZ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  ee
j                   «       G d„ d	«      «       Zy
)zD
IProxyParser implementation for version one of the PROXY protocol.
é    )ÚTupleÚUnion)Úimplementer)Úaddressé   )Ú_infoÚ_interfaces)ÚInvalidNetworkProtocolÚInvalidProxyHeaderÚMissingAddressDataÚconvertErrorc                   ó¢   — e Zd ZdZdZdZdZdZeeefZ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j                  fd„«       Zy)ÚV1Parserzõ
    PROXY protocol version one header parser.

    Version one of the PROXY protocol is a human readable format represented
    by a single, newline delimited binary string that contains all of the
    relevant source and destination data.
    s   PROXYs   UNKNOWNs   TCP4s   TCP6s   
ÚreturnNc                 ó   — d| _         y )Nó    )Úbuffer)Úselfs    úE/usr/lib/python3/dist-packages/twisted/protocols/haproxy/_v1parser.pyÚ__init__zV1Parser.__init__,   s	   € Øˆ�r   Údata©NNc                 ó‚  — | xj                   |z  c_         t        | j                   «      dkD  r"| j                  | j                   vr
t        «       ‚| j                   j	                  | j                  d«      }t        |«      dkD  syd| _         |j                  «       }|j                  «       }| j                  |«      }||fS )aî  
        Consume a chunk of data and attempt to parse it.

        @param data: A bytestring.
        @type data: L{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.
        ék   r   r   r   )r   ÚlenÚNEWLINEr   ÚsplitÚpopÚparse)r   r   ÚlinesÚ	remainingÚheaderÚinfos         r   ÚfeedzV1Parser.feed/   s™   € ð" 	�Š�tÑ�Üˆt�{‰{Ó˜cÒ! d§l¡l¸$¿+¹+Ñ&EÜ$Ó&Ð&Ø—‘×#Ñ# D§L¡L°!Ó4ˆÜ�5‹z˜AŠ~ØØˆŒØ—I‘I“Kˆ	Ø—‘“ˆØ�z‰z˜&Ó!ˆØ�iÐ Ð r   Úlinec                 ó˜  — |}d}d}d}d}d}d}t        t        t        «      5  |j                  dd«      \  }}ddd«       || j                  k7  r
t        «       ‚t        t        t
        «      5  |j                  dd«      \  }}ddd«       || j                  vr
t        «       ‚|| j                  k(  rt        j                  |dd«      S t        t        t        «      5  |j                  dd«      \  }}ddd«       t        t        t        «      5  |j                  dd«      \  }}ddd«       t        t        t        «      5  |j                  dd«      \  }}ddd«       t        t        t        «      5  |j                  d«      d   }ddd«       || j                  k(  rot        j                  |t        j                  d|j                  «       t        |«      «      t        j                  d|j                  «       t        |«      «      «      S t        j                  |t        j                   d|j                  «       t        |«      «      t        j                   d|j                  «       t        |«      «      «      S # 1 sw Y   �ŒGxY w# 1 sw Y   �Œ	xY w# 1 sw Y   �Œ¦xY w# 1 sw Y   �Œ�xY w# 1 sw Y   �Œ\xY w# 1 sw Y   �Œ8xY w)a�  
        Parse a bytestring as a full PROXY protocol header line.

        @param line: A bytestring that represents a valid HAProxy PROXY
            protocol header line.
        @type line: bytes

        @return: A L{_interfaces.IProxyInfo} containing the parsed data.

        @raises InvalidProxyHeader: If the bytestring does not represent a
            valid PROXY header.

        @raises InvalidNetworkProtocol: When no protocol can be parsed or is
            not one of the allowed values.

        @raises MissingAddressData: When the protocol is TCP* but the header
            does not contain a complete set of addresses and ports.
        Nó    r   r   ÚTCP)r   Ú
ValueErrorr   r   ÚPROXYSTRr
   ÚALLOWED_NET_PROTOSÚUNKNOWN_PROTOr   Ú	ProxyInfor   Ú
TCP4_PROTOr   ÚIPv4AddressÚdecodeÚintÚIPv6Address)	Úclsr%   ÚoriginalLineÚproxyStrÚnetworkProtocolÚ
sourceAddrÚ
sourcePortÚdestAddrÚdestPorts	            r   r   zV1Parser.parseL   si  € ð( ˆØˆØˆØˆ
Øˆ
ØˆØˆäœ*Ô&8Ó9ñ 	1Ø!ŸZ™Z¨¨aÓ0‰NˆH�d÷	1ð �s—|‘|Ò#Ü$Ó&Ð&äœ*Ô&<Ó=ñ 	8Ø$(§J¡J¨t°QÓ$7Ñ!ˆO˜T÷	8ð  #×"8Ñ"8Ñ8Ü(Ó*Ð*à˜c×/Ñ/Ò/Ü—?‘? <°°tÓ<Ð<äœ*Ô&8Ó9ñ 	3Ø#Ÿz™z¨$°Ó2ÑˆJ˜÷	3ô œ*Ô&8Ó9ñ 	1Ø!ŸZ™Z¨¨aÓ0‰NˆH�d÷	1ô œ*Ô&8Ó9ñ 	3Ø#Ÿz™z¨$°Ó2ÑˆJ˜÷	3ô œ*Ô&8Ó9ñ 	+Ø—z‘z $Ó'¨Ñ*ˆH÷	+ð ˜cŸn™nÒ,Ü—?‘?ØÜ×#Ñ# E¨:×+<Ñ+<Ó+>ÄÀJÃÓPÜ×#Ñ# E¨8¯?©?Ó+<¼cÀ(»mÓLóð ô �‰ØÜ×Ñ  z×'8Ñ'8Ó':¼CÀ
»OÓLÜ×Ñ  x§¡Ó'8¼#¸h»-ÓHó
ð 	
÷E	1ñ 	1ú÷	8ñ 	8ú÷	3ñ 	3ú÷	1ñ 	1ú÷	3ñ 	3ú÷	+ñ 	+úsG   £I>Á.JÃJÄJ%ÅJ2Å4J?É>JÊJÊJ"Ê%J/Ê2J<Ê?K	)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r,   r.   Ú
TCP6_PROTOr+   r   r   Úbytesr   r   r   r-   r$   Úclassmethodr   © r   r   r   r      s–   „ ñð €HØ€MØ€JØ€JàØØðÐð
 €Góð!Øð!à	ˆu�U—_‘_ eÐ+Ñ,¨e°JÑ.?Ð?Ñ	@ó!ð: ðA
˜ð A
 5§?¡?ò A
ó ñA
r   r   N)r>   Útypingr   r   Úzope.interfacer   Útwisted.internetr   Ú r   r	   Ú_exceptionsr
   r   r   r   ÚIProxyParserr   rB   r   r   ú<module>rI      sI   ðñ÷  å &å $ß  ÷ó ñ ˆ[×%Ñ%Ó&÷v
ð v
ó 'ñv
r   