o
    .j`                     @  s2  d dl m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 ddlmZmZmZ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!m"Z"m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z* ej+rd dl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 G dd de#Z4dS )    )annotationsN)asynccontextmanager)timeout   )HTTPHeaderDict)
_TYPE_BODY)	C_INT_MAXCHUNK_AMT_MAXDECODE_GROWTH_FACTORDECODE_MIN_RAW_REFERENCE)AsyncLowLevelResponse)BaseSSLError	HTTPErrorIncompleteReadProtocolErrorReadTimeoutErrorResponseNotReadySSLErrorMustRedialError)ContentDecoderHTTPResponse)is_fp_closedBytesQueueBuffer)Retry   )AsyncHTTPConnection)Message)AsyncHTTPConnectionPool)AsyncExtensionFromHTTP)AsyncTrafficPolicec                   @  s  e Zd Z																	dZd[d#d$Zd\d'd(Zed]d*d+Zd^d,d-Zed_d/d0Z	ed`d2d3Z
dad6d7Zdbd9d:Zedcd<d=Zddded@dAZ	dddedBdCZ		dfdgdEdFZ			GdhdidIdJZ			GdhdGdKdjdMdNZ	dkdldQdRZd^dSdTZdmdVdWZd^dXdYZdS )nAsyncHTTPResponse Nr   Tbodyr   headers>typing.Mapping[str, str] | typing.Mapping[bytes, bytes] | Nonestatusintversionreason
str | Nonepreload_contentbooldecode_contentoriginal_responseAsyncLowLevelResponse | NonepoolAsyncHTTPConnectionPool | None
connectionAsyncHTTPConnection | NonemsgMessage | NoneretriesRetry | Noneenforce_content_lengthrequest_methodrequest_url
auto_closepolice_officer.AsyncTrafficPolice[AsyncHTTPConnection] | NonereturnNonec                 C  s  t |tr	|| _nt|| _zt|| _W n ty!   d| _Y nw || _|| _|| _d| _	|| _
d | _d | _|| _d| _d| jv r\| jdd }dd |dD }d|v r\d	| _d | _|| _|| _d | _d| _d | _|| _d| _|d urtjd
tdd || _|rt |ttfr|| _|	| _ |
| _!t"|dr|| _d | _#|| _$| %| j$| _&t' | _(d| _)|| _*|| _+| j*d ur| j*,| | j! | j*j-d ur| j*j-,| | j  d S d S d S )Nr   Fztransfer-encodingr!   c                 s  s    | ]}|  V  qd S N)strip).0enc rC   S/home/thesage/.local/lib/python3.10/site-packages/urllib3_future/_async/response.py	<genexpr>X   s    z-AsyncHTTPResponse.__init__.<locals>.<genexpr>,chunkedTzjPassing msg=.. is deprecated and no-op in urllib3.future and is scheduled to be removed in a future major.r   )
stacklevelread).
isinstancer   r#   r&   r%   
ValueErrorr'   r(   r,   _has_decoded_content_request_url_retries
_extensionr5   rG   getlowersplit_decoderr7   r:   _body_uncached_read_occurred_fp_original_response_fp_bytes_readwarningswarnDeprecationWarningr3   strbytes_pool_connectionhasattr
chunk_left_request_method_init_lengthlength_remainingr   _decoded_buffer_last_raw_read_size_police_officer_preloaded_contentmemorizeparent)selfr"   r#   r%   r'   r(   r*   r,   r-   r/   r1   r3   r5   r7   r8   r9   r:   r;   tr_enc	encodingsrC   rC   rD   __init__,   sr   





zAsyncHTTPResponse.__init__b	bytearrayc                   s>   |  t|I d H }t|dkrdS ||d t|< t|S )Nr   )rI   len)rk   ro   temprC   rC   rD   readinto   s   zAsyncHTTPResponse.readinto!typing.AsyncGenerator[None, None]c              
   C s@  d}zxzdV  W nH t y } zt| jdd|d}~w ty; } zdt|vr/t||t| jdd|d}~w ttfyQ } z	td|||d}~ww d}W |sj| j	r_| j	
  | jrj| j
 I dH  | j	rx| j	 rz|   dS dS dS |s| j	r| j	
  | jr| j
 I dH  | j	r| j	 r|   w w w )z
        Catch low-level python exceptions, instead re-raising urllib3
        variants, so that low-level exceptions are not leaked in the
        high-level api.

        On exit, release the connection back to the pool.
        FNzRead timed out.zread operation timed outzConnection broken: T)SocketTimeoutr   r^   r   r\   r   OSErrorr   r   rW   closer_   isclosedrelease_conn)rk   
clean_exiterC   rC   rD   _error_catcher   sD   	




