a
    nJh:q                  
   @   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mZ d dlmZ d dlZd dlmZ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/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z?m@Z@mAZAmBZBmCZC ddlDmEZE ddlFmGZG dZHerddlImJZJ ddlKmLZL ddlMmNZN ejOddddG dd dZPejQejR d ZSeeT eUd< deS dZVeeT eUd< d Wd!Xd"d# d$eYeZd%d& D Z[eeT eUd'< d(Z\eeT eUd)< d*jWe[e\d+Z]eeT eUd,< d-jWeVe]d.Z^eeT eUd/< e_d0Z`eeeT  eUd1< e_e^ZaeeeT  eUd2< G d3d4 d4eeTef e/ZbG d5d6 d6ebZcdS )7    N)SimpleCookie)MappingProxyType)TYPE_CHECKINGAnyDictFinalIteratorMappingMutableMappingOptionalPatternTupleUnioncast)	parse_qsl)CIMultiDictCIMultiDictProxy	MultiDictMultiDictProxyMultiMapping)URL   )hdrs)AbstractStreamWriter)	_SENTINELDEBUGETAG_ANYLIST_QUOTED_ETAG_REChainMapProxyETagHeadersMixinparse_http_datereifysentinelset_exception)RawRequestMessage)HttpVersion)BodyPartReaderMultipartReader)EmptyStreamReaderStreamReader)DEFAULT_JSON_DECODERJSONDecoderLooseHeaders
RawHeadersStrOrURL)HTTPRequestEntityTooLarge)StreamResponse)BaseRequest	FileFieldRequest)Application)RequestHandler)UrlMappingMatchInfoT)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 )r3   namefilenamefilecontent_typezCIMultiDictProxy[str]headersN)__name__
__module____qualname__str__annotations__ioBufferedReader rG   rG   E/var/www/shaz/venv/lib/python3.9/site-packages/aiohttp/web_request.pyr3   L   s
   

