o
    çûõ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mZ d dlZd dlmZmZmZmZmZ d dl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/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 ejJdkrÙd dlKmLZL nd dlKZKG dd„ deKjLeM ejNƒZLdZOe�rddlPmQZQ ddlRmSZS ddlTmUZU edƒZVdZWeeX eYd< ejZdddd �G d!d"„ d"ƒƒZ[e\eMB e]B e[B Z^ej_ej` d# Zaee\ eYd$< d%ea› d&�Zbee\ eYd'< d( cd) dd*d+„ d,eeefd-d.ƒƒ D ƒ¡¡Zgee\ eYd/< d0Zhee\ eYd1< d2eh› d3eg› d4�Ziee\ eYd5< d6eb› d7eb› d3ei› d8�Zjee\ eYd9< e kd:¡Zleee\  eYd;< e kej¡Zmeee\  eYd<< d=eXd>eFfd?d@„ZnG dAdB„ dBee\e0e B ef e/ƒZoG dCdD„ dDeoƒZpdS )Eé    N)ÚIteratorÚMappingÚMutableMapping)ÚPattern)ÚMappingProxyType)ÚIOÚTYPE_CHECKINGÚAnyÚFinalÚOptionalÚTypeVarÚcastÚoverload)ÚCIMultiDictÚCIMultiDictProxyÚ	MultiDictÚMultiDictProxyÚMultiMapping)ÚURLÚquery_to_pairsé   )Ú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)é   é   )ÚSpooledTemporaryFilec                   @   s:   e Zd ZdZdefdd„Zdefdd„Zdefdd„Zd	S )
r7   a€  Make the spooled file satisfy the documented `FileField.file` type.

        `tempfile.SpooledTemporaryFile` only became an `io.IOBase` subclass in
        3.11 (python/cpython#70363), and never grew the three capability
        predicates before then. Both underlying files (`io.BytesIO` before
        rollover, a `w+b` temp file after) are readable, writable and seekable.
        Úreturnc                 C   ó   dS ©NT© ©Úselfr;   r;   úF/opt/steambot/venv/lib/python3.10/site-packages/aiohttp/web_request.pyÚreadableF   ó   zSpooledTemporaryFile.readablec                 C   r9   r:   r;   r<   r;   r;   r>   ÚwritableI   r@   zSpooledTemporaryFile.writablec                 C   r9   r:   r;   r<   r;   r;   r>   ÚseekableL   r@   zSpooledTemporaryFile.seekableN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úboolr?   rA   rB   r;   r;   r;   r>   r7   =   s
    r7   )ÚBaseRequestÚ	FileFieldÚRequest)ÚApplication)ÚRequestHandler)ÚUrlMappingMatchInfoÚ_Té   Ú_FILE_SPOOL_MAX_SIZET)Úauto_attribsÚfrozenÚslotsc                   @   s>   e Zd ZU eed< eed< ee ed< eed< ee ed< dS )rI   ÚnameÚfilenameÚfileÚcontent_typeÚheadersN)rC   rD   rE   ÚstrÚ__annotations__r   Úbytesr   r;   r;   r;   r>   rI   c   s   
 rI   z!#$%&'*+.^_`|~-Ú_TCHARú[z]+Ú_TOKENz[{}]Ú c                 c   s   � | ]}t |ƒV  qd S ©N)Úchr)Ú.0Úcr;   r;   r>   Ú	<genexpr>s   s   € rd   )é	   é    é!   é#   é   Ú_QDTEXTz
\\[\t !-~]Ú_QUOTED_PAIRz"(?:ú|z)*"Ú_QUOTED_STRINGú(z)=(z)(:\d{1,4})?Ú_FORWARDED_PAIRz\\([\t !-~])Ú_QUOTED_PAIR_REPLACE_REÚ_FORWARDED_PAIR_REÚ
max_fieldsr8   c                 C   s   t | d| › d�d�S )NzMaximum number of form fields z
 exceeded.©Útext)r2   )rr   r;   r;   r>   Ú_too_many_fields‰   s   ÿru   c                   @   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œd	ed
