a
    }3en                  
   @   s  U d dl Z d dlZd dlZd dlZd dlZ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 d dlmZ d dlZd dlmZ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)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ ddlAmBZB ddlCmDZD dZEerddlFmGZG ddlHmIZI ddlJmKZK ejLddddG dd dZMejNejO d ZPe<eQ eRd< deP dZSe<eQ eRd< d Td!Ud"d# d$eVeWd%d& D ZXe<eQ eRd'< d(ZYe<eQ eRd)< d*jTeXeYd+ZZe<eQ eRd,< d-jTeSeZd.Z[e<eQ eRd/< e\d0Z]e<eeQ  eRd1< e\e[Z^e<eeQ  eRd2< G d3d4 d4eeQef e,Z_G d5d6 d6e_Z`dS )7    N)SimpleCookie)MappingProxyType)TYPE_CHECKINGAnyDictIteratorMappingMutableMappingOptionalPatternTupleUnioncast)	parse_qsl)CIMultiDictCIMultiDictProxy	MultiDictMultiDictProxy)URL   )hdrs)AbstractStreamWriter)	DEBUGETAG_ANYLIST_QUOTED_ETAG_REChainMapProxyETagHeadersMixinparse_http_datereifysentinel)RawRequestMessage)HttpVersion)BodyPartReaderMultipartReader)EmptyStreamReaderStreamReader)DEFAULT_JSON_DECODERFinalJSONDecoderLooseHeaders
RawHeadersStrOrURL)HTTPRequestEntityTooLarge)StreamResponse)BaseRequest	FileFieldRequest)Application)RequestHandler)UrlMappingMatchInfoT)Zauto_attribsfrozenslotsc                   @   s8   e Zd ZU eed< eed< ejed< eed< ded< dS )r0   namefilenamefilecontent_typeCIMultiDictProxy[str]headersN)__name__
__module____qualname__str__annotations__ioBufferedReader rD   rD   F/home/pi/bot/my_env/lib/python3.9/site-packages/aiohttp/web_request.pyr0   D   s
   

