o
    4˜Žjž|  ã                
   @   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m	Z	m
Z
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 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& d	dl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d	dl5m6Z6 d	dl7m8Z8 d	dl9m:Z:m;Z; d	dl<m=Z=m>Z> d	dl?m@Z@mAZAmBZBmCZCmDZD d	dlEmFZFmGZG d	dlHmIZI dZJeråd	dlKmLZL d	dlMmNZN d	dlOmPZP edƒZQejRdddd�G dd„ dƒƒZSeTeUB eVB eSB ZWejXejY d ZZeeT e[d< d eZ› d!�Z\eeT e[d"< d# ]d$ ^d%d&„ d'e_e`d(d)ƒƒ D ƒ¡¡ZaeeT e[d*< d+ZbeeT e[d,< d-eb› d.ea› d/�ZceeT e[d0< d1e\› d2e\› d.ec› d3�ZdeeT e[d4< e ed5¡ZfeeeT  e[d6< e eed¡ZgeeeT  e[d7< G d8d9„ d9eeTe0e B ef e/ƒZhG d:d;„ d;ehƒZidS )<é    N)ÚIteratorÚMappingÚMutableMapping)ÚPattern)ÚMappingProxyType)ÚTYPE_CHECKINGÚAnyÚFinalÚOptionalÚTypeVarÚcastÚoverload)Ú	parse_qsl)ÚCIMultiDictÚCIMultiDictProxyÚ	MultiDictÚMultiDictProxyÚMultiMapping)ÚURLé   )Úhdrs)Úparse_cookie_header)ÚAbstractStreamWriter)Ú	_SENTINELÚDEBUGÚDEFAULT_CHUNK_SIZEÚETAG_ANYÚLIST_QUOTED_ETAG_REÚChainMapProxyÚETagÚHeadersMixinÚ
RequestKeyÚparse_http_dateÚreifyÚsentinelÚset_exception)ÚRawRequestMessage)ÚHttpVersion)ÚBodyPartReaderÚMultipartReader)ÚEmptyStreamReaderÚStreamReader)ÚDEFAULT_JSON_DECODERÚJSONDecoderÚLooseHeadersÚ
RawHeadersÚStrOrURL)ÚHTTPRequestEntityTooLargeÚNotAppKeyWarning)ÚStreamResponse)ÚBaseRequestÚ	FileFieldÚRequest)ÚApplication)ÚRequestHandler)ÚUrlMappingMatchInfoÚ_TT)Úauto_attribsÚfrozenÚslotsc                   @   s<   e Zd ZU eed< eed< ejed< eed< ee ed< dS )r5   ÚnameÚfilenameÚfileÚcontent_typeÚheadersN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__ÚioÚBufferedReaderr   © rJ   rJ   úP/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiohttp/web_request.pyr5   E   s   
 
