o
    n~bl                  
   @   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)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 rE   rE   >/usr/local/lib/python3.10/dist-packages/aiohttp/web_request.pyr0   D   s   
 
r0   z!#$%&'*+.^_`|~-_TCHAR[z]+_TOKENz[{}] c                 c   s    | ]}t |V  qd S N)chr).0crE   rE   rF   	<genexpr>S   s    rO   )	       !   #      _QDTEXTz
\\[\t !-~]_QUOTED_PAIRz"(?:{quoted_pair}|{qdtext})*")ZqdtextZquoted_pair_QUOTED_STRINGz0({token})=({token}|{quoted_string})(:\d{{1,4}})?)token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dededdd	ed
ddejdedeeeef  dee dee dee ddfddZeeeeeeddededededededd fddZedddZedddZedeej fdd Z edefd!d"Z!e"defd#d$Z#e"de$fd%d&Z%e"dejfd'd(Z&d)edefd*d+Z'd)ed,eddfd-d.Z(d)eddfd/d0Z)defd1d2Z*de+e fd3d4Z,e"de-fd5d6Z.e"de/e0eef d7f fd8d9Z1e"defd:d;Z2e"defd<d=Z3e"de4fd>d?Z5e"defd@dAZ6e"dee fdBdCZ7e"de$fdDdEZ8e"defdFdGZ9e"defdHdIZ:e"defdJdKZ;e"ddMdNZ<e"defdOdPZ=e"ddRdSZ>e"de?fdTdUZ@e"deeAjA fdVdWZBe"deeAjA fdXdYZCeDdZede+eE fd[d\ZFeGd]ee dee/eEd7f  fd^d_ZHe"dee/eEd7f  fd`daZIe"dee/eEd7f  fdbdcZJe"deeAjA fdddeZKe"de-fdfdgZLe"de0eef fdhdiZMe"deNfdjdkZOe"defdldmZPede-fdndoZQede-fdpdqZRe"de-fdrdsZSddtduZTdeUfdvdwZVdefdxdyZWeXdzd{eYdefd|d}ZZde[fd~dZ\dddZ]ddededefddZ^defddZ_de`de-fddZade-fddZbdecddfddZddeeddf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remotemessagepayloadprotocolr3   payload_writertaskasyncio.Task[None]looprn   ro   rp   rq   rr   returnc                C   s   |d u ri }|| _ || _|| _|| _|j| _|j| _|j| _	|j
| _d | _d | _|| _i | _|| _|| _|| _| jj}|d usAJ |d| _|d| _|	d urV|	| jd< |
d ur_|
| jd< |d urj|| jd< d S d S )N
sslcontextpeernamerp   rq   rr   )r]   r^   r_   r`   r=   ra   methodrb   versionrc   urlrd   re   rf   rg   rh   ri   rj   rk   	transportget_extra_inforl   rm   )selfrs   rt   ru   rv   rw   ry   rn   ro   rp   rq   rr   r   rE   rE   rF   __init__   s:   

zBaseRequest.__init__r}   rel_urlr=   rp   rq   rr   r}   r   r=   c                C   s   | j rtdi }|tur||d< |tur#t|}||d< t||d< |tur<tt||d< tdd | D |d< | j	j
di |}	i }
|turO||
d	< |turW||
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 contentr}   r   pathr=   c                 s   s(    | ]\}}| d | d fV  qdS )utf-8N)encode)rM   kvrE   rE   rF   rO      s    
z$BaseRequest.clone.<locals>.<genexpr>raw_headersrp   rq   rr   )rn   ro   NrE   )rf   RuntimeErrorr    r   rA   r   r   tupleitemsr]   _replace	__class__r`   r^   r_   ri   rk   rj   rg   copy)r   r}   r   r=   rp   rq   rr   dctnew_urlrs   kwargsrE   rE   rF   clone   sF   	zBaseRequest.clonec                 C      | j S rK   )ri   r   rE   rE   rF   rw         zBaseRequest.taskc                 C   r   rK   )r^   r   rE   rE   rF   ru      r   zBaseRequest.protocolc                 C   s   | j d u rd S | j jS rK   )r^   r   r   rE   rE   rF   r      s   
zBaseRequest.transportc                 C   r   rK   )r_   r   rE   rE   rF   writer  r   zBaseRequest.writerc                 C      t jdtdd | jS )NzRequest.message is deprecated   
stacklevel)warningswarnDeprecationWarningr]   r   rE   rE   rF   rs     s   zBaseRequest.messagec                 C   r   rK   )rd   r   rE   rE   rF   r     r   zBaseRequest.rel_urlc                 C   r   )Nz#request.loop property is deprecated   r   )r   r   r   rk   r   rE   rE   rF   ry     s   zBaseRequest.loopkeyc                 C   s
   | j | S rK   rg   r   r   rE   rE   rF   __getitem__     