r0   z!#$%&'*+.^_`|~-_TCHAR[z]+_TOKENz[{}] c                 c   s   | ]}t |V  qd S N)chr).0crD   rD   rE   	<genexpr>S       rN   )	       !   #      _QDTEXTz
\\[\t !-~]_QUOTED_PAIRz"(?:{quoted_pair}|{qdtext})*")ZqdtextZquoted_pair_QUOTED_STRINGz0({token})=({token}|{quoted_string})(:\d{{1,4}})?)tokenZquoted_string_FORWARDED_PAIRz\\([\t !-~])_QUOTED_PAIR_REPLACE_RE_FORWARDED_PAIR_REc                   @   s  e Zd ZejejejejejhZ	e
jeg dB Zddddddeededejeeeeef  ee ee ee dddd	Zeeeeeed
eeeeeed dddZeddddZeddddZeeej dddZ eedddZ!e"edddZ#e"e$dddZ%e"ejdddZ&eedddZ'eedd d!d"Z(eddd#d$Z)edd%d&Z*e+e dd'd(Z,e"e-dd)d*Z.e"e/e0eef d+f dd,d-Z1e"edd.d/Z2e"edd0d1Z3e"e4dd2d3Z5e"edd4d5Z6e"ee dd6d7Z7e"e$dd8d9Z8e"edd:d;Z9e"edd<d=Z:e"edd>d?Z;e"d@ddAdBZ<e"eddCdDZ=e"dEddFdGZ>e"e?ddHdIZ@e"eeAjA ddJdKZBe"eeAjA ddLdMZCeDee+eE dNdOdPZFeGee ee/eEd+f  dQdRdSZHe"ee/eEd+f  ddTdUZIe"ee/eEd+f  ddVdWZJe"eeAjA ddXdYZKe"e-ddZd[ZLe"e0eef dd\d]ZMe"eNdd^d_ZOe"edd`daZPee-ddbdcZQee-ddddeZRe"e-ddfdgZSdddhdiZTeUddjdkZVeddldmZWeXdneYedodpdqZZe[ddrdsZ\dtddudvZ]deeedwdxdyZ^eddzd{Z_e`e-d|d}d~Zae-dddZbecddddZdeeddddZfdS )r/   )_message	_protocol_payload_writer_payload_headers_method_version_rel_url_post_read_bytes_state_cache_task_client_max_size_loop_transport_sslcontext_transport_peernamei   N)client_max_sizestateschemehostremoter3   zasyncio.Task[None])messagepayloadprotocolpayload_writertasklooprm   rn   ro   rp   rq   returnc                C   s  |d u ri }|| _ || _|| _|| _|j| _|j| _|j| _	i | _
|j}| r~|| j
d< |j| j
d< |j| j
d< | | _n|j| _d | _d | _|| _|| _|| _|| _| jj}|d usJ |d| _|d| _|	d ur|	| j
d< |
d ur|
| j
d< |d ur|| j
d< d S )Nurlrp   ro   Z
sslcontextZpeernamerq   )r\   r]   r^   r_   r<   r`   methodra   versionrb   rg   ry   is_absoluterp   ro   relativerc   rd   re   rf   rh   ri   rj   	transportget_extra_infork   rl   )selfrr   rs   rt   ru   rv   rw   rm   rn   ro   rp   rq   ry   r~   rD   rD   rE   __init__   sB    



zBaseRequest.__init__rz   rel_urlr<   ro   rp   rq   rz   r   r<   ro   rp   rq   rx   c                C   s   | j rtdi }|tur"||d< |turFt|}||d< t||d< |turxtt||d< tdd | D |d< | j	j
f i |}	i }
|tur||
d	< |tur||
d
< |tur||
d< | j|	| j| j| j| j| jf| j| j d|
S )a  Clone itself with replacement some attributes.

        Creates and returns a new instance of Request object. If no parameters
        are given, an exact copy is returned. If a parameter is not passed, it
        will reuse the one from the current request object.
        z.Cannot clone request after reading its contentrz   ry   pathr<   c                 s   s&   | ]\}}| d | d fV  qdS )utf-8N)encode)rL   kvrD   rD   rE   rN      s   z$BaseRequest.clone.<locals>.<genexpr>raw_headersro   rp   rq   )rm   rn   )re   RuntimeErrorr    r   r@   r   r   tupleitemsr\   _replace	__class__r_   r]   r^   rh   rj   ri   rf   copy)r   rz   r   r<   ro   rp   rq   dctnew_urlrr   kwargsrD   rD   rE   clone   sF    	zBaseRequest.clonerx   c                 C   s   | j S rJ   )rh   r   rD   rD   rE   rv      s    zBaseRequest.taskc                 C   s   | j S rJ   )r]   r   rD   rD   rE   rt     s    zBaseRequest.protocolc                 C   s   | j d u rd S | j jS rJ   )r]   r~   r   rD   rD   rE   r~     s    
zBaseRequest.transportc                 C   s   | j S rJ   )r^   r   rD   rD   rE   writer  s    zBaseRequest.writerc                 C   s   t jdtdd | jS )NzRequest.message is deprecated   
stacklevel)warningswarnDeprecationWarningr\   r   rD   rD   rE   rr     s    zBaseRequest.messagec                 C   s   | j S rJ   )rc   r   rD   rD   rE   r     s    zBaseRequest.rel_urlc                 C   s   t jdtdd | jS )Nz#request.loop property is deprecated   r   )r   r   r   rj   r   rD   rD   rE   rw     s    zBaseRequest.loop)keyrx   c                 C   s
   | j | S rJ   rf   r   r   rD   rD   rE   __getitem__"  s    zBaseRequest.__getitem__)r   valuerx   c                 C   s   || j |< d S rJ   r   )r   r   r   rD   rD   rE   __setitem__%  s    zBaseRequest.__setitem__c                 C   s   | j |= d S rJ   r   r   rD   rD   rE   __delitem__(  s    zBaseRequest.__delitem__c                 C   s
   t | jS rJ   )lenrf   r   rD   rD   rE   __len__+  s    zBaseRequest.__len__c                 C   s
   t | jS rJ   )iterrf   r   rD   rD   rE   __iter__.  s    zBaseRequest.__iter__c                 C   s
   | j dkS )z5A bool indicating if the request is handled with SSL.https)ro   r   rD   rD   rE   secure3  s    zBaseRequest.secure.c                 C   sX  g }| j jtjdD ]6}t|}d}d}i }|t| d|  krT|k rn qt	
||}|dur|r~|d|}n\| \}}	}
|	d dkrtd|	dd	 }	|
r|	|
7 }	|	|| < |t|d7 }d
}q@|| dkrd}i }|t| |d7 }q@|| dkr(d}|d7 }q@|| dv r@|d7 }q@|d|}q@qt|S )a  A tuple containing all parsed Forwarded header(s).

        Makes an effort to parse Forwarded headers as specified by RFC 7239:

        - It adds one (immutable) dictionary per Forwarded 'field-value', ie
          per proxy. The element corresponds to the data in the Forwarded
          field-value added by the first proxy encountered by the client. Each
          subsequent item corresponds to those added by later proxies.
        - It checks that every value has valid syntax in general as specified
          in section 4: either a 'token' or a 'quoted-string'.
        - It un-escapes found escape sequences.
        - It does NOT validate 'by' and 'for' contents as specified in section
          6.
        - It does NOT validate 'host' contents (Host ABNF).
        - It does NOT validate 'proto' contents for valid URI scheme names.

        Returns a tuple containing one or more immutable dicts
        rD   r   FN,"z\1r   T;z 	)r\   r<   Zgetallr   Z	FORWARDEDr   appendtypesr   r[   matchfindgroupsrZ   sublowergroupr   )r   elemsZfield_valuelengthposZneed_separatorelemr   r7   r   portrD   rD   rE   	forwarded8  s@    


zBaseRequest.forwardedc                 C   s   | j r
dS dS dS )a  A string representing the scheme of the request.

        Hostname is resolved in this order:

        - overridden value by .clone(scheme=new_scheme) call.
        - type of connection to peer: HTTPS if socket is SSL, HTTP otherwise.

        'http' or 'https'.
        r   httpN)rk   r   rD   rD   rE   ro   u  s    zBaseRequest.schemec                 C   s   | j S )zyRead only property for getting HTTP method.

        The value is upper-cased str like 'GET', 'POST', 'PUT' etc.
        )ra   r   rD   rD   rE   rz     s    zBaseRequest.methodc                 C   s   | j S )zxRead only property for getting HTTP version of request.

        Returns aiohttp.protocol.HttpVersion instance.
        )rb   r   rD   rD   rE   r{     s    zBaseRequest.versionc                 C   s$   | j jtj}|dur|S t S )zHostname of the request.

        Hostname is resolved in this order:

        - overridden value by .clone(host=new_host) call.
        - HOST HTTP header
        - socket.getfqdn() value
        N)r\   r<   getr   ZHOSTsocketgetfqdn)r   rp   rD   rD   rE   rp     s    
zBaseRequest.hostc                 C   s6   | j du rdS t| j ttfr,t| j d S t| j S )zRemote IP of client initiated HTTP request.

        The IP is resolved in this order:

        - overridden value by .clone(remote=new_remote) call.
        - peername of opened socket
        Nr   )rl   
isinstancelistr   r@   r   rD   rD   rE   rq     s
    	
zBaseRequest.remotec                 C   s   t j| j| jd}|| jS )N)ro   rp   )r   buildro   rp   joinrc   )r   ry   rD   rD   rE   ry     s    zBaseRequest.urlc                 C   s   | j jS )z_The URL including *PATH INFO* without the host or scheme.

        E.g., ``/app/blog``
        )rc   r   r   rD   rD   rE   r     s    zBaseRequest.pathc                 C   s
   t | jS )zXThe URL including PATH_INFO and the query string.

        E.g, /app/blog?id=10
        )r@   rc   r   rD   rD   rE   path_qs  s    zBaseRequest.path_qsc                 C   s   | j jS )zThe URL including raw *PATH INFO* without the host or scheme.

        Warning, the path is unquoted and may contains non valid URL characters

        E.g., ``/my%2Fpath%7Cwith%21some%25strange%24characters``
        )r\   r   r   rD   rD   rE   raw_path  s    zBaseRequest.raw_pathzMultiDictProxy[str]c                 C   s   t | jjS )z7A multidict with all the variables in the query string.)r   rc   queryr   rD   rD   rE   r     s    zBaseRequest.queryc                 C   s   | j jS )z:The query string in the URL.

        E.g., id=10
        )rc   query_stringr   rD   rD   rE   r     s    zBaseRequest.query_stringr;   c                 C   s   | j S )z4A case-insensitive multidict proxy with all headers.)r`   r   rD   rD   rE   r<     s    zBaseRequest.headersc                 C   s   | j jS )z$A sequence of pairs for all headers.)r\   r   r   rD   rD   rE   r     s    zBaseRequest.raw_headersc                 C   s   t | jtjS )zyThe value of If-Modified-Since HTTP header, or None.

        This header is represented as a `datetime` object.
        )r   r<   r   r   ZIF_MODIFIED_SINCEr   rD   rD   rE   if_modified_since  s    zBaseRequest.if_modified_sincec                 C   s   t | jtjS )z{The value of If-Unmodified-Since HTTP header, or None.

        This header is represented as a `datetime` object.
        )r   r<   r   r   ZIF_UNMODIFIED_SINCEr   rD   rD   rE   if_unmodified_since  s    zBaseRequest.if_unmodified_since)etag_headerrx   c                 c   sZ   | t krtdt dV  n>t| D ]2}|ddd\}}}|rB qVtt||dV  q"dS )z'Extract `ETag` objects from raw header.F)is_weakr   r   r      N)r   r   r   finditerr   bool)r   r   r   r   garbagerD   rD   rE   _etag_values  s    
