o
    Rhhs                  
   @   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   U/home/air/sanwanet/backup_V2/venv/lib/python3.10/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>[   s    rQ   )	       !   #      _QDTEXTz
\\[\t !-~]_QUOTED_PAIRz"(?:{quoted_pair}|{qdtext})*")qdtext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eddeeef deeef deeef deeef deeef deeef deeef 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'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/d0Z+d+eddfd1d2Z,defd3d4Z-de.e fd5d6Z/e%de0fd7d8Z1e%de2e3eef d9f fd:d;Z4e%defd<d=Z5e%defd>d?Z6e%de7fd@dAZ8e%defdBdCZ9e%dee fdDdEZ:e%de'fdFdGZ;e%defdHdIZ<e%defdJdKZ=e%defdLdMZ>e%ddOdPZ?e%defdQdRZ@e%ddSdTZAe%deBfdUdVZCe%deeDjD fdWdXZEe%deeDjD fdYdZZFeGd[ede.eH fd\d]ZIeJd^ee dee2eHd9f  fd_d`ZKe%dee2eHd9f  fdadbZLe%dee2eHd9f  fdcddZMe%deeDjD fdedfZNe%de0fdgdhZOe%de3eef fdidjZPe%deQfdkdlZRe%defdmdnZSede0fdodpZTede0fdqdrZUe%de0fdsdtZVddudvZWdeXfdwdxZYdefdydzZZe[d{d|e\defd}d~Z]de^fddZ_dddZ`ddededefddZadefddZbdecde0fddZdde0fddZedefddfddZgdehddfddZidddZjd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remotemessagepayloadprotocolr6   payload_writertaskasyncio.Task[None]looprr   rs   rt   ru   rv   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s_J |d| _|d| _|	d urt|	| j
d< |
d ur}|
| j
d< |d ur|| j
d< d S d S )Nurlru   rt   
sslcontextpeernamerv   )ra   rb   rc   rd   r?   re   methodrf   versionrg   rl   r   is_absoluteru   rt   relativerh   ri   rj   rk   rm   rn   ro   	transportget_extra_inforp   rq   )selfrw   rx   ry   rz   r{   r}   rr   rs   rt   ru   rv   r   r   rG   rG   rH   __init__   sD   


zBaseRequest.__init__r   rel_urlr?   rt   ru   rv   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 |d< | j	j
di |}
i }|turQ||d	< |turY||d
< |tura||d< |tu rh| 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_headersrt   ru   rv   )rr   rs   NrG   )rj   RuntimeErrorr#   r   rC   r   r   tupleitemsra   _replacern   	__class__rd   rb   rc   rm   ro   rk   copy)r   r   r   r?   rt   ru   rv   rr   dctnew_urlrw   kwargsrG   rG   rH   clone   sJ   
	zBaseRequest.clonec                 C      | j S rM   )rm   r   rG   rG   rH   r{   
     zBaseRequest.taskc                 C   r   rM   )rb   r   rG   rG   rH   ry     r   zBaseRequest.protocolc                 C   s   | j d u rd S | j jS rM   )rb   r   r   rG   rG   rH   r     s   
zBaseRequest.transportc                 C   r   rM   )rc   r   rG   rG   rH   writer  r   zBaseRequest.writerc                 C   r   rM   )rn   r   rG   rG   rH   rr     r   zBaseRequest.client_max_sizec                 C      t jdtdd | jS )NzRequest.message is deprecated   
stacklevel)warningswarnDeprecationWarningra   r   rG   rG   rH   rw      s   zBaseRequest.messagec                 C   r   rM   )rh   r   rG   rG   rH   r   %  r   zBaseRequest.rel_urlc                 C   r   )Nz#request.loop property is deprecated   r   )r   r   r   ro   r   rG   rG   rH   r}   )  s   zBaseRequest.loopkeyc                 C   s
   | j | S rM   rk   r   r   rG   rG   rH   __getitem__2     