zBaseRequest.__getitem__valuec                 C   s   || j |< d S rK   r   )r   r   r   rE   rE   rF   __setitem__  s   zBaseRequest.__setitem__c                 C   s   | j |= d S rK   r   r   rE   rE   rF   __delitem__   s   zBaseRequest.__delitem__c                 C   
   t | jS rK   )lenrg   r   rE   rE   rF   __len__#  r   zBaseRequest.__len__c                 C   r   rK   )iterrg   r   rE   rE   rF   __iter__&  r   zBaseRequest.__iter__c                 C   s
   | j dkS )z5A bool indicating if the request is handled with SSL.https)rp   r   rE   rE   rF   secure+     
zBaseRequest.secure.c                 C   sd  g }| j jtjdD ]}t|}d}d}i }|t| d|  kr)|k rn qt	
||}|durm|r>|d|}nd| \}}	}
|	d dkrUtd|	dd	 }	|
r[|	|
7 }	|	|| < |t|d7 }d
}n5|| dkrd}i }|t| |d7 }n|| dkrd}|d7 }n|| dv r|d7 }n|d|}d|  kr|k s+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
        rE   r   FN,"z\1r   T;z 	)r]   r=   Zgetallr   Z	FORWARDEDr   appendtypesr   r\   matchfindgroupsr[   sublowergroupr   )r   elemsZfield_valuelengthposZneed_separatorelemr   r8   r   portrE   rE   rF   	forwarded0  sD   


 zBaseRequest.forwardedc                 C   s   | j r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   http)rl   r   rE   rE   rF   rp   m  s   zBaseRequest.schemec                 C   r   )zyRead only property for getting HTTP method.

        The value is upper-cased str like 'GET', 'POST', 'PUT' etc.
        )rb   r   rE   rE   rF   r}   }     zBaseRequest.methodc                 C   r   )zxRead only property for getting HTTP version of request.

        Returns aiohttp.protocol.HttpVersion instance.
        )rc   r   rE   rE   rF   r~     r   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   rq   rE   rE   rF   rq     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   )rm   
isinstancelistr   rA   r   rE   rE   rF   rr     s
   
	
zBaseRequest.remotec                 C   s   t j| j| jd}|| jS )N)rp   rq   )r   buildrp   rq   joinrd   )r   r   rE   rE   rF   r     s   zBaseRequest.urlc                 C      | j jS )z_The URL including *PATH INFO* without the host or scheme.

        E.g., ``/app/blog``
        )rd   r   r   rE   rE   rF   r        zBaseRequest.pathc                 C   r   )zXThe URL including PATH_INFO and the query string.

        E.g, /app/blog?id=10
        )rA   rd   r   rE   rE   rF   path_qs  s   
