o
    n~b~                     @   s$  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mZmZ d dlmZmZmZ d dlmZm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z' dd	l(m)Z)m*Z*m+Z+m,Z, dd
l-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8 dZ9erddl:m;Z; G dd de<Z=G dd de<Z>dee? deee? ee?e?f f fddZ@	d)dee?e?f de?dee? fddZAG dd dZBG dd dZCe6eCe2jDd G d!d" d"e3ZEG d#d$ d$ZFee3e?e?f ZGG d%d& d&e3ZHG d'd( d(ZIdS )*    N)deque)TracebackType)TYPE_CHECKINGAnyAsyncIteratorDequeDictIteratorListMappingOptionalSequenceTupleTypeUnioncast)	parse_qslunquote	urlencode)CIMultiDictCIMultiDictProxyMultiMapping   )CONTENT_DISPOSITIONCONTENT_ENCODINGCONTENT_LENGTHCONTENT_TRANSFER_ENCODINGCONTENT_TYPE)CHARTOKENparse_mimetypereify)HeadersParser)JsonPayloadLookupErrorOrderPayloadStringPayloadget_payloadpayload_type)StreamReader)MultipartReaderMultipartWriterBodyPartReaderBadContentDispositionHeaderBadContentDispositionParamparse_content_dispositioncontent_disposition_filename)ClientResponsec                   @      e Zd ZdS )r.   N__name__
__module____qualname__ r8   r8   </usr/local/lib/python3.10/dist-packages/aiohttp/multipart.pyr.   A       r.   c                   @   r3   )r/   Nr4   r8   r8   r8   r9   r/   E   r:   r/   headerreturnc                    s  dt dtfdd dt dtfdd}dt dtf fdd}dt dtfd	d
}dt dtfdd}dttjtddt dt dt fdd}| sJd i fS | d^}} |s`t	t
|  d i fS i }|rO|d}	d|	vryt	t
|  d i fS |	dd\}
}|
  }
| }|
|v rt	t
|  d i fS  |
st	t|	 qb||
r||r||dd }n |st	t|	 qbn||
r||r|dd\}}}|pd}nt	t|	 qbzt||d}W n^ ty   t	t|	 Y qbw d}||rd}||dd d}n+ |rd}n#|r;| d|d  }||r;|d ||dd d}d}|rIt	t
|  d i fS |||
< |se| |fS )Nstringr<   c                 S   s   t | o	tt| kS N)boolr   setr=   r8   r8   r9   is_tokenL   s   z+parse_content_disposition.<locals>.is_tokenc                 S   s    | d | d   kodkS   S )Nr   "r8   rA   r8   r8   r9   	is_quotedO   s    z,parse_content_disposition.<locals>.is_quotedc                    s    | o
|  ddkS )N'   )countrA   rB   r8   r9   
is_rfc5987R      z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |  dS )N*)endswithrA   r8   r8   r9   is_extended_paramU      
z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |  dd }|sdS | dr| |d n| |d  }| S )NrL   r   FrC   )findrM   isdigit)r=   posZ	substringr8   r8   r9   is_continuous_paramX   s
   "z6parse_content_disposition.<locals>.is_continuous_param )charstextrU   c                S   s   t d| dd| S )Nz\\([z])z\1)resub)rV   rU   r8   r8   r9   unescape_   rK   z+parse_content_disposition.<locals>.unescape;r   =r   rC   rF   rG   utf-8strictTFz\/)strr?   joinmaprW   escaper   splitwarningswarnr.   poplowerstriplstripr/   r   UnicodeDecodeError)r;   rE   rJ   rN   rS   rY   Zdisptypepartsparamsitemkeyvalueencoding_failed_valuer8   rI   r9   r0   I   s   *





>r0   filenamerk   namec           
         s   d|  | sd S  | v r|   S || v r| | S g }t  fdd|  D }t|D ]%\}\}}|dd\}}|drD|d d }|t|krP|| q+ |sUd S d|}d|v rq|dd	\}	}}|	pjd
}	t||	dS |S )Nz%s*c                 3   s&    | ]\}}|  r||fV  qd S r>   )
startswith).0rm   rn   Zname_sufr8   r9   	<genexpr>   s    
z/content_disposition_filename.<locals>.<genexpr>rL   r   rC   rT   rF   rG   r\   r]   )	sorteditems	enumeraterb   rM   r^   appendr_   r   )
rk   rt   rj   Zfnparamsnumrm   rn   rp   tailro   r8   rw   r9   r1      s4   

r1   c                   @   sp   e Zd ZdZ						ddd	Zdd
dZded fddZdefddZ	de
ed  fddZdddZdS )MultipartResponseWrapperzzWrapper around the MultipartReader.

    It takes care about
    underlying connection and close it when it needs in.
    respr2   streamr+   r<   Nc                 C   s   || _ || _d S r>   )r   r   )selfr   r   r8   r8   r9   __init__   s   
z!MultipartResponseWrapper.__init__c                 C      | S r>   r8   r   r8   r8   r9   	__aiter__      z"MultipartResponseWrapper.__aiter__)r+   r-   c                        |   I d H }|d u rt|S r>   nextStopAsyncIterationr   partr8   r8   r9   	__anext__   
   z"MultipartResponseWrapper.__anext__c                 C   s   | j j S )z2Returns True when all response data had been read.)r   contentat_eofr   r8   r8   r9   r         zMultipartResponseWrapper.at_eofc                    s.   | j  I dH }| j  r|  I dH  |S )z#Emits next multipart reader object.N)r   r   r   releaser   rl   r8   r8   r9   r      s
   
zMultipartResponseWrapper.nextc                    s   | j  I dH  dS )z_Release the connection gracefully.

        All remaining content is read to the void.
        N)r   r   r   r8   r8   r9   r      s   z MultipartResponseWrapper.release)r   r2   r   r+   r<   N)r<   r   r<   N)r5   r6   r7   __doc__r   r   r   r   r?   r   r   r   r   r8   r8   r8   r9   r      s$    




	r   c                   @   s  e Zd ZdZdZdedddeddfd	d
Zded  fddZ	defddZ
dee fddZdddedefddZefdedefddZdedefddZdedefddZdefddZd9dd Zdd!d"ee defd#d$Zdd!d"ee deeeef  fd%d&Zdd!d"ee deeeef  fd'd(Zdefd)d*Zd+edefd,d-Zd+edefd.d/Zd+edefd0d1Z d2edefd3d4Z!e"dee fd5d6Z#e"dee fd7d8Z$dS ):r-   z&Multipart reader for single body part.i    boundaryheadersCIMultiDictProxy[str]r   r<   Nc                 C   s`   || _ || _|| _d| _| j td }|d urt|nd | _d| _t	 | _
d | _d| _i | _d S )NFr   )r   	_boundary_content_at_eofgetr   int_length_read_bytesr   _unread_prev_chunk_content_eof_cache)r   r   r   r   lengthr8   r8   r9   r     s   
zBodyPartReader.__init__c                 C   r   r>   r8   r   r8   r8   r9   r     r   zBodyPartReader.__aiter__c                    r   r>   r   r   r8   r8   r9   r     s
   zBodyPartReader.__anext__c                    s   |   I d H }|sd S |S r>   )readr   r8   r8   r9   r     s
   zBodyPartReader.nextFdecoder   c                   sH   | j rdS t }| j s|| | jI dH  | j r|r"| |S |S )zReads body part data.

        decode: Decodes data following by encoding
                method from Content-Encoding header. If it missed
                data remains untouched
            N)r   	bytearrayextend
