U
    ;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/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(ZSeeC eTd)d*d+ZUG d,d- d-e jVeeP ZWG d.d/ d/eWeN ZXG d0d1 d1eWeO ZYG d2d3 d3ZZG d4d5 d5Z[eXZ\eYZ]eNZ^eOZ_z2e(sdd6l`mXZXmYZYmNZNmOZO eXZaeYZbeNZceOZdW n eek
r   Y nX dS )7    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   S/opt/bot/vods_filmes/script/venv/lib/python3.8/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                   @   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 )r0        FN)max_line_sizemax_headersmax_field_sizelaxreturnc                 C   s   || _ || _|| _|| _d S N)re   rf   rg   _lax)selfre   rf   rg   rh   rO   rO   rP   __init__}   s    zHeadersParser.__init__rA   linesri   c                 C   sR  t  }g }d}|d }t|}|rBz|dd\}}W n tk
rV   t|d Y nX t|dkrlt||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k}|r|g}|r|
t|7 }
|
| jkrjtd|	d	d
t
| jt
|
|| |d7 }||k r|| }|r|d dk}nd}qq(d|}n0|
| jkrtd|	d	d
t
| jt
|
|d}|	dd}d|ksd|ksd|kr&t|||	| |||f q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'   lstriprg   r)   formatdecoderL   r:   	fullmatchrk   appendjoinstripaddr   tuple)rl   ro   rB   rC   Z	lines_idxline
line_countZbnameZbvaluenameheader_lengthZcontinuationZ
bvalue_lstvaluerO   rO   rP   parse_headers   s    








z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kS )z)Check if the upgrade header is supported. >   tcp	websocket)getr   UPGRADElowerrB   rO   rO   rP   _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ddd	d
Zejee edddZej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 ) r1   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 )Nrx   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      s0       zHttpParser.__init__rn   c                 C   s   d S rj   rO   )rl   ro   rO   rO   rP   parse_message  s    zHttpParser.parse_messageteri   c                 C   s   d S rj   rO   rl   r   rO   rO   rP   _is_chunked_te  s    zHttpParser._is_chunked_teri   c              
   C   s|   | j d k	r| j   d | _ n\| jr0| j| j | jrx| jd dkrP| jd tt | | jW  5 Q R  S Q R X d S )Nrq   z
rx   )r   feed_eofr   r   r   r   	Exceptionr   rl   rO   rO   rP   r     s    


zHttpParser.feed_eofr6   rx   )dataSEPEMPTYCONTENT_LENGTHMETH_CONNECTSEC_WEBSOCKET_KEY1ri   c                    s  g }| j r| j | d }| _ t|}d}	| j}
d}|	|k r| jd kr| js|||	}||	krx| jsx|t| }	q2||	kr|rtd||	| }|dkr|d}| j	| |t| }	| jd |krz| | jW 5 | j
  X tt d fd	d
}| }|jkr$t|jo4tj| _td| j}tdd}| jd k	sbtt|p|t|ozt|}|s|d k	r|dksjr| jst| j| j|
| jd}t||j|j| j| j | j!| j"d	}|j#s|| _n||krHt$t%stt| j| j|
| jd}d| _t|jj| j!| j"d| _nh|s|d kr| j&rt| j| j|
| jd}t||j|j| j| j | j!| j"d	}|j#s|| _nt'}|	|f j(}n||	d  | _ |}qq2| jd kr| jr| jrtqq2|r|	|k r| jr t| jd k	s0tz| j)||	d  |\}}W nZ t*k
r } z:|}| j+d k	r| +t,|}t-| jj.|| d}d}W 5 d }~X Y nX |rd}	t|}d | _q2q2qq2|r|	|k r||	d  }n|}|| j|fS )Nrx   r   FzData after `Connection: close`r7      rq   r   c                     s2   j  } | d krd S t| s*t t| S rj   )rB   r   r<   r   r'   rS   )Z
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   clearr   r   rS   rB   r'   rF   r   getattrr>   r   AssertionErrorr"   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   messagesZdata_len	start_posr   rD   posr   r   r   r>   rQ   Z
empty_bodyr   Zpayload_parsereofZunderlying_excZreraised_excrO   r   rP   r   -  s   






zHttpParser.feed_datarA   c              
      s6  | 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k	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kr|} tj}|dk	r&| |rd}tj kr&t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|   Z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   ZCONTENT_LOCATIONZCONTENT_RANGEZCONTENT_TYPEZETAGZHOSTZMAX_FORWARDSZSERVERTRANSFER_ENCODINGZ
USER_AGENTnextr#   r   Z
CONNECTIONr   r   ZCONTENT_ENCODINGr   )rl   ro   rC   Z
close_connencodingrF   rG   Z
singletonsZbad_hdrconnvencr   rO   r   rP   r     sT    

zHttpParser.parse_headers)valri   c                 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   asyncioZ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      sp   
             
' @Br1   c                   @   s4   e Zd ZdZee edddZee	d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   c                 C   s  |d  dd}z|jddd\}}}W n tk
rF   t|d Y nX t|| jkrptdt| jtt|t	|st|t
	|}|d krt|tt|dt|d}|d	krtj|d
d}n|dr|d\}	}
}|	d\}	}}tj|	||d
d}nP|dkr4|dkr4t|d
d}n.t|d
d}|jdkrbt|jdd d| |\}}}}}}|d kr|tkrd
}nd}t||||||||||
S )Nr   rv   rw    rV   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|   re   r)   rL   r:   r   r;   r+   rS   groupr   build
startswith	partitionschemer(   encoder   r,   r4   )rl   ro   r   r>   r?   r@   match	version_orH   Z	path_partZ_hash_separatorZurl_fragmentZ_question_mark_separatorZqs_partrB   rC   r   rE   rF   rG   rO   rO   rP   r   =  sv      




zHttpRequestParser.parse_messager   c                 C   s0   |j dddd d dkr$dS tdd S )	N,r   r   rq    	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                
       st   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eed	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.
    N)r   r   argskwargsri   c                    s*   |d krt rdnd}t j||f||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k
rB   t|d Y nX z|jdd\}}W n  tk
rx   | }d}Y nX t|| jkrtdt| jtt|t	
|}|d krt|tt|dt|d}t|d	kst
|st|t|}| |\}	}
}}}}|d kr||tkr0d
}nLd|  krHdk sTn |dkrZd}n"tj|	ksrtj|	krxd}nd
}t||| |	|
||||	S )Nr   rv   rw   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   ro   r   r@   statusrR   r   r   Z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   rq   r   rG   )r   r   r   r   rO   rO   rP   r     s    z!HttpResponseParser._is_chunked_te)N)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                   @   sj   e Zd Zd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   rG   rE   rQ   r>   r   r   rh   ri   c
                 C   s   d| _ tj| _tj| _d| _d| _|| _	|	| _
d| _|rN|rN| j	rNt||}
n|}
|sntj| _|
  d| _n<|r|tj| _n.|d k	rtj| _|| _ | j dkr|
  d| _|
| _d S )Nr   rx   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   Zreal_payloadrO   rO   rP   rm     s6     

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  rU   r[   r   r   rY   r&   rZ   r*   r   rO   rO   rP   r   !  s    zHttpPayloadParser.feed_eofr6      ;)chunkr   	CHUNK_EXTri   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 n6| j tjkr| j	r| j	| }d| _	|r| j
tjkr ||}|dkr||d|}|dkr4|d | }d|||  }	kr@td|	}
t| j|
 |
n|d | }| jrP| }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r|| j}t|}||krB|| | _| j|| dS d| _| j|d | | ||d  }tj| _
| j  | j
tjkr| jr|d
r|dd  }|d t| |kr|t|d  }tj| _
n
|| _	dS | j
tjkrX|d t| }||kr*| j  d|t|d  fS |s4dS ||d d krP|| _	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   )Trx   Trx   r7   z"Unexpected LF in chunk-extension: asciirw      r   r   )Frx   )"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  requiredZ	chunk_lenr   iZsize_bextexcsizeheadrO   rO   rP   r   -  s    

















zHttpPayloadParser.feed_data)NFNNNTTF)r6   r	  )rI   rJ   rK   r.   r   rS   rN   rL   rm   r   r   r   r   r   rO   rO   rO   rP   r     s:           .     
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   ri   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   )rl   r  r   rO   rO   rP   rm     s    
zDeflateBuffer.__init__)r  	exc_causeri   c                 C   s   t | j|| d S rj   )r!   r  )rl   r  r  rO   rO   rP   r!     s    zDeflateBuffer.set_exception)r
  r  ri   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k
rx   td| j Y nX 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|   )rl   r
  r  rO   rO   rP   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   )rl   r
  rO   rO   rP   r     s    
zDeflateBuffer.feed_eofc                 C   s   | j   d S rj   )r  r  r   rO   rO   rP   r    s    z(DeflateBuffer.begin_http_chunk_receivingc                 C   s   | j   d S rj   )r  r  r   rO   rO   rP   r    s    z&DeflateBuffer.end_http_chunk_receiving)rI   rJ   rK   r   r   rM   r.   r   rL   rm   r   r   r!   r   rS   r   r   r  r  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   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,   streamsr-   r.   Z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  ZHttpRequestParserPyZHttpResponseParserPyZRawRequestMessagePyZRawResponseMessagePyZ_http_parserZHttpRequestParserCZHttpResponseParserCZRawRequestMessageCZRawResponseMessageCImportErrorrO   rO   rO   rP   <module>   sj    @$	(
		"l  JdY CN