U
    u?dD                     @   s  U d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ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(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5m6Z6 zd dl7Z7dZ8W n e9k
rT   dZ8Y nX dZ:e;ej<Z=e5ee>  e?d< e@dZAe5ee>  e?d< e@dZBe5ee>  e?d< e@dZCe5eeD  e?d< G dd deZEeFddddd d!d"d#d$d%g	ZGed&eEeGZHG d'd( d(e	ZIG d)d* d*e	ZJG d+d, d,ZKG d-d. d.e jLeeH ZMG d/d0 d0eMeE ZNG d1d2 d2eMeG ZOG d3d4 d4ZPG d5d6 d6ZQeNZReOZSeEZTeGZUz2e"sdd7lVmNZNmOZOmEZEmGZG eNZWeOZXeEZYeGZZW n e9k
r   Y nX dS )8    N)suppress)IntEnum)AnyGenericList
NamedTupleOptionalPatternSetTupleTypeTypeVarUnioncast)CIMultiDictCIMultiDictProxyistr)URL   )hdrs)BaseProtocol)NO_EXTENSIONSBaseTimerContext)BadHttpMessageBadStatusLineContentEncodingErrorContentLengthErrorInvalidHeaderLineTooLongTransferEncodingError)HttpVersionHttpVersion10)internal_logger)EMPTY_PAYLOADStreamReader)Final
RawHeadersTF)HeadersParser
HttpParserHttpRequestParserHttpResponseParserRawRequestMessageRawResponseMessageASCIISETz[!#$%&'*+\-.^_`|~0-9A-Za-z]+METHREzHTTP/(\d+).(\d+)VERSREs'   [\x00-\x1F\x7F()<>@,;:\[\]={} \t\\\\\"]HDRREc                   @   sb   e Zd ZU eed< eed< eed< ded< eed< eed< ee ed< eed	< eed
< e	ed< dS )r+   methodpathversionCIMultiDictProxy[str]headersraw_headersshould_closecompressionupgradechunkedurlN)
__name__
__module____qualname__str__annotations__r    r&   boolr   r    rB   rB   7/tmp/pip-unpacked-wheel-_pk67_um/aiohttp/http_parser.pyr+   K   s   
r+   r,   r3   codereasonr5   r6   r7   r8   r9   r:   _MsgTc                   @   s   e Zd ZdZdZdZdZdS )
ParseStater   r         N)r<   r=   r>   
PARSE_NONEPARSE_LENGTHPARSE_CHUNKEDPARSE_UNTIL_EOFrB   rB   rB   rC   rG   k   s   rG   c                   @   s    e Zd ZdZdZdZdZdZdS )
ChunkStater   r   rH   rI      N)r<   r=   r>   PARSE_CHUNKED_SIZEPARSE_CHUNKED_CHUNKPARSE_CHUNKED_CHUNK_EOFPARSE_MAYBE_TRAILERSPARSE_TRAILERSrB   rB   rB   rC   rN   s   s
   rN   c                   @   s>   e Zd ZdeeeddddZee edef dd	d