edddedddejde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 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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/fd.d/„ƒZ0e-dejfd0d1„ƒZ1e2d2ee3 de3fd3d4„ƒZ4e2d2edefd5d4„ƒZ4d2eee3 B defd6d4„Z4e2d2ee3 d7e3ddfd8d9„ƒZ5e2d2ed7eddfd:d9„ƒZ5d2eee3 B d7eddfd;d9„Z5d2eee3 B ddfd<d=„Z6defd>d?„Z7de8eee B  fd@dA„Z9e-de:fdBdC„ƒZ;e-de<e=eef dDf fdEdF„ƒZ>e-defdGdH„ƒZ?e-defdIdJ„ƒZ@e-deAfdKdL„ƒZBe-defdMdN„ƒZCe-dedB fdOdP„ƒZDe-de/fdQdR„ƒZEe-defdSdT„ƒZFe-defdUdV„ƒZGe-defdWdX„ƒZHe-d¤dZd[„ƒZIe-defd\d]„ƒZJe-deKe fd^d_„ƒZLe-deMfd`da„ƒZNe-deOjOdB fdbdc„ƒZPe-deOjOdB fddde„ƒZQeRdfede8eS fdgdh„ƒZTeUdiedB de<eSdDf dB fdjdk„ƒZVe-de<eSdDf dB fdldm„ƒZWe-de<eSdDf dB fdndo„ƒZXe-deOjOdB fdpdq„ƒZYe-de:fdrds„ƒZZe-de=eef fdtdu„ƒZ[e-de\fdvdw„ƒZ]e-defdxdy„ƒZ^e%de:fdzd{„ƒZ_e%de:fd|d}„ƒZ`e-de:fd~d„ƒZad¥d€d�„Zbdefd‚dƒ„Zcdefd„d…„Zdeed†œd‡efdefdˆd‰„ZgdehfdŠd‹„Zid¦d�dŽ„Zjd§d�ed�edefd‘d’„Zkdefd“d”„Zld•emde:fd–d—„Znde:fd˜d™„Zodšepddfd›dœ„Zqd�erddfdždŸ„Zsd¥d d¡„ZtdS )¨rH   )Ú_messageÚ	_protocolÚ_payload_writerÚ_payloadÚ_headersÚ_methodÚ_versionÚ_rel_urlÚ_postÚ_read_bytesÚ_stateÚ_cacheÚ_taskÚ_client_max_sizeÚ_client_max_fieldsÚ_loopÚ_transport_sslcontextÚ_transport_peernameÚ_transport_socknameNr~   r   Ú_seen_str_keysrO   iè  )Úclient_max_sizeÚclient_max_fieldsÚstateÚschemeÚhostÚremoteÚmessageÚpayloadÚprotocolrL   Úpayload_writerÚtaskúasyncio.Task[None]ÚlooprŠ   r‹   rŒ   r�   rŽ   r�   r8   c                C   s4  || _ || _|| _|| _|j| _|j| _|j| _	i | _
|j}|jrW|
d u r/|jr/|jr-dnd}
|
d ur=| |
¡}|
| j
d< |d urF| |¡}|| j
d< |j| j
d< | ¡ | _n|| _|
d urc|
| j
d< |d url|| j
d< |	d u rri n|	| _|| _|| _|| _|| _|j| _|j| _|j| _|d ur˜|| j
d< d S d S )NÚhttpsÚhttpr�   ÚurlrŽ   r�   )rv   rw   rx   ry   rX   rz   Úmethodr{   Úversionr|   r�   r™   Úabsoluter�   Ússl_contextÚwith_schemeÚ	with_hostrŽ   Úrelativer}   r€   r‚   rƒ   r„   r…   r†   Úpeernamer‡   Úsocknamerˆ   )r=   r�   r‘   r’   r“   r”   r–   rŠ   r‹   rŒ   r�   rŽ   r�   r™   r;   r;   r>   Ú__init__³   sH   





ÿzBaseRequest.__init__©rš   Úrel_urlrX   r�   rŽ   r�   rŠ   r‹   rš   r¥   rX   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}|tu ro| 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™   ÚpathrX   c                 s   s(   � | ]\}}|  d ¡|  d ¡fV  qdS )úutf-8N)Úencode)rb   ÚkÚvr;   r;   r>   rd     s
   € ÿ
