o
    Zh                     @   s  U 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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#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z; ddl<m=Z= dZ>ed Z?e@ejAZBeeeC  eDd< eEdZFeeC eDd< eGdeF dZHeeeC  eDd< eGdejIZJeeeC  eDd< eGdejIZKeeeC  eDd< eGdZLeeeM  eDd< G dd  d eZNG d!d" d"eZOed#eNeOZPG d$d% d%eZQG d&d' d'eZRG d(d) d)ZSG d*d+ d+e jTeeP ZUG d,d- d-eUeN ZVG d.d/ d/eUeO ZWG d0d1 d1ZXG d2d3 d3ZYeVZZeWZ[eNZ\eOZ]ze'sydd4l^mVZVmWZWmNZNmOZO eVZ_eWZ`eNZaeOZbW dS W dS  ecy   Y dS w )5    N)suppress)IntEnum)AnyClassVarFinalGenericListLiteral
NamedTupleOptionalPatternSetTupleTypeTypeVarUnion)CIMultiDictCIMultiDictProxyistr)URL   )hdrs)BaseProtocol)
HAS_BROTLIBrotliDecompressorZLibDecompressor)DEBUGNO_EXTENSIONSBaseTimerContextmethod_must_be_empty_bodystatus_code_must_be_empty_body)BadHttpMessageBadStatusLineContentEncodingErrorContentLengthErrorInvalidHeaderInvalidURLErrorLineTooLongTransferEncodingError)HttpVersionHttpVersion10)internal_logger)EMPTY_PAYLOADStreamReader)
RawHeaders)HeadersParser
HttpParserHttpRequestParserHttpResponseParserRawRequestMessageRawResponseMessage)   
   
ASCIISETz!#$%&'*+-.^_`|~_TCHAR_SPECIALSz
[0-9A-Za-zz]+TOKENREzHTTP/(\d)\.(\d)VERSREz\d+DIGITSs   [0-9a-fA-F]+	HEXDIGITSc                   @   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 )r3   methodpathversionCIMultiDictProxy[str]headersraw_headersshould_closecompressionupgradechunkedurlN)
__name__
__module____qualname__str__annotations__r)   r.   boolr   r    rN   rN   J/var/www/html/lang_env/lib/python3.10/site-packages/aiohttp/http_parser.pyr3   O   s   
 r3   c                   @   s^   e Zd ZU eed< eed< eed< ee ed< eed< e	ed< e
e ed< e	ed< e	ed	< d
S )r4   r?   codereasonrA   rB   rC   rD   rE   rF   N)rH   rI   rJ   r)   rL   intrK   r   r.   rM   r   rN   rN   rN   rO   r4   \   s   
 r4   _MsgTc                   @   s   e Zd ZdZdZdZdZdS )
ParseStater   r         N)rH   rI   rJ   
PARSE_NONEPARSE_LENGTHPARSE_CHUNKEDPARSE_UNTIL_EOFrN   rN   rN   rO   rT   k   s
    rT   c                   @   s    e Zd ZdZdZdZdZdZdS )
ChunkStater   r   rU   rV      N)rH   rI   rJ   PARSE_CHUNKED_SIZEPARSE_CHUNKED_CHUNKPARSE_CHUNKED_CHUNK_EOFPARSE_MAYBE_TRAILERSPARSE_TRAILERSrN   rN   rN   rO   r[   s   s    r[   c                	   @   sL   e Zd Z			ddedededdfdd	Zd
ee dedef fddZ	dS )r/        max_line_sizemax_headersmax_field_sizereturnNc                 C   s   || _ || _|| _d S N)rd   re   rf   )selfrd   re   rf   rN   rN   rO   __init__|   s   
zHeadersParser.__init__linesr@   c                 C   s2  t  }g }d}|d }t|}|rz
|dd\}}W n ty(   t|d w t|dkr3t||d |d hddh@ rCt||d}t|| jkrctd|	d	d
t
| jt
t||	dd}	t|	srt|t|}
|d7 }|| }|o|d dv }|r|g}|r|
t|7 }
|
| jkrtd|	d	d
t
| jt
|
|| |d7 }||k r|| }|r|d dv }nd}n|sd|}n|
| jkrtd|	d	d
t
| jt
|
|d}|	dd}d|v sd|v sd|v rt|||	| |||f |st|t|fS )Nr      :r       	   s    	zrequest header name {}utf8backslashreplaceutf-8surrogateescape)rn   ro   zrequest header field {}    
 )r   lensplit