zBaseRequest._etag_values)header_valuerx   c                 C   s   |sd S t | |S rJ   )r   r   )clsr   rD   rD   rE   _if_match_or_none_impl  s    z"BaseRequest._if_match_or_none_implc                 C   s   |  | jtjS )zxThe value of If-Match HTTP header, or None.

        This header is represented as a `tuple` of `ETag` objects.
        )r   r<   r   r   ZIF_MATCHr   rD   rD   rE   if_match  s    zBaseRequest.if_matchc                 C   s   |  | jtjS )z}The value of If-None-Match HTTP header, or None.

        This header is represented as a `tuple` of `ETag` objects.
        )r   r<   r   r   ZIF_NONE_MATCHr   rD   rD   rE   if_none_match  s    zBaseRequest.if_none_matchc                 C   s   t | jtjS )zpThe value of If-Range HTTP header, or None.

        This header is represented as a `datetime` object.
        )r   r<   r   r   ZIF_RANGEr   rD   rD   rE   if_range'  s    zBaseRequest.if_rangec                 C   s
   | j j S )zIs keepalive enabled by client?)r\   Zshould_closer   rD   rD   rE   
keep_alive/  s    zBaseRequest.keep_alivec                 C   s.   | j tjd}t|}tdd | D S )zMReturn request cookies.

        A read-only dictionary-like object.
        rI   c                 S   s   i | ]\}}||j qS rD   )r   )rL   r   valrD   rD   rE   