zBaseRequest.__getitem__valuec                 C   s   || j |< d S rM   r   )r   r   r   rG   rG   rH   __setitem__5  s   zBaseRequest.__setitem__c                 C   s   | j |= d S rM   r   r   rG   rG   rH   __delitem__8  s   zBaseRequest.__delitem__c                 C   
   t | jS rM   )lenrk   r   rG   rG   rH   __len__;  r   zBaseRequest.__len__c                 C   r   rM   )iterrk   r   rG   rG   rH   __iter__>  r   zBaseRequest.__iter__c                 C   s
   | j dkS )z5A bool indicating if the request is handled with SSL.https)rt   r   rG   rG   rH   secureC     
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
        rG   r   FN,"z\1r   T;z 	)ra   r?   getallr   	FORWARDEDr   appendtypesr   r`   matchfindgroupsr_   sublowergroupr   )r   elemsfield_valuelengthposneed_separatorelemr   r;   r   portrG   rG   rH   	forwardedH  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)rp   r   rG   rG   rH   rt     s   zBaseRequest.schemec                 C   r   )zyRead only property for getting HTTP method.

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

        Returns aiohttp.protocol.HttpVersion instance.
        )rg   r   rG   rG   rH   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)ra   r?   getr   HOSTsocketgetfqdn)r   ru   rG   rG   rH   ru     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   )rq   
isinstancelistr   rC   r   rG   rG   rH   rv     s
   
	
zBaseRequest.remotec                 C   s   t j| j| jd}|| jS )N)rt   ru   )r   buildrt   ru   joinrh   )r   r   rG   rG   rH   r     s   zBaseRequest.urlc                 C      | j jS )z_The URL including *PATH INFO* without the host or scheme.

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

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

        E.g., id=10
        )rh   query_stringr   rG   rG   rH   r     r   zBaseRequest.query_stringc                 C   r   )z4A case-insensitive multidict proxy with all headers.)re   r   rG   rG   rH   r?        zBaseRequest.headersc                 C   r   )z$A sequence of pairs for all headers.)ra   r   r   rG   rG   rH   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   IF_MODIFIED_SINCEr   rG   rG   rH   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   IF_UNMODIFIED_SINCEr   rG   rG   rH   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   garbagerG   rG   rH   _etag_values	  s   
zBaseRequest._etag_valuesheader_valuec                 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      |  | 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   IF_MATCHr   rG   rG   rH   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   IF_NONE_MATCHr   rG   rG   rH   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   IF_RANGEr   rG   rG   rH   if_range7  r   zBaseRequest.if_rangec                 C   s
   | j j S )zIs keepalive enabled by client?)ra   should_closer   rG   rG   rH   
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.
        rL   c                 S   s   i | ]\}}||j qS rG   )r   )rO   r   valrG   rG   rH   
<dictcomp>L  s    z'BaseRequest.cookies.<locals>.<dictcomp>)r?   r   r   COOKIEr   r   r   )r   rawparsedrG   rG   rH   cookiesD  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)
re   r   r   RANGErefindall
IndexError
ValueErrorintslice)r   rngstartendpatternrG   rG   rH   
http_rangeN  s,   zBaseRequest.http_rangec                 C   r   )zReturn raw payload stream.)rd   r   rG   rG   rH   contentr  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   rd   at_eofr   rG   rG   rH   has_bodyw  s   zBaseRequest.has_bodyc                 C   s   | j   S )r  )rd   r  r   rG   rG   rH   can_read_body  r   zBaseRequest.can_read_bodyc                 C   s   t | jtuS )z6Return True if request has HTTP BODY, False otherwise.)typerd   r)   r   rG   rG   rH   body_exists  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)rd   r  readanyr   rG   rG   rH   release  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_sizeactual_size)	rj   	bytearrayrd   r  extendrn   r   r0   bytes)r   bodychunk	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   
bytes_bodyencodingrG   rG   rH   text  s   

zBaseRequest.text)loadsr%  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(   re   rd   r   rG   rG   rH   	multipart  s   zBaseRequest.multipart,MultiDictProxy[Union[str, bytes, FileField]]c                    s  | 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r3|  I dH }| j}| I dH }|dur2d}|j	
tj}t|tr#|jdus\J |jr| jdtjI dH }|jddI dH }	|	r||	}	| jd|j|	I dH  |t|	7 }d|  k r|k rn n| jd|jI dH  t||d|jddI dH }	|	su| jd|jdI dH  |du rd}t|j|jttj|||j	}
| |j|
 nJ|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 }|rR| j%pBd}|&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#  ))ri   rf   POST_METHODSr   r   r>   r'  rn   nextr?   r   r   CONTENT_TYPEr   r'   r;   r<   ro   run_in_executortempfileTemporaryFile
read_chunkr!  writer   closer0   seekr3   r   rE   rF   addr  
startswithget_charsetr  r   r  r   rstrip)r   r>   outr'  r  fieldr*  field_cttmpr  ffr   r   datarG   rG   rH   post  s   






