a
    nJh                     @   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: ddl;m<Z<m=Z= ddl>m?Z? dZ@ed ZAeBejCZDeeeE  eFd< eGdZHeeE eFd< eIdeH dZJeeeE  eFd< eIdejKZLeeeE  eFd< eIdejKZMeeeE  eFd< eIdZNeeeO  eFd< G dd  d eZPG d!d" d"eZQed#ePeQZRG d$d% d%eZSG d&d' d'eZTG d(d) d)ZUeeE eVd*d+d,ZWG d-d. d.e jXeeR ZYG d/d0 d0eYeP ZZG d1d2 d2eYeQ Z[G d3d4 d4Z\G d5d6 d6Z]eZZ^e[Z_ePZ`eQZaz2e(sdd7lbmZZZm[Z[mPZPmQZQ eZZce[ZdePZeeQZfW n egy   Y n0 dS )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)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 )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   E/var/www/shaz/venv/lib/python3.9/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                   @   s@   e Zd ZdeeeeddddZee ede	f d	d
dZ
dS )r1        FN)max_line_sizemax_headersmax_field_sizelaxreturnc                 C   s   || _ || _|| _|| _d S N)rf   rg   rh   _lax)selfrf   rg   rh   ri   rP   rP   rQ   __init__~   s    zHeadersParser.__init__rB   linesrj   c                 C   sP  t  }g }d}|d }t|}|r@z|dd\}}W n tyT   t|d Y n0 t|dkrjt||d |d hddh@ rt||d}t|| jkrtd|	d	d
t
| jt
t||	dd}	t|	st|t|}
|d7 }|| }| jo|o|d dv }|r|g}|r|
t|7 }
|
| jkrhtd|	d	d
t
| jt
|
|| |d7 }||k r|| }|r|d dv }nd}qq&d|}n0|
| jkrtd|	d	d
t
| jt
|
|d}|	dd}d|v sd|v sd|v r$t|||	| |||f qt|t|fS )Nr      :r       	   s    	zrequest header name {}utf8backslashreplaceutf-8surrogateescape)rs   rt   zrequest header field {}    
 )r   lensplit
ValueErrorr'   lstriprh   r)   formatdecoderM   r;   	fullmatchrl   appendjoinstripaddr   tuple)rm   rp   rC   rD   Z	lines_idxline
line_countZbnameZbvaluenameheader_lengthZcontinuationZ
bvalue_lstvaluerP   rP   rQ   parse_headers   s    








z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. >   ZtcpZ	websocket)getr   UPGRADElowerrC   rP   rP   rQ   _is_supported_upgrade   s    r   c                   @   s  e Zd ZU dZee ed< dee ee	j
 eeeeee ee ee eeee  eeeddd	d
Zejee edddZee dddZddejejejfeeeeeeeeeeef  eef dddZ ee ede!ee ee eef dddZ"eddddZ#dS )r2   Fri   N   rd   re   T)protocollooplimitrf   rg   rh   timerrR   r?   readallpayload_exceptionresponse_with_bodyread_until_eofauto_decompressrj   c                 C   s   || _ || _|| _|| _|| _|| _|| _|	| _|
| _|| _	|| _
|| _g | _d| _d| _d | _d | _|| _|| _t|||| j| _d S )Nry   F)r   r   rf   rg   rh   r   rR   r?   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   r   rP   rP   rQ   rn      s,    
zHttpParser.__init__ro   c                 C   s   d S rk   rP   )rm   rp   rP   rP   rQ   parse_message  s    zHttpParser.parse_messagerj   c                 C   s   | j d ur| j   d | _ nh| jr0| j| j | jr| jd dkrP| jd tt | | jW  d    S 1 sz0    Y  d S )Nrr   z
ry   )r   feed_eofr   r   r   r   	Exceptionr   rm   rP   rP   rQ   r     s    


*zHttpParser.feed_eofr7   ry   )dataSEPEMPTYCONTENT_LENGTHMETH_CONNECTSEC_WEBSOCKET_KEY1rj   c                    s  g }| j r| j | d }| _ t|}d}	| j}
|	|k r| jd u r| js|||	}||	krt| jst|t| }	q.||	kr||	| }|dkr|d}| j| |t| }	| jd |krz| 	| jW | j
  n| j
  0 tt d fdd}| }|jv rt|jo.tj| _td	| j}td