read_chunk
chunk_sizer   )r   r   datar8   r8   r9   r      s   
zBodyPartReader.readsizec                    s   | j rdS | jr| |I dH }n| |I dH }|  jt|7  _| j| jkr,d| _ | j r?| j I dH }d|ks?J d|S )zWReads body part content chunk of the specified size.

        size: chunk size
        r   NT   
z3reader did not read all the data or it is malformed)r   r   _read_chunk_from_length_read_chunk_from_streamr   lenr   readline)r   r   chunkZclrfr8   r8   r9   r   0  s    zBodyPartReader.read_chunkc                    s<   | j d us
J dt|| j | j }| j|I d H }|S )Nz(Content-Length required for chunked read)r   minr   r   r   )r   r   r   r   r8   r8   r9   r   F  s
   z&BodyPartReader._read_chunk_from_lengthc                    sb  |t | jd ksJ d| jd u }|r| j|I d H | _| j|I d H }|  jt| j 7  _| jdk s=J d| jd usDJ | j| }d| j }|rV||}n||t	dt | jt | }|dkrt
  t
jdtd | j||d   W d    n1 sw   Y  ||kr| jd | | _|t | j| }|sd	| _| j}|| _|S )
NrG   z<Chunk size must be greater or equal than boundary length + 2   zReading after EOFr   r   ignore)categoryT)r   r   r   r   r   r   r   r   rP   maxrc   catch_warningsfilterwarningsDeprecationWarningZunread_datar   )r   r   Zfirst_chunkr   windowrX   idxresultr8   r8   r9   r   N  s<   


 
z&BodyPartReader._read_chunk_from_streamc                    s   | j rdS | jr| j }n| j I dH }|| jr?|d}| j}| jd }||ks2||kr=d| _ | j| dS |S | j I dH }|| jrS|dd }| j| |S )z Reads body part by line by line.r   Nr      --T)	r   r   popleftr   r   ru   r   rstripr|   )r   linesliner   last_boundary	next_liner8   r8   r9   r   p  s(   

zBodyPartReader.readlinec                    s2   | j rdS | j s| | jI dH  | j r	dS dS )z0Like read(), but reads all the data to the void.N)r   r   r   r   r8   r8   r9   r     s   zBodyPartReader.release)ro   ro   c                   s.   | j ddI dH }|p| jdd}||S )z;Like read(), but assumes that body part contains text data.Tr   Nr\   default)r   get_charsetr   r   ro   r   r8   r8   r9   rV     s   
zBodyPartReader.textc                   sJ   | j ddI dH }|sdS |p| jdd}ttttf t||S )z<Like read(), but assumes that body parts contains JSON data.Tr   Nr\   r   )	r   r   r   r   r^   r   jsonloadsr   r   r8   r8   r9   r     s   zBodyPartReader.jsonc                   sN   | j ddI dH }|sg S |dur|}n| jdd}t| |d|dS )zFLike read(), but assumes that body parts contain form urlencoded data.Tr   Nr\   r   )keep_blank_valuesro   )r   r   r   r   r   )r   ro   r   Zreal_encodingr8   r8   r9   form  s   zBodyPartReader.formc                 C      | j S )z<Returns True if the boundary was reached or False otherwise.r   r   r8   r8   r9   r        zBodyPartReader.at_eofr   c                 C   s,   t | jv r
| |}t| jv r| |S |S )zDecodes data.

        Decoding is done according the specified Content-Encoding
        or Content-Transfer-Encoding headers value.
        )r   r   _decode_content_transferr   _decode_content)r   r   r8   r8   r9   r     s
   



