
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    '7`=x                     @   sl  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	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" ddl#m$Z$m%Z% ddl&m'Z' ddl(m)Z)m*Z* ddl+m,Z, zd dl-Z-dZ.W n e/k
r&   dZ.Y nX dZ0e1ej2Z3e4dZ5e4dZ6e4dZ7e8dddddddddddg
Z9e8d dd!d"ddddddg	Z:G d#d$ d$eZ;G d%d& d&eZ<G d'd( d(Z=G d)d* d*e j>Z?G d+d, d,e?Z@G d-d. d.e?ZAG d/d0 d0ZBG d1d2 d2ZCe@ZDeAZEe9ZFe:ZGz2esNdd3lHm@Z@mAZAm9Z9m:Z: e@ZIeAZJe9ZKe:ZLW n e/k
rf   Y nX dS )4    N)IntEnum)AnyListOptionalTupleTypeUnion)CIMultiDictCIMultiDictProxyistr)URL   )hdrs)BaseProtocol)NO_EXTENSIONSBaseTimerContext)BadStatusLineContentEncodingErrorContentLengthErrorInvalidHeaderLineTooLongTransferEncodingError)HttpVersionHttpVersion10)internal_logger)EMPTY_PAYLOADStreamReader)
RawHeadersTF)HeadersParser
HttpParserHttpRequestParserHttpResponseParserRawRequestMessageRawResponseMessagez[!#$%&'*+\-.^_`|~0-9A-Za-z]+zHTTP/(\d+).(\d+)s'   [\x00-\x1F\x7F()<>@,;:\[\]={} \t\\\\\"]r"   methodpathversionheadersraw_headersZshould_closecompressionupgradechunkedurlr#   codereasonc                   @   s   e Zd ZdZdZdZdZdS )
ParseStater   r         N)__name__
__module____qualname__
PARSE_NONEPARSE_LENGTHPARSE_CHUNKEDPARSE_UNTIL_EOF r9   r9   F/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/http_parser.pyr/   [   s   r/   c                   @   s    e Zd ZdZdZdZdZdZdS )
ChunkStater   r   r0   r1      N)r2   r3   r4   PARSE_CHUNKED_SIZEPARSE_CHUNKED_CHUNKPARSE_CHUNKED_CHUNK_EOFPARSE_MAYBE_TRAILERSPARSE_TRAILERSr9   r9   r9   r:   r;   c   s
   r;   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)rD   rE   rF   )selfrD   rE   rF   r9   r9   r:   __init__l   s    zHeadersParser.__init__CIMultiDictProxy[str]linesrG   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lstripHDRREsearchrF   r   formatdecodestrappendjoinaddr
   tuple)rI   rM   r'   r(   Z	lines_idxlineZ
line_countZbnameZbvalueheader_lengthZcontinuationZ
bvalue_lstnamevaluer9   r9   r:   parse_headersv   sz    