ÿz$BaseRequest.clone.<locals>.<genexpr>Úraw_headersr�   rŽ   r�   )rŠ   r‹   rŒ   Nr;   )r   ÚRuntimeErrorr%   r   rY   r   r   ÚtupleÚitemsrv   Ú_replacerƒ   r„   Ú	__class__ry   rw   rx   r‚   r…   r€   Úcopy)r=   rš   r¥   rX   r�   rŽ   r�   rŠ   r‹   ÚdctÚnew_urlr�   Úkwargsr;   r;   r>   Úcloneò   sP   
þú÷
özBaseRequest.clonec                 C   ó   | j S r`   )r‚   r<   r;   r;   r>   r”   1  ó   zBaseRequest.taskc                 C   r¶   r`   )rw   r<   r;   r;   r>   r’   5  r·   zBaseRequest.protocolc                 C   s   | j d u rd S | j jS r`   )rw   Ú	transportr<   r;   r;   r>   r¸   9  s   
zBaseRequest.transportc                 C   r¶   r`   )rx   r<   r;   r;   r>   Úwriter?  r·   zBaseRequest.writerc                 C   r¶   r`   )rƒ   r<   r;   r;   r>   rŠ   C  r·   zBaseRequest.client_max_sizec                 C   r¶   r`   )r„   r<   r;   r;   r>   r‹   G  r·   zBaseRequest.client_max_fieldsc                 C   ó   t jdtdd� | jS )NzRequest.message is deprecatedr5   ©Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningrv   r<   r;   r;   r>   r�   K  s   zBaseRequest.messagec                 C   r¶   r`   )r}   r<   r;   r;   r>   r¥   P  r·   zBaseRequest.rel_urlc                 C   rº   )Nz#request.loop property is deprecatedé   r»   )r½   r¾   r¿   r…   r<   r;   r;   r>   r–   T  s   ÿzBaseRequest.loopÚkeyc                 C   ó   d S r`   r;   ©r=   rÁ   r;   r;   r>   Ú__getitem__]  r@   zBaseRequest.__getitem__c                 C   rÂ   r`   r;   rÃ   r;   r;   r>   rÄ   `  r@   c                 C   s
   | j | S r`   ©r€   rÃ   r;   r;   r>   rÄ   c  ó   
Úvaluec                 C   rÂ   r`   r;   ©r=   rÁ   rÇ   r;   r;   r>   Ú__setitem__f  r@   zBaseRequest.__setitem__c                 C   rÂ   r`   r;   rÈ   r;   r;   r>   rÉ   i  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"   rH   r‰   Úaddr½   r¾   r3   r€   rÈ   r;   r;   r>   rÉ   l  s   ûc                 C   s   | j |= d S r`   rÅ   rÃ   r;   r;   r>   Ú__delitem__x  s   zBaseRequest.__delitem__c                 C   ó
   t | jƒS r`   )Úlenr€   r<   r;   r;   r>   Ú__len__{  rÆ   zBaseRequest.__len__c                 C   rÎ   r`   )Úiterr€   r<   r;   r;   r>   Ú__iter__~  rÆ   zBaseRequest.__iter__c                 C   s
   | j dkS )z5A bool indicating if the request is handled with SSL.r—   )r�   r<   r;   r;   r>   Úsecureƒ  ó   
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
        r;   r   FNú,ú"z\1r   éÿÿÿÿTú;z 	)rv   rX   Úgetallr   Ú	FORWARDEDrÏ   ÚappendÚtypesr   rq   ÚmatchÚfindÚgroupsrp   ÚsubÚlowerÚgroupr­   )r=   ÚelemsÚfield_valueÚlengthÚposÚneed_separatorÚelemrÝ   rT   rÇ   Úportr;   r;   r>   Ú	forwardedˆ  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—   r˜   )r†   r<   r;   r;   r>   r�   Å  s   zBaseRequest.schemec                 C   r¶   )zyRead only property for getting HTTP method.

        The value is upper-cased str like 'GET', 'POST', 'PUT' etc.
        )r{   r<   r;   r;   r>   rš   Õ  ó   zBaseRequest.methodc                 C   r¶   )zxRead only property for getting HTTP version of request.

        Returns aiohttp.protocol.HttpVersion instance.
        )r|   r<   r;   r;   r>   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.
        Nr_   é   r]   r   ú])
