U
    nËj¬(  ã                   @   sÒ  d dl Z d dlmZmZmZmZmZmZmZm	Z	 ddl
mZmZ ddlmZmZmZ erdddlmZ zd dlmZ W n  ek
r”   d dlmZ Y nX dZe  d	¡Ze  e d
¡¡Ze  e d
¡¡ZG dd„ deeeef  ƒZe	eeeef  eeeef  eeeef  eeeef  f Zeeed edœdd„ƒZ eeed edœdd„ƒZ ede	eef e!edœdd„ƒZ d e	eef e!edœdd„Z eeee dœdd„Z"eeee edœdd„Z#de!dœdd„Z$dS )!é    N)ÚAnyStrÚcastÚListÚoverloadÚSequenceÚTupleÚTYPE_CHECKINGÚUnioné   )Ú
field_nameÚfield_value)ÚbytesifyÚLocalProtocolErrorÚvalidate)ÚRequest)ÚLiteralé   s   [0-9]+Úasciic                   @   sž   e Zd ZdZdZeeeeef  ddœdd„Ze	dœdd	„Z
ee	d
œdd„Zedœdd„Zedœdd„Zeeeef dœdd„Zeeeef  dœdd„ZdS )ÚHeadersaÕ  
    A list-like interface that allows iterating over headers as byte-pairs
    of (lowercased-name, value).

    Internally we actually store the representation as three-tuples,
    including both the raw original casing, in order to preserve casing
    over-the-wire, and the lowercased name, for case-insensitive comparisions.

    r = Request(
        method="GET",
        target="/",
        headers=[("Host", "example.org"), ("Connection", "keep-alive")],
        http_version="1.1",
    )
    assert r.headers == [
        (b"host", b"example.org"),
        (b"connection", b"keep-alive")
    ]
    assert r.headers.raw_items() == [
        (b"Host", b"example.org"),
        (b"Connection", b"keep-alive")
    ]
    Ú_full_itemsN)Ú
full_itemsÚreturnc                 C   s
   || _ d S ©N©r   )Úselfr   © r   ú0/tmp/pip-unpacked-wheel-fpxc_c9c/h11/_headers.pyÚ__init__h   s    zHeaders.__init__)r   c                 C   s
   t | jƒS r   )Úboolr   ©r   r   r   r   Ú__bool__k   s    zHeaders.__bool__)Úotherr   c                 C   s   t | ƒt |ƒkS r   )Úlist)r   r!   r   r   r   Ú__eq__n   s    zHeaders.__eq__c                 C   s
   t | jƒS r   )Úlenr   r   r   r   r   Ú__len__q   s    zHeaders.__len__c                 C   s   dt t| ƒƒ S )Nz<Headers(%s)>)Úreprr"   r   r   r   r   Ú__repr__t   s    zHeaders.__repr__)Úidxr   c                 C   s   | j | \}}}||fS r   r   )r   r(   Ú_ÚnameÚvaluer   r   r   Ú__getitem__w   s    zHeaders.__getitem__c                 C   s   dd„ | j D ƒS )Nc                 S   s   g | ]\}}}||f‘qS r   r   )Ú.0Úraw_namer)   r+   r   r   r   Ú
<listcomp>|   s     z%Headers.raw_items.<locals>.<listcomp>r   r   r   r   r   Ú	raw_items{   s    zHeaders.raw_items)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   Úbytesr   r   r    Úobjectr#   Úintr%   Ústrr'   r,   r0   r   r   r   r   r   M   s   r   T)ÚheadersÚ_parsedr   c                 C   s   d S r   r   ©r:   r;   r   r   r   Únormalize_and_validate‡   s    r=   Fc                 C   s   d S r   r   r<   r   r   r   r=   Œ   s    c                 C   s   d S r   r   r<   r   r   r   r=   ‘   s    c           	      C   sd  g }d }d}| D �]H\}}|sJt |ƒ}t |ƒ}tt|d|ƒ tt|d|ƒ t|tƒsXt‚t|tƒsft‚|}| ¡ }|dkrúdd„ | d¡D ƒ}t	|ƒdkr¢t
d	ƒ‚| ¡ }tt|d
ƒ t	|ƒtkrÊt
d
ƒ‚|d krè|}| |||f¡ n||krøt
d	ƒ‚q|dk�rJ|�rt
ddd�‚| ¡ }|dk�r4t
ddd�‚d}| |||f¡ q| |||f¡ qt|ƒS )NFzIllegal header name {!r}zIllegal header value {!r}s   content-lengthc                 S   s   h | ]}|  ¡ ’qS r   )Ústrip)r-   Úlengthr   r   r   Ú	<setcomp>­   s     z)normalize_and_validate.<locals>.<setcomp>ó   ,r
   z"conflicting Content-Length headerszbad Content-Lengths   transfer-encodingz"multiple Transfer-Encoding headersiõ  )Zerror_status_hints   chunkedz,Only Transfer-Encoding: chunked is supportedT)r   r   Ú_field_name_reÚ_field_value_reÚ
isinstancer6   ÚAssertionErrorÚlowerÚsplitr$   r   ÚpopÚ_content_length_reÚCONTENT_LENGTH_MAX_DIGITSÚappendr   )	r:   r;   Únew_headersZseen_content_lengthZsaw_transfer_encodingr*   r+   r.   Úlengthsr   r   r   r=   ˜   sT    

 ÿ
þ)r:   r*   r   c                 C   sP   g }| j D ]@\}}}||kr
| ¡ }| d¡D ]}| ¡ }|r.| |¡ q.q
|S )NrA   )r   rF   rG   r>   rK   )r:   r*   Úoutr)   Ú
found_nameÚfound_raw_valueZfound_split_valuer   r   r   Úget_comma_headerÑ   s    $rQ   )r:   r*   Ú
new_valuesr   c                 C   sP   g }| j D ] \}}}||kr
| ||f¡ q
|D ]}| | ¡ |f¡ q0t|ƒS r   )r   rK   Útitler=   )r:   r*   rR   rL   Zfound_raw_namerO   rP   Ú	new_valuer   r   r   Úset_comma_header   s    
rU   r   )Úrequestr   c                 C   s"   | j dk rdS t| jdƒ}d|kS )Ns   1.1Fs   expects   100-continue)Úhttp_versionrQ   r:   )rV   Úexpectr   r   r   Úhas_expect_100_continue  s    
rY   )F)F)%ÚreÚtypingr   r   r   r   r   r   r   r	   Z_abnfr   r   Z_utilr   r   r   Z_eventsr   r   ÚImportErrorZtyping_extensionsrJ   ÚcompilerI   ÚencoderB   rC   r6   r   r9   ZHeaderTypesr=   r   rQ   rU   rY   r   r   r   r   Ú<module>   sR   (9
2ýÿ ÿ
 þ ÿ
 þ9/