zBaseRequest.path_qsc                 C   r   )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   rE   rE   rF   raw_path  s   zBaseRequest.raw_pathMultiDictProxy[str]c                 C   s   t | jjS )z7A multidict with all the variables in the query string.)r   rd   queryr   rE   rE   rF   r        zBaseRequest.queryc                 C   r   )z:The query string in the URL.

        E.g., id=10
        )rd   query_stringr   rE   rE   rF   r     r   zBaseRequest.query_stringr<   c                 C   r   )z4A case-insensitive multidict proxy with all headers.)ra   r   rE   rE   rF   r=        zBaseRequest.headersc                 C   r   )z$A sequence of pairs for all headers.)r]   r   r   rE   rE   rF   r     s   zBaseRequest.raw_headersc                 C      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   rE   rE   rF   if_modified_since     zBaseRequest.if_modified_sincec                 C   r   )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   rE   rE   rF   if_unmodified_since  r   zBaseRequest.if_unmodified_sinceetag_headerc                 c   s`    | t krtdt dV  dS t| D ]}|ddd\}}}|r$ dS t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   garbagerE   rE   rF   _etag_values  s   
zBaseRequest._etag_valuesheader_valuec                 C   s   |sd S t | |S rK   )r   r   )clsr   rE   rE   rF   _if_match_or_none_impl  s   z"BaseRequest._if_match_or_none_implc                 C      |  | 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   rE   rE   rF   if_match     zBaseRequest.if_matchc                 C   r   )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   rE   rE   rF   if_none_match  r   zBaseRequest.if_none_matchc                 C   r   )zpThe value of If-Range HTTP header, or None.

        This header is represented as a `datetime` object.
        )r   r=   r   r   ZIF_RANGEr   rE   rE   rF   if_range  r   zBaseRequest.if_rangec                 C   s
   | j j S )zIs keepalive enabled by client?)r]   Zshould_closer   rE   rE   rF   
keep_alive'  r   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.
        rJ   c                 S   s   i | ]\}}||j qS rE   )r   )rM   r   valrE   rE   rF   
<dictcomp>4  s    z'BaseRequest.cookies.<locals>.<dictcomp>)r=   r   r   ZCOOKIEr   r   r   )r   rawparsedrE   rE   rF   cookies,  s   zBaseRequest.cookiesc                 C   s   | j tj}d\}}|durhzd}t||d \}}W n ty(   tdw |r/t|nd}|r7t|nd}|du rF|durF| }d}|durZ|durZ|d7 }||krZtd||  u rgdu rht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)
ra   r   r   RANGErefindall
IndexError
ValueErrorintslice)r   rngstartendpatternrE   rE   rF   
http_range6  s,   zBaseRequest.http_rangec                 C   r   )zReturn raw payload stream.)r`   r   rE   rE   rF   contentZ  r   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   rE   rE   rF   has_body_  s   zBaseRequest.has_bodyc                 C   s   | j   S )r   )r`   r   r   rE   rE   rF   can_read_bodyg  r   zBaseRequest.can_read_bodyc                 C   s   t | jtuS )z6Return True if request has HTTP BODY, False otherwise.)typer`   r%   r   rE   rE   rF   body_existsl  s   zBaseRequest.body_existsc                    s.   | j  s| j  I dH  | j  rdS dS )zKRelease request.

        Eat unread part of HTTP BODY if present.
        N)r`   r   readanyr   rE   rE   rF   releaseq  s   
zBaseRequest.releasec                    sl   | j du r3t }	 | j I dH }|| | jr*t|}|| jkr*t| j|d|s-nq
t|| _ | j S )z_Read request body if present.

        Returns bytes object with full request content.
        NTmax_sizeZactual_size)	rf   	bytearrayr`   r  extendrj   r   r-   bytes)r   bodychunkZ	body_sizerE   rE   rF   ready  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encodingrE   rE   rF   text  s   