r5   z!#$%&'*+.^_`|~-Ú_TCHARú[z]+Ú_TOKENz[{}]Ú c                 c   s   � | ]}t |ƒV  qd S ©N)Úchr)Ú.0ÚcrJ   rJ   rK   Ú	<genexpr>U   s   € rT   )é	   é    é!   é#   é   Ú_QDTEXTz
\\[\t !-~]Ú_QUOTED_PAIRz"(?:ú|z)*"Ú_QUOTED_STRINGú(z)=(z)(:\d{1,4})?Ú_FORWARDED_PAIRz\\([\t !-~])Ú_QUOTED_PAIR_REPLACE_REÚ_FORWARDED_PAIR_REc                   @   sØ  e Zd ZU ejejejejejhZ	e
jeg d¢ƒB ZdZee dB ed< dZedB ed< eƒ Zee ed< 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B ef dB dedB dedB dedB ddfdd„Ze e e e e e e dœdee!B de"e!B de#e!B dee!B dee!B dee!B dee!B dd fdd„Z$e%dždd„ƒZ&e%dŸd d!„ƒZ'e%dej(dB 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-„ƒZ0e1d.ee2 de2fd/d0„ƒZ3e1d.edefd1d0„ƒZ3d.eee2 B defd2d0„Z3e1d.ee2 d3e2ddfd4d5„ƒZ4e1d.ed3eddfd6d5„ƒZ4d.eee2 B d3eddfd7d5„Z4d.eee2 B ddfd8d9„Z5defd:d;„Z6de7eee B  fd<d=„Z8e,de9fd>d?„ƒZ:e,de;e<eef d@f fdAdB„ƒZ=e,defdCdD„ƒZ>e,defdEdF„ƒZ?e,de@fdGdH„ƒZAe,defdIdJ„ƒZBe,dedB fdKdL„ƒZCe,de.fdMdN„ƒZDe,defdOdP„ƒZEe,defdQdR„ƒZFe,defdSdT„ƒZGe,d dVdW„ƒZHe,defdXdY„ƒZIe,deJe fdZd[„ƒZKe,deLfd\d]„ƒZMe,deNjNdB fd^d_„ƒZOe,deNjNdB fd`da„ƒZPeQdbede7eR fdcdd„ƒZSeTdeedB de;eRd@f dB fdfdg„ƒZUe,de;eRd@f dB fdhdi„ƒZVe,de;eRd@f dB fdjdk„ƒZWe,deNjNdB fdldm„ƒZXe,de9fdndo„ƒZYe,de<eef fdpdq„ƒZZe,de[fdrds„ƒZ\e,defdtdu„ƒZ]e%de9fdvdw„ƒZ^e%de9fdxdy„ƒZ_e,de9fdzd{„ƒZ`d¡d|d}„Zadefd~d„Zbdefd€d�„Zcedd‚œdƒeedefd„d…„Zfdegfd†d‡„Zhd¢d‰dŠ„Zid£d‹edŒedefd�dŽ„Zjdefd�d�„Zkd‘elde9fd’d“„Zmde9fd”d•„Znd–eoddfd—d˜„Zpd™eqddfdšd›„Zrd¡dœd�„ZsdS )¤r4   )Ú_messageÚ	_protocolÚ_payload_writerÚ_payloadÚ_headersÚ_methodÚ_versionÚ_rel_urlÚ_postÚ_read_bytesÚ_stateÚ_cacheÚ_taskÚ_client_max_sizeÚ_loopÚ_transport_sslcontextÚ_transport_peernameÚ_transport_socknameNrj   rk   Ú_seen_str_keysi   )Úclient_max_sizeÚstateÚschemeÚhostÚremoteÚmessageÚpayloadÚprotocolr8   Úpayload_writerÚtaskúasyncio.Task[None]Úloopru   rv   rw   rx   ry   Úreturnc                C   s  || _ || _|| _|| _|j| _|j| _|j| _	i | _
|j}|jrJ|	d ur*| |	¡}|
d ur3| |
¡}|| j
d< |j| j
d< |j| j
d< | ¡ | _n|| _|	d urV|	| j
d< |
d ur_|
| j
d< |d u rei n|| _|| _|| _|| _|j| _|j| _|j| _|d urˆ|| j
d< d S d S )NÚurlrx   rw   ry   )rb   rc   rd   re   rB   rf   Úmethodrg   Úversionrh   rm   r‚   ÚabsoluteÚwith_schemeÚ	with_hostrx   rw   Úrelativeri   rl   rn   ro   rp   Ússl_contextrq   Úpeernamerr   Úsocknamers   )Úselfrz   r{   r|   r}   r~   r€   ru   rv   rw   rx   ry   r‚   rJ   rJ   rK   Ú__init__Ž   sB   




ÿzBaseRequest.__init__©rƒ   Úrel_urlrB   rw   rx   ry   ru   rƒ   r�   rB   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‚   ÚpathrB   c                 s   s(   � | ]\}}|  d ¡|  d ¡fV  qdS )úutf-8N)Úencode)rR   ÚkÚvrJ   rJ   rK   rT   ä   s
   € ÿ
