o
    n~bN                     @   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 e9y   dZ8Y nw 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.ZQeNZReOZSeEZTeGZUze"s]dd/lVmNZNmOZOmEZEmGZG eNZWeOZXeEZYeGZZW dS W dS  e9yj   Y dS w )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   >/usr/local/lib/python3.10/dist-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                	   @   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)rW   rX   rY   )selfrW   rX   rY   rB   rB   rC   __init__|   s   
zHeadersParser.__init__linesr4   c                 C   s  t  }g }d}|d }t|}|rz
|dd\}}W n ty'   t|d w |d}| }t|r:t|t|| j	krUt
d|ddt| j	tt|t|}	|d7 }|| }|oh|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|
spd
|}n|	| j	krt
d	|ddt| j	t|	| }|dd}|dd}||| |||f |s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   s   









FzHeadersParser.parse_headers)rU   rV   rU   )
r<   r=   r>   intr]   r   bytesr   r&   rx   rB   rB   rB   rC   r'   {   s$    


r'   c                   @   sJ  e Zd Z														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 ).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 )Nrd   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_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 )Nz
rd   )r   feed_eofr   r   ro   r   	Exceptionr   r\   rB   rB   rC   r     s   



 zHttpParser.feed_eof   
rd   dataSEPEMPTYCONTENT_LENGTHMETH_CONNECTSEC_WEBSOCKET_KEY1c                    s  g }| j r| j | d}| _ t|}d}	| j}
|	|k r| jd u r6| js6|||	}||	kr8| js8|d }	q||	kr,| j||	|  |d }	| jd |kr+z| | jW | j	  n| j	  w dt
t f fdd}| }|jv rt|j| _td| j}| jd usJ |d ur|dksjrĈjst| j| j|
| jd	}t||j|j| j| j| j| jd
	}|js|| _n`||krttsJ t| j| j|
| jd	}d| _t|jjd| jd| _n9tdddkr"|d u r"| jr"t| j| j|
| jd	}t||j|j| jd| j| jd
	}|js!|| _nt }||f n||	d  | _ |}nz| jd u rG| jrG| jrFJ ni|r|	|k r| jrUJ | jd us]J 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 )Nrd   r   rH   r   rZ   c                     sP   j  } | d u rd S zt| }W n ty   t w |dk r&t |S )Nr   )r5   getry   ri   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   rg   r}   r   r   findr   ro   r   clearr   ry   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}|r0| }	|	dkr#d}n|	dkr*d}n|	dkr0d}|tj}
|
rB|
 }
|
dv rB|
}|tj}|durbd| krUd}ntd	tj	|v rbt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   rx   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   rx     s:   

zHttpParser.parse_headersvalc                 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AbstractEventLoopry   r   r?   rA   r   r   r]   abcabstractmethodr   rz   rF   r   r   r   r   r   r   r   r   r$   r   r&   rx   r   rB   rB   rB   rC   r(      s    	


'
 5
1r(   c                   @   &   e Zd ZdZdee def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^   rZ   c                 C   sL  |d  dd}z|d d\}}}W n ty   t|d w t|| jkr4tdt| jtt||d\}}}|d\}}	}
t	
|sMt|z!|dri|d	d  d
d\}}tt|t|}nt|W n tyy   t|w | |\}}}}}}|d u r|tkrd}nd}t|||||||||tj||
|dd
S )Nr   re   rf   rH   Status line is too long#?zHTTP/   .r   TF)r2   Zquery_stringfragmentencoded)rn   rh   ri   r   rg   rW   r   r?   	partitionr.   match
startswithr    ry   r   rx   r!   r+   r   build)r\   r^   rs   r1   r2   r3   Z	path_partZ_hash_separatorZurl_fragmentZ_question_mark_separatorZqs_partZn1Zn2	version_or5   r6   r   r8   r9   r:   rB   rB   rC   r   
  sh   


zHttpRequestParser.parse_messageN)r<   r=   r>   __doc__r   rz   r+   r   rB   rB   rB   rC   r)     s    r)   c                   @   r   )r*   zRead response status line and headers.

    BadStatusLine could be raised in case of any errors in status line.
    Returns RawResponseMessage.
    r^   rZ   c              
   C   sB  |d  dd}z
|d d\}}W n ty   t|d w z
|d d\}}W n ty4   d}Y nw t|| jkrItdt| jtt|t	|}|d u rVt|t
t|dt|d}zt|}W n tyw   t|d w |dkrt|| |\}	}
}}}}|d u r|tk}t||| |	|
||||	S )	Nr   re   rf   r    r   rH   i  )rn   rh   ri   r   rg   rW   r   r?   r/   r   r    ry   grouprx   r!   r,   rj   )r\   r^   rs   r3   statusrE   r   r   Zstatus_ir5   r6   r   r8   r9   r:   rB   rB   rC   r   V  s^   



z HttpResponseParser.parse_messageN)r<   r=   r>   r   r   rz   r,   r   rB   rB   rB   rC   r*   O  s    r*   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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   r:   r8   rD   r1   r   r   r   rZ   c
                 C   s   d| _ tj| _tj| _d| _d| _|	| _	d| _
|r$|r$| j	r$t||}
n|}
|s4tj| _|
  d| _
n>|r;tj| _n7|d urStj| _|| _ | j dkrR|
  d| _
n|r^|dkr^tj| _n|dv rrtd tj| _|
  d| _
|
| _d S )Nr   rd   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__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   rG   rM   r   r   rK   r   rL   r   r   rB   rB   rC   r     s   zHttpPayloadParser.feed_eofr      ;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 | }z	tt|d}	W n ty   t|d | dd}
| j|
 |
d w ||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r#|dd  }tj| _
n|| _	d	S | j
tjkr^|d d }||krG| j  d|dd  fS |sLd	S ||d d
 krZ|| _	d	S tj| _
| j
tjkr||}|dkr|||d d  }tj| _
n|| _	d	S |s[d	S | j tjkr| j|t| d	S )Nr   )Trd   Trd      asciirf   rH   )Frd   r   )r   rG   rK   r   rg   r   r   r   rL   r   r   rN   rP   r   ry   rz   ri   r   rn   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   


j











]zHttpPayloadParser.feed_data)NFNNNFTTrZ   N)r   r   )r<   r=   r>   r$   r   ry   rA   r?   r]   r   rz   r   r   rB   rB   rB   rC   r     sR    	


8
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   rZ   Nc                 C   sp   || _ d| _|| _d| _|dkr#tstdG dd d}| | _d S |dkr,dtj ntj}tj	|d	| _d S )
Nr   Fr   zECan not decode content-encoding: brotli (br). Please install `Brotli`c                   @   s6   e Zd Zd
ddZdedefddZdefdd	ZdS )z-DeflateBuffer.__init__.<locals>.BrotliDecoderrZ   Nc                 S   s   t  | _d S r[   )brotliZDecompressor_objr   rB   rB   rC   r]   e     z6DeflateBuffer.__init__.<locals>.BrotliDecoder.__init__r   c                 S   s0   t | jdrtt| j|S tt| j|S )N
decompress)hasattrr   r   rz   r   process)r\   r   rB   rB   rC   r   h  s   z8DeflateBuffer.__init__.<locals>.BrotliDecoder.decompressc                 S   s    t | jdrtt| j S dS )Nflushrd   )r   r   r   rz   r   r   rB   rB   rC   r   m  s   z3DeflateBuffer.__init__.<locals>.BrotliDecoder.flushr   )r<   r=   r>   r]   rz   r   r   rB   rB   rB   rC   BrotliDecodera  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]   T  s   zDeflateBuffer.__init__r   c                 C   s   | j | d S r[   )r   r   )r\   r   rB   rB   rC   r   w  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tj d| _z| j|}W n ty:   t	d| j w d| _|rK| j
|t| d S d S )Nr   r         r   z#Can not decode content-encoding: %sT)r   r   r   r   r   r   r   r   r   r   r   r   rg   )r\   r   r   rB   rB   rC   r   z  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   r   r   r   r   rg   r   r   r   r   )r\   r   rB   rB   rC   r     s   
zDeflateBuffer.feed_eofc                 C      | j   d S r[   )r   r   r   rB   rB   rC   r     r   z(DeflateBuffer.begin_http_chunk_receivingc                 C   r   r[   )r   r   r   rB   rB   rC   r     r   z&DeflateBuffer.end_http_chunk_receivingr   )r<   r=   r>   r   r   r@   r$   r   r?   r]   r   r   rz   ry   r   r   r   r   rB   rB   rB   rC   r   O  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   rz   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$			^  +MA @Z