zBaseRequest.text)loadsr  c                   s   |   I dH }||S )zReturn BODY as JSON.N)r  )r   r  r	  rE   rE   rF   json  s   zBaseRequest.jsonc                    s   t | j| jS )z3Return async iterator to process BODY as multipart.)r$   ra   r`   r   rE   rE   rF   	multipart  s   zBaseRequest.multipart,MultiDictProxy[Union[str, bytes, FileField]]c                    sx  | j dur	| j S | j| jvrtt | _ | j S | j}|dvr(tt | _ | j S t }|dkr|  I dH }| j}| I dH }|durd}|j	
tj}t|tr|jdus\J |jrt }|jddI dH }	|	r||	}	||	 |t|	7 }d|  k r|k rn n
|  t||d|jddI dH }	|	sn|d |du rd}t|j|jttj|||j	}
||j|
 nH|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 }|dusFn|  I dH }|r4| j#p$d}|$t%|& |d	|d t|| _ | j S )zReturn POST parameters.N)rJ   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  )'re   rb   POST_METHODSr   r   r;   r  rj   nextr=   r   r   CONTENT_TYPEr   r#   r8   r9   tempfileTemporaryFileZ
read_chunkr  writer   closer-   seekr0   r   rC   rD   addr  
startswithget_charsetr   r  r  r   rstrip)r   r;   outr  r  fieldr  Zfield_cttmpr
  ffr   r  datarE   rE   rF   post  s   







:
zBaseRequest.postr8   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   r8   r  ru   r   rE   rE   rF   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>   rb   )r   Zascii_encodable_pathrE   rE   rF   __repr__	  s   zBaseRequest.__repr__otherc                 C   s   t | t |kS rK   )id)r   r.  rE   rE   rF   __eq__     zBaseRequest.__eq__c                 C   s   dS )NTrE   r   rE   rE   rF   __bool__  s   zBaseRequest.__bool__responsec                    s   d S rK   rE   )r   r3  rE   rE   rF   _prepare_hook  s   zBaseRequest._prepare_hookexcc                 C   s   | j | d S rK   )r`   set_exception)r   r5  rE   rE   rF   _cancel  r1  zBaseRequest._cancel)rz   rx   )rz   r3   )rz   r   )rz   r<   )rz   N)rz   r  rK   )gr>   r?   r@   r   Z
METH_PATCHZ	METH_POSTZMETH_PUTZ
METH_TRACEZMETH_DELETEr  r   ATTRS	frozensetr!   r&   r   asyncioAbstractEventLoopr   r
   r   rA   r   r   r    r,   r*   r   propertyrw   ru   	Transportr   r   r   rs   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   rp   r}   r"   r~   rq   rr   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-  objectr0  r2  r.   r4  BaseExceptionr7  rE   rE   rE   rF   r/   n   s4   	

4	
7 <		#

`r/   c                       s   e Zd ZejedgB Zdededdf fddZer(de	d	eddf fd
dZ
eeeeeedde	dedede	de	de	dd f fddZed ddZed!ddZedefddZdeddfddZ  ZS )"r1   _match_infoargsr   rz   Nc                    s   t  j|i | d | _d S rK   )superr   rC  )r   rD  r   r   rE   rF   r   "  s   
zRequest.__init__r8   r   c                    s8   || j vrtjd| jj|tdd t || d S )Nz-Setting custom {}.{} attribute is discouragedr   r   )	r8  r   r   r,  r   r>   r   rE  __setattr__)r   r8   r   rF  rE   rF   rG  -  s   
zRequest.__setattr__r   r}   r   r=   rp   rq   rr   c          	         s.   t  j||||||d}tt|}| j|_|S )Nr   )rE  r   r   r1   rC  )	r   r}   r   r=   rp   rq   rr   retZnew_retrF  rE   rF   r   7  s   

zRequest.cloner4   c                 C   s   | j }|dus	J |S )zResult of route resolving.N)rC  r   
match_inforE   rE   rF   rJ  M  s   zRequest.match_infor2   c                 C   s   | j }|dus	J |jS )zApplication instance.N)rC  Zcurrent_apprI  rE   rE   rF   appT  s   zRequest.appc                 C   sH   | j }|d us	J |j}| j}||}tt|d |d  }t|S )Nr   )rC  ZappsrK  indexr   reversedr   )r   rJ  lstrK  idxZsublistrE   rE   rF   config_dict[  s   
zRequest.config_dictr3  c                    s8   | j }|d u r
d S |jD ]}|j| |I d H  qd S rK   )rC  Z_appsZon_response_preparesend)r   r3  rJ  rK  rE   rE   rF   r4  e  s   
zRequest._prepare_hook)rz   r4   )rz   r2   )r>   r?   r@   r/   r8  r9  r   r   r   rA   rG  r    r,   r*   r   r   rJ  r<  rK  r   rP  r.   r4  __classcell__rE   rE   rF  rF   r1     sB    			r1   )ar:  r>  rC   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   rJ   r   abcr   helpersr   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+   r,   Zweb_exceptionsr-   Zweb_responser.   __all__Zweb_appr2   Zweb_protocolr3   Zweb_urldispatcherr4   sr0   digitsascii_lettersrG   rA   rB   rI   r,  r   r   rangerU   rV   rW   rZ   compiler[   r\   r/   r1   rE   rE   rE   rF   <module>   sr   
 4,       5