r3   z!#$%&'*+.^_`|~-_TCHAR[z]+_TOKENz[{}] c                 c   s   | ]}t |V  qd S N)chr).0crG   rG   rH   	<genexpr>[       rQ   )	       !   #      _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ed
eeef eeef eeef eeef eeef eeef eeef 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'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%e0dd+d,Z1e%e2e3eef d-f dd.d/Z4e%edd0d1Z5e%edd2d3Z6e%e7dd4d5Z8e%edd6d7Z9e%ee dd8d9Z:e%e'dd:d;Z;e%edd<d=Z<e%edd>d?Z=e%edd@dAZ>e%dBddCdDZ?e%eddEdFZ@e%dBddGdHZAe%eBddIdJZCe%eeDjD ddKdLZEe%eeDjD ddMdNZFeGee.eH dOdPdQZIeJee ee2eHd-f  dRdSdTZKe%ee2eHd-f  ddUdVZLe%ee2eHd-f  ddWdXZMe%eeDjD ddYdZZNe%e0dd[d\ZOe%e3eef dd]d^ZPe%eQdd_d`ZRe%eddadbZSee0ddcddZTee0ddedfZUe%e0ddgdhZVdddidjZWeXddkdlZYeddmdnZZe[doe\edpdqdrZ]e^ddsdtZ_duddvdwZ`deeedxdydzZaedd{d|Zbece0d}d~dZde0dddZeefddddZgehddddZidS )r2   )_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remoter6   zasyncio.Task[None])messagepayloadprotocolpayload_writertasklooprp   rq   rr   rs   rt   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urlrs   rr   Z
sslcontextZpeernamert   )r_   r`   ra   rb   r?   rc   methodrd   versionre   rj   r|   is_absoluters   rr   relativerf   rg   rh   ri   rk   rl   rm   	transportget_extra_inforn   ro   )selfru   rv   rw   rx   ry   rz   rp   rq   rr   rs   rt   r|   r   rG   rG   rH   __init__   sB    



zBaseRequest.__init__r}   rel_urlr?   rr   rs   rt   rp   r}   r   r?   rr   rs   rt   rp   r{   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< |tu r| j}| j|
| j| j| j| j| jf|| 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 contentr}   r|   pathr?   c                 s   s&   | ]\}}| d | d fV  qdS )utf-8N)encode)rO   kvrG   rG   rH   rQ      s   z$BaseRequest.clone.<locals>.<genexpr>raw_headersrr   rs   rt   )rp   rq   )rh   RuntimeErrorr#   r   rC   r   r   tupleitemsr_   _replacerl   	__class__rb   r`   ra   rk   rm   ri   copy)r   r}   r   r?   rr   rs   rt   rp   dctnew_urlru   kwargsrG   rG   rH   clone   sJ    	zBaseRequest.cloner{   c                 C   s   | j S rM   )rk   r   rG   rG   rH   ry   	  s    zBaseRequest.taskc                 C   s   | j S rM   )r`   r   rG   rG   rH   rw     s    zBaseRequest.protocolc                 C   s   | j d u rd S | j jS rM   )r`   r   r   rG   rG   rH   r     s    
zBaseRequest.transportc                 C   s   | j S rM   )ra   r   rG   rG   rH   writer  s    zBaseRequest.writerc                 C   s   | j S rM   )rl   r   rG   rG   rH   rp     s    zBaseRequest.client_max_sizec                 C   s   t jdtdd | jS )NzRequest.message is deprecated   
stacklevel)warningswarnDeprecationWarningr_   r   rG   rG   rH   ru     s    zBaseRequest.messagec                 C   s   | j S rM   )rf   r   rG   rG   rH   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   rm   r   rG   rG   rH   rz   (  s    zBaseRequest.loop)keyr{   c                 C   s
   | j | S rM   ri   r   r   rG   rG   rH   __getitem__1  s    zBaseRequest.__getitem__)r   valuer{   c                 C   s   || j |< d S rM   r   )r   r   r   rG   rG   rH   __setitem__4  s    zBaseRequest.__setitem__c                 C   s   | j |= d S rM   r   r   rG   rG   rH   __delitem__7  s    zBaseRequest.__delitem__c                 C   s
   t | jS rM   )lenri   r   rG   rG   rH   __len__:  s    zBaseRequest.__len__c                 C   s
   t | jS rM   )iterri   r   rG   rG   rH   __iter__=  s    zBaseRequest.__iter__c                 C   s
   | j dkS )z5A bool indicating if the request is handled with SSL.https)rr   r   rG   rG   rH   secureB  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
        rG   r   FN,"z\1r   T;z 	)r_   r?   Zgetallr   Z	FORWARDEDr   appendtypesr   r^   matchfindgroupsr]   sublowergroupr   )r   ZelemsZfield_valuelengthposZneed_separatorelemr   r;   r   portrG   rG   rH   	forwardedG  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)rn   r   rG   rG   rH   rr     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.
        )rd   r   rG   rG   rH   r}     s    zBaseRequest.methodc                 C   s   | j S )zxRead only property for getting HTTP version of request.

        Returns aiohttp.protocol.HttpVersion instance.
        )re   r   rG   rG   rH   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   rs   rG   rG   rH   rs     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   )ro   
isinstancelistr   rC   r   rG   rG   rH   rt     s
    	
