
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    '7`Vg                  
   @   sf  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 d dl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, d	dl-m.Z. d	dl/m0Z0 d	dl1m2Z2m3Z3 d	dl4m5Z5m6Z6 d	dl7m8Z8m9Z9m:Z:m;Z;m<Z< d	dl=m>Z> d	dl?m@Z@ dZAerd	dlBmCZC d	dlDmEZE d	dlFmGZG ejHddddG dd dZIejJejK d ZLdeL dZMdNd Od!d" d#ePeQd$d% D ZRd&ZSd'jNeReSd(ZTd)jNeMeTd*ZUeVd+ZWeVeUZXG d,d- d-eeYef e*ZZG d.d/ d/eZZ[dS )0    N)	parsedate)SimpleCookie)MappingProxyType)
TYPE_CHECKINGAnyDictIteratorMappingMutableMappingOptionalTupleUnioncast)	parse_qsl)CIMultiDictCIMultiDictProxy	MultiDictMultiDictProxy)URL   )hdrs)AbstractStreamWriter)DEBUGChainMapProxyHeadersMixinreifysentinel)RawRequestMessage)HttpVersion)BodyPartReaderMultipartReader)EmptyStreamReaderStreamReader)DEFAULT_JSON_DECODER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 )r+   namefilenamefilecontent_typeCIMultiDictProxy[str]headersN)__name__
__module____qualname__str__annotations__ioBufferedReader r?   r?   F/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/web_request.pyr+   9   s
   