ÿz$BaseRequest.clone.<locals>.<genexpr>Úraw_headersrw   rx   ry   )ru   rv   NrJ   )rk   ÚRuntimeErrorr$   r   rF   r   r   ÚtupleÚitemsrb   Ú_replacero   Ú	__class__re   rc   rd   rn   rp   rl   Úcopy)rŒ   rƒ   r�   rB   rw   rx   ry   ru   ÚdctÚnew_urlrz   ÚkwargsrJ   rJ   rK   ÚcloneÆ   sJ   
þúø	÷zBaseRequest.clonec                 C   ó   | j S rP   )rn   ©rŒ   rJ   rJ   rK   r~     ó   zBaseRequest.taskc                 C   r    rP   )rc   r¡   rJ   rJ   rK   r|     r¢   zBaseRequest.protocolc                 C   s   | j d u rd S | j jS rP   )rc   Ú	transportr¡   rJ   rJ   rK   r£   	  s   
zBaseRequest.transportc                 C   r    rP   )rd   r¡   rJ   rJ   rK   Úwriter  r¢   zBaseRequest.writerc                 C   r    rP   )ro   r¡   rJ   rJ   rK   ru     r¢   zBaseRequest.client_max_sizec                 C   ó   t jdtdd� | jS )NzRequest.message is deprecatedé   ©Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningrb   r¡   rJ   rJ   rK   rz     s   zBaseRequest.messagec                 C   r    rP   )ri   r¡   rJ   rJ   rK   r�     r¢   zBaseRequest.rel_urlc                 C   r¥   )Nz#request.loop property is deprecatedé   r§   )r©   rª   r«   rp   r¡   rJ   rJ   rK   r€      s   ÿzBaseRequest.loopÚkeyc                 C   ó   d S rP   rJ   ©rŒ   r­   rJ   rJ   rK   Ú__getitem__)  ó   zBaseRequest.__getitem__c                 C   r®   rP   rJ   r¯   rJ   rJ   rK   r°   ,  r±   c                 C   s
   | j | S rP   ©rl   r¯   rJ   rJ   rK   r°   /  ó   
Úvaluec                 C   r®   rP   rJ   ©rŒ   r­   r´   rJ   rJ   rK   Ú__setitem__2  r±   zBaseRequest.__setitem__c                 C   r®   rP   rJ   rµ   rJ   rJ   rK   r¶   5  r±   c                 C   s>   t |tƒs|tjvrtj |¡ tjdtdd� || j|< d S )Nz‚It is recommended to use web.RequestKey instances for keys.
https://docs.aiohttp.org/en/stable/web_advanced.html#request-s-storager¬   )Úcategoryr¨   )	Ú
isinstancer!   r4   rt   Úaddr©   rª   r2   rl   rµ   rJ   rJ   rK   r¶   8  s   ûc                 C   s   | j |= d S rP   r²   r¯   rJ   rJ   rK   Ú__delitem__D  s   zBaseRequest.__delitem__c                 C   ó
   t | jƒS rP   )Úlenrl   r¡   rJ   rJ   rK   Ú__len__G  r³   zBaseRequest.__len__c                 C   r»   rP   )Úiterrl   r¡   rJ   rJ   rK   Ú__iter__J  r³   zBaseRequest.__iter__c                 C   s
   | j dkS )z5A bool indicating if the request is handled with SSL.Úhttps)rw   r¡   rJ   rJ   rK   ÚsecureO  ó   