Z	dS )r'        N)max_line_sizemax_headersmax_field_sizereturnc                 C   s   || _ || _|| _d S N)rW   rX   rY   )selfrW   rX   rY   rB   rB   rC   __init__|   s    zHeadersParser.__init__r4   linesrZ   c                 C   s  t  }g }d}|d }t|}|rz|dd\}}W n tk
rV   t|d Y nX |d}| }t|r|t|t|| j	krt
d|ddt| j	tt|t|}	|d7 }|| }|o|d dk}
|
rv|g}|
rj|	t|7 }	|	| j	kr(t
d	|ddt| j	t|	|| |d7 }||k r`|| }|rh|d dk}
qd
}qjqd
|}n0|	| j	krt
d	|ddt| j	t|	| }|dd}|dd}||| |||f qt|t|fS )Nr      :s    	zrequest header name {}utf8xmlcharrefreplacer   )    	   zrequest header field {}    utf-8surrogateescape)r   lensplit
ValueErrorr   striplstripr0   searchrY   r   formatdecoder?   appendjoinaddr   tuple)r\   r_   r5   r6   Z	lines_idxline
line_countZbnameZbvalueheader_lengthZcontinuationZ
bvalue_lstnamevaluerB   rB   rC   parse_headers   sz    







zHeadersParser.parse_headers)rU   rV   rU   )
r<   r=   r>   intr]   r   bytesr   r&   ry   rB   rB   rB   rC   r'   {   s      
r'   c                   @   s   e Zd Zdee eej eeeeee ee ee	 e
eee  e
e
e
dddd	Zejee ed
ddZee dddZddejejejfeeeee	eeeeeef  e
ef dddZee edeee
 ee	 e
e
f d
ddZe
ddddZdS )r(   N   rU   rV   FT)protocollooplimitrW   rX   rY   timerrD   r1   readallpayload_exceptionresponse_with_bodyread_until_eofauto_decompressrZ   c                 C   s   || _ || _|| _|| _|| _|| _|| _|	| _|
| _|| _	|| _
|| _g | _d| _d| _d | _d | _|| _|| _t|||| _d S )Nre   F)r}   r~   rW   rX   rY   r   rD   r1   r   r   r   r   _lines_tail	_upgraded_payload_payload_parser_auto_decompress_limitr'   _headers_parser)r\   r}   r~   r   rW   rX   rY   r   rD   r1   r   r   r   r   r   rB   rB   rC   r]      s(    zHttpParser.__init__r^   c                 C   s   d S r[   rB   )r\   r_   rB   rB   rC   parse_message  s    zHttpParser.parse_messagerZ   c              
   C   s|   | j d k	r| j   d | _ n\| jr0| j| j | jrx| jd dkrP| jd tt | | jW  5 Q R  S Q R X d S )Nz
re   )r   feed_eofr   r   rp   r   	Exceptionr   r\   rB   rB   rC   r     s    


zHttpParser.feed_eof   
re   )dataSEPEMPTYCONTENT_LENGTHMETH_CONNECTSEC_WEBSOCKET_KEY1rZ   c                    s  g }| j r| j | d }| _ t|}d}	| j}
|	|k rh| jd krv| jsv|||	}||	krp| jsp|d }	q.||	kr^| j||	|  |d }	| jd |krtz| 	| jW 5 | j  X t
t d fdd}| }|jkrt|j| _td| j}| jd k	st|d k	r.|dks>jrjst| j| j|
| jd	}t||j|j| j| j| j| jd
	}|jsN|| _n||krttstt| j| j|
| jd	}d| _t|jjd| jd| _nrtdddkrJ|d krJ| j rJt| j| j|
| jd	}t||j|j| jd| j| jd
	}|jsN|| _nt!}||f n||	d  | _ |}qhq.| jd kr| jr| jrhtqhq.|rh|	|k rh| jrt| jd k	stz| j"||	d  \}}W n` t#k
rD } z@| j$d k	r| jj%&| $t'| n| jj%&| d}d}W 5 d }~X Y nX |rfd}	t|}d | _q.q.qhq.|r|	|k r||	d  }n|}|| j|fS )Nre   r   rH   r   r   c                     sV   j  } | d krd S zt| }W n tk
r@   t Y nX |dk rRt |S )Nr   )r5   getrz   rj   r   )Z
length_hdrlengthr   msgrB   rC   get_content_length?  s    z0HttpParser.feed_data.<locals>.get_content_lengthr1   )r   r~   r   )r   r:   r1   r8   rD   r   r   r   T)r1   r8   r   r   rD   d      )(r   rh   r~   r   r   findr   rp   clearr   r   rz   r5   r   r9   getattrr1   r}   AssertionErrorr:   r$   r   r   HttpPayloadParserr8   rD   r   r   r   done
isinstancer+   r   r#   	feed_dataBaseExceptionr   payloadset_exceptionr?   )r\   r   r   r   r   r   r   messagesZdata_lenZ	start_posr~   posr   r   r1   r   Zpayload_parsereofexcrB   r   rC   r     s    





	zHttpParser.feed_datar4   c                 C   s   | j |\}}d}d}d}d}|tj}|r`| }	|	dkrFd}n|	dkrTd}n|	dkr`d}|tj}
|
r|
 }
|
dkr|
}|tj}|dk	rd| krd}ntd	tj	|krtd
||||||fS )zParses RFC 5322 headers from a stream.

        Line continuations are supported. Returns list of header name
        and value pairs. Header name is in upper case.
        NFcloseTz
keep-aliver9   )gzipdeflatebrr:   z'Request has invalid `Transfer-Encoding`z6Content-Length can't be present with Transfer-Encoding)
r   ry   r   r   Z
CONNECTIONlowerZCONTENT_ENCODINGZTRANSFER_ENCODINGr   r   )r\   r_   r5   r6   Z
close_connencodingr9   r:   connvencterB   rB   rC   ry     s:    

zHttpParser.parse_headers)valrZ   c                 C   s
   || _ dS )zZSet connection upgraded (to websocket) mode.

        :param bool val: new state.
        N)r   )r\   r   rB   rB   rC   set_upgraded  s    zHttpParser.set_upgraded)NNr|   rU   rV   rU   NNNFNTFT) r<   r=   r>   r   r   asyncioZAbstractEventLooprz   r   r?   rA   r   r   r]   abcabstractmethodr   r{   rF   r   r   r   r   r   r   r   r   r$   r   r&   ry   r   rB   rB   rB   rC   r(      sn                 
' 61r(   c                   @   s$   e Zd ZdZee edddZdS )r)   zRead request status line.

    Exception .http_exceptions.BadStatusLine
    could be raised in case of any errors in status line.
    Returns RawRequestMessage.
    r^   c                 C   s  |d  dd}z|d d\}}}W n tk
