o
    `g                     @   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*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> dZ?ed Z@eAejBZCeeeD  eEd< eFdZGeeD eEd< eHdeG dZIeeeD  eEd< eHdejJZKeeeD  eEd< eHdejJZLeeeD  eEd< eHdZMeeeN  eEd< G dd deZOG d d! d!eZPed"eOePZQG d#d$ d$eZRG d%d& d&eZSG d'd( d(ZTd)eeD d*eUfd+d,ZVG d-d. d.e jWeeQ ZXG d/d0 d0eXeO ZYG d1d2 d2eXeP ZZG d3d4 d4Z[G d5d6 d6Z\eYZ]eZZ^eOZ_ePZ`ze*sdd7lamYZYmZZZmOZOmPZP eYZbeZZceOZdePZeW dS W dS  efy   Y dS w )8    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)_EXC_SENTINELDEBUGEMPTY_BODY_METHODSEMPTY_BODY_STATUS_CODESNO_EXTENSIONSBaseTimerContextset_exception)	BadHttpMessageBadHttpMethodBadStatusLineContentEncodingErrorContentLengthErrorInvalidHeaderInvalidURLErrorLineTooLongTransferEncodingError)HttpVersionHttpVersion10)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 )r5   methodpathversionCIMultiDictProxy[str]headersraw_headersshould_closecompressionupgradechunkedurlN)
__name__
__module____qualname__str__annotations__r,   r0   boolr   r    rP   rP   N/var/www/html/propose/venv/lib/python3.10/site-packages/aiohttp/http_parser.pyr5   Q   s   
 r5   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 )r6   rA   codereasonrC   rD   rE   rF   rG   rH   N)rJ   rK   rL   r,   rN   intrM   r   r0   rO   r   rP   rP   rP   rQ   r6   ^   s   
 r6   _MsgTc                   @   s   e Zd ZdZdZdZdZdS )
ParseStater   r         N)rJ   rK   rL   
PARSE_NONEPARSE_LENGTHPARSE_CHUNKEDPARSE_UNTIL_EOFrP   rP   rP   rQ   rV   m   s
    rV   c                   @   s    e Zd ZdZdZdZdZdZdS )
ChunkStater   r   rW   rX      N)rJ   rK   rL   PARSE_CHUNKED_SIZEPARSE_CHUNKED_CHUNKPARSE_CHUNKED_CHUNK_EOFPARSE_MAYBE_TRAILERSPARSE_TRAILERSrP   rP   rP   rQ   r]   u   s    r]   c                   @   sR   e Zd Z				dde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 )r1        Fmax_line_sizemax_headersmax_field_sizelaxreturnNc                 C   s   || _ || _|| _|| _d S N)rf   rg   rh   _lax)selfrf   rg   rh   ri   rP   rP   rQ   __init__~   s   
zHeadersParser.__init__linesrB   c                 C   s<  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 }|| }| jo|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 sd|v sd|v rt|||	| |||f |st|t|fS )Nr      :r       	   s    	zrequest header name {}utf8backslashreplaceutf-8surrogateescape)rr   rs   zrequest header field {}    
 )r   lensplit
ValueErrorr(   lstriprh   r*   formatdecoderM   r;   	fullmatchrl   appendjoinstripaddr   tuple)rm   ro   rC   rD   	lines_idxline
line_countbnamebvaluenameheader_lengthcontinuation
bvalue_lstvaluerP   rP   rQ   parse_headers   s   










QzHeadersParser.parse_headers)rd   re   rd   F)rJ   rK   rL   rT   rO   rn   r   bytesr   r0   r   rP   rP   rP   rQ   r1   }   s*    

r1   rC   rj   c                 C   s   |  tjd dv S )z)Check if the upgrade header is supported. >   tcp	websocket)getr   UPGRADElowerrC   rP   rP   rQ   _is_supported_upgrade   s   r   c                   @   sn  e Zd ZU dZee ed< 													d0d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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ejd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 )1r2   Fri   N   rd   re   Tprotocollooplimitrf   rg   rh   timerrR   r?   payload_exceptionresponse_with_bodyread_until_eofauto_decompressrj   c                 C   s   || _ || _|| _|| _|| _|| _|| _|	| _|
| _|| _	|| _
g | _d| _d| _d | _d | _|| _|| _t|||| j| _d S )Nrx   F)r   r   rf   rg   rh   r   rR   r?   r   r   r   _lines_tail	_upgraded_payload_payload_parser_auto_decompress_limitr1   ri   _headers_parser)rm   r   r   r   rf   rg   rh   r   rR   r?   r   r   r   r   rP   rP   rQ   rn      s*   

zHttpParser.__init__ro   c                 C      d S rk   rP   )rm   ro   rP   rP   rQ   parse_message     zHttpParser.parse_messagetec                 C   r   rk   rP   rm   r   rP   rP   rQ   _is_chunked_te  r   zHttpParser._is_chunked_tec                 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 )Nrq   z
rx   )r   feed_eofr   r   r   r   	Exceptionr   rm   rP   rP   rQ   r     s   



 zHttpParser.feed_eofr7   rx   dataSEPEMPTYCONTENT_LENGTHMETH_CONNECTSEC_WEBSOCKET_KEY1c                    s  g }| j r| j | d}| _ t|}d}	| j}