zBaseRequest.secure.c                 C   sd  g }| j j tjd¡D ]¢}t|ƒ}d}d}i }| t |¡¡ d|  kr)|k r­n qt	 
||¡}|durm|r>| d|¡}nd| ¡ \}}	}
|	d dkrUt d|	dd	… ¡}	|
r[|	|
7 }	|	|| ¡ < |t| d¡ƒ7 }d
}n5|| dkr„d}i }| t |¡¡ |d7 }n|| dkr‘d}|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
        rJ   r   FNú,ú"z\1r   éÿÿÿÿTú;z 	)rb   rB   Úgetallr   Ú	FORWARDEDr¼   ÚappendÚtypesr   ra   ÚmatchÚfindÚgroupsr`   ÚsubÚlowerÚgroupr—   )rŒ   ÚelemsÚfield_valueÚlengthÚposÚneed_separatorÚelemrË   r>   r´   ÚportrJ   rJ   rK   Ú	forwardedT  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)rq   r¡   rJ   rJ   rK   rw   ‘  s   zBaseRequest.schemec                 C   r    )zyRead only property for getting HTTP method.

        The value is upper-cased str like 'GET', 'POST', 'PUT' etc.
        )rg   r¡   rJ   rJ   rK   rƒ   ¡  ó   zBaseRequest.methodc                 C   r    )zxRead only property for getting HTTP version of request.

        Returns aiohttp.protocol.HttpVersion instance.
        )rh   r¡   rJ   rJ   rK   r„   ©  rÚ   zBaseRequest.versionc                 C   sh   | j j tj¡}|dur|S | j}|du rdS t|tƒr0t|ƒdkr*d|d › d�S t	|d ƒS t	|ƒS )a¸  Hostname of the request.

        Hostname is resolved in this order:

        - overridden value by .clone(host=new_host) call.
        - HOST HTTP header
        - local socket address the request arrived on
          (transport ``sockname``)
        - empty string if no transport information is available

        For example, 'example.com' or 'localhost:8080'.

        For historical reasons, the port number may be included.
        NrO   é   rM   r   ú])
rb   rB   Úgetr   ÚHOSTrs   r¸   r—   r¼   rF   )rŒ   rx   r‹   rJ   rJ   rK   rx   ±  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 )zÂRemote 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   )rr   r¸   Úlistr—   rF   r¡   rJ   rJ   rK   ry   Ð  s
   
	
zBaseRequest.remotec                 C   s   t j| j| jd� | j¡S )zThe full URL of the request.)rw   Ú	authority)r   Úbuildrw   rx   Újoinri   r¡   rJ   rJ   rK   r‚   ß  s   zBaseRequest.urlc                 C   ó   | j jS )z_The URL including *PATH INFO* without the host or scheme.

        E.g., ``/app/blog``
        )ri   r�   r¡   rJ   rJ   rK   r�   æ  ó   zBaseRequest.pathc                 C   r»   )zXThe URL including PATH_INFO and the query string.

        E.g, /app/blog?id=10
        )rF   ri   r¡   rJ   rJ   rK   Úpath_qsî  s   
zBaseRequest.path_qsc                 C   rã   )zÚThe 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``
        )rb   r�   r¡   rJ   rJ   rK   Úraw_pathö  s   zBaseRequest.raw_pathúMultiMapping[str]c                 C   rã   )z7A multidict with all the variables in the query string.)ri   Úqueryr¡   rJ   rJ   rK   rè      ó   zBaseRequest.queryc                 C   rã   )z:The query string in the URL.

        E.g., id=10
        )ri   Úquery_stringr¡   rJ   rJ   rK   rê     rä   zBaseRequest.query_stringc                 C   r    )z4A case-insensitive multidict proxy with all headers.)rf   r¡   rJ   rJ   rK   rB     ó   zBaseRequest.headersc                 C   rã   )z$A sequence of pairs for all headers.)rb   r•   r¡   rJ   rJ   rK   r•     ré   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"   rB   rÝ   r   ÚIF_MODIFIED_SINCEr¡   rJ   rJ   rK   Ú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"   rB   rÝ   r   ÚIF_UNMODIFIED_SINCEr¡   rJ   rJ   rK   Ú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¦   rÛ   N)r   r   r   ÚfinditerrÐ   Úbool)rò   rË   ró   r´   ÚgarbagerJ   rJ   rK   Ú_etag_values'  s   €þ