zBodyPartReader.decodec                 C   s^   | j td }|dkrt|tj S |dkr"t|dtj S |dkr(|S td| )NrT   deflategzip   identityunknown content encoding: )r   r   r   rf   zlib
decompress	MAX_WBITSRuntimeErrorr   r   ro   r8   r8   r9   r     s   zBodyPartReader._decode_contentc                 C   sP   | j td }|dkrt|S |dkrt|S |dv r!|S td	|)NrT   base64quoted-printable)binary8bit7bit%unknown content transfer encoding: {})
r   r   r   rf   r   	b64decodebinasciia2b_qpr   formatr   r8   r8   r9   r     s   

z'BodyPartReader._decode_content_transferr   c                 C   s$   | j td}t|}|jd|S )z>Returns charset parameter from Content-Type header or default.rT   charset)r   r   r   r    
parameters)r   r   ctypemimetyper8   r8   r9   r     s   zBodyPartReader.get_charsetc                 C      t | jt\}}t|dS )z|Returns name specified in Content-Disposition header.

        If the header is missing or malformed, returns None.
        rt   r0   r   r   r   r1   r   rp   rk   r8   r8   r9   rt        
zBodyPartReader.namec                 C   r   )zReturns filename specified in Content-Disposition header.

        Returns None if the header is missing or malformed.
        rs   r   r   r8   r8   r9   rs     r   zBodyPartReader.filenamer   )%r5   r6   r7   r   r   bytesr*   r   r   r   r   r   r   r?   r   r   r   r   r   r   r   r^   rV   r   r   r   r
   r   r   r   r   r   r   r   r!   rt   rs   r8   r8   r8   r9   r-      sB    