rD   t|d Y nX t|| jkrntdt| jtt|t	|st|zB|
dr|dd  dd	\}}tt|t|}nt|W n tk
r   t|Y nX |d
krtj|dd}	nL|
dr8|d\}
}}|
d\}
}}tj|
||dd}	nt|dd}	| |\}}}}}}|d krx|tkrtd}nd}t||||||||||	
S )Nr   rf   rg   rH   Status line is too longzHTTP/   .r   ZCONNECTT)	authorityencoded/#?)r2   Zquery_stringfragmentr   )r   F)ro   ri   rj   r   rh   rW   r   r?   r.   match
startswithr    rz   r   r   build	partitionry   r!   r+   )r\   r_   rt   r1   r2   r3   Zn1Zn2	version_or;   Z	path_partZ_hash_separatorZurl_fragmentZ_question_mark_separatorZqs_partr5   r6   r   r8   r9   r:   rB   rB   rC   r   
  sp      


	


zHttpRequestParser.parse_messageN)r<   r=   r>   __doc__r   r{   r+   r   rB   rB   rB   rC   r)     s   r)   c                   @   s$   e Zd ZdZee edddZdS )r*   zRead response status line and headers.

    BadStatusLine could be raised in case of any errors in status line.
    Returns RawResponseMessage.
    r^   c              
   C   sT  |d  dd}z|d d\}}W n tk
rB   t|d Y nX z|d d\}}W n tk
rp   d}Y nX t|| jkrtdt| jtt|t	|}|d krt|t
t|dt|d}zt|}W n tk
r   t|d Y nX |dkrt|| |\}	}
}}}}|d kr8|tk}t||| |	|
||||	S )	Nr   rf   rg   r    r   rH   i  )ro   ri   rj   r   rh   rW   r   r?   r/   r   r    rz   groupry   r!   r,   rk   )r\   r_   rt   r3   statusrE   r   r   Zstatus_ir5   r6   r   r8   r9   r:   rB   rB   rC   r   c  s\    
  




z HttpResponseParser.parse_messageN)r<   r=   r>   r   r   r{   r,   r   rB   rB   rB   rC   r*   \  s   r*   c                   @   sj   e Zd Zdeee eee ee ee eeedd
ddZdddd	Z	de
e
e
eee
f dddZdS )r   NFT)
r   r   r:   r8   rD   r1   r   r   r   rZ   c
                 C   s   d| _ tj| _tj| _d| _d| _|	| _	d| _
|rH|rH| j	rHt||}
n|}
|shtj| _|
  d| _
n||rvtj| _nn|d k	rtj| _|| _ | j dkr|
  d| _
n>|r|dkrtj| _n(|dkrtd tj| _|
  d| _
|
| _d S )Nr   re   FT   )PUTPOSTz6Content-Length or Transfer-Encoding header is required)_lengthrG   rJ   _typerN   rP   _chunk_chunk_size_chunk_tailr   r   DeflateBufferr   rL   rK   rM   r"   warningr   )r\   r   r   r:   r8   rD   r1   r   r   r   Zreal_payloadrB   rB   rC   r]     sF     


zHttpPayloadParser.__init__r   c                 C   sF   | j tjkr| j  n*| j tjkr.tdn| j tjkrBtdd S )Nz2Not enough data for satisfy content length header.z3Not enough data for satisfy transfer length header.)	r   rG   rM   r   r   rK   r   rL   r   r   rB   rB   rC   r     s    zHttpPayloadParser.feed_eofr      ;)chunkr   	CHUNK_EXTrZ   c                 C   s:  | j tjkr| j}t|}||krT|| | _| j|| | jdkr| j  dS n6d| _| j|d | | | j  d||d  fS n| j tjkr| j	r| j	| }d| _	|r6| j
tjkr||}|dkr||d|}|dkr|d | }n|d | }ztt|d}	W n@ tk
r\   t|d | dd}
| j|
 |
d Y nX ||d d  }|	dkrtj| _
ntj| _
|	| _| j  n
|| _	d	S | j
tjkr"| j}t|}||kr|| | _| j|| d	S d| _| j|d | | ||d  }tj| _
| j  | j
tjkrb|d d |krX|dd  }tj| _
n
|| _	d	S | j
tjkr|d d }||kr| j  d|dd  fS |sd	S ||d d
 kr|| _	d	S tj| _