<
zBaseRequest.postr;   r+  c                 C   s0   | j }|du r	|S |j}|du r|S |||S )z"Extra info from protocol transportN)rb   r   r   )r   r;   r+  ry   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@   rf   )r   ascii_encodable_pathrG   rG   rH   __repr__#  s   zBaseRequest.__repr__otherc                 C   s   t | t |kS rM   )id)r   rG  rG   rG   rH   __eq__+     zBaseRequest.__eq__c                 C   s   dS )NTrG   r   rG   rG   rH   __bool__.  s   zBaseRequest.__bool__responsec                    s   d S rM   rG   )r   rL  rG   rG   rH   _prepare_hook1  s   zBaseRequest._prepare_hookexcc                 C   s   t | j| d S rM   )r$   rd   )r   rN  rG   rG   rH   _cancel4  rJ  zBaseRequest._cancelc                 C   sD   | j d u s
| jdkrd S | j  D ]\}}t|tr|j  qd S )Nr)  )ri   r>   r   r   r3   r=   r5  )r   	file_namefile_field_objectrG   rG   rH   _finish7  s   

zBaseRequest._finish)r~   r|   )r~   r6   )r~   r   )r~   N)r~   r(  rM   )kr@   rA   rB   r   
METH_PATCH	METH_POSTMETH_PUT
METH_TRACEMETH_DELETEr-  r    ATTRS	frozensetr%   r*   r   asyncioAbstractEventLoopr  r   r   rC   r   r   r#   r   r   r/   r-   r   propertyr{   ry   	Transportr   r   rr   r"   rw   r   r   r}   r   r   r   r   r   r   r   r   r   r	   r   rt   r   r&   r   ru   rv   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'  rA  r   rF  objectrI  rK  r1   rM  BaseExceptionrO  rR  rG   rG   rG   rH   r2   v   s@   	

<






	

; <		#

br2   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eddee	ef deeef deeef dee	ef dee	ef dee	ef deeef 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 )#r4   _match_infoargsr   r~   Nc                    s   t  j|i | d | _d S rM   )superr   rc  )r   rd  r   r   rG   rH   r   H  s   
zRequest.__init__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   )	rX  r   r   rD  r   r@   r   re  __setattr__)r   r;   r   rf  rG   rH   rg  S  s   
zRequest.__setattr__r   r   r   r?   rt   ru   rv   rr   c          
   	      s0   t  j|||||||d}tt|}	| j|	_|	S )Nr   )re  r   r   r4   rc  )
r   r   r   r?   rt   ru   rv   rr   retnew_retrf  rG   rH   r   ]  s   
	zRequest.cloner7   c                 C   s   | j }|dus	J |S )zResult of route resolving.N)rc  r   
match_inforG   rG   rH   rk  u  s   zRequest.match_infor5   c                 C   s   | j }|dus	J |jS )zApplication instance.N)rc  current_apprj  rG   rG   rH   app|  s   zRequest.appc                 C   sH   | j }|d us	J |j}| j}||}tt|d |d  }t|S )Nr   )rc  appsrm  indexr   reversedr   )r   rk  lstrm  idxsublistrG   rG   rH   config_dict  s   
zRequest.config_dictrL  c                    s8   | j }|d u r
d S |jD ]}|j| |I d H  qd S rM   )rc  _appson_response_preparesend)r   rL  rk  rm  rG   rG   rH   rM    s   
zRequest._prepare_hook)r~   r7   )r~   r5   )r@   rA   rB   r2   rX  rY  r   r   r   rC   rg  r#   r   r   r/   r-   r  r   r"   rk  r\  rm  r   rt  r1   rM  __classcell__rG   rG   rf  rH   r4   D  sH    	






	
	r4   )drZ  r^  rE   r  r   stringr1  r   r   http.cookiesr   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   urllib.parser   attr	multidictr   r   r   r   r   yarlr   rL   r   abcr   helpersr   r   r   r   r   r   r    r!   r"   r#   r$   http_parserr%   http_writerr&   r'  r'   r(   streamsr)   r*   typedefsr+   r,   r-   r.   r/   web_exceptionsr0   web_responser1   __all__web_appr5   web_protocolr6   web_urldispatcherr7   sr3   digitsascii_lettersrI   rC   rD   rK   rD  r   r   rangerW   rX   r[   r^   compiler_   r`   r2   r4   rG   rG   rG   rH   <module>   sn   
 84      S