"
((r-   )orderc                       s@   e Zd Zdedededdf fddZdeddfd	d
Z  ZS )BodyPartReaderPayloadrn   argskwargsr<   Nc                    sb   t  j|g|R i | i }|jd ur|j|d< |jd ur#|j|d< |r/| jdi | d S d S )Nrt   rs   
attachmentT)r   T)superr   rt   rs   Zset_content_disposition)r   rn   r   r   rk   	__class__r8   r9   r     s   



zBodyPartReaderPayload.__init__writerc                    sR   | j }|jddI d H }|r'|||I d H  |jddI d H }|sd S d S )Ni   )r   )rr   r   writer   )r   r   fieldr   r8   r8   r9   r     s   zBodyPartReaderPayload.write)r5   r6   r7   r-   r   r   r   __classcell__r8   r8   r   r9   r     s    r   c                   @   s"  e Zd ZdZeZdZeZde	e
e
f deddfddZded fd	d
Zdeed ef  fddZedddefddZdefddZdeed ef  fddZd(ddZded ef fddZddded ef fddZde
fddZdefddZd(d d!Zd(d"d#Zd)d$d%Zd(d&d'Z dS )*r+   zMultipart body reader.Nr   r   r<   c                 C   s:   || _ d|    | _|| _d | _d| _d| _g | _d S )Nz--FT)	r   _get_boundaryencoder   r   
_last_partr   _at_bofr   )r   r   r   r8   r8   r9   r     s   
zMultipartReader.__init__r-   c                 C   r   r>   r8   r   r8   r8   r9   r   "  s   zMultipartReader.__aiter__c                    r   r>   r   r   r8   r8   r9   r   '  r   zMultipartReader.__anext__responser2   c                 C   s   |  || |j|j}|S )zConstructs reader instance from HTTP response.

        :param response: :class:`~aiohttp.client.ClientResponse` instance
        )response_wrapper_clsr   r   )clsr  objr8   r8   r9   from_response/  s   	zMultipartReader.from_responsec                 C   r   )z@Returns True if the final boundary was reached, false otherwise.r   r   r8   r8   r9   r   =  r   zMultipartReader.at_eofc                    sd   | j rdS |  I dH  | jr|  I dH  d| _n|  I dH  | j r'dS |  I dH | _| jS )z#Emits the next multipart body part.NF)r   _maybe_release_last_partr  _read_until_first_boundary_read_boundaryfetch_next_partr  r   r8   r8   r9   r   A  s   zMultipartReader.nextc                    s>   | j s|  I dH }|du rdS | I dH  | j rdS dS )z=Reads all the body parts to the void till the final boundary.N)r   r   r   r   r8   r8   r9   r   S  s   zMultipartReader.releasec                    s   |   I dH }| |S )z"Returns the next body part reader.N)_read_headers_get_part_reader)r   r   r8   r8   r9   r  [  s   
zMultipartReader.fetch_next_partr   c                 C   sX   | td}t|}|jdkr#| jdu rt| || jS | || jS | | j|| jS )zDispatches the response by the `Content-Type` header.

        Returns a suitable reader instance.

        :param dict headers: Response headers
        rT   	multipartN)r   r   r    typemultipart_reader_clsr   part_reader_clsr   )r   r   r   r   r8   r8   r9   r  b  s   