z AsyncHTTPResponse._error_catcherc              
     sJ   z	|   I dH  W n tttfy   Y nw | jr#t | _d| _dS dS )z
        Read and discard any remaining HTTP response data in the response connection.

        Unread data in the HTTPResponse connection blocks the connection from being released back to the pool.
        N)	_raw_readr   rv   r   rL   r   re   rS   rk   rC   rC   rD   
drain_conn   s   
zAsyncHTTPResponse.drain_connHTTPHeaderDict | Nonec                 C  s&   | j du rdS t| j dr| j jS dS )z
        Retrieve post-response (trailing headers) if any.
        This WILL return None if no HTTP Trailer Headers have been received.
        Ntrailers)rV   r`   r   r~   rC   rC   rD   r      s
   
zAsyncHTTPResponse.trailersAsyncExtensionFromHTTP | Nonec                 C  s   | j S r?   )rO   r~   rC   rC   rD   	extension   s   zAsyncHTTPResponse.extensionitemr   c                   s@   | j d ur
tdt| jdst || I d H  || _ d S )Nzextension already plugged in_dsa)rO   rv   r`   rV   r   start)rk   r   rC   rC   rD   start_extension   s   

z!AsyncHTTPResponse.start_extension
typing.Anyc                   s   t | jI dH S )a  
        Parses the body of the HTTP response as JSON.

        To use a custom JSON decoder pass the result of :attr:`HTTPResponse.data` to the decoder.

        This method can raise either `UnicodeDecodeError` or `json.JSONDecodeError`.

        Read more :ref:`here <json>`.
        N)_jsonloadsdatar~   rC   rC   rD   json  s   
zAsyncHTTPResponse.jsonr]   c                   s*   | j r| j S | jr| jddI d H S d S )NT)cache_content)rT   rV   rI   r~   rC   rC   rD   r     s   zAsyncHTTPResponse.dataamt
int | Nonec                   s&  | j sJ |r|tks| jru| jtkrutjdk rut }t| j t}|du s+|dkrq|dur9t	|t
}||8 }nt
}z|rH| j |I dH }n| j |}W n ty[   Y | S w |sc	 | S || ~|du s+|dks+| S t| j tr| j |I dH S |dur| j |S | j  S )a_  
        Read a response with the thought that reading the number of bytes
        larger than can fit in a 32-bit int at a time via SSL in some
        known cases leads to an overflow error that has to be prevented
        if `amt` or `self.length_remaining` indicate that a problem may
        happen.

        The known cases:
          * 3.8 <= CPython < 3.9.7 because of a bug
            https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900.
          * urllib3 injected with pyOpenSSL-backed SSL-support.
          * CPython < 3.10 only when `amt` does not fit 32-bit int.
        )   
   Nr   )rV   r   rd   sysversion_infoioBytesIOrJ   r   minr	   rI   rK   writegetvalue)rk   r   bufferis_async_ll	chunk_amtr   rC   rC   rD   _fp_read  sF   





zAsyncHTTPResponse._fp_readc              	     s\  | j du rdS t| j dd}|  4 I dH a |s"| |I dH nd}|du o/t| j dd }|dur:|dkr:|r<|rn|rUt|}|  j|7  _| jdurU|  j|8  _| j   | jrn| jdurn| jdkrnt	| j| jW d  I dH  n1 I dH s~w   Y  |r|st|}|  j|7  _| jdur|  j|8  _t
|ttfr|rt|| _|S )z7
        Reads `amt` of bytes from the socket.
        NclosedF    r   )rV   getattrr|   r   rq   rX   rd   rw   r7   r   rJ   r]   rp   rf   )rk   r   	fp_closedr   is_foreign_fp_uncloseddata_lenrC   rC   rD   r}   L  s<   






(&

zAsyncHTTPResponse._raw_readbool | Nonec                   sP   | j |pd|dI dH }d| _|dur&t||kr&| j| | j|S |S )a  
        Similar to ``http.client.HTTPResponse.read1`` and documented
        in :meth:`io.BufferedReader.read1`, but with an additional parameter:
        ``decode_content``.

        :param amt:
            How much of the content to read.

        :param decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.
        )r   r,   NT)rI   rU   rq   re   putrP   rk   r   r,   r   rC   rC   rD   read1  s   zAsyncHTTPResponse.read1Fr   c                   s   | j |||dI d H S )N)r   r,   r   )_read)rk   r   r,   r   rC   rC   rD   rI     s   zAsyncHTTPResponse.read)partialr   c          
   
     s  z|    |d u r| j}|d urd}|dk rt| jr8| jjr8t| jtt }| jd|d|d}|r8| j	
