o
    ~#i                     @   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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8 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(ZSd)eeC d*eTfd+d,ZUG d-d. d.e jVeeP ZWG d/d0 d0eWeN ZXG d1d2 d2eWeO ZYG d3d4 d4ZZG d5d6 d6Z[eXZ\eYZ]eNZ^eOZ_ze(sdd7l`mXZXmYZYmNZNmOZO eXZaeYZbeNZceOZdW dS W dS  ee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NO_EXTENSIONSBaseTimerContextmethod_must_be_empty_bodyset_exceptionstatus_code_must_be_empty_body)BadHttpMessage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 )r4   methodpathversionCIMultiDictProxy[str]headersraw_headersshould_closecompressionupgradechunkedurlN)
__name__
__module____qualname__str__annotations__r+   r/   boolr   r    rO   rO   Z/var/www/GraceOrthoHospital/venv_grace/lib/python3.10/site-packages/aiohttp/http_parser.pyr4   P   s   
 r4   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 )r5   r@   codereasonrB   rC   rD   rE   rF   rG   N)rI   rJ   rK   r+   rM   intrL   r   r/   rN   r   rO   rO   rO   rP   r5   ]   s   
 r5   _MsgTc                   @   s   e Zd ZdZdZdZdZdS )
ParseStater   r         N)rI   rJ   rK   
PARSE_NONEPARSE_LENGTHPARSE_CHUNKEDPARSE_UNTIL_EOFrO   rO   rO   rP   rU   l   s
    rU   c                   @   s    e Zd ZdZdZdZdZdZdS )
ChunkStater   r   rV   rW      N)rI   rJ   rK   PARSE_CHUNKED_SIZEPARSE_CHUNKED_CHUNKPARSE_CHUNKED_CHUNK_EOFPARSE_MAYBE_TRAILERSPARSE_TRAILERSrO   rO   rO   rP   r\   t   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 )r0        Fmax_line_sizemax_headersmax_field_sizelaxreturnNc                 C   s   || _ || _|| _|| _d S N)re   rf   rg   _lax)selfre   rf   rg   rh   rO   rO   rP   __init__}   s   
zHeadersParser.__init__linesrA   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)rq   rr   zrequest header field {}    
 )r   lensplit
ValueErrorr'   lstriprg   r)   formatdecoderL   r:   	fullmatchrk   appendjoinstripaddr   tuple)rl   rn   rB   rC   	lines_idxline
line_countbnamebvaluenameheader_lengthcontinuation
bvalue_lstvaluerO   rO   rP   parse_headers   s   










QzHeadersParser.parse_headers)rc   rd   rc   F)rI   rJ   rK   rS   rN   rm   r   bytesr   r/   r   rO   rO   rO   rP   r0   |   s*    

r0   rB   ri   c                 C   s   |  tjd dv S )z)Check if the upgrade header is supported. >   tcp	websocket)getr   UPGRADElowerrB   rO   rO   rP   _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 )1r1   Frh   N   rc   rd   Tprotocollooplimitre   rf   rg   timerrQ   r>   payload_exceptionresponse_with_bodyread_until_eofauto_decompressri   c                 C   s   || _ || _|| _|| _|| _|| _|| _|	| _|
| _|| _	|| _
g | _d| _d| _d | _d | _|| _|| _t|||| j| _d S )Nrw   F)r   r   re   rf   rg   r   rQ   r>   r   r   r   _lines_tail	_upgraded_payload_payload_parser_auto_decompress_limitr0   rh   _headers_parser)rl   r   r   r   re   rf   rg   r   rQ   r>   r   r   r   r   rO   rO   rP   rm      s*   

zHttpParser.__init__rn   c                 C      d S rj   rO   )rl   rn   rO   rO   rP   parse_message     zHttpParser.parse_messagetec                 C   r   rj   rO   rl   r   rO   rO   rP   _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 )Nrp   z
rw   )r   feed_eofr   r   r   r   	Exceptionr   rl   rO   rO   rP   r     s   



 zHttpParser.feed_eofr6   rw   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|pt|ot|}|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 )Nrw   r   FzData after `Connection: close`r7      rp   ri   c                     s2   j  } | d u rd S t| st t| S rj   )rB   r   r<   r   r'   rS   )
length_hdrr   msgrO   rP   get_content_length^  s   
z0HttpParser.feed_data.<locals>.get_content_lengthr>   rQ   )r   r   r   )lengthrG   r>   rE   rQ   r   r   rh   T)r>   rE   r   rh   ).r   r{   r   r   r   findr   r#   rstripr   r   clearr   rS   rB   r'   rF   r   getattrr>   r   r"   rN   r    rG   r.   r   r   HttpPayloadParserrE   rQ   r   r   rh   done
isinstancer4   r   r-   rD   	feed_dataBaseExceptionr   rL   r!   payload)rl   r   r   r   r   r   r   messagesdata_len	start_posr   rD   posr   r   r   r>   rQ   
empty_bodyr   payload_parsereofunderlying_excreraised_excrO   r   rP   r   -  s  








  $zHttpParser.feed_datarA   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 )rO   r   N)r{   getall).0hr   rO   rP   	<genexpr>	  s   & z+HttpParser.parse_headers.<locals>.<genexpr>zDuplicate 'z' header found.closeTz
keep-aliverF   )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   )rl   rn   rC   
close_connencodingrF   rG   
singletonsbad_hdrconnvencr   rO   r   rP   r     sT   


zHttpParser.parse_headersvalc                 C   s
   || _ dS )zZSet connection upgraded (to websocket) mode.

        :param bool val: new state.
        N)r   )rl   r   rO   rO   rP   set_upgraded-  s   
