o
    h^                     @   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eeC  eDd< eEdZGeeeC  eDd< eEdZHeeeI  eDd< eEdZJG dd deZKG dd deZLedeKeLZMG d d! d!eZNG d"d# d#eZOG d$d% d%ZPG d&d' d'e jQeeM ZRG d(d) d)eReK ZSG d*d+ d+eReL ZTG d,d- d-ZUG d.d/ d/ZVeSZWeTZXeKZYeLZZze's^dd0l[mSZSmTZTmKZKmLZL eSZ\eTZ]eKZ^eLZ_W dS W dS  e`yk   Y dS w )1    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[!#$%&'*+\-.^_`|~0-9A-Za-z]+METHREzHTTP/(\d).(\d)VERSREs*   [\x00-\x1F\x7F-\xFF()<>@,;:\[\]={} \t\"\\]HDRREs   [0-9a-fA-F]+c                   @   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    rL   rL   I/var/www/html/ai/venv/lib/python3.10/site-packages/aiohttp/http_parser.pyr3   P   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reasonr?   r@   rA   rB   rC   rD   N)rF   rG   rH   r)   rJ   intrI   r   r.   rK   r   rL   rL   rL   rM   r4   ]   s   
 r4   _MsgTc                   @   s   e Zd ZdZdZdZdZdS )
ParseStater   r         N)rF   rG   rH   
PARSE_NONEPARSE_LENGTHPARSE_CHUNKEDPARSE_UNTIL_EOFrL   rL   rL   rM   rR   l   s
    rR   c                   @   s    e Zd ZdZdZdZdZdZdS )
ChunkStater   r   rS   rT      N)rF   rG   rH   PARSE_CHUNKED_SIZEPARSE_CHUNKED_CHUNKPARSE_CHUNKED_CHUNK_EOFPARSE_MAYBE_TRAILERSPARSE_TRAILERSrL   rL   rL   rM   rY   t   s    rY   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)rb   rc   rd   )selfrb   rc   rd   rL   rL   rM   __init__}   s   
zHeadersParser.__init__linesr>   c                 C   s  t  }g }d}|d }t|}|rz
|dd\}}W n ty(   t|d w |d |d hddh@ r9t||d}t|rGt|t|| jkrbt	d
|d	d
t| jtt|t|}	|d7 }|| }|ou|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|
s}d|}n|	| jkrt	d
|d	d
t| jt|	|d}|dd}|dd}d|v sd|v sd|v rt|||| |||f |st|t|fS )Nr      :r       	   s    	zrequest header name {}utf8backslashreplace)rl   rm   zrequest header field {}    utf-8surrogateescape
 )r   lensplit
ValueErrorr%   lstripr:   searchrd   r'   formatdecoderI   appendjoinstripaddr   tuple)rg   ri   r?   r@   	lines_idxline
line_countbnamebvalueheader_lengthcontinuation
bvalue_lstnamevaluerL   rL   rM   parse_headers   s   