r+   z!#$%&'*+.^_`|~-[z]+z[{}] c                 c   s   | ]}t |V  qd S N)chr).0cr?   r?   r@   	<genexpr>H   s     rG   )	       !   #      z
\\[\t !-~]z"(?:{quoted_pair}|{qdtext})*")ZqdtextZquoted_pairz0({token})=({token}|{quoted_string})(:\d{{1,4}})?)tokenZquoted_stringz\\([\t !-~])c                   @   sl  e Zd ZejejejejejhZ	e
jeddddddddd	d
dddddddg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d0d1d2Z(edd-d3d4Z)edd5d6Z*e+e dd7d8Z,e"e-dd9d:Z.e"e/e0eef d;f dd<d=Z1e"edd>d?Z2e"edd@dAZ3e"e4ddBdCZ5e"eddDdEZ6e"ee ddFdGZ7e"e$ddHdIZ8e"eddJdKZ9e"eddLdMZ:e"eddNdOZ;e"dPddQdRZ<e"eddSdTZ=e"dUddVdWZ>e"e?ddXdYZ@eAee eeBjB dZd[d\ZCe"eeBjB dd]d^ZDe"eeBjB dd_d`ZEe"eeBjB ddadbZFe"e-ddcddZGe"e0eef ddedfZHe"eIddgdhZJe"eddidjZKee-ddkdlZLee-ddmdnZMe"e-ddodpZNdddqdrZOePddsdtZQeddudvZReSdweTedxdydzZUeVdd{d|ZWd}dd~dZXdeeedddZYedddZZe[e-dddZ\e-dddZ]e^ddddZ_e`ddddZad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remoter.   zasyncio.Task[None])messagepayloadprotocolpayload_writertaskloopr_   r`   ra   rb   rc   returnc                C   s   |d kri }|| _ || _|| _|| _|j| _|j| _|j| _	|j
| _d | _d | _|| _i | _|| _|| _|| _| jj}|d k	st|d| _|d| _|	d k	r|	| jd< |
d k	r|
| jd< |d k	r|| jd< d S )NZ
sslcontextZpeernamera   rb   rc   )rN   rO   rP   rQ   r7   rR   methodrS   versionrT   urlrU   rV   rW   rX   rY   rZ   r[   r\   	transportAssertionErrorget_extra_infor]   r^   )selfrd   re   rf   rg   rh   ri   r_   r`   ra   rb   rc   rn   r?   r?   r@   __init__   s8    

zBaseRequest.__init__rk   rel_urlr7   ra   rb   rc   rk   rt   r7   ra   rb   rc   rj   c                C   s   | j rtdi }|tk	r"||d< |tk	rFt|}||d< t||d< |tk	rxtt||d< tdd | D |d< | j	j
f |}	i }
|tk	r||
d	< |tk	r||
d
< |tk	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 contentrk   rm   pathr7   c                 s   s&   | ]\}}| d | d fV  qdS )utf-8N)encode)rE   kvr?   r?   r@   rG      s    z$BaseRequest.clone.<locals>.<genexpr>raw_headersra   rb   rc   )r_   r`   )rW   RuntimeErrorr   r   r;   r   r   tupleitemsrN   _replace	__class__rQ   rO   rP   rZ   r\   r[   rX   copy)rq   rk   rt   r7   ra   rb   rc   dctZnew_urlrd   kwargsr?   r?   r@   clone   sF    	zBaseRequest.clonerj   c                 C   s   | j S rC   )rZ   rq   r?   r?   r@   rh      s    zBaseRequest.taskc                 C   s   | j S rC   )rO   r   r?   r?   r@   rf      s    zBaseRequest.protocolc                 C   s   | j d krd S | j jS rC   )rO   rn   r   r?   r?   r@   rn      s    
zBaseRequest.transportc                 C   s   | j S rC   )rP   r   r?   r?   r@   writer   s    zBaseRequest.writerc                 C   s   t jdtdd | jS )NzRequest.message is deprecated   
stacklevel)warningswarnDeprecationWarningrN   r   r?   r?   r@   rd      s    zBaseRequest.messagec                 C   s   | j S rC   )rU   r   r?   r?   r@   rt     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   r\   r   r?   r?   r@   ri     s      zBaseRequest.loop)keyrj   c                 C   s
   | j | S rC   rX   rq   r   r?   r?   r@   __getitem__  s    zBaseRequest.__getitem__)r   valuerj   c                 C   s   || j |< d S rC   r   )rq   r   r   r?   r?   r@   __setitem__  s    zBaseRequest.__setitem__c                 C   s   | j |= d S rC   r   r   r?   r?   r@   __delitem__  s    zBaseRequest.__delitem__c                 C   s
   t | jS rC   )lenrX   r   r?   r?   r@   __len__  s    zBaseRequest.__len__c                 C   s
   t | jS rC   )iterrX   r   r?   r?   r@   __iter__  s    zBaseRequest.__iter__c                 C   s
   | j dkS )z5A bool indicating if the request is handled with SSL.https)ra   r   r?   r?   r@   secure   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k	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k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
        r?   r   FN,"z\1r   T;z 	)rN   r7   Zgetallr   Z	FORWARDEDr   appendtypesr   _FORWARDED_PAIR_REmatchfindgroups_QUOTED_PAIR_REPLACE_REsublowergroupr}   )rq   ZelemsZfield_valuelengthposZneed_separatorelemr   r2   r   portr?   r?   r@   	forwarded%  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)r]   r   r?   r?   r@   ra   b  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.
        )rS   r   r?   r?   r@   rk   r  s    zBaseRequest.methodc                 C   s   | j S )zxRead only property for getting HTTP version of request.

        Returns aiohttp.protocol.HttpVersion instance.
        )rT   r   r?   r?   r@   rl   z  s    zBaseRequest.versionc                 C   s(   | j jtj}|dk	r|S t S d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)rN   r7   getr   ZHOSTsocketgetfqdn)rq   rb   r?   r?   r@   rb     s    
zBaseRequest.hostc                 C   s$   t | jttfr| jd S | jS d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
        r   N)
isinstancer^   listr}   r   r?   r?   r@   rc     s    	
zBaseRequest.remotec                 C   s   t j| j| jd}|| jS )N)ra   rb   )r   buildra   rb   joinrU   )rq   rm   r?   r?   r@   rm     s    zBaseRequest.urlc                 C   s   | j jS )z_The URL including *PATH INFO* without the host or scheme.

        E.g., ``/app/blog``
        )rU   rv   r   r?   r?   r@   rv     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;   rU   r   r?   r?   r@   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``
        )rN   rv   r   r?   r?   r@   raw_path  s    zBaseRequest.raw_pathzMultiDictProxy[str]c                 C   s   | j jS )z7A multidict with all the variables in the query string.)rU   queryr   r?   r?   r@   r     s    zBaseRequest.queryc                 C   s   | j jS )z:The query string in the URL.

        E.g., id=10
        )rU   query_stringr   r?   r?   r@   r     s    zBaseRequest.query_stringr6   c                 C   s   | j S )z4A case-insensitive multidict proxy with all headers.)rR   r   r?   r?   r@   r7     s    zBaseRequest.headersc                 C   s   | j jS )z$A sequence of pairs for all headers.)rN   r{   r   r?   r?   r@   r{     s    zBaseRequest.raw_headers)	_date_strrj   c                 C   s8   | dk	r4t | }|dk	r4tj|dd dtjjiS dS )z/Process a date string, return a datetime objectN   tzinfo)r   datetimetimezoneutc)r   	timetupler?   r?   r@   