zHeadersParser.parse_headers)rB   rC   rB   )
r2   r3   r4   intrJ   r   bytesr   r   rh   r9   r9   r9   r:   r   k   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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 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   rB   rC   FT)protocollooplimitrD   rE   rF   timerr-   r$   readallpayload_exceptionresponse_with_bodyread_until_eofauto_decompressrG   c                 C   s   || _ || _|| _|| _|| _|| _|| _|	| _|
| _|| _	|| _
|| _g | _d| _d| _d | _d | _|| _|| _t|||| _d S )NrS   F)rl   rm   rD   rE   rF   ro   r-   r$   rp   rq   rr   rs   _lines_tail	_upgraded_payload_payload_parser_auto_decompress_limitr   _headers_parser)rI   rl   rm   rn   rD   rE   rF   ro   r-   r$   rp   rq   rr   rs   rt   r9   r9   r:   rJ      s(    zHttpParser.__init__rL   c                 C   s   d S rH   r9   )rI   rM   r9   r9   r:   parse_message   s    zHttpParser.parse_messagerG   c                 C   sz   | j d k	r| j   d | _ nZ| jr0| j| j | jrv| jd dkrP| jd z| | jW S  tk
rt   Y d S X d S )Nz
rS   )ry   feed_eofrv   ru   r`   r}   	ExceptionrI   r9   r9   r:   r      s    

zHttpParser.feed_eof   
rS   )dataSEPEMPTYCONTENT_LENGTHMETH_CONNECTSEC_WEBSOCKET_KEY1rG   c                 C   s  g }| j r| j | d }| _ t|}d}	| j}
|	|k r| jd kr| js|||	}||	krp| jsp|d }	q.||	kr| j||	|  |d }	| jd |krz| 	| j}W 5 | j  X |j
|}|d k	rzt|}W n tk
r   t|Y nX |dk rt|||j
kr,t||j| _t|d| j}| jd k	sRt|d k	rf|dksv|jr|jst| j| j|
| jd}t|||j||j| j| j| j| jd	}|jsv|| _n||krt| j| j|
| jd}d| _t||j|jd| jd	| _nrt|d
ddkrr|d krr| jrrt| j| j|
| jd}t|||j||j| jd| j| jd	}|jsv|| _nt }|||f n||	d  | _ |}qq.| jd kr| jr| jrtqq.|r|	|k r| jrt| jd k	stz| j!||	d  \}}W n` t"k
rl } z@| j#d k	rF| jj$%| #t&| n| jj$%| d}d}W 5 d }~X Y nX |rd}	t|}d | _q.q.qq.|r|	|k r||	d  }n|}|| j|fS )NrS   r   r0   r   r$   )ro   rm   rn   )lengthr+   r$   r)   r-   rp   rr   rt   T)r$   r)   rp   rt   r-   d      )'rv   rV   rm   ry   rw   findru   r`   clearr}   r'   getri   rX   r   r*   getattrr$   rl   AssertionErrorr+   r   ro   r{   HttpPayloadParserr)   r-   rp   rr   rz   doners   r   	feed_dataBaseExceptionrq   payloadset_exceptionr_   )rI   r   r   r   r   r   r   messagesZdata_lenZ	start_posrm   posmsgr   r$   r   Zpayload_parsereofexcr9   r9   r:   r     s   






	zHttpParser.feed_datarK   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}|rd| krd}||||||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-aliver*   )gzipdeflatebrr+   )r|   rh   r   r   Z
CONNECTIONlowerZCONTENT_ENCODINGZTRANSFER_ENCODING)rI   rM   r'   r(   Z
close_connencodingr*   r+   Zconnvencter9   r9   r:   rh     s.    
zHttpParser.parse_headers)valrG   c                 C   s
   || _ dS )zYSet connection upgraded (to websocket) mode.
        :param bool val: new state.
        N)rw   )rI   r   r9   r9   r:   set_upgraded  s    zHttpParser.set_upgraded)NNrk   rB   rC   rB   NNNFNTFT)r2   r3   r4   r   r   asyncioZAbstractEventLoopri   r   r_   boolr   r   rJ   abcabstractmethodr   rj   r   r}   r   r   r   r   r   r   r   r   r   rh   r   r9   r9   r9   r:   r      sn                 
' .)r   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.
    rL   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||d\}}}|d\}}	}
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r4|tkr0d}nd}t|||||||||tj||
|dd
S )Nr   rT   rU   r0   Status line is too long#?zHTTP/   .r   TF)r%   Zquery_stringfragmentencoded)r^   rW   rX   r   rV   rD   r   r_   	partitionMETHREmatch
startswithr   ri   r   rh   r   r"   r   build)rI   rM   rd   r$   r%   r&   Z	path_partZ_hash_separatorZurl_fragmentZ_question_mark_separatorZqs_partZn1Zn2	version_or'   r(   r   r)   r*   r+   r9   r9   r:   r}     sf      





