U
    g'                     @   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 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)Literals   [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-ib4s2i_e/h11/_headers.py__init__f   s    zHeaders.__init__)r   c                 C   s
   t | jS r   )boolr   r   r   r   r   __bool__i   s    zHeaders.__bool__)otherr   c                 C   s   t | t |kS r   )list)r   r    r   r   r   __eq__l   s    zHeaders.__eq__c                 C   s
   t | jS r   )lenr   r   r   r   r   __len__o   s    zHeaders.__len__c                 C   s   dt t|  S )Nz<Headers(%s)>)reprr!   r   r   r   r   __repr__r   s    zHeaders.__repr__)idxr   c                 C   s   | j | \}}}||fS r   r   )r   r'   _namevaluer   r   r   __getitem__u   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>z   s     z%Headers.raw_items.<locals>.<listcomp>r   r   r   r   r   	raw_itemsy   s    zHeaders.raw_items)__name__
__module____qualname____doc__	__slots__r   r   bytesr   r   r   objectr"   intr$   strr&   r+   r/   r   r   r   r   r   K   s   r   T)headers_parsedr   c                 C   s   d S r   r   r9   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   sP  g }d }d}| D ]4\}}|sJt |}t |}tt|d| tt|d| t|tsXtt|tsft|}| }|dkrdd |dD }t	|dkrt
d	| }tt|d
 |d kr|}||||f n||krt
d	q|dkr6|rt
ddd| }|dkr t
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
isinstancer5   AssertionErrorlowersplitr#   r   pop_content_length_reappendr   )	r9   r:   new_headersZseen_content_lengthZsaw_transfer_encodingr)   r*   r-   lengthsr   r   r   r<      sP    

 
)r9   r)   r   c                 C   sP   g }| j D ]@\}}}||kr
| }|dD ]}| }|r.|| q.q
|S )Nr@   )r   rE   rF   r=   rI   )r9   r)   outr(   
found_namefound_raw_valueZfound_split_valuer   r   r   get_comma_header   s    $rO   )r9   r)   
new_valuesr   c                 C   sP   g }| j D ] \}}}||kr
|||f q
|D ]}|| |f q0t|S r   )r   rI   titler<   )r9   r)   rP   rJ   Zfound_raw_namerM   rN   	new_valuer   r   r   set_comma_header   s    
rS   r   )requestr   c                 C   s"   | j dk rdS t| jd}d|kS )Ns   1.1Fs   expects   100-continue)http_versionrO   r9   )rT   expectr   r   r   has_expect_100_continue  s    
rW   )F)F)$retypingr   r   r   r   r   r   r   r	   Z_abnfr   r   Z_utilr   r   r   Z_eventsr   r   ImportErrorZtyping_extensionscompilerH   encoderA   rB   r5   r   r8   ZHeaderTypesr<   r   rO   rS   rW   r   r   r   r   <module>   sP   (9
2 
  
 7/