_http_date  s
    zBaseRequest._http_datec                 C   s   |  | jtjS )zyThe value of If-Modified-Since HTTP header, or None.

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

        This header is represented as a `datetime` object.
        )r   r7   r   r   ZIF_UNMODIFIED_SINCEr   r?   r?   r@   if_unmodified_since  s    zBaseRequest.if_unmodified_sincec                 C   s   |  | jtjS )zpThe value of If-Range HTTP header, or None.

        This header is represented as a `datetime` object.
        )r   r7   r   r   ZIF_RANGEr   r?   r?   r@   if_range  s    zBaseRequest.if_rangec                 C   s
   | j j S )zIs keepalive enabled by client?)rN   Zshould_closer   r?   r?   r@   
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.
        rB   c                 S   s   i | ]\}}||j qS r?   )r   )rE   r   valr?   r?   r@   
<dictcomp>  s      z'BaseRequest.cookies.<locals>.<dictcomp>)r7   r   r   ZCOOKIEr   r   r~   )rq   rawparsedr?   r?   r@   cookies  s    zBaseRequest.cookiesc                 C   s   | j tj}d\}}|dk	rzd}t||d \}}W n tk
rV   tdY nX |rdt|nd}|rtt|nd}|dkr|dk	r| }d}|dk	r|dk	r|d7 }||krtd||  krdk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)
rR   r   r   RANGErefindall
IndexError
ValueErrorintslice)rq   rngstartendpatternr?   r?   r@   
http_range  s(    zBaseRequest.http_rangec                 C   s   | j S )zReturn raw payload stream.)rQ   r   r?   r?   r@   content)  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   rQ   at_eofr   r?   r?   r@   has_body.  s      zBaseRequest.has_bodyc                 C   s   | j   S )r   )rQ   r   r   r?   r?   r@   can_read_body6  s    zBaseRequest.can_read_bodyc                 C   s   t | jtk	S )z6Return True if request has HTTP BODY, False otherwise.)typerQ   r!   r   r?   r?   r@   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)rQ   r   readanyr   r?   r?   r@   release@  s    
zBaseRequest.releasec                    sh   | j dk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)	rW   	bytearrayrQ   r   extendr[   r   r(   bytes)rq   bodychunkZ	body_sizer?   r?   r@   readH  s    


 
zBaseRequest.readc                    s"   |   I dH }| jpd}||S )z1Return BODY as text using encoding from .charset.Nrw   )r   charsetdecode)rq   Z
bytes_bodyencodingr?   r?   r@   text]  s    
zBaseRequest.text)loads)r   rj   c                   s   |   I dH }||S )zReturn BODY as JSON.N)r   )rq   r   r   r?   r?   r@   jsonc  s    zBaseRequest.jsonc                    s   t | j| jS )z3Return async iterator to process BODY as multipart.)r    rR   rQ   r   r?   r?   r@   	multiparth  s    zBaseRequest.multipartz,MultiDictProxy[Union[str, bytes, FileField]]c                    sv  | j dk	r| j S | j| jkr.tt | _ | j S | j}|dkrNtt | _ | j S t }|dkr(|  I dH }| j}| I dH }|dk	rfd}|j	
tj}t|tr|jdk	st|jrt }|jddI dH }	|	r:||	}	||	 |t|	7 }d|  k r|k r&n nt||d|jddI dH }	q|d |dkrRd}t|j|jttj|||j	}
||j|
 n|jd	d