| j
tjkr||}|dkr||d d  }tj| _
q|| _	d	S qn | j tjkr6| j|t| d	S )Nr   )Tre   Tre      asciirg   rH   )Fre   r   )r   rG   rK   r   rh   r   r   r   rL   r   r   rN   rP   r   rz   r{   rj   r   ro   r   rS   rQ   r   begin_http_chunk_receivingrR   end_http_chunk_receivingrT   rM   )r\   r   r   r   requiredZ	chunk_lenr   iZsize_bsizer   headrB   rB   rC   r     s    

















zHttpPayloadParser.feed_data)NFNNNFTT)r   r   )r<   r=   r>   r$   r   rz   rA   r?   r]   r   r{   r   r   rB   rB   rB   rC   r     s:           8     
r   c                   @   s|   e Zd ZU dZeed< eee ddddZ	e
dddd	Zeedd
ddZddddZddddZddddZdS )r   zDDeflateStream decompress stream and feed data into specified stream.decompressorN)outr   rZ   c                 C   sn   || _ d| _|| _d| _|dkrDts,tdG dd d}| | _n&|dkrVdtj ntj}tj	|d	| _d S )
Nr   Fr   zECan not decode content-encoding: brotli (br). Please install `Brotli`c                   @   s8   e Zd ZddddZeedddZeddd	ZdS )
z-DeflateBuffer.__init__.<locals>.BrotliDecoderNr   c                 S   s   t  | _d S r[   )brotliZDecompressor_objr   rB   rB   rC   r]   r  s    z6DeflateBuffer.__init__.<locals>.BrotliDecoder.__init__)r   rZ   c                 S   s0   t | jdrtt| j|S tt| j|S )N
decompress)hasattrr   r   r{   r   process)r\   r   rB   rB   rC   r   u  s    z8DeflateBuffer.__init__.<locals>.BrotliDecoder.decompressc                 S   s    t | jdrtt| j S dS )Nflushre   )r   r   r   r{   r   r   rB   rB   rC   r   z  s    z3DeflateBuffer.__init__.<locals>.BrotliDecoder.flush)r<   r=   r>   r]   r{   r   r   rB   rB   rB   rC   BrotliDecodern  s   r   r   r   wbits)
r   r   r   _started_decoding
HAS_BROTLIr   r   zlib	MAX_WBITSdecompressobj)r\   r   r   r   	zlib_moderB   rB   rC   r]   a  s    
zDeflateBuffer.__init__)r   rZ   c                 C   s   | j | d S r[   )r   r   )r\   r   rB   rB   rC   r     s    zDeflateBuffer.set_exception)r   r   rZ   c                 C   s   |sd S |  j |7  _ | jsH| jdkrH|d d@ dkrHtjtj d| _z| j|}W n" tk
rz   t	d| j Y nX d| _|r| j
|t| d S )Nr   r         r   z#Can not decode content-encoding: %sT)r   r   r   r   r   r   r   r   r   r   r   r   rh   )r\   r   r   rB   rB   rC   r     s&    
zDeflateBuffer.feed_datar   c                 C   sR   | j  }|s| jdkrD| j|t| | jdkrD| j jsDtd| j	  d S )Nr   r   )
r   r   r   r   r   rh   r   r   r   r   )r\   r   rB   rB   rC   r     s    
zDeflateBuffer.feed_eofc                 C   s   | j   d S r[   )r   r   r   rB   rB   rC   r     s    z(DeflateBuffer.begin_http_chunk_receivingc                 C   s   | j   d S r[   )r   r   r   rB   rB   rC   r     s    z&DeflateBuffer.end_http_chunk_receiving)r<   r=   r>   r   r   r@   r$   r   r?   r]   r   r   r{   rz   r   r   r   r   rB   rB   rB   rC   r   \  s   
#
r   )r)   r*   r+   r,   )[r   r   collectionsrestringr   
contextlibr   enumr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   Z	multidictr   r   r   Zyarlr   r   r   Zbase_protocolr   Zhelpersr   r   Zhttp_exceptionsr   r   r   r   r   r   r   Zhttp_writerr    r!   logr"   Zstreamsr#   r$   Ztypedefsr%   r&   r   r   ImportError__all__set	printabler-   r?   r@   compiler.   r/   r0   r{   r+   
namedtupler,   rF   rG   rN   r'   ABCr(   r)   r*   r   r   ZHttpRequestParserPyZHttpResponseParserPyZRawRequestMessagePyZRawResponseMessagePyZ_http_parserZHttpRequestParserCZHttpResponseParserCZRawRequestMessageCZRawResponseMessageCrB   rB   rB   rC   <module>   s    8$	
		^  +ZA @Z