<dictcomp><  rO   z'BaseRequest.cookies.<locals>.<dictcomp>)r<   r   r   ZCOOKIEr   r   r   )r   rawparsedrD   rD   rE   cookies4  s    zBaseRequest.cookiesc                 C   s   | j tj}d\}}|durzd}t||d \}}W n tyT   tdY n0 |rbt|nd}|rrt|nd}|du r|dur| }d}|dur|dur|d7 }||krtd||  u rdu rn ntdt	||dS )	zMThe content of Range HTTP header.

        Return a slice instance.

        )NNNz^bytes=(\d*)-(\d*)$r   zrange not in acceptable formatr   zstart cannot be after endz"No start or end of range specified)
r`   r   r   RANGErefindall
IndexError
ValueErrorintslice)r   rngstartendpatternrD   rD   rE   
http_range>  s(    zBaseRequest.http_rangec                 C   s   | j S )zReturn raw payload stream.)r_   r   rD   rD   rE   contentb  s    zBaseRequest.contentc                 C   s   t jdtdd | j  S )@Return True if request's HTTP BODY can be read, False otherwise.z$Deprecated, use .can_read_body #2005r   r   )r   r   r   r_   at_eofr   rD   rD   rE   has_bodyg  s    zBaseRequest.has_bodyc                 C   s   | j   S )r   )r_   r   r   rD   rD   rE   can_read_bodyo  s    zBaseRequest.can_read_bodyc                 C   s   t | jtuS )z6Return True if request has HTTP BODY, False otherwise.)typer_   r%   r   rD   rD   rE   body_existst  s    zBaseRequest.body_existsc                    s    | j  s| j  I dH  q dS )zKRelease request.

        Eat unread part of HTTP BODY if present.
        N)r_   r   readanyr   rD   rD   rE   releasey  s    
zBaseRequest.releasec                    sh   | j du rbt }| j I dH }|| | jrPt|}|| jkrPt| j|d|sqXqt|| _ | j S )z_Read request body if present.

        Returns bytes object with full request content.
        Nmax_sizeZactual_size)	re   	bytearrayr_   r   extendri   r   r-   bytes)r   bodychunkZ	body_sizerD   rD   rE   read  s    



zBaseRequest.readc                    s"   |   I dH }| jpd}||S )z1Return BODY as text using encoding from .charset.Nr   )r   charsetdecode)r   Z
bytes_bodyencodingrD   rD   rE   text  s    
zBaseRequest.text)loads)r   rx   c                   s   |   I dH }||S )zReturn BODY as JSON.N)r   )r   r   r   rD   rD   rE   json  s    zBaseRequest.jsonc                    s   t | j| jS )z3Return async iterator to process BODY as multipart.)r$   r`   r_   r   rD   rD   rE   	multipart  s    zBaseRequest.multipartz,MultiDictProxy[Union[str, bytes, FileField]]c                    s~  | j dur| j S | j| jvr.tt | _ | j S | j}|dvrNtt | _ | j S t }|dkr0|  I dH }| j}| I dH }|durnd}|j	
tj}t|tr|jdusJ |jrt }|jddI dH }	|	rB||	}	||	 |t|	7 }d|  k r|k r.n n|  t||d|jddI dH }	q|d |du rZd}t|j|jttj|||j	}
||j|
 n|jd	d