I dH }|dk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 }|rf| j#pFd}|$t%|& |d	|d t|| _ | j S )zReturn POST parameters.N)rB   z!application/x-www-form-urlencodedmultipart/form-datar   r   i   )sizer   zapplication/octet-streamT)r   ztext/rw   )defaultz8To decode nested multipart you need to use custom reader)keep_blank_valuesr   )'rV   rS   POST_METHODSr   r   r5   r   r[   nextr7   r   r   ZCONTENT_TYPEr   r   r2   ro   r3   tempfileTemporaryFileZ
read_chunkr   writer   r(   seekr+   r   r=   r>   addr   
startswithget_charsetr   r   r   r   rstrip)rq   r5   outr   r   fieldr   Zfield_cttmpr   Zffr   r   datar?   r?   r@   postl  s    




 


 
zBaseRequest.post)r2   r   rj   c                 C   s0   | j }|dkr|S |j}|dkr$|S |||S )z"Extra info from protocol transportN)rO   rn   rp   )rq   r2   r   rf   rn   r?   r?   r@   rp     s    zBaseRequest.get_extra_infoc                 C   s(   | j ddd}d| jj| j|S )Nasciibackslashreplacez<{} {} {} >)rv   rx   r   formatr   r8   rS   )rq   Zascii_encodable_pathr?   r?   r@   __repr__  s      zBaseRequest.__repr__)otherrj   c                 C   s   t | t |kS rC   )id)rq   r  r?   r?   r@   __eq__  s    zBaseRequest.__eq__c                 C   s   dS )NTr?   r   r?   r?   r@   __bool__  s    zBaseRequest.__bool__responserj   c                    s   d S rC   r?   )rq   r  r?   r?   r@   _prepare_hook  s    zBaseRequest._prepare_hook)excrj   c                 C   s   | j | d S rC   )rQ   set_exception)rq   r  r?   r?   r@   _cancel  s    zBaseRequest._cancel)N)br8   r9   r:   r   Z
METH_PATCHZ	METH_POSTZMETH_PUTZ
METH_TRACEZMETH_DELETEr   r   ATTRS	frozensetr   r"   r   asyncioZAbstractEventLoopr   r   r   r;   r   rr   r   r'   r%   r   propertyrh   rf   Z	Transportrn   r   r   rd   r   rt   ri   r   r   r   r   r   r   boolr   r   r	   r   ra   rk   r   rl   rb   rc   rm   rv   r   r   r   r   r7   r&   r{   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r$   r   r    r   r  rp   r  objectr	  r
  r)   r  BaseExceptionr  r?   r?   r?   r@   r*   a   s  49 <	#_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 )r,   _match_infoN)argsr   rj   c                    s   t  j|| d | _d S rC   )superrr   r  )rq   r  r   r   r?   r@   rr     s    zRequest.__init__)r2   r   rj   c                    s8   || j kr&tjd| jj|tdd t || d S )Nz-Setting custom {}.{} attribute is discouragedr   r   )	r  r   r   r  r   r8   r   r  __setattr__)rq   r2   r   r  r?   r@   r    s    
 zRequest.__setattr__rs   ru   c          	         s.   t  j||||||d}tt|}| j|_|S )Nrs   )r  r   r   r,   r  )	rq   rk   rt   r7   ra   rb   rc   retZnew_retr  r?   r@   r     s    

zRequest.cloner/   r   c                 C   s   | j }|dk	st|S )zResult of route resolving.N)r  ro   rq   
match_infor?   r?   r@   r     s    zRequest.match_infor-   c                 C   s   | j }|dk	st|jS )zApplication instance.N)r  ro   Zcurrent_appr  r?   r?   r@   app"  s    zRequest.appc                 C   sH   | j }|d k	st|j}| j}||}tt|d |d  }t|S )Nr   )r  ro   Zappsr!  indexr   reversedr   )rq   r   lstr!  idxZsublistr?   r?   r@   config_dict)  s    
zRequest.config_dictr  c                    s6   | j }|d krd S |jD ]}|j| |I d H  qd S rC   )r  Z_appsZon_response_preparesend)rq   r  r   r!  r?   r?   r@   r  3  s
    
zRequest._prepare_hook)r8   r9   r:   r*   r  r  r   rr   r   r;   r  r   r'   r%   r   r   r   r  r!  r   r&  r)   r  __classcell__r?   r?   r  r@   r,     s4   		r,   )\r  r   r=   r   r   stringr   r   r   email.utilsr   Zhttp.cookiesr   r   typingr   r   r   r   r	   r
   r   r   r   r   urllib.parser   attrZ	multidictr   r   r   r   Zyarlr   rB   r   abcr   Zhelpersr   r   r   r   r   Zhttp_parserr   Zhttp_writerr   r   r   r    Zstreamsr!   r"   Ztypedefsr#   r$   r%   r&   r'   Zweb_exceptionsr(   Zweb_responser)   __all__Zweb_appr-   Zweb_protocolr.   Zweb_urldispatcherr/   sr+   digitsascii_lettersZ_TCHARZ_TOKENr  r   r}   rangeZ_QDTEXTZ_QUOTED_PAIRZ_QUOTED_STRINGZ_FORWARDED_PAIRcompiler   r   r;   r*   r,   r?   r?   r?   r@   <module>   sp   0   

     