þùzBaseRequest._etag_valuesÚheader_valuec                 C   s   |sd S t |  |¡ƒS rP   )r—   r÷   )Úclsrø   rJ   rJ   rK   Ú_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ú   rB   rÝ   r   ÚIF_MATCHr¡   rJ   rJ   rK   Úif_matchE  ó   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ú   rB   rÝ   r   ÚIF_NONE_MATCHr¡   rJ   rJ   rK   Úif_none_matchM  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"   rB   rÝ   r   ÚIF_RANGEr¡   rJ   rJ   rK   Úif_rangeU  rï   zBaseRequest.if_rangec                 C   s
   | j j S )zIs keepalive enabled by client?)rb   Úshould_closer¡   rJ   rJ   rK   Ú
keep_alive]  rÂ   zBaseRequest.keep_alivec                 C   s&   t | j tjd¡ƒ}tdd„ |D ƒƒS )zMReturn request cookies.

        A read-only dictionary-like object.
        rO   c                 S   s   i | ]\}}||j “qS rJ   )r´   )rR   r>   ÚmorselrJ   rJ   rK   Ú
<dictcomp>l  s    z'BaseRequest.cookies.<locals>.<dictcomp>)r   rB   rÝ   r   ÚCOOKIEr   )rŒ   ÚparsedrJ   rJ   rK   Úcookiesb  s   zBaseRequest.cookiesc                 C   sà   | j  tj¡}d\}}|durjzd}t ||tj¡d \}}W n ty*   tdƒ‚w |r1t	|ƒnd}|r9t	|ƒnd}|du rH|durH| }d}|dur\|dur\|d7 }||kr\tdƒ‚||  u ridu rjt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)rf   rÝ   r   ÚRANGEÚreÚfindallÚASCIIÚ
IndexErrorÚ
ValueErrorÚintÚslice)rŒ   ÚrngÚstartÚendÚpatternrJ   rJ   rK   Ú
http_rangen  s,   ÿÿzBaseRequest.http_rangec                 C   r    )zReturn raw payload stream.)re   r¡   rJ   rJ   rK   Úcontent’  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«   re   Úat_eofr¡   rJ   rJ   rK   Úhas_body—  s   ÿzBaseRequest.has_bodyc                 C   s   | j  ¡  S )r  )re   r  r¡   rJ   rJ   rK   Ú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.)Útypere   r*   r¡   rJ   rJ   rK   Ú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)re   r  Úreadanyr¡   rJ   rJ   rK   Úrelease©  s   €
ÿzBaseRequest.releasec                 Ã   s|   �| j du r;| jr| j | j¡ tƒ }	 | j ¡ I dH }| |¡ | jr2t|ƒ}|| jkr2t| jƒ‚|s5nqt	|ƒ| _ | j S )z_Read request body if present.

        Returns bytes object with full request content.
        N)
rk   ro   re   Úset_read_chunk_sizeÚ	bytearrayr  Úextendr¼   r1   Úbytes)rŒ   ÚbodyÚchunkÚ	body_sizerJ   rJ   rK   Ú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ÚencodingrJ   rJ   rK   ÚtextÈ  s   €