rv   rX   Úgetr   ÚHOSTrˆ   rË   r­   rÏ   rY   )r=   rŽ   r¢   r;   r;   r>   rŽ   å  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   )r‡   rË   Úlistr­   rY   r<   r;   r;   r>   r�     s
   
	
zBaseRequest.remotec                 C   s   t j| j| jd� | j¡S )zThe full URL of the request.)r�   Ú	authority)r   Úbuildr�   rŽ   Újoinr}   r<   r;   r;   r>   r™     s   zBaseRequest.urlc                 C   ó   | j jS )z_The URL including *PATH INFO* without the host or scheme.

        E.g., ``/app/blog``
        )r}   r¦   r<   r;   r;   r>   r¦     ó   zBaseRequest.pathc                 C   rÎ   )zXThe URL including PATH_INFO and the query string.

        E.g, /app/blog?id=10
        )rY   r}   r<   r;   r;   r>   Ú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``
        )rv   r¦   r<   r;   r;   r>   Úraw_path*  s   zBaseRequest.raw_pathúMultiMapping[str]c                 C   rô   )z7A multidict with all the variables in the query string.)r}   Úqueryr<   r;   r;   r>   rù   4  ó   zBaseRequest.queryc                 C   rô   )z:The query string in the URL.

        E.g., id=10
        )r}   Úquery_stringr<   r;   r;   r>   rû   9  rõ   zBaseRequest.query_stringc                 C   r¶   )z4A case-insensitive multidict proxy with all headers.)rz   r<   r;   r;   r>   rX   A  ó   zBaseRequest.headersc                 C   rô   )z$A sequence of pairs for all headers.)rv   r«   r<   r;   r;   r>   r«   F  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#   rX   rî   r   ÚIF_MODIFIED_SINCEr<   r;   r;   r>   Úif_modified_sinceK  ó   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#   rX   rî   r   ÚIF_UNMODIFIED_SINCEr<   r;   r;   r>   Úif_unmodified_sinceS  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À   r5   rì   N)r   r    r   Úfinditerrâ   rG   )r  rÝ   r  rÇ   Úgarbager;   r;   r>   Ú_etag_values[  s   €þ