I dH }|du s| dr|j!dd}||j|| n||j| |t|7 }d|  k r|k rn nt||dnt"d| I dH }qn>|  I dH }|rn| j#pNd}|$t%|& |d	|d t|| _ | j S )zReturn POST parameters.N)rI   z!application/x-www-form-urlencodedmultipart/form-datar  r   i   )sizer   zapplication/octet-streamT)r   ztext/r   )defaultz8To decode nested multipart you need to use custom reader)keep_blank_valuesr   )'rd   ra   POST_METHODSr   r   r:   r  ri   nextr<   r   r   CONTENT_TYPEr   r#   r7   r8   tempfileTemporaryFileZ
read_chunkr   writer   closer-   seekr0   r   rB   rC   addr   
startswithget_charsetr   r   r   r   rstrip)r   r:   outr  r   fieldr  Zfield_cttmpr   ffr   r   datarD   rD   rE   post  s    








zBaseRequest.post)r7   r  rx   c                 C   s0   | j }|du r|S |j}|du r$|S |||S )z"Extra info from protocol transportN)r]   r~   r   )r   r7   r  rt   r~   rD   rD   rE   r     s    zBaseRequest.get_extra_infoc                 C   s(   | j ddd}d| jj| j|S )Nasciibackslashreplacez<{} {} {} >)r   r   r   formatr   r=   ra   )r   Zascii_encodable_pathrD   rD   rE   __repr__  s    zBaseRequest.__repr__)otherrx   c                 C   s   t | t |kS rJ   )id)r   r  rD   rD   rE   __eq__  s    zBaseRequest.__eq__c                 C   s   dS )NTrD   r   rD   rD   rE   __bool__  s    zBaseRequest.__bool__responserx   c                    s   d S rJ   rD   )r   r"  rD   rD   rE   _prepare_hook  s    zBaseRequest._prepare_hook)excrx   c                 C   s   | j | d S rJ   )r_   Zset_exception)r   r$  rD   rD   rE   _cancel"  s    zBaseRequest._cancel)N)gr=   r>   r?   r   Z
METH_PATCHZ	METH_POSTZMETH_PUTZ
METH_TRACEZMETH_DELETEr  r   ATTRS	frozensetr!   r&   r   asyncioZAbstractEventLoopr   r
   r   r@   r   r   r    r,   r*   r   propertyrv   rt   	Transportr~   r   r   rr   r   r   rw   r   r   r   r   r   r   r   r   r   r   r   ro   rz   r"   r{   rp   rq   ry   r   r   r   r   r   r<   r+   r   datetimer   r   staticmethodr   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r)   r  r$   r  r  r   r  objectr  r   r.   r#  BaseExceptionr%  rD   rD   rD   rE   r/   n   s  <7 <		#`r/   c                	       s   e Zd ZejedgB Zeedd fddZerHe	edd fddZ