zHttpParser.set_upgraded)NNr   rc   rd   rc   NNNNTFT)%rI   rJ   rK   rh   r   rN   rM   r   r   asyncioAbstractEventLooprS   r   rL   r   r   rm   abcabstractmethodr   r   rT   r   r   r   r   r   r   r   _SEPr   r   r.   r   r/   r   r   rO   rO   rO   rP   r1      s   
 	


'
 ?
Br1   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 )
r2   zRead request status line.

    Exception .http_exceptions.BadStatusLine
    could be raised in case of any errors in status line.
    Returns RawRequestMessage.
    rn   ri   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   ru   rv    rV   maxsplitStatus line is too longr   CONNECTT)	authorityencoded/#?)r?   query_stringfragmentr   *OPTIONS)r   r   )errorslatin1F)r   r|   r}   r$   r{   re   r)   rL   r:   r   r;   r+   rS   groupr   build
startswith	partitionschemer(   encoder   r,   r4   )rl   rn   r   r>   r?   r@   match	version_orH   	path_part_hash_separatorurl_fragment_question_mark_separatorqs_partrB   rC   r   rE   rF   rG   rO   rO   rP   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   rp    	rG   Tz'Request has invalid `Transfer-Encoding`)rsplitr   r   r#   r   rO   rO   rP   r     s    z HttpRequestParser._is_chunked_teN)rI   rJ   rK   __doc__r   r   r4   r   rL   rN   r   rO   rO   rO   rP   r2   5  s    Ur2   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 )r3   zRead response status line and headers.

    BadStatusLine could be raised in case of any errors in status line.
    Returns RawResponseMessage.
    Nr   r   argskwargsri   c                    s0   |d u r
t rdnd}t j||g|R i |S )Nr6   r7   )r   superr   )rl   r   r   r  r  	__class__rO   rP   r     s   zHttpResponseParser.feed_datarn   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   ru   rv   r   r   r   r   rV   rW   Td      >   0     F)r   r|   r}   r$   r   r{   re   r)   rL   r;   r   r+   rS   r  r<   r   r,   r   r   r   r5   )rl   rn   r   r@   statusrR   r  r  status_irB   rC   r   rE   rF   rG   rO   rO   rP   r     sd   


z HttpResponseParser.parse_messager   c                 C   s    |j dddd d dkS )Nr  r   r   rp   r  rG   )r  r   r   r   rO   rO   rP   r     s    z!HttpResponseParser._is_chunked_terj   )rI   rJ   rK   r  r   rh   r   r   r   r   r   r   r5   r.   rN   r   r   rL   r   __classcell__rO   rO   r  rP   r3     s"    ?r3   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   rG   rE   rQ   r>   r   r   rh   ri   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   rw   FT)_lengthrU   r[   _typer\   r^   _chunk_chunk_size_chunk_tailr   rk   r   DeflateBufferrX   r   rZ   rY   r   )rl   r   r   rG   rE   rQ   r>   r   r   rh   real_payloadrO   rO   rP   rm     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$  rU   r[   r   r   rY   r&   rZ   r*   r   rO   rO   rP   r   !  s   zHttpPayloadParser.feed_eofr6      ;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   )Trw   Trw   r7   z"Unexpected LF in chunk-extension: asciirv      r   r   )Frw   )"r$  rU   rY   r#  r{   r   r   r   rZ   r'  r%  r\   r^   r   r#   r!   rk   r   rer   r=   r*   r   rS   r   ra   r  r_   r&  begin_http_chunk_receivingr`   end_http_chunk_receivingrb   r[   )rl   r+  r   r,  required	chunk_lenr   isize_bextexcsizeheadrO   rO   rP   r   -  s   


w











jzHttpPayloadParser.feed_data)NFNNNTTFri   N)r6   r*  )rI   rJ   rK   r.   r   rS   rN   rL   rm   r   r   r   r   r   rO   rO   rO   rP   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   ri   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<  r8  r   _started_decodingr   r%   r   r;  r   )rl   r<  r   rO   rO   rP   rm     s   zDeflateBuffer.__init__r7  	exc_causec                 C   s   t | j|| d S rj   )r!   r<  )rl   r7  r>  rO   rO   rP   r!     s   zDeflateBuffer.set_exceptionr+  r8  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)r8  r=  r   r   r;  decompress_syncr   r%   r<  r   r{   )rl   r+  r8  rO   rO   rP   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;  flushr8  r<  r   r{   r   r   r%   r   )rl   r+  rO   rO   rP   r     s   
zDeflateBuffer.feed_eofc                 C      | j   d S rj   )r<  r0  r   rO   rO   rP   r0       z(DeflateBuffer.begin_http_chunk_receivingc                 C   rD  rj   )r<  r1  r   rO   rO   rP   r1    rE  z&DeflateBuffer.end_http_chunk_receivingr:  )rI   rJ   rK   r  r   rM   r.   r   rL   rm   r   r   r!   r   rS   r   r   r0  r1  rO   rO   rO   rP   r(    s    
 

 

r(  )r2   r3   r4   r5   )fr   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    r!   r"   http_exceptionsr#   r$   r%   r&   r'   r(   r)   r*   http_writerr+   r,   streamsr-   r.   typedefsr/   __all__r   set	printabler8   rL   rM   escaper9   compiler:   ASCIIr;   r<   r=   r   r4   r5   rT   rU   r\   r0   rN   r   ABCr1   r2   r3   r   r(  HttpRequestParserPyHttpResponseParserPyRawRequestMessagePyRawResponseMessagePy_http_parserHttpRequestParserCHttpResponseParserCRawRequestMessageCRawResponseMessageCImportErrorrO   rO   rO   rP   <module>   sn   
 @$(	
		"l  JdY CN