þùzBaseRequest._etag_valuesÚheader_valuec                 C   s   |sd S t |  |¡ƒS r`   )r­   r  )Úclsr  r;   r;   r>   Ú_if_match_or_none_implp  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
  rX   rî   r   ÚIF_MATCHr<   r;   r;   r>   Úif_matchy  ó   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
  rX   rî   r   ÚIF_NONE_MATCHr<   r;   r;   r>   Ú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#   rX   rî   r   ÚIF_RANGEr<   r;   r;   r>   Úif_range‰  r   zBaseRequest.if_rangec                 C   s
   | j j S )zIs keepalive enabled by client?)rv   Úshould_closer<   r;   r;   r>   Ú
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.
        r_   c                 S   s   i | ]\}}||j “qS r;   )rÇ   )rb   rT   Úmorselr;   r;   r>   Ú
<dictcomp>   s    z'BaseRequest.cookies.<locals>.<dictcomp>)r   rX   rî   r   ÚCOOKIEr   )r=   Úparsedr;   r;   r>   Úcookies–  s   zBaseRequest.cookiesc                 C   sæ   | j  tj¡}d\}}|durmzd}t ||tjtjB ¡d \}}W n ty-   t	dƒ‚w |r4t
|ƒnd}|r<t
|ƒnd}|du rK|durK| }d}|dur_|dur_|d7 }||kr_t	dƒ‚||  u rldu rmt	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)rz   rî   r   ÚRANGEÚreÚfindallÚASCIIÚ
IGNORECASEÚ
IndexErrorÚ
ValueErrorÚintÚslice)r=   ÚrngÚstartÚendÚpatternr;   r;   r>   Ú
http_range¢  s,   "ÿÿzBaseRequest.http_rangec                 C   r¶   )zReturn raw payload stream.)ry   r<   r;   r;   r>   Ú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¿   ry   Úat_eofr<   r;   r;   r>   Úhas_bodyÌ  s   ÿzBaseRequest.has_bodyc                 C   s   | j  ¡  S )r)  )ry   r*  r<   r;   r;   r>   Ú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.)Útypery   r+   r<   r;   r;   r>   Ú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)ry   r*  Úreadanyr<   r;   r;   r>   Ú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)
r   rƒ   ry   Úset_read_chunk_sizeÚ	bytearrayr/  ÚextendrÏ   r2   r[   )r=   ÚbodyÚchunkÚ	body_sizer;   r;   r>   Úreadæ  s"   €



ø
	zBaseRequest.readc                 Ã   s$   �|   ¡ I dH }| jpd}| |¡S )z1Return BODY as text using encoding from .charset.Nr§   )r7  ÚcharsetÚdecode)r=   Ú
bytes_bodyÚencodingr;   r;   r>   rt   ý  s   €

zBaseRequest.text)Úloadsr<  c                Ã   s   �|   ¡ I dH }||ƒS )zReturn BODY as JSON.Nrs   )r=   r<  r4  r;   r;   r>   Ú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.)rŠ   Úmax_field_sizeÚmax_headersÚmax_size_error_cls)r*   rz   ry   rƒ   rw   r>  r?  r2   r<   r;   r;   r>   Ú	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 |dk�rštƒ }|  ¡ I dH }| j}| j}| j	}| 
¡ I dH  }du�r™d|  k rZ|jk r[t|ƒ‚ d|  k rjt|ƒkrkt|ƒ‚ |j tj¡}t|tƒ�rŠ|jdu r�tdƒ‚|j�r#ttƒ}	d}
|jtd�I dH  }rôd|  k r¡|jk r¼n n|
r´| j d|	j¡I dH  t|ƒ‚|	 ¡  t|ƒ‚| |¡2 z&3 dH W }|
pÒ|	  ¡ t|ƒ tk}
|
râ| j d|	j!|¡I dH  qÁ|	 !|¡ qÁ6 |jtd�I dH  }s–|
�r| j d|	j"d¡I dH  n|	 "d¡ |du �rd}t#|j|j|	||jƒ}| $|j|¡ nkt%ƒ }| ¡ I dH  }�rPd|  k �r@|jk �rAt|ƒ‚ | &|¡ | ¡ I dH  }�s0t%ƒ }| |¡2 z3 dH W }| &|¡ �qX6 |du �sq| 'd	¡�r‚|j(d
d�}| $|j| )|¡¡ n| $|j|¡ ntdƒ‚| 
¡ I dH  }dusLn>|  *¡ I dH  }�s¨tƒ }n0| j+�p­d
}| ,¡  )|¡}| j}ztt-||dk�rÃ|nd|d�ƒ}W n t�y×   t|ƒd‚w t|ƒ| _ | j S )zReturn POST parameters.N)r_   z!application/x-www-form-urlencodedúmultipart/form-datarC  r   zMultipart field missing name.F)Úsizezapplication/octet-streamztext/r§   )Údefaultz8To decode nested multipart you need to use custom reader)rr   r;  ).r~   r{   ÚPOST_METHODSr   r   rW   rA  rƒ   r„   ry   ÚnextÚtotal_bytesr2   rÏ   ru   rX   rî   r   ÚCONTENT_TYPErË   r)   rT   r   rU   r7   rP   Ú
read_chunkr   r…   Úrun_in_executorÚcloseÚdecode_iterÚtellÚwriteÚseekrI   rÌ   r2  r3  Ú
startswithÚget_charsetr9  r7  r8  Úrstripr   )r=   rW   ÚoutrA  Úmax_sizerr   r‘   ÚfieldÚfield_ctÚtmpÚrolledr5  Údecoded_chunkÚffÚraw_datarÇ   Údr8  Údatarù   r;   r;   r>   Úpost  sÊ   €

ÿÿ
ÿÿÿÿôø

ûÿ
ýÿÿ±€Rýÿ
ÿ
zBaseRequest.postrT   rE  c                 C   s0   | j }|du r	|S |j}|du r|S | ||¡S )z"Extra info from protocol transportN)rw   r¸   Úget_extra_info)r=   rT   rE  r’   r¸   r;   r;   r>   r`  “  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¨   r9  r°   rC   r{   )r=   Úascii_encodable_pathr;   r;   r>   Ú__repr__Ÿ  s   ÿzBaseRequest.__repr__Úotherc                 C   s   t | ƒt |ƒkS r`   )Úid)r=   rg  r;   r;   r>   Ú__eq__¥  ó   zBaseRequest.__eq__c                 C   r9   r:   r;   r<   r;   r;   r>   Ú__bool__¨  r@   zBaseRequest.__bool__Úresponsec                 Ã   s   �d S r`   r;   )r=   rl  r;   r;   r>   Ú_prepare_hook«  s   €zBaseRequest._prepare_hookÚexcc                 C   s   t | j|ƒ d S r`   )r&   ry   )r=   rn  r;   r;   r>   Ú_cancel®  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 )NrC  )r~   rW   r®   rË   rI   rV   rL  )r=   Ú	file_nameÚfile_field_objectr;   r;   r>   Ú_finish±  s   

€þzBaseRequest._finish)r8   r•   )r8   rL   )r8   rø   )r8   N)r8   rB  r`   )urC   rD   rE   r   Ú
METH_PATCHÚ	METH_POSTÚMETH_PUTÚ
METH_TRACEÚMETH_DELETErF  r!   ÚATTRSÚ	frozensetr~   r   Ú_PostrZ   r   r[   Úsetr‰   rY   r'   r,   r   ÚasyncioÚAbstractEventLoopr!  Údictr"   r	   r£   r%   r   r1   r/   rµ   Úpropertyr”   r’   Ú	Transportr¸   r¹   rŠ   r‹   r$   r�   r   r¥   r–   r   rN   rÄ   rÉ   rÍ   rÐ   r   rÒ   rG   rÓ   r­   r   rê   r�   rš   r(   r›   rŽ   r�   r™   r¦   rö   r÷   rù   rû   r   rX   r0   r«   Údatetimerÿ   r  Ústaticmethodr    r  Úclassmethodr
  r  r  r  r  r  r"  r'  r(  r+  r,  r.  r0  r7  rt   r-   r.   r=  r*   rA  r_  r`  rf  Úobjectri  rk  r4   rm  ÚBaseExceptionro  rr  r;   r;   r;   r>   rH   �   sh  
 ûÿòþýüûúù	÷
öõôóò
ñBöýüûúùø	÷
ö
õ? <	ÿþ$

 rH   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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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 ) rJ   Ú_match_infoNrM   rT   Úvalr8   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»   )rx  r½   r¾   r°   rC   r¿   ÚsuperÚ__setattr__)r=   rT   r‡  ©r°   r;   r>   rŠ  Ã  s   