ValueErrorr%   lstriprf   r'   formatdecoderK   r9   	fullmatchappendjoinstripaddr   tuple)ri   rk   rA   rB   Z	lines_idxline
line_countZbnameZbvaluenameheader_lengthZcontinuationZ
bvalue_lstvaluerN   rN   rO   parse_headers   s   










QzHeadersParser.parse_headers)rb   rc   rb   )
rH   rI   rJ   rR   rj   r   bytesr   r.   r   rN   rN   rN   rO   r/   {   s$    


r/   c                   @   s\  e Zd ZU dZee ed< 														d.dee d	ee	j
 d
ededededee dee dee dedeee  dedededdfddZejdee defddZdee fddZddejejejfd ed!ed"ed#ed$ed%edeeeeef  eef fd&d'Z dee ded(e!ee ee eef fd)d*Z"d+eddfd,d-Z#dS )/r0   FlaxN   rb   rc   Tprotocollooplimitrd   re   rf   timerrP   r=   readallpayload_exceptionresponse_with_bodyread_until_eofauto_decompressrg   c                 C   s   || _ || _|| _|| _|| _|| _|| _|	| _|
| _|| _	|| _
|| _g | _d| _d| _d | _d | _|| _|| _t|||| _d S )Nrt   F)r   r   rd   re   rf   r   rP   r=   r   r   r   r   _lines_tail	_upgraded_payload_payload_parser_auto_decompress_limitr/   _headers_parser)ri   r   r   r   rd   re   rf   r   rP   r=   r   r   r   r   r   rN   rN   rO   rj      s(   zHttpParser.__init__rk   c                 C   s   d S rh   rN   )ri   rk   rN   rN   rO   parse_message  s   zHttpParser.parse_messagec                 C   s   | j d ur| j   d | _ d S | jr| j| j | jrC| jd dkr)| jd tt | | jW  d    S 1 s>w   Y  d S )Nrm   z
rt   )r   feed_eofr   r   r   r   	Exceptionr   ri   rN   rN   rO   r     s   



 zHttpParser.feed_eofr5   rt   dataSEPEMPTYCONTENT_LENGTHMETH_CONNECTSEC_WEBSOCKET_KEY1c                    s  g }| j r| j | d}| _ t|}d}	| j}
|	|k r| jd u rZ| jsZ|||	}||	kr:| js:|t| }	q||	krP||	| }|dkrN|d}| j| |t| }	| jd |krOz| 	| jW | j
  n| j
  w dtt f fdd}| }|jv rt|j| _td	| j}td