NzHeadersParser.parse_headers)r`   ra   r`   )
rF   rG   rH   rP   rh   r   bytesr   r.   r   rL   rL   rL   rM   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   r`   ra   Tprotocollooplimitrb   rc   rd   timerrN   r;   readallpayload_exceptionresponse_with_bodyread_until_eofauto_decompressre   c                 C   s   || _ || _|| _|| _|| _|| _|| _|	| _|
| _|| _	|| _
|| _g | _d| _d| _d | _d | _|| _|| _t|||| _d S )Nrp   F)r   r   rb   rc   rd   r   rN   r;   r   r   r   r   _lines_tail	_upgraded_payload_payload_parser_auto_decompress_limitr/   _headers_parser)rg   r   r   r   rb   rc   rd   r   rN   r;   r   r   r   r   r   rL   rL   rM   rh      s(   zHttpParser.__init__ri   c                 C   s   d S rf   rL   )rg   ri   rL   rL   rM   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 )Nrk   z
rp   )r   feed_eofr   r   r}   r   	Exceptionr   rg   rL   rL   rM   r     s   



 zHttpParser.feed_eofr5   rp   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 )Nrp   r   r6      rk   re   c                     s6   j  } | d u rd S | d st t| S )Nz 	)r?   getr   	isdecimalr%   rP   )
length_hdrr   msgrL   rM   get_content_lengthM  s   z0HttpParser.feed_data.<locals>.get_content_lengthr;   rN   )r   r   r   )	lengthrD   r;   rB   rN   r   r   r   r   T)r;   rB   r   r   r   ),r   rv   r   r   r   findr   rstripr}   r   clearr   rP   r?   r%   rC   getattrr;   r   r    rK   r   rD   r-   r   r   HttpPayloadParserrB   rN   r   r   r   r   done
isinstancer3   r   r,   	feed_dataBaseExceptionr   payloadset_exceptionrI   )rg   r   r   r   r   r   r   messagesdata_len	start_posr   posr   r   r   r;   rN   
empty_bodyr   payload_parsereofexcrL   r   rM   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 )rL   r   N)rv   getall).0hr?   rL   rM   	<genexpr>  s   & z+HttpParser.parse_headers.<locals>.<genexpr>zDuplicate 'z' header found.closeTz
keep-aliverC   )gzipdeflatebrrD   z'Request has invalid `Transfer-Encoding`z6Transfer-Encoding can't be present with Content-Length)r   r   r   r   CONTENT_LOCATIONCONTENT_RANGECONTENT_TYPEETAGHOSTMAX_FORWARDSSERVERTRANSFER_ENCODING
USER_AGENTnextr!   r   
CONNECTIONlowerUPGRADECONTENT_ENCODING)rg   ri   r@   
close_connencodingrC   rD   
singletonsbad_hdrconnvencterL   r   rM   r     sV   

zHttpParser.parse_headersvalc                 C   s
   || _ dS )zZSet connection upgraded (to websocket) mode.

        :param bool val: new state.
        N)r   )rg   r   rL   rL   rM   set_upgraded  s   
zHttpParser.set_upgraded)NNr   r`   ra   r`   NNNFNTFT)$rF   rG   rH   r   r   rK   rJ   r   r   asyncioAbstractEventLooprP   r   rI   r   r   rh   abcabstractmethodr   r   rQ   r   r   r   r   r   r   _SEPr   r   r-   r   r.   r   r   rL   rL   rL   rM   r0      s   
 	


'
 8
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.
    ri   re   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   rq   rr    rS   maxsplitStatus line is too longr   CONNECTT)	authorityencoded/#?)r<   query_stringfragmentr   *OPTIONS)r    )errorslatin1F)r|   rw   rx   r"   rv   rb   r'   rI   r8   	fullmatchr9   r)   rP   groupr   build
startswith	partitionschemer&   encoder   r*   r3   )rg   ri   r   r;   r<   r=   match	version_orE   	path_part_hash_separatorurl_fragment_question_mark_separatorqs_partr?   r@   r   rB   rC   rD   rL   rL   rM   r   +  st   




zHttpRequestParser.parse_messageN)rF   rG   rH   __doc__r   r   r3   r   rL   rL   rL   rM   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kwargsre   c                    s0   |d u r
t rdnd}t j||g|R i |S )Nr5   r6   )r   superr   )rg   r   r   r  r  	__class__rL   rM   r     s   zHttpResponseParser.feed_datari   c              
   C   s8  |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ss| swt|t|}| |\}	}
}}}}|d u r|tk}t||| |	|
||||	S )
Nr   rq   rr   r   r   r   r   rS   rT   )r|   rw   rx   r"   r   rv   rb   r'   rI   r9   r   r)   rP   r   r   r   r*   r4   )rg   ri   r   r=   statusrO   r  r  status_ir?   r@   r   rB   rC   rD   rL   rL   rM   r     sX   


z HttpResponseParser.parse_messagerf   )rF   rG   rH   r  r   r   r   r   r   r   r   r   r4   r-   rK   r   r   __classcell__rL   rL   r  rM   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   rD   rB   rN   r;   r   r   r   r   re   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   rp   FT   )PUTPOSTz6Content-Length or Transfer-Encoding header is required)_lengthrR   rU   _typerY   r[   _chunk_chunk_size_chunk_tailr   _laxr   DeflateBufferr   rW   rV   rX   r+   warningr   )rg   r   r   rD   rB   rN   r;   r   r   r   r   real_payloadrL   rL   rM   rh     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  rR   rX   r   r   rV   r$   rW   r(   r   rL   rL   rM   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   )Trp   Trp   asciirr      r   r   )Frp   )!r  rR   rV   r  rv   r   r   r   rW   r  r  rY   r[   r   r  r   rer   HEXDIGITr(   r|   r   rP   r   r^   r   r\   r  begin_http_chunk_receivingr]   end_http_chunk_receivingr_   rX   )rg   r!  r   r"  required	chunk_lenr   isize_br   sizeheadrL   rL   rM   r     s   


p










czHttpPayloadParser.feed_data)	NFNNNFTTFre   N)r5   r   )rF   rG   rH   r-   r   rP   rK   rI   rh   r   r   r   r   r   rL   rL   rL   rM   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   re   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   )	r1  r-  r   _started_decodingr   r#   r   r0  r   )rg   r1  r   rL   rL   rM   rh     s   zDeflateBuffer.__init__r   c                 C   s   | j | d S rf   )r1  r   )rg   r   rL   rL   rM   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   suppress_deflate_headerz#Can not decode content-encoding: %s)r-  r2  r   r   r0  decompress_syncr   r#   r1  r   rv   )rg   r!  r-  rL   rL   rM   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   )
r0  flushr-  r1  r   rv   r   r   r#   r   )rg   r!  rL   rL   rM   r     s   
zDeflateBuffer.feed_eofc                 C      | j   d S rf   )r1  r'  r   rL   rL   rM   r'       z(DeflateBuffer.begin_http_chunk_receivingc                 C   r8  rf   )r1  r(  r   rL   rL   rM   r(    r9  z&DeflateBuffer.end_http_chunk_receivingr/  )rF   rG   rH   r  r   rJ   r-   r   rI   rh   r   r   r   rP   r   r   r'  r(  rL   rL   rL   rM   r    s   
 
 

r  )r1   r2   r3   r4   )ar   r   r%  string
contextlibr   enumr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   	multidictr   r   r   yarlr   r   r   base_protocolr   compression_utilsr   r   r   helpersr   r   r   r   r    http_exceptionsr!   r"   r#   r$   r%   r&   r'   r(   http_writerr)   r*   logr+   streamsr,   r-   typedefsr.   __all__r   set	printabler7   rI   rJ   compiler8   r9   r:   r   r&  r3   r4   rQ   rR   rY   r/   ABCr0   r1   r2   r   r  HttpRequestParserPyHttpResponseParserPyRawRequestMessagePyRawResponseMessagePy_http_parserHttpRequestParserCHttpResponseParserCRawRequestMessageCRawResponseMessageCImportErrorrL   rL   rL   rM   <module>   sp   
 @(
		
f  C^L HJ