üzRequest.__setattr__r¤   rš   r¥   rX   r�   rŽ   r�   rŠ   r‹   c             
      s2   t ƒ j||||||||d�}	tt|	ƒ}
| j|
_|
S )Nr¤   )r‰  rµ   r   rJ   r†  )r=   rš   r¥   rX   r�   rŽ   r�   rŠ   r‹   ÚretÚnew_retr‹  r;   r>   rµ   Í  s   ø

zRequest.clonec                 C   s   | j }|dus	J ‚|S )zResult of route resolving.N)r†  ©r=   Ú
match_infor;   r;   r>   r�  ç  s   zRequest.match_inforK   c                 C   s   | j }|dus	J ‚|jS )zApplication instance.N)r†  Úcurrent_apprŽ  r;   r;   r>   Úappî  s   zRequest.appc                 C   sH   | j }|d us	J ‚|j}| j}| |¡}tt|d |d … ƒƒ}t|ƒS )Nr   )r†  Úappsr‘  Úindexrð   Úreversedr   )r=   r�  Úlstr‘  ÚidxÚsublistr;   r;   r>   Úconfig_dictõ  s   
zRequest.config_dictrl  c                 Ã   s@   �| j }|d u r
d S |jD ]}|j }r| | |¡I d H  qd S r`   )r†  Ú_appsÚon_response_prepareÚsend)r=   rl  r�  r‘  rš  r;   r;   r>   rm  ÿ  s   €

€þzRequest._prepare_hook)r8   rM   )r8   rK   )rC   rD   rE   rH   rx  ry  r†  r   rZ   r   rY   r	   rŠ  r%   r   r1   r/   r!  rµ   r$   r�  r  r‘  r   r˜  r4   rm  Ú__classcell__r;   r;   r‹  r>   rJ   »  sN   
 öýüûúùø	÷
öõ	rJ   )qr|  r�  Úior  ÚstringÚsysrÜ   r½   Úcollections.abcr   r   r   r   r   Útypingr   r   r	   r
   r   r   r   r   ÚattrÚ	multidictr   r   r   r   r   Úyarlr   r   r_   r   Ú_cookie_helpersr   Úabcr   Úhelpersr   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   Úhttp_parserr'   Úhttp_writerr(   rA  r)   r*   Ústreamsr+   r,   Útypedefsr-   r.   r/   r0   r1   Úweb_exceptionsr2   r3   Úweb_responser4   Úversion_infoÚtempfiler7   r[   ÚIOBaseÚ__all__Úweb_apprK   Úweb_protocolrL   Úweb_urldispatcherrM   rN   rP   r!  rZ   ÚsrI   rY   r2  rz  ÚdigitsÚascii_lettersr\   r^   Úformatró   r­   Úrangerj   rk   rm   ro   Úcompilerp   rq   ru   rH   rJ   r;   r;   r;   r>   Ú<module>   sv   
 (<
 ÿ$"      2