eeeeeed	e	eee	e	e	d d
 fddZeddddZeddddZeedddZeddddZ  ZS )r1   _match_infoN)argsr   rx   c                    s   t  j|i | d | _d S rJ   )superr   r0  )r   r1  r   r   rD   rE   r   *  s    zRequest.__init__)r7   r   rx   c                    s8   || j vr&tjd| jj|tdd t || d S )Nz-Setting custom {}.{} attribute is discouragedr   r   )	r&  r   r   r  r   r=   r   r2  __setattr__)r   r7   r   r3  rD   rE   r4  5  s    
zRequest.__setattr__r   r   c          	         s.   t  j||||||d}tt|}| j|_|S )Nr   )r2  r   r   r1   r0  )	r   rz   r   r<   ro   rp   rq   retZnew_retr3  rD   rE   r   ?  s    

zRequest.cloner4   r   c                 C   s   | j }|dusJ |S )zResult of route resolving.N)r0  r   
match_inforD   rD   rE   r7  U  s    zRequest.match_infor2   c                 C   s   | j }|dusJ |jS )zApplication instance.N)r0  Zcurrent_appr6  rD   rD   rE   app\  s    zRequest.appc                 C   sH   | j }|d usJ |j}| j}||}tt|d |d  }t|S )Nr   )r0  Zappsr8  indexr   reversedr   )r   r7  lstr8  idxZsublistrD   rD   rE   config_dictc  s    
zRequest.config_dictr!  c                    s6   | j }|d u rd S |jD ]}|j| |I d H  qd S rJ   )r0  Z_appsZon_response_preparesend)r   r"  r7  r8  rD   rD   rE   r#  m  s
    
zRequest._prepare_hook)r=   r>   r?   r/   r&  r'  r   r   r   r@   r4  r    r,   r*   r   r   r7  r)  r8  r   r=  r.   r#  __classcell__rD   rD   r3  rE   r1   &  s4   		r1   )ar(  r+  rB   r   r   stringr
  r   r   http.cookiesr   r   typingr   r   r   r   r   r	   r
   r   r   r   r   urllib.parser   attrZ	multidictr   r   r   r   Zyarlr   rI   r   abcr   Zhelpersr   r   r   r   r   r   r   r   r    Zhttp_parserr!   Zhttp_writerr"   r  r#   r$   Zstreamsr%   r&   Ztypedefsr'   r(   r)   r*   r+   r,   Zweb_exceptionsr-   Zweb_responser.   __all__Zweb_appr2   Zweb_protocolr3   Zweb_urldispatcherr4   sr0   digitsascii_lettersrF   r@   rA   rH   r  r   r   rangerU   rV   rW   rY   compilerZ   r[   r/   r1   rD   rD   rD   rE   <module>   sp   
4,       =