d}| jd us\J t|pvt|ott|}|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rHt#t$sJ t| j| j|
| jd}d| _t|jjd| j | j!d| _nj|s|d u r| j%rt| j| j|
| jd}t||j|j| jd| j| j | j!d
}|j"s|| _nt&}||f n||	d  | _ |}qq.| jd u r | jr | jrJ qq.|r|	|k r| jrJ | jd us,J z| j'||	d  |\}}W n\ t(y } zB|}| j)d urz| )t*|}t+| jj,|| d}d}W Y d }~n
d }~0 0 |rd}	t|}d | _q.q.qq.|r|	|k r||	d  }n|}|| j|fS )Nry   r   r8      rr   r   c                     s2   j  } | d u rd S t| s*t t| S rk   )rC   r   r=   r   r'   rT   )Z
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   r   ri   T)r?   rF   r   r   ri   )-r   r}   r   r   r   findr   rstripr   r   clearr   rT   rC   r'   rG   r   getattrr?   r   r"   rO   r    rH   r/   r   r   HttpPayloadParserrF   rR   r   r   r   ri   done
isinstancer5   r   r.   	feed_dataBaseExceptionr   rM   r!   payload)rm   r   r   r   r   r   r   messagesZdata_len	start_posr   posr   r   r   r?   rR   Z
empty_bodyr   Zpayload_parsereofZunderlying_excZreraised_excrP   r   rQ   r   .  s   






zHttpParser.feed_datarB   c              
      sB  | 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}	|	r|	 }
|
dkrd}n&|
d	krd}n|
d
krȈ tjrd} tj}|r| }|dv r|} tj}|dur2d| krd}ntdtj v r2t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}   Zgetall).0hr   rP   rQ   	<genexpr>  ry   z+HttpParser.parse_headers.<locals>.<genexpr>zDuplicate 'z' header found.closeTz
keep-aliverG   )gzipdeflatebrrH   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SERVERTRANSFER_ENCODINGZ
USER_AGENTnextr#   r   Z
CONNECTIONr   r   ZCONTENT_ENCODING)rm   rp   rD   Z
close_connencodingrG   rH   Z
singletonsZbad_hdrconnvencterP   r   rQ   r     sV    

zHttpParser.parse_headers)valrj   c                 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   NNNFNTFT)$rJ   rK   rL   ri   r   rO   rN   r   r   asyncioZAbstractEventLooprT   r   rM   r   r   rn   abcabstractmethodr   r   rU   r   r   r   r   r   r   _SEPr   r   r/   r   r0   r   r   rP   rP   rP   rQ   r2      sp   
              
) >Dr2   c                   @   s$   e Zd ZdZee ed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   c                 C   s  |d  dd}z|jddd\}}}W n tyD   t|d Y n0 t|| jkrntdt| jtt|t	|st|t
	|}|d u rt|tt|dt|d}|d	krtj|d
d}n|dr|d\}	}
}|	d\}	}}tj|	||d
d}nP|dkr2|dkr2t|d
d}n.t|d
d}|jdkr`t|jdd d| |\}}}}}}|d u r|tkrd
}nd}t||||||||||
S )Nr   rw   rx    rW   maxsplitStatus line is too longr   ZCONNECTT)	authorityencoded/#?)r@   Zquery_stringfragmentr   *OPTIONS)r   r   )errorslatin1F)r   r~   r   r$   r}   rf   r)   rM   r;   r   r<   r+   rT   groupr   build
startswith	partitionschemer(   encoder   r,   r5   )rm   rp   r   r?   r@   rA   match	version_orI   Z	path_partZ_hash_separatorZurl_fragmentZ_question_mark_separatorZqs_partrC   rD   r   rF   rG   rH   rP   rP   rQ   r   >  sr    



zHttpRequestParser.parse_messageN)rJ   rK   rL   __doc__r   r   r5   r   rP   rP   rP   rQ   r3   6  s   r3   c                
       sd   e Zd ZdZe Zd	eee e	e	e
ee
eef  eef d fddZee ed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.
    N)r   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 Y n0 z|jdd\}}W n tyt   | }d}Y n0 t|| jkrtdt| jtt|t	
|}|d u rt|tt|dt|d}t|d	kst
|st|t|}| |\}	}
}}}}|d u rx|tkr,d
}nLd|  krDdk sPn |dv rVd}n"tj|	v sntj|	v rtd}nd
}t||| |	|
||||	S )Nr   rw   rx   r   r   r   r   rW   rX   Td      >   i0     F)r   r~   r   r$   r   r}   rf   r)   rM   r<   r   r+   rT   r   r=   r   r,   r   r   r   r6   )rm   rp   r   rA   statusrS   r   r   Zstatus_irC   rD   r   rF   rG   rH   rP   rP   rQ   r     s`    