d}| jd usJ t|pt|ot|}|s|d ur|dksjrjst| j| j|
| jd}t||j|j| j| j| j| j| j d
}|j!s|| _n_||krt"t#sJ t| j| j|
| jd}d| _t|jjd| j| j d| _n5|sF|d u rF| j$rFt| j| j|
| jd}t||j|j| jd| j| j| j d
}|j!sE|| _nt%}||f n||	d  | _ |}n{| jd u rk| jrk| jrjJ nj|r|	|k r| jryJ | jd usJ z| j&||	d  |\}}W n1 t'y } z$| j(d ur| jj)*| (t+| n| jj)*| d}d}W Y d }~nd }~ww |rd}	t|}d | _qnn|	|k s|r|	|k r||	d  }n|}|| j|fS )Nrt   r   r6      rm   rg   c                     s2   j  } | d u rd S t| st t| S rh   )rA   getr;   r~   r%   rR   )Z
length_hdrr   msgrN   rO   get_content_lengthP  s   
z0HttpParser.feed_data.<locals>.get_content_lengthr=   rP   )r   r   r   )	lengthrF   r=   rD   rP   r   r   r   r   T)r=   rD   r   r   r   ),r   rx   r   r   r   findr   rstripr   r   clearr   rR   rA   r%   rE   getattrr=   r   r    rM   r   rF   r-   r   r   HttpPayloadParserrD   rP   r   r   r   r   done
isinstancer3   r   r,   	feed_dataBaseExceptionr   payloadset_exceptionrK   )ri   r   r   r   r   r   r   messagesdata_len	start_posr   posr   r   r   r=   rP   Z
empty_bodyr   Zpayload_parsereofexcrN   r   rO   r   #  s  








  zHttpParser.feed_datar@   c              
      s<  | j |\ }d}d}d}d}tjtjtjtjtjtjtj	tj
tjtjf
}t fdd|D d}|dur>td| d tj}	|	rd|	 }
|
dkrQd}n|
d	krXd}n|
d
krd tjrdd} tj}|rv| }|dv rv|} 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.
        NFc                 3   s(    | ]}t  |d dkr|V  qdS )rN   r   N)rx   Zgetall).0hrA   rN   rO   	<genexpr>  s   & z+HttpParser.parse_headers.<locals>.<genexpr>zDuplicate 'z' header found.closeTz
keep-aliverE   )gzipdeflatebrrF   z'Request has invalid `Transfer-Encoding`z6Transfer-Encoding can't be present with Content-Length)r   r   r   r   ZCONTENT_LOCATIONZCONTENT_RANGEZCONTENT_TYPEZETAGZHOSTZMAX_FORWARDSZSERVERZTRANSFER_ENCODINGZ
USER_AGENTnextr!   r   Z
CONNECTIONlowerUPGRADEZCONTENT_ENCODING)ri   rk   rB   Z
close_connencodingrE   rF   Z
singletonsZbad_hdrconnvencterN   r   rO   r     sV   

zHttpParser.parse_headersvalc                 C   s
   || _ dS )zZSet connection upgraded (to websocket) mode.

        :param bool val: new state.
        N)r   )ri   r   rN   rN   rO   set_upgraded  s   
zHttpParser.set_upgraded)NNr   rb   rc   rb   NNNFNTFT)$rH   rI   rJ   r   r   rM   rL   r   r   asyncioAbstractEventLooprR   r   rK   r   r   rj   abcabstractmethodr   r   rS   r   r   r   r   r   r   _SEPr   r   r-   r   r.   r   r   rN   rN   rN   rO   r0      s   
 	


'
 9
Dr0   c                   @   s&   e Zd ZdZdee defddZdS )r1   zRead request status line.

    Exception .http_exceptions.BadStatusLine
    could be raised in case of any errors in status line.
    Returns RawRequestMessage.
    rk   rg   c                 C   s  |d  dd}z|jddd\}}}W n ty    t|d w t|| jkr5tdt| jtt|t	|s>t|t
	|}|d u rKt|tt|dt|d}|d	krftj|d
d}nD|dr|d\}	}
}|	d\}	}}tj|	||d
d}n%|dkr|dkrt|d
d}nt|d
d}|jdkrt|jdd d| |\}}}}}}|d u r|tkrd
}nd}t||||||||||
S )Nr   rr   rs    rU   maxsplitStatus line is too longr   ZCONNECTT)	authorityencoded/#?)r>   Zquery_stringfragmentr   *OPTIONS)r    )errorslatin1F)r}   ry   rz   r"   rx   rd   r'   rK   r9   r~   r:   r)   rR   groupr   build
startswith	partitionschemer&   encoder   r*   r3   )ri   rk   r   r=   r>   r?   match	version_orG   Z	path_partZ_hash_separatorZurl_fragmentZ_question_mark_separatorZqs_partrA   rB   r   rD   rE   rF   rN   rN   rO   r   /  st   




