a
    !fD                     @   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 e9yR   dZ8Y n0 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g d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'd( d(eMeE ZNG d)d* d*eMeG ZOG d+d, d,ZPG d-d. d.ZQeNZReOZSeEZTeGZUz2e"sdd/lVmNZNmOZOmEZEmGZG eNZWeOZXeEZYeGZZW n e9y   Y n0 dS )0    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   T/var/www/html/python-backend/venv/lib/python3.9/site-packages/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yT   t|d Y n0 |d}| }t|rzt|t|| j	krt
d|ddt| j	tt|t|}	|d7 }|| }|o|d dv }
|
rt|g}|
rh|	t|7 }	|	| j	kr&t
d	|ddt| j	t|	|| |d7 }||k r^|| }|rf|d dv }
qd
}qhqd
|}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 ur| j   d | _ nh| jr0| j| j | jr| jd dkrP| jd tt | | jW  d    S 1 sz0    Y  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 rv| jd u r| js|||	}||	krp| jsp|d }	q.||	krj| j||	|  |d }	| jd |krz| | jW | j	  n| j	  0 t
t d fdd}| }|jv r t|j| _td| j}| jd us&J |d ur:|dksJjrjst| j| j|
| jd	}t||j|j| j| j| j| jd
	}|jsZ|| _n||krttsJ t| j| j|
| jd	}d| _t|jjd| jd| _nrtdddkrV|d u rV| jrVt| j| j|
| jd	}t||j|j| jd| j| jd
	}|jsZ|| _nt }||f n||	d  | _ |}qvq.| jd u r| jr| jrvJ qvq.|rv|	|k rv| jrJ | jd usJ z| j!||	d  \}}W nb t"yR } zH| j#d ur(| jj$%| #t&| n| jj$%| d}d}W Y d }~n
d }~0 0 |rtd}	t|}d | _q.q.qvq.|r|	|k r||	d  }n|}|| j|fS )Nre   r   rH   r   r   c                     sT   j  } | d u rd S zt| }W n ty>   t Y n0 |dk rPt |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   r   clearr   rz   r5   r   r9   getattrr1   r}   r:   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   messagesdata_len	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v r|
}|tj}|durd| krd}ntd	tj	|v 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   asyncio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yB   t|d Y n0 t|| jkrltdt| jtt|t	|s~t|zB|
dr|dd  dd	\}}tt|t|}nt|W n ty   t|Y n0 |d
krtj|dd}	nL|
dr4|d\}
}}|
d\}
}}tj|
||dd}	nt|dd}	| |\}}}}}}|d u rt|tkrpd}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   
  sl    

	


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   sN  |d  dd}z|d d\}}W n ty@   t|d Y n0 z|d d\}}W n tyl   d}Y n0 t|| jkrtdt| jtt|t	|}|d u rt|t
t|dt|d}zt|}W n ty   t|d Y n0 |dkr
t|| |\}	}
}}}}|d u r2|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  sX    




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 urtj| _|| _ | j dkr|
  d| _
n>|r|dkrtj| _n(|dv 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]     sD    


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   s8  | 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| _	|r4| j
tjkr||}|dkr||d|}|dkr|d | }n|d | }ztt|d}	W n> tyZ   t|d | dd}
| j|
 |
d Y n0 ||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r`|d d |krV|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r4| 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     s4           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yx   t	d| j Y n0 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   helpersr   r   Zhttp_exceptionsr   r   r   r   r   r   r   Zhttp_writerr    r!   logr"   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>   st   
8$	
		^  +ZA @Z