d}|	|k r| jd u rg| jsg|||	}||	kr<| js<|t| }	q||	kr]|rGtd||	| }|dkrV|d}| j	| |t| }	| jd |kr\z| 
| jW | j  n| j  w dtt f fd	d
}| }|jv rt|jotj| _td| j}tdd}| jd usJ |tv pt|o|tv }|s|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rt#t$sJ t| j| j|
| jd}d| _t|jj| j | j!d| _n4|sP|d u rP| j%rPt| j| j|
| jd}t||j|j| j| j| j | j!d	}|j"sO|| _nt&}|	|f j'}n~||	d  | _ |}nx| jd u rx| jrx| jrwJ ng|r|	|k r| jrJ | jd usJ z| j(||	d  |\}}W n. t)y } z!|}| j*d ur| *t+|}t,| 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 )Nrx   r   FzData after `Connection: close`r8      rq   rj   c                     s2   j  } | d u rd S t| st t| S rk   )rC   r   r=   r   r(   rT   )
length_hdrr   msgrP   rQ   get_content_length_  s   
z0HttpParser.feed_data.<locals>.get_content_lengthr?   rR   )r   r   r   )lengthrH   r?   rF   rR   r   r   ri   T)r?   rF   r   ri   ).r   r|   r   r   r   findr   r#   rstripr   r   clearr   rT   rC   r(   rG   r   getattrr?   r   r   rO   r   rH   r/   r   r   HttpPayloadParserrF   rR   r   r   ri   done
isinstancer5   r   r.   rE   	feed_dataBaseExceptionr   rM   r"   payload)rm   r   r   r   r   r   r   messagesdata_len	start_posr   rE   posr   r   r   r?   rR   
empty_bodyr   payload_parsereofunderlying_excreraised_excrP   r   rQ   r   .  s  








  $zHttpParser.feed_datarB   c              
      s0  | 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r| |rd}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 )rP   r   N)r|   getall).0hr   rP   rQ   	<genexpr>
  s   & z+HttpParser.parse_headers.<locals>.<genexpr>zDuplicate 'z' header found.closeTz
keep-aliverG   )gzipdeflatebrz6Transfer-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   
CONNECTIONr   r   CONTENT_ENCODINGr   )rm   ro   rD   
close_connencodingrG   rH   
singletonsbad_hdrconnvencr   rP   r   rQ   r     sT   


zHttpParser.parse_headersvalc                 C   s
   || _ dS )zZSet connection upgraded (to websocket) mode.

        :param bool val: new state.
        N)r   )rm   r   rP   rP   rQ   set_upgraded.  s   
zHttpParser.set_upgraded)NNr   rd   re   rd   NNNNTFT)%rJ   rK   rL   ri   r   rO   rN   r   r   asyncioAbstractEventLooprT   r!   rM   r   r   rn   abcabstractmethodr   r   rU   r   r   r   r   r   r   r   _SEPr   r   r/   r   r0   r   r   rP   rP   rP   rQ   r2      s   
 	


'
 ?
Br2   c                   @   s8   e Zd ZdZdee defddZdede	fddZ
d	S )
r3   zRead request status line.

    Exception .http_exceptions.BadStatusLine
    could be raised in case of any errors in status line.
    Returns RawRequestMessage.
    ro   rj   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   rv   rw    rW   maxsplitStatus line is too longr   CONNECTT)	authorityencoded/#?)r@   query_stringfragmentr   *OPTIONS)r   r   )errorslatin1F)r   r}   r~   r$   r|   rf   r*   rM   r;   r   r<   r%   r,   rT   groupr   build
startswith	partitionschemer)   encoder   r-   r5   )rm   ro   r   r?   r@   rA   match	version_orI   	path_part_hash_separatorurl_fragment_question_mark_separatorqs_partrC   rD   r   rF   rG   rH   rP   rP   rQ   r   >  st   




zHttpRequestParser.parse_messager   c                 C   s,   |j dddd d dkrdS td)	N,r   r   rq    	rH   Tz'Request has invalid `Transfer-Encoding`)rsplitr   r   r#   r   rP   rP   rQ   r     s    z HttpRequestParser._is_chunked_teN)rJ   rK   rL   __doc__r   r   r5   r   rM   rO   r   rP   rP   rP   rQ   r3   6  s    Ur3   c                       s   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dedefddZ  ZS )r4   zRead response status line and headers.

    BadStatusLine could be raised in case of any errors in status line.
    Returns RawResponseMessage.
    Nr   r   argskwargsrj   c                    s0   |d u r