zHttpRequestParser.parse_messageN)rH   rI   rJ   __doc__r   r   r3   r   rN   rN   rN   rO   r1   '  s    r1   c                       sp   e Zd ZdZe Z	ddedee de	de	de
ee
eef  eef f
 fdd	Zd
ee defddZ  ZS )r2   zRead response status line and headers.

    BadStatusLine could be raised in case of any errors in status line.
    Returns RawResponseMessage.
    Nr   r   argskwargsrg   c                    s0   |d u r
t rdnd}t j||g|R i |S )Nr5   r6   )r   superr   )ri   r   r   r   r   	__class__rN   rO   r     s   zHttpResponseParser.feed_datark   c              
   C   s:  |d  dd}z
|jdd\}}W n ty   t|d w z
|jdd\}}W n ty8   | }d}Y nw t|| jkrMtdt| jtt|t	
|}|d u rZt|tt|dt|d}t|d	kstt
|sxt|t|}| |\}	}
}}}}|d u r|tk}t||| |	|
||||	S )
Nr   rr   rs   r   r   r   r   rU   rV   )r}   ry   rz   r"   r   rx   rd   r'   rK   r:   r~   r)   rR   r   r;   r   r*   r4   )ri   rk   r   r?   statusrQ   r   r   Zstatus_irA   rB   r   rD   rE   rF   rN   rN   rO   r     sX   


z HttpResponseParser.parse_messagerh   )rH   rI   rJ   r   r   r   r   r   r   r   r   r   r4   r-   rM   r   r   __classcell__rN   rN   r   rO   r2     s     r2   c                   @   s   e Zd Z									ddedee dedee dee d	ee d
ededededdfddZdddZ		dde
dede
deee
f fddZdS )r   NFTr   r   rF   rD   rP   r=   r   r   r   r   rg   c                 C   s   d| _ tj| _tj| _d| _d| _|	| _	|
| _
d| _|r'|r'| j	r't||}n|}|s7tj| _|  d| _n>|r>tj| _n7|d urVtj| _|| _ | j dkrU|  d| _n|ra|dkratj| _n|dv rutd tj| _|  d| _|| _d S )Nr   rt   FT   )PUTPOSTz6Content-Length or Transfer-Encoding header is required)_lengthrT   rW   _typer[   r]   _chunk_chunk_size_chunk_tailr   _laxr   DeflateBufferr   rY   rX   rZ   r+   warningr   )ri   r   r   rF   rD   rP   r=   r   r   r   r   Zreal_payloadrN   rN   rO   rj     sH   



