o
    b                     @   sp   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	 d	Zd
S )zD
IProxyParser implementation for version one of the PROXY protocol.
    )TupleUnion)implementer)address   )_info_interfaces)InvalidNetworkProtocolInvalidProxyHeaderMissingAddressDataconvertErrorc                   @   sx   e Zd ZdZdZdZdZdZeeefZdZ	dd	d
Z
dedeeejef ed f fddZededejfddZdS )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                 C   s
   d| _ d S )N    )buffer)self r   E/usr/lib/python3/dist-packages/twisted/protocols/haproxy/_v1parser.py__init__,   s   
zV1Parser.__init__dataNNc                 C   sv   |  j |7  _ t| j dkr| j| j vrt | j | jd}t|dks'dS d| _ | }| }| |}||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infor   r   r   feed/   s   
zV1Parser.feedlinec           	   
   C   s  |}d}d}d}d}d}d}t tt |dd\}}W d   n1 s&w   Y  || jkr3t t tt |dd\}}W d   n1 sKw   Y  || jvrXt || jkrdt	|ddS t tt
 |dd\}}W d   n1 s|w   Y  t tt
 |dd\}}W d   n1 sw   Y  t tt
 |dd\}}W d   n1 sw   Y  t tt
 |dd }W d   n1 sw   Y  || jkrt	|td| t|td| t|S t	|td| t|td| t|S )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destPortr   r   r   r   L   sT   



zV1Parser.parse)r   N)__name__
__module____qualname____doc__r&   r(   r*   
TCP6_PROTOr'   r   r   bytesr   r   r   r)   r!   classmethodr   r   r   r   r   r      s&    

r   N)r:   typingr   r   zope.interfacer   twisted.internetr    r   r   _exceptionsr	   r
   r   r   IProxyParserr   r   r   r   r   <module>   s   