t rdnd}t j||g|R i |S )Nr7   r8   )r   superr   )rm   r   r   r  r  	__class__rP   rQ   r     s   zHttpResponseParser.feed_dataro   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rd
}n!d|  krdk sn |dv rd}ntj|	v stj|	v rd}nd
}t||| |	|
||||	S )Nr   rv   rw   r   r   r   r   rW   rX   Td      >   0     F)r   r}   r~   r%   r   r|   rf   r*   rM   r<   r   r,   rT   r  r=   r   r-   r   r   r   r6   )rm   ro   r   rA   statusrS   r  r  status_irC   rD   r   rF   rG   rH   rP   rP   rQ   r     sd   


z HttpResponseParser.parse_messager   c                 C   s    |j dddd d dkS )Nr  r   r   rq   r  rH   )r  r   r   r   rP   rP   rQ   r     s    z!HttpResponseParser._is_chunked_terk   )rJ   rK   rL   r  r   ri   r   r   r   r   r   r   r6   r/   rO   r   r   rM   r   __classcell__rP   rP   r  rQ   r4     s"    ?r4   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   rH   rF   rR   r?   r   r   ri   rj   c
                 C   s   d| _ tj| _tj| _d| _d| _|| _	|	| _
d| _|r'|r'| j	r't||}
n|}
|s7tj| _|
  d| _n|r>tj| _n|d urUtj| _|| _ | j dkrU|
  d| _|
| _d S )Nr   rx   FT)_lengthrV   r\   _typer]   r_   _chunk_chunk_size_chunk_tailr   rl   r   DeflateBufferrY   r   r[   rZ   r   )rm   r   r   rH   rF   rR   r?   r   r   ri   real_payloadrP   rP   rQ   rn     s4   


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%  rV   r\   r   r   rZ   r'   r[   r+   r   rP   rP   rQ   r   "  s   zHttpPayloadParser.feed_eofr7      ;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 | }d|||  }	v rtd|	}
t| j|
 |
n|d | }| jr| }tt|st|d | dd}
t| 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r4| j}t|}||kr|| | _| j|| dS d| _| j|d | | ||d  }tj| _
| j  | j
tjkrh| jrK|d
rK|dd  }|d t| |krc|t|d  }tj| _
n|| _	dS | j
tjkr|d t| }||kr| j  d|t|d  fS |sd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   )Trx   Trx   r8   z"Unexpected LF in chunk-extension: asciirw      r   r   )Frx   )"r%  rV   rZ   r$  r|   r   r   r   r[   r(  r&  r]   r_   r   r#   r"   rl   r   rer   r>   r+   r   rT   r   rb   r	  r`   r'  begin_http_chunk_receivingra   end_http_chunk_receivingrc   r\   )rm   r,  r   r-  required	chunk_lenr   isize_bextexcsizeheadrP   rP   rQ   r   .  s   


w











jzHttpPayloadParser.feed_data)NFNNNTTFrj   N)r7   r+  )rJ   rK   rL   r/   r   rT   rO   rM   rn   r   r   r   r   r   rP   rP   rP   rQ   r     sR    	


.
r   c                   @   s   e Zd ZU dZeed< dedee ddfddZ	e
fd	e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   rj   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=  r9  r   _started_decodingr   r&   r   r<  r   )rm   r=  r   rP   rP   rQ   rn     s   zDeflateBuffer.__init__r8  	exc_causec                 C   s   t | j|| d S rk   )r"   r=  )rm   r8  r?  rP   rP   rQ   r"     s   zDeflateBuffer.set_exceptionr,  r9  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)r9  r>  r   r   r<  decompress_syncr   r&   r=  r   r|   )rm   r,  r9  rP   rP   rQ   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<  flushr9  r=  r   r|   r   r   r&   r   )rm   r,  rP   rP   rQ   r     s   
zDeflateBuffer.feed_eofc                 C      | j   d S rk   )r=  r1  r   rP   rP   rQ   r1       z(DeflateBuffer.begin_http_chunk_receivingc                 C   rE  rk   )r=  r2  r   rP   rP   rQ   r2    rF  z&DeflateBuffer.end_http_chunk_receivingr;  )rJ   rK   rL   r  r   rN   r/   r   rM   rn   r   r   r"   r   rT   r   r   r1  r2  rP   rP   rP   rQ   r)    s    
 

 

r)  )r3   r4   r5   r6   )gr   r   r0  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    r!   r"   http_exceptionsr#   r$   r%   r&   r'   r(   r)   r*   r+   http_writerr,   r-   streamsr.   r/   typedefsr0   __all__r   set	printabler9   rM   rN   escaper:   compiler;   ASCIIr<   r=   r>   r   r5   r6   rU   rV   r]   r1   rO   r   ABCr2   r3   r4   r   r)  HttpRequestParserPyHttpResponseParserPyRawRequestMessagePyRawResponseMessagePy_http_parserHttpRequestParserCHttpResponseParserCRawRequestMessageCRawResponseMessageCImportErrorrP   rP   rP   rQ   <module>   sn   
 @$,			"l  JdY CN