zHttpPayloadParser.__init__c                 C   sF   | j tjkr| j  d S | j tjkrtd| j tjkr!tdd S )Nz2Not enough data for satisfy content length header.z3Not enough data for satisfy transfer length header.)	r   rT   rZ   r   r   rX   r$   rY   r(   r   rN   rN   rO   r     s   zHttpPayloadParser.feed_eofr5      ;chunkr   	CHUNK_EXTc                 C   s  | j tjkrF| j}t|}||kr+|| | _| j|| | jdkr)| j  dS d
S d| _| j|d | | | j  d||d  fS | j tjkr| j	rX| j	| }d| _	|r| j
tjkr||}|dkr||d|}|dkr||d | }n|d | }| jr| }tt|st|d | dd}	| j|	 |	tt|d}
||t| d  }|
dkrtj| _
| jr|dr|d	d  }ntj| _
|
| _| j  n|| _	d
S | j
tjkr*| j}t|}||kr|| | _| j|| d
S d| _| j|d | | ||d  }| jr!|dr!|d	d  }tj| _
| j  | j
tjkrN|d t| |krI|t|d  }tj| _
n|| _	d
S | j
tjkr|d t| }||krq| j  d|t|d  fS |svd
S ||d d	 kr|| _	d
S tj| _
| j
tjkr||}|dkr||t| d  }tj| _
n|| _	d
S |s[d
S | j tj kr| j|t| d
S )Nr   )Trt   Trt   asciirs      r   r   )Frt   )!r   rT   rX   r   rx   r   r   r   rY   r   r   r[   r]   r   r   r   rer~   r<   r(   r}   r   rR   r   r`   r   r^   r   begin_http_chunk_receivingr_   end_http_chunk_receivingra   rZ   )ri   r  r   r  requiredZ	chunk_lenr   iZsize_br   sizeheadrN   rN   rO   r     s   


p










czHttpPayloadParser.feed_data)	NFNNNFTTFrg   N)r5   r   )rH   rI   rJ   r-   r   rR   rM   rK   rj   r   r   r   r   r   rN   rN   rN   rO   r     sX    	


:
r   c                   @   sz   e Zd ZU dZeed< dedee ddfddZ	d	e
ddfd
dZdededdfddZdddZdddZdddZdS )r   zDDeflateStream decompress stream and feed data into specified stream.decompressoroutr   rg   Nc                 C   sL   || _ d| _|| _d| _|  |dkrtstdt | _d S t|d| _d S )Nr   Fr   zECan not decode content-encoding: brotli (br). Please install `Brotli`)r   )	r  r
  r   _started_decodingr   r#   r   r  r   )ri   r  r   rN   rN   rO   rj     s   zDeflateBuffer.__init__r   c                 C   s   | j | d S rh   )r  r   )ri   r   rN   rN   rO   r     s   zDeflateBuffer.set_exceptionr  r
  c                 C   s   |sd S |  j |7  _ | js#| jdkr#|d d@ dkr#t| jdd| _z| j|}W n ty9   td| j w d| _|rJ| j	|t
| d S d S )Nr   r         T)r   Zsuppress_deflate_headerz#Can not decode content-encoding: %s)r
  r  r   r   r  Zdecompress_syncr   r#   r  r   rx   )ri   r  r
  rN   rN   rO   r     s*   
zDeflateBuffer.feed_datac                 C   sR   | j  }|s| jdkr"| j|t| | jdkr"| j js"td| j	  d S )Nr   r   )
r  flushr
  r  r   rx   r   r   r#   r   )ri   r  rN   rN   rO   r     s   
zDeflateBuffer.feed_eofc                 C      | j   d S rh   )r  r  r   rN   rN   rO   r       z(DeflateBuffer.begin_http_chunk_receivingc                 C   r  rh   )r  r  r   rN   rN   rO   r    r  z&DeflateBuffer.end_http_chunk_receivingr  )rH   rI   rJ   r   r   rL   r-   r   rK   rj   r   r   r   rR   r   r   r  r  rN   rN   rN   rO   r     s   
 
 

r   )r1   r2   r3   r4   )dr   r   r  string
contextlibr   enumr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Z	multidictr   r   r   Zyarlr   r   r   Zbase_protocolr   Zcompression_utilsr   r   r   helpersr   r   r   r   r    Zhttp_exceptionsr!   r"   r#   r$   r%   r&   r'   r(   Zhttp_writerr)   r*   logr+   streamsr,   r-   Ztypedefsr.   __all__r   set	printabler7   rK   rL   escaper8   compiler9   ASCIIr:   r;   r<   r   r3   r4   rS   rT   r[   r/   ABCr0   r1   r2   r   r   ZHttpRequestParserPyZHttpResponseParserPyZRawRequestMessagePyZRawResponseMessagePyZ_http_parserZHttpRequestParserCZHttpResponseParserCZRawRequestMessageCZRawResponseMessageCImportErrorrN   rN   rN   rO   <module>   sn   
 @(
		"j  D^L HJ