$z HttpResponseParser.parse_message)N)rJ   rK   rL   r   r   ri   r   r   r   r   r   r   r6   r/   rO   r   r   __classcell__rP   rP   r   rQ   r4     s    r4   c                   @   sl   e Zd Zdeee eee ee ee eeeeddddZdddd	Z	de
ee
eee
f dddZdS )r   NFT)r   r   rH   rF   rR   r?   r   r   r   ri   rj   c                 C   s   d| _ tj| _tj| _d| _d| _|	| _	|
| _
d| _|rN|rN| j	rNt||}n|}|sntj| _|  d| _n||r|tj| _nn|d urtj| _|| _ | j dkr|  d| _n>|r|dkrtj| _n(|dv rtd tj| _|  d| _|| _d S )Nr   ry   FTr   )PUTPOSTz6Content-Length or Transfer-Encoding header is required)_lengthrV   rY   _typer]   r_   _chunk_chunk_size_chunk_tailr   rl   r   DeflateBufferr   r[   rZ   r\   r-   warningr   )rm   r   r   rH   rF   rR   r?   r   r   r   ri   Zreal_payloadrP   rP   rQ   rn     sF    


zHttpPayloadParser.__init__r   c                 C   sF   | j tjkr| j  n*| j tjkr.tdn| j tjkrBt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_EXTrj   c                 C   s  | j tjkr| j}t|}||krT|| | _| j|| | jdkr| j  dS n6d| _| j|d | | | j  d||d  fS n | j tjkrn| j	r| j	| }d| _	|r| j
tjkr||}|dkr||d|}|dkr|d | }n|d | }| jr| }tt|sPt|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rf| j}t|}||kr|| | _| j|| d
S d| _| j|d | | ||d  }| jrT|drT|d	d  }tj| _
| j  | j
tjkr|d t| |kr|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| _
q|| _	d
S qn | j tj kr| j|t| d
S )Nr   )Try   Try   asciirx      r   r   )Fry   )!r   rV   rZ   r   r}   r   r   r   r[   r  r   r]   r_   r   rl   r   rer   r>   r*   r   r!   rT   r   rb   r   r`   r   begin_http_chunk_receivingra   end_http_chunk_receivingrc   r\   )rm   r  r   r  requiredZ	chunk_lenr   iZsize_bexcsizeheadrP   rP   rQ   r   0  s    
















zHttpPayloadParser.feed_data)	NFNNNFTTF)r7   r  )rJ   rK   rL   r/   r   rT   rO   rM   rn   r   r   r   r   r   rP   rP   rP   rQ   r     s8            : 
r   c                   @   s   e Zd ZU dZeed< eee ddddZ	e
feedddd	Zeedd
ddZddddZddddZddddZdS )r  zDDeflateStream decompress stream and feed data into specified stream.decompressorN)outr   rj   c                 C   sJ   || _ d| _|| _d| _|  |dkr:ts0tdt | _n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   )rm   r  r   rP   rP   rQ   rn     s    
zDeflateBuffer.__init__)r  	exc_causerj   c                 C   s   t | j|| d S rk   )r!   r  )rm   r  r  rP   rP   rQ   r!     s    zDeflateBuffer.set_exception)r  r  rj   c                 C   s   |sd S |  j |7  _ | jsF| jdkrF|d d@ dkrFt| jdd| _z| j|}W n  tyv   td| j Y n0 d| _|r| j	|t
| 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   r}   )rm   r  r  rP   rP   rQ   r     s*    
zDeflateBuffer.feed_datar   c                 C   sR   | j  }|s| jdkrD| j|t| | jdkrD| j jsDtd| j	  d S )Nr   r   )
r  flushr  r  r   r}   r   r   r%   r   )rm   r  rP   rP   rQ   r     s    
zDeflateBuffer.feed_eofc                 C   s   | j   d S rk   )r  r
  r   rP   rP   rQ   r
    s    z(DeflateBuffer.begin_http_chunk_receivingc                 C   s   | j   d S rk   )r  r  r   rP   rP   rQ   r    s    z&DeflateBuffer.end_http_chunk_receiving)rJ   rK   rL   r   r   rN   r/   r   rM   rn   r   r   r!   r   rT   r   r   r
  r  rP   rP   rP   rQ   r    s   
 
r  )r3   r4   r5   r6   )hr   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   Zhelpersr   r   r   r   r    r!   r"   Zhttp_exceptionsr#   r$   r%   r&   r'   r(   r)   r*   Zhttp_writerr+   r,   logr-   streamsr.   r/   Z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  ZHttpRequestParserPyZHttpResponseParserPyZRawRequestMessagePyZRawResponseMessagePyZ_http_parserZHttpRequestParserCZHttpResponseParserCZRawRequestMessageCZRawResponseMessageCImportErrorrP   rP   rP   rQ   <module>   sj   
@$	(
		"l  J^U HN