zBaseRequest.remotec                 C   s   t j| j| jd}|| jS )N)rr   rs   )r   buildrr   rs   joinrf   )r   r|   rG   rG   rH   r|     s    zBaseRequest.urlc                 C   s   | j jS )z_The URL including *PATH INFO* without the host or scheme.

        E.g., ``/app/blog``
        )rf   r   r   rG   rG   rH   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
        )rC   rf   r   rG   rG   rH   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   rG   rG   rH   raw_path  s    zBaseRequest.raw_pathzMultiMapping[str]c                 C   s   t | jjS )z7A multidict with all the variables in the query string.)r   rf   queryr   rG   rG   rH   r     s    zBaseRequest.queryc                 C   s   | j jS )z:The query string in the URL.

        E.g., id=10
        )rf   query_stringr   rG   rG   rH   r     s    zBaseRequest.query_stringc                 C   s   | j S )z4A case-insensitive multidict proxy with all headers.)rc   r   rG   rG   rH   r?     s    zBaseRequest.headersc                 C   s   | j jS )z$A sequence of pairs for all headers.)r_   r   r   rG   rG   rH   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   rG   rG   rH   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   rG   rG   rH   if_unmodified_since   s    zBaseRequest.if_unmodified_since)etag_headerr{   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   garbagerG   rG   rH   _etag_values  s    
zBaseRequest._etag_values)header_valuer{   c                 C   s   |sd S t | |S rM   )r   r   )clsr   rG   rG   rH   _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   rG   rG   rH   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   rG   rG   rH   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   rG   rG   rH   if_range6  s    zBaseRequest.if_rangec                 C   s
   | j j S )zIs keepalive enabled by client?)r_   Zshould_closer   rG   rG   rH   
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.
        rL   c                 S   s   i | ]\}}||j qS rG   )r   )rO   r   valrG   rG   rH   
<dictcomp>K  rR   z'BaseRequest.cookies.<locals>.<dictcomp>)r?   r   r   ZCOOKIEr   r   r   )r   rawparsedrG   rG   rH   cookiesC  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)
rc   r   r   RANGErefindall
IndexError
ValueErrorintslice)r   rngstartendpatternrG   rG   rH   
http_rangeM  s(    zBaseRequest.http_rangec                 C   s   | j S )zReturn raw payload stream.)rb   r   rG   rG   rH   contentq  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   rb   at_eofr   rG   rG   rH   has_bodyv  s    zBaseRequest.has_bodyc                 C   s   | j   S )r   )rb   r   r   rG   rG   rH   can_read_body~  s    zBaseRequest.can_read_bodyc                 C   s   t | jtuS )z6Return True if request has HTTP BODY, False otherwise.)typerb   r)   r   rG   rG   rH   body_exists  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)rb   r   readanyr   rG   rG   rH   release  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)	rh   	bytearrayrb   r   extendrl   r   r0   bytes)r   bodychunkZ	body_sizerG   rG   rH   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encodingrG   rG   rH   text  s    
zBaseRequest.text)loads)r  r{   c                   s   |   I dH }||S )zReturn BODY as JSON.N)r  )r   r  r   rG   rG   rH   json  s    zBaseRequest.jsonc                    s   t | j| jS )z3Return async iterator to process BODY as multipart.)r(   rc   rb   r   rG   rG   rH   	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rh|  I dH }| j}| I dH }|durd}|j	
tj}t|trN|jdusJ |jr| jdtjI dH }|jddI dH }	|	rl||	}	| jd|j|	I dH  |t|	7 }d|  k r2|k rXn n"| jd|jI dH  t||d|jddI dH }	q| jd|jdI dH  |du rd}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 rVn nt||dnt$d| I dH }qn>| ! I dH }|r| j%pd}|&t'|( |d	|d t|| _ | j S )zReturn POST parameters.N)rL   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   ))rg   rd   POST_METHODSr   r   r>   r  rl   nextr?   r   r   ZCONTENT_TYPEr   r'   r;   r<   rm   Zrun_in_executortempfileTemporaryFileZ
read_chunkr   writer   closer0   seekr3   r   rE   rF   addr   
startswithget_charsetr   r   r   r   rstrip)r   r>   outr  r   fieldr  Zfield_cttmpr   ffr   r   datarG   rG   rH   post  s    