| t| j	rt| j	t| j	W | jrpt| jddrq| jd urrt| jdrf| jjd u sf| jjjrs| j|  d | _S S S S S |dkr| jr| jjrt| j	|k r| jd|d|t| j	 d}| j	
| |t| j	kr| j	|W | jrt| jddr| jd urt| jdr| jjd u s| jjjr| j|  d | _S S S S S | jd ur| j| 4 I d H  | |I d H }W d   I d H  n1 I d H sw   Y  n| |I d H }|sd| _|r|dk rt|}d}|d u r(d}n
|dkr2|s2d}|s|t| j	dkr|| jrF| jjs||W | jrxt| jddry| jd urzt| jdrn| jjd u sn| jjjr{| j|  d | _S S S S S |d u r| |||}|r| js|| _n|s| jrtd|W | jrt| jddr| jd urt| jdr| jjd u s| jjjr| j|  d | _S S S S S | j||||t| j	 d	}| j	
| |ot| jd}	t| j	|k rY|rY|	sY| jd ur/| j| 4 I d H  | |I d H }W d   I d H  n1 I d H s)w   Y  n| |I d H }| j||||t| j	 d	}| j	
| t| j	|k rY|rY|	r| j	|}|W | jrt| jddr| jd urt| jdr| jjd u s| jjjr| j|  d | _S S S S S | jrt| jddr| jd urt| jdr| jjd u s| jjjr| j|  d | _w )
NFr   r   )flush_decoder
max_length_eotr   Tz_Calling read(decode_content=False) is not supported after read(decode_content=True) was called.)r   )_init_decoderr,   rS   has_unconsumed_tailmaxrf   r   r
   _decodere   r   rq   rP   rV   r   rg   r`   r   r   forgetborrowr}   rU   rT   rL   RuntimeError)
rk   r   r,   r   r   capdecoded_datar   r   surface_per_framerC   rC   rD   r     sv  	
`

J

(
1

#
*

zAsyncHTTPResponse._read   "typing.AsyncGenerator[bytes, None]c                 C s   |dkrd S | j d u rd S t| j r| js| jr>| jjr@| j||ddI d H }|r-|V  t| j r| js| jrB| jjsd S d S d S d S )Nr   T)r   r,   r   )rV   r   re   rS   r   r   r   rC   rC   rD   streamO  s4   
zAsyncHTTPResponse.streamc                   sj   | j d ur| j js| j  I d H  | js| jr| j  | jr(| j I d H  | js3tj|  d S d S r?   )r   r   rw   rV   r_   r:   r   IOBaser~   rC   rC   rD   rw   b  s   
zAsyncHTTPResponse.closetyping.AsyncIterator[bytes]c                 C s   g }| j ddd2 z=3 d H W }d|v rB|d}dg ||d dV  |dd D ]}|d V  q-|d r?|d g}q
g }q
|| q
6 |rSd|V  d S d S )Nr   T)r,      
r   r   r   )r   rR   joinappend)rk   r   chunkchunksxrC   rC   rD   	__aiter__o  s    
zAsyncHTTPResponse.__aiter__c                 C  s4   | j s| jr| j  | jstj|  d S d S d S r?   )r   rV   rw   r:   r   r   r~   rC   rC   rD   __del__  s   
zAsyncHTTPResponse.__del__)r!   Nr   r   NTTNNNNNTNNTN)$r"   r   r#   r$   r%   r&   r'   r&   r(   r)   r*   r+   r,   r+   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r+   r8   r)   r9   r)   r:   r+   r;   r<   r=   r>   )ro   rp   r=   r&   )r=   rt   )r=   r>   )r=   r   )r=   r   )r   r   r=   r>   )r=   r   )r=   r]   r?   )r   r   r=   r]   )NN)r   r   r,   r   r=   r]   )NNF)r   r   r,   r   r   r+   r=   r]   )
r   r   r,   r   r   r+   r   r+   r=   r]   )r   N)r   r   r,   r   r=   r   )r=   r   )__name__
__module____qualname__rn   rs   r   r|   r   propertyr   r   r   r   r   r   r}   r   rI   r   r   rw   r   r   rC   rC   rC   rD   r    +   sj    
i
7


5?  

r    )5
__future__r   r   r   r   r   typingrY   
contextlibr   socketr   ru   _collectionsr   _typingr   	_constantr   r	   r
   r   backend._asyncr   
exceptionsr   r   r   r   r   r   r   r   responser   r   util.responser   r   
util.retryr   r1   r   TYPE_CHECKINGemail.messager   _async.connectionpoolr   contrib.webextensions._asyncr   util._async.traffic_policer   r    rC   rC   rC   rD   <module>   s.    (