zHttpRequestParser.parse_messageNr2   r3   r4   __doc__r   rj   r   r}   r9   r9   r9   r:   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 RawResponseMessagerL   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   rT   rU   r    r   r0   i  )r^   rW   rX   r   rV   rD   r   r_   VERSREr   r   ri   grouprh   r   r#   rY   )rI   rM   rd   r&   statusr.   r   r   Zstatus_ir'   r(   r   r)   r*   r+   r9   r9   r:   r}   3  s\    
  




z HttpResponseParser.parse_messageNr   r9   r9   r9   r:   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+   r)   r-   r$   rp   rr   rt   rG   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   rS   FT   )ZPUTZPOSTz6Content-Length or Transfer-Encoding header is required)_lengthr/   r5   _typer;   r=   _chunk_chunk_size_chunk_tailrz   r   DeflateBufferr   r7   r6   r8   r   warningr   )rI   r   r   r+   r)   r-   r$   rp   rr   rt   Zreal_payloadr9   r9   r:   rJ   n  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   r/   r8   r   r   r6   r   r7   r   r   r9   r9   r:   r     s    zHttpPayloadParser.feed_eofr      ;)chunkr   	CHUNK_EXTrG   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   )TrS   TrS      asciirU   r0   )FrS   r   )r   r/   r6   r   rV   r   r   r   r7   r   r   r;   r=   r   ri   rj   rX   r   r^   r   r@   r>   r   begin_http_chunk_receivingr?   end_http_chunk_receivingrA   r8   )rI   r   r   r   requiredZ	chunk_lenr   iZsize_bsizer   headr9   r9   r:   r     s    

















zHttpPayloadParser.feed_data)NFNNNFTT)r   r   )r2   r3   r4   r   r   ri   r   r_   rJ   r   rj   r   r   r9   r9   r9   r:   r   m  s:           8     
r   c                   @   sr   e Zd ZdZ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.N)outr   rG   c                 C   sb   || _ d| _|| _d| _|dkr8ts,tdt | _n&|dkrJdt	j
 nt	j
}t	j|d| _d S )Nr   Fr   zGCan not decode content-encoding: brotli (br). Please install `brotlipy`r   r   Zwbits)r   r   r   _started_decoding
HAS_BROTLIr   brotliZDecompressordecompressorzlib	MAX_WBITSdecompressobj)rI   r   r   Z	zlib_moder9   r9   r:   rJ   /  s    zDeflateBuffer.__init__)r   rG   c                 C   s   | j | d S rH   )r   r   )rI   r   r9   r9   r:   r   @  s    zDeflateBuffer.set_exception)r   r   rG   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   
decompressr   r   r   r   rV   )rI   r   r   r9   r9   r:   r   C  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   flushr   r   r   rV   r   r   r   r   )rI   r   r9   r9   r:   r   a  s    
zDeflateBuffer.feed_eofc                 C   s   | j   d S rH   )r   r   r   r9   r9   r:   r   k  s    z(DeflateBuffer.begin_http_chunk_receivingc                 C   s   | j   d S rH   )r   r   r   r9   r9   r:   r   n  s    z&DeflateBuffer.end_http_chunk_receiving)r2   r3   r4   r   r   r   r_   rJ   r   r   rj   ri   r   r   r   r   r9   r9   r9   r:   r   ,  s   
r   )r    r!   r"   r#   )Mr   r   collectionsrestringr   enumr   typingr   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   Zhttp_writerr   r   logr   Zstreamsr   r   Ztypedefsr   r   r   ImportError__all__set	printableZASCIISETcompiler   r   r[   
namedtupler"   r#   r/   r;   r   ABCr   r    r!   r   r   ZHttpRequestParserPyZHttpResponseParserPyZRawRequestMessagePyZRawResponseMessagePyZ_http_parserZHttpRequestParserCZHttpResponseParserCZRawRequestMessageCZRawResponseMessageCr9   r9   r9   r:   <module>   s     
	
	


^  K@ @F