z MultipartReader._get_part_readerc                 C   sb   t | jt }|jdksJ dd|jvrtd| jt  |jd }t|dkr/td| |S )Nr  z!multipart/* content type expectedr   z$boundary missed for Content-Type: %sF   z&boundary %r is too long (70 chars max))r    r   r   r  r   
ValueErrorr   )r   r   r   r8   r8   r9   r   v  s   

zMultipartReader._get_boundaryc                    s"   | j r	| j  S | j I d H S r>   )r   re   r   r   r   r8   r8   r9   	_readline  s   
zMultipartReader._readlinec                    sX   	 |   I d H }|dkrtd| j | }|| jkrd S || jd kr+d| _d S q)NTr   z#Could not find starting boundary %rr   )r  r  r   r   r   r   r   r8   r8   r9   r	    s   
z*MultipartReader._read_until_first_boundaryc                    s   |   I d H  }|| jkrd S || jd krCd| _|   I d H }|   I d H }|d d dkr9| j| d S | j||g d S td|d| j)Nr   TrG   zInvalid boundary z, expected )r  r   r   r   r   r|   r   r  )r   r   epiloguer   r8   r8   r9   r
    s   
zMultipartReader._read_boundaryc                    sL   dg}	 | j  I d H }| }|| |snqt }||\}}|S )Nr   )r   r   rg   r|   r"   parse_headers)r   linesr   parserr   Zraw_headersr8   r8   r9   r    s   
zMultipartReader._read_headersc                    sD   | j dur | j  s| j  I dH  | j| j j d| _ dS dS )z8Ensures that the last read body part is read completely.N)r  r   r   r   r   r   r8   r8   r9   r    s   


z(MultipartReader._maybe_release_last_partr   )r<   r   )!r5   r6   r7   r   r   r  r  r-   r  r   r^   r*   r   r   r   r   r   r   classmethodr  r?   r   r   r   r  r  r   r   r  r	  r
  r  r  r8   r8   r8   r9   r+     sJ    










r+   c                       s  e Zd ZdZd.dedee ddf fddZd/d	d
Zdeee	  dee	 dee
 ddfddZdee fddZdefddZdefddZedZedZedefddZedefddZd0dedeee  defddZd edefd!d"Z	d0dedeee  defd#d$Z	d0de e!e"eef  e#eef f deee  defd%d&Z$edee fd'd(Z%d1d*ed+eddfd,d-Z&  Z'S )2r,   zMultipart body writer.mixedNsubtyper   r<   c                    sl   |d ur|nt  j}z|d| _W n ty   tdd w d| d| j }t j	d |d g | _
d S )Nasciiz(boundary should contain ASCII only charsz
multipart/z; boundary=)content_type)uuiduuid4hexr   r   UnicodeEncodeErrorr  _boundary_valuer   r   _parts)r   r  r   r   r   r8   r9   r     s   

zMultipartWriter.__init__c                 C   r   r>   r8   r   r8   r8   r9   	__enter__  r   zMultipartWriter.__enter__exc_typeexc_valexc_tbc                 C   s   d S r>   r8   )r   r&  r'  r(  r8   r8   r9   __exit__  s   zMultipartWriter.__exit__c                 C   
   t | jS r>   )iterr$  r   r8   r8   r9   __iter__  rO   zMultipartWriter.__iter__c                 C   r*  r>   )r   r$  r   r8   r8   r9   __len__  rO   zMultipartWriter.__len__c                 C   s   dS )NTr8   r   r8   r8   r9   __bool__  r   zMultipartWriter.__bool__s   \A[!#$%&'*+\-.^_`|~\w]+\Zs   [\x00-\x08\x0A-\x1F\x7F]c                 C   s^   | j }t| j|r|dS t| j|rtd|dd}|dd}d|d d S )zyWrap boundary parameter value in quotes, if necessary.

        Reads self.boundary and returns a unicode sting.
        r  z*boundary value contains invalid characters   \s   \\   "s   \"rD   )	r   rW   match_valid_tchar_regexr   search_invalid_qdtext_char_regexr  replace)r   rn   Zquoted_value_contentr8   r8   r9   r#    s   
zMultipartWriter._boundary_valuec                 C   s   | j dS )Nr  )r   r   r   r8   r8   r9   r     r   zMultipartWriter.boundaryr  r   c                 C   sd   |d u rt  }t|tr|j| | |S zt||d}W n ty,   td| w | |S )Nr   zCannot create payload from %r)	r   
isinstancer&   r   updateappend_payloadr(   r$   	TypeError)r   r  r   payloadr8   r8   r9   r|     s   


zMultipartWriter.appendr;  c                 C   s   |j td }|r|dvrtd| |dkrd}|j td }|dvr0td||dkr6d}|j}|durH|sH|sHt||j t	< | j
|||f |S )	z)Adds a new body part to multipart writer.rT   )r   r   r   r   r   N)rT   r   r   r   r   r   )r   r   r   rf   r   r   r   r   r^   r   r$  r|   )r   r;  ro   te_encodingr   r8   r8   r9   r9  &  s6   zMultipartWriter.append_payloadc                 C   s    |du rt  }| t||dS )zHelper to append JSON part.Nr6  )r   r9  r#   )r   r  r   r8   r8   r9   append_jsonF  s   zMultipartWriter.append_jsonc                 C   sV   t |ttfs	J |du rt }t |trt| }t|dd}| t||ddS )z&Helper to append form urlencoded part.NT)doseqz!application/x-www-form-urlencoded)r   r  )	r7  r   r   r   listrz   r   r9  r'   )r   r  r   r   r8   r8   r9   append_formO  s   
zMultipartWriter.append_formc                 C   sv   d}| j D ](\}}}|s|s|jdu r dS |tdt| j d |j t|j d 7 }q|dt| j d 7 }|S )zSize of the payload.r   NrG      )r$  r   r   r   r   _binary_headers)r   totalr   ro   r<  r8   r8   r9   r   d  s&   	zMultipartWriter.sizeTr   close_boundaryc                    s   | j D ]Q\}}}|d| j d I dH  ||jI dH  |s#|rEt|}|r.|| |r5|| ||I dH  | I dH  n||I dH  |dI dH  q|rg|d| j d I dH  dS dS )zWrite body.r   r   Ns   --
)r$  r   r   rB  MultipartPayloadWriterenable_compressionenable_encoding	write_eof)r   r   rD  r   ro   r<  wr8   r8   r9   r   x  s"   

zMultipartWriter.write)r  N)r<   r,   r>   )T)(r5   r6   r7   r   r^   r   r   r%  r   BaseExceptionr   r)  r	   _Partr,  r   r-  r?   r.  rW   compiler2  r4  propertyr#  r   r   r   r&   r|   r9  r=  r   r   r   r   r@  r   r   r   r8   r8   r   r9   r,     sV     




 !



 r,   c                   @   sj   e Zd ZdeddfddZdeddfddZd	ejfded
e	ddfddZ
dddZdeddfddZdS )rE  r   r<   Nc                 C   s   || _ d | _d | _d | _d S r>   )_writer	_encoding	_compress_encoding_buffer)r   r   r8   r8   r9   r     s   
zMultipartPayloadWriter.__init__ro   c                 C   s0   |dkr|| _ t | _d S |dkrd| _ d S d S )Nr   r   )rO  r   rQ  )r   ro   r8   r8   r9   rG    s   
z&MultipartPayloadWriter.enable_encodingr   strategyc                 C   s.   |dkr	dt j nt j }t j||d| _d S )Nr   r   )wbitsrR  )r   r   compressobjrP  )r   ro   rR  	zlib_moder8   r8   r9   rF    s   z)MultipartPayloadWriter.enable_compressionc                    sf   | j d ur| j  }|rd | _ | |I d H  | jdkr/| jr1| jt| jI d H  d S d S d S )Nr   )rP  flushr   rO  rQ  rN  r   	b64encoder  r8   r8   r9   rH    s   


z MultipartPayloadWriter.write_eofr   c                    s   | j d ur|r| j |}|sd S | jdkrX| j}|d us J || |rTtt|d\}}|d |d  ||d d  }| _|rVt|}| j	
|I d H  d S d S d S | jdkrk| j	
t|I d H  d S | j	
|I d H  d S )Nr   r   r   )rP  compressrO  rQ  r   divmodr   r   rW  rN  r   r   b2a_qp)r   r   bufdivmodZ	enc_chunkZb64chunkr8   r8   r9   r     s*   


$

zMultipartPayloadWriter.writer   )r5   r6   r7   r   r   r^   rG  r   Z_DEFAULT_STRATEGYr   rF  rH  r   r   r8   r8   r8   r9   rE    s    

rE  )rs   )Jr   r   r   rW   r  rc   r   collectionsr   typesr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   urllib.parser   r   r   Z	multidictr   r   r   hdrsr   r   r   r   r   helpersr   r   r    r!   httpr"   r;  r#   r$   r%   r&   r'   r(   r)   streamsr*   __all__Zclient_reqrepr2   RuntimeWarningr.   r/   r^   r0   r1   r   r-   Z	try_firstr   r+   rK  r,   rE  r8   r8   r8   r9   <module>   s\    @$	
d

!/ { : H