zBaseRequest.post)r;   r  r{   c                 C   s0   | j }|du r|S |j}|du r$|S |||S )z"Extra info from protocol transportN)r`   r   r   )r   r;   r  rw   r   rG   rG   rH   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@   rd   )r   Zascii_encodable_pathrG   rG   rH   __repr__"  s    zBaseRequest.__repr__)otherr{   c                 C   s   t | t |kS rM   )id)r   r  rG   rG   rH   __eq__*  s    zBaseRequest.__eq__c                 C   s   dS )NTrG   r   rG   rG   rH   __bool__-  s    zBaseRequest.__bool__responser{   c                    s   d S rM   rG   )r   r#  rG   rG   rH   _prepare_hook0  s    zBaseRequest._prepare_hook)excr{   c                 C   s   t | j| d S rM   )r$   rb   )r   r%  rG   rG   rH   _cancel3  s    zBaseRequest._cancel)N)jr@   rA   rB   r   Z
METH_PATCHZ	METH_POSTZMETH_PUTZ
METH_TRACEZMETH_DELETEr	  r    ATTRS	frozensetr%   r*   r   asyncioZAbstractEventLoopr   r   r   rC   r   r   r#   r   r   r/   r-   r   propertyry   rw   	Transportr   r   rp   r"   ru   r   r   rz   r   r   r   r   r   r   r   r   r   r	   r   rr   r}   r&   r~   rs   rt   r|   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!  r1   r$  BaseExceptionr&  rG   rG   rG   rH   r2   v   s  <






: <		#br2   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ed	ee	ef eeef eeef ee	ef ee	ef ee	ef eeef 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 )r4   _match_infoN)argsr   r{   c                    s   t  j|i | d | _d S rM   )superr   r1  )r   r2  r   r   rG   rH   r   ;  s    zRequest.__init__)r;   r   r{   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   r3  __setattr__)r   r;   r   r4  rG   rH   r5  F  s    
zRequest.__setattr__r   r   c          
   	      s0   t  j|||||||d}tt|}	| j|	_|	S )Nr   )r3  r   r   r4   r1  )
r   r}   r   r?   rr   rs   rt   rp   retZnew_retr4  rG   rH   r   P  s    	
zRequest.cloner7   r   c                 C   s   | j }|dusJ |S )zResult of route resolving.N)r1  r   
match_inforG   rG   rH   r8  h  s    zRequest.match_infor5   c                 C   s   | j }|dusJ |jS )zApplication instance.N)r1  Zcurrent_appr7  rG   rG   rH   appo  s    zRequest.appc                 C   sH   | j }|d usJ |j}| j}||}tt|d |d  }t|S )Nr   )r1  Zappsr9  indexr   reversedr   )r   r8  lstr9  idxZsublistrG   rG   rH   config_dictv  s    
zRequest.config_dictr"  c                    s6   | j }|d u rd S |jD ]}|j| |I d H  qd S rM   )r1  Z_appsZon_response_preparesend)r   r#  r8  r9  rG   rG   rH   r$    s
    
zRequest._prepare_hook)r@   rA   rB   r2   r'  r(  r   r   r   rC   r5  r#   r   r   r/   r-   r   r   r"   r8  r*  r9  r   r>  r1   r$  __classcell__rG   rG   r4  rH   r4   7  s8   	






	r4   )dr)  r,  rE   r   r   stringr  r   r   http.cookiesr   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   urllib.parser   attrZ	multidictr   r   r   r   r   Zyarlr   rL   r   abcr   Zhelpersr   r   r   r   r   r   r    r!   r"   r#   r$   Zhttp_parserr%   Zhttp_writerr&   r  r'   r(   streamsr)   r*   Ztypedefsr+   r,   r-   r.   r/   Zweb_exceptionsr0   Zweb_responser1   __all__Zweb_appr5   Zweb_protocolr6   Zweb_urldispatcherr7   sr3   digitsascii_lettersrI   rC   rD   rK   r  r   r   rangerX   rY   rZ   r\   compiler]   r^   r2   r4   rG   rG   rG   rH   <module>   sp   
84      F