zBaseRequest.text)Úloadsr-  c                Ã   s   �|   ¡ I dH }||ƒS )zReturn BODY as JSON.N)r,  )rŒ   r-  r$  rJ   rJ   rK   ÚjsonÎ  s   €zBaseRequest.jsonc                 Ã   s$   �t | j| j| j| jj| jjtd�S )z3Return async iterator to process BODY as multipart.)ru   Úmax_field_sizeÚmax_headersÚmax_size_error_cls)r)   rf   re   ro   rc   r/  r0  r1   r¡   rJ   rJ   rK   Ú	multipartÓ  s   €úzBaseRequest.multipartúMultiDictProxy[_Post]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�r`|  ¡ I dH }| j}d}| ¡ I dH  }du�r_|j	 
tj¡}t|tƒ�rP|jdu r^tdƒ‚|jrå| j dtj¡I dH }|jtd�I dH  }	r¼| |	¡2 z33 dH W }
| j d|j|
¡I dH  |t|
ƒ7 }d|  k rž|k r¯n q|| j d|j¡I dH  t|ƒ‚q|6 |jtd�I dH  }	sw| j d|jd¡I dH  |du rÎd}t|j|jtt j!|ƒ||j	ƒ}| "|j|¡ not#ƒ }| ¡ I dH  }	�r|t|	ƒ7 }d|  k �r|k �rt|ƒ‚ | $|	¡ | ¡ I dH  }	sòt#ƒ }| |¡2 z3 dH W }| $|¡ �q6 |du �s7| %d¡�rH|j&d	d
�}| "|j| '|¡¡ n| "|j|¡ ntdƒ‚| ¡ I dH  }dusHn|  (¡ I dH }|�r| j)�pod	}| $t*| +¡  '|¡d|d�¡ t|ƒ| _ | j S )zReturn POST parameters.N)rO   z!application/x-www-form-urlencodedúmultipart/form-datar4  r   zMultipart field missing name.)Úsizezapplication/octet-streamztext/r‘   )Údefaultz8To decode nested multipart you need to use custom readerT)Úkeep_blank_valuesr+  ),rj   rg   ÚPOST_METHODSr   r   rA   r2  ro   ÚnextrB   rÝ   r   ÚCONTENT_TYPEr¸   r(   r>   r  r?   rp   Úrun_in_executorÚtempfileÚTemporaryFileÚ
read_chunkr   Údecode_iterÚwriter¼   Úcloser1   Úseekr5   r   rH   rI   r¹   r!  r"  Ú
startswithÚget_charsetr)  r'  r(  r   Úrstrip)rŒ   rA   Úoutr2  Úmax_sizer5  ÚfieldÚfield_ctÚtmpr%  Údecoded_chunkÚffÚraw_datar´   Údr(  ÚdatarJ   rJ   rK   ÚpostÞ  s    €



ÿ
ÿþûÿ	
ûÿ
üÿÿÆ€>ýÿ
zBaseRequest.postr>   r6  c                 C   s0   | j }|du r	|S |j}|du r|S | ||¡S )z"Extra info from protocol transportN)rc   r£   Úget_extra_info)rŒ   r>   r6  r|   r£   rJ   rJ   rK   rQ  B  s   zBaseRequest.get_extra_infoc                 C   s2   | j  dd¡ d¡}d| jj› d| j› d|› d�S )NÚasciiÚbackslashreplaceú<ú z >)r�   r’   r)  rš   rC   rg   )rŒ   Úascii_encodable_pathrJ   rJ   rK   Ú__repr__N  s   ÿzBaseRequest.__repr__Úotherc                 C   s   t | ƒt |ƒkS rP   )Úid)rŒ   rX  rJ   rJ   rK   Ú__eq__T  ó   zBaseRequest.__eq__c                 C   s   dS )NTrJ   r¡   rJ   rJ   rK   Ú__bool__W  r±   zBaseRequest.__bool__Úresponsec                 Ã   s   �d S rP   rJ   )rŒ   r]  rJ   rJ   rK   Ú_prepare_hookZ  s   €zBaseRequest._prepare_hookÚexcc                 C   s   t | j|ƒ d S rP   )r%   re   )rŒ   r_  rJ   rJ   rK   Ú_cancel]  r[  zBaseRequest._cancelc                 C   sD   | j d u s
| jdkrd S | j  ¡ D ]\}}t|tƒr|j ¡  qd S )Nr4  )rj   rA   r˜   r¸   r5   r@   rA  )rŒ   Ú	file_nameÚfile_field_objectrJ   rJ   rK   Ú_finish`  s   

€þzBaseRequest._finish)r�   r   )r�   r8   )r�   rç   )r�   N)r�   r3  rP   )trC   rD   rE   r   Ú
METH_PATCHÚ	METH_POSTÚMETH_PUTÚ
METH_TRACEÚMETH_DELETEr8  r    ÚATTRSÚ	frozensetrj   r   Ú_PostrG   rk   r#  Úsetrt   rF   r&   r+   r   ÚasyncioÚAbstractEventLoopr  Údictr!   r   r�   r$   r   r0   r.   rŸ   Úpropertyr~   r|   Ú	Transportr£   r¤   ru   r#   rz   r   r�   r€   r   r:   r°   r¶   rº   r½   r   r¿   rõ   rÁ   r—   r   rØ   rw   rƒ   r'   r„   rx   ry   r‚   r�   rå   ræ   rè   rê   r   rB   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)   r2  rP  rQ  rW  ÚobjectrZ  r\  r3   r^  ÚBaseExceptionr`  rc  rJ   rJ   rJ   rK   r4   k   sV  
 ûÿóþýüûúù	÷
öõôó
ò;÷ýüûúùø	÷

ö; <	ÿþ#

dr4   c                       sì   e Zd ZU ejedgƒB ZdZed ed< e	r$de
deddf‡ fdd„Zeeeeeeed	œd
e
eB deeB deeB de
eB de
eB de
eB deeB 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 )r6   Ú_match_infoNr9   r>   Úvalr�   c                    s>   || j vrtjd| jj› d|› d�tdd� tƒ  ||¡ d S )NzSetting custom Ú.z attribute is discouragedr¬   r§   )ri  r©   rª   rš   rC   r«   ÚsuperÚ__setattr__)rŒ   r>   rx  ©rš   rJ   rK   r{  u  s   
üzRequest.__setattr__rŽ   rƒ   r�   rB   rw   rx   ry   ru   c          
   	      s0   t ƒ j|||||||d�}tt|ƒ}	| j|	_|	S )NrŽ   )rz  rŸ   r   r6   rw  )
rŒ   rƒ   r�   rB   rw   rx   ry   ru   ÚretÚnew_retr|  rJ   rK   rŸ     s   ù
	zRequest.clonec                 C   s   | j }|dus	J ‚|S )zResult of route resolving.N)rw  ©rŒ   Ú
match_inforJ   rJ   rK   r€  —  s   zRequest.match_infor7   c                 C   s   | j }|dus	J ‚|jS )zApplication instance.N)rw  Úcurrent_appr  rJ   rJ   rK   Úappž  s   zRequest.appc                 C   sH   | j }|d us	J ‚|j}| j}| |¡}tt|d |d … ƒƒ}t|ƒS )Nr   )rw  Úappsr‚  Úindexrß   Úreversedr   )rŒ   r€  Úlstr‚  ÚidxÚsublistrJ   rJ   rK   Úconfig_dict¥  s   
zRequest.config_dictr]  c                 Ã   s@   �| j }|d u r
d S |jD ]}|j }r| | |¡I d H  qd S rP   )rw  Ú_appsÚon_response_prepareÚsend)rŒ   r]  r€  r‚  r‹  rJ   rJ   rK   r^  ¯  s   €

€þzRequest._prepare_hook)r�   r9   )r�   r7   )rC   rD   rE   r4   ri  rj  rw  r
   rG   r   rF   r   r{  r$   r   r0   r.   r  rŸ   r#   r€  rp  r‚  r   r‰  r3   r^  Ú__classcell__rJ   rJ   r|  rK   r6   m  sH   
 ÷ýüûúùø	÷
ö	r6   )jrm  rr  rH   r  Ústringr<  rÊ   r©   Úcollections.abcr   r   r   r   r   Útypingr   r   r	   r
   r   r   r   Úurllib.parser   ÚattrÚ	multidictr   r   r   r   r   Úyarlr   rO   r   Ú_cookie_helpersr   Úabcr   Úhelpersr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   Úhttp_parserr&   Úhttp_writerr'   r2  r(   r)   Ústreamsr*   r+   Útypedefsr,   r-   r.   r/   r0   Úweb_exceptionsr1   r2   Úweb_responser3   Ú__all__Úweb_appr7   Úweb_protocolr8   Úweb_urldispatcherr9   r:   Úsr5   rF   r#  r!  rk  ÚdigitsÚascii_lettersrL   rG   rN   Úformatrâ   r—   ÚrangerZ   r[   r]   r_   Úcompiler`   ra   r4   r6   rJ   rJ   rJ   rK   Ú<module>   sl   
 $< ÿ$"      