o
    .j                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlmZ	 ej
r7d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 G dd dedZdS )    )annotationsN)ABCMeta)asynccontextmanager)timeout   )AsyncHTTPResponse)HttpVersion)AsyncDirectStreamAccess)AsyncTrafficPolice)BaseSSLErrorProtocolErrorReadTimeoutErrorSSLErrorMustRedialErrorc                   @  s   e Zd ZdZd4ddZed5ddZed5d	d
Zed6ddZ	d7ddZ
ed8ddZed9ddZed:ddZed;ddZed<dd Zd=d$d%Zd4d&d'Zd>d)d*Zd?d-d.Zd@d1d2Zd3S )AAsyncExtensionFromHTTPzRepresent an extension that can be negotiated just after a "101 Switching Protocol" HTTP response.
    This will considerably ease downstream integration.returnNonec                 C  s   d | _ d | _d | _d S N)_dsa	_response_police_officerself r   b/home/thesage/.local/lib/python3.10/site-packages/urllib3/contrib/webextensions/_async/protocol.py__init__   s   
zAsyncExtensionFromHTTP.__init__!typing.AsyncGenerator[None, None]c              
   C s,  d}zzdV  W nh t y- } zd}| jr t| jdr | jjnd}t|dd|d}~w ty[ } z#dt|vr?t||d}| jrNt| jdrN| jjnd}t|dd|d}~w tt	fyq } z	t
d|||d}~ww d}W |s| jr|  I dH  dS dS dS |s| jr|  I dH  w w w )
        Catch low-level python exceptions, instead re-raising urllib3
        variants, so that low-level exceptions are not leaked in the
        high-level api.

        On unrecoverable issues, release the connection back to the pool.
        FNT_poolRead timed out.zread operation timed outConnection broken: )SocketTimeoutr   hasattrr   r   r   strr   OSErrorr   r   closer   
clean_exitepoolr   r   r   _read_error_catcher    sT   	





z*AsyncExtensionFromHTTP._read_error_catcherc              
   C s   d}zazdV  W nF t y+ } z| jrt| jdr| jjnd}t|dd|d}~w ty; } zt||d}~w tyO } z	td|||d}~ww d}W |sa| jrc| 	 I dH  dS dS dS |sr| jrs| 	 I dH  w w w )r   FNr   r   r    T)
r!   r   r"   r   r   r   r   r$   r   r%   r&   r   r   r   _write_error_catcherV   s@   	



z+AsyncExtensionFromHTTP._write_error_catcherdict[str, typing.Any]c                 C  s   i S r   r   r   r   r   r   urlopen_kwargs      z%AsyncExtensionFromHTTP.urlopen_kwargsresponser   c                   s<   |j du st|j dstd|j j| _|j| _|| _dS )zEThe HTTP server gave us the go-to start negotiating another protocol.Nr   z-The HTTP extension is closed or uninitialized)_fpr"   r$   r   r   r   )r   r/   r   r   r   start   s   

zAsyncExtensionFromHTTP.startboolc                 C  s
   | j d u S r   )r   r   r   r   r   closed   s   
zAsyncExtensionFromHTTP.closedset[HttpVersion]c                   C     t )z3Hint about supported parent SVN for this extension.NotImplementedErrorr   r   r   r   supported_svn      z$AsyncExtensionFromHTTP.supported_svnr#   c                   C  r5   r   r6   r   r   r   r   implementation   r.   z%AsyncExtensionFromHTTP.implementationset[str]c                   C  r5   )z%Recognized schemes for the extension.r6   r   r   r   r   supported_schemes   r9   z(AsyncExtensionFromHTTP.supported_schemesschemec                 C  r5   )zJConvert the extension scheme to a known http scheme (either http or https)r6   )r=   r   r   r   scheme_to_http_scheme   r9   z,AsyncExtensionFromHTTP.scheme_to_http_schemehttp_versionr   dict[str, str]c                 C  r5   )zHSpecific HTTP headers required (request) before the 101 status response.r6   )r   r?   r   r   r   headers   r.   zAsyncExtensionFromHTTP.headersc                      t )z"End/Notify close for sub protocol.r6   r   r   r   r   r%         zAsyncExtensionFromHTTP.closestr | bytes | Nonec                   rB   )zUnpack the next received message/payload from remote. This call does read from the socket.
        If the method return None, it means that the remote closed the (extension) pipeline.
        r6   r   r   r   r   next_payload   s   z#AsyncExtensionFromHTTP.next_payloadbufstr | bytesc                   rB   )zDispatch a buffer to remote.r6   )r   rF   r   r   r   send_payload   rC   z#AsyncExtensionFromHTTP.send_payloadcallback=typing.Callable[[str | bytes | None], typing.Awaitable[None]]c                   rB   )zSet up a callback that will be invoked automatically once a payload is received.
        Meaning that you stop calling manually next_payload().r6   )r   rI   r   r   r   
on_payload   s   z!AsyncExtensionFromHTTP.on_payloadN)r   r   )r   r   )r   r,   )r/   r   r   r   )r   r2   )r   r4   )r   r#   )r   r;   )r=   r#   r   r#   )r?   r   r   r@   )r   rD   )rF   rG   r   r   )rI   rJ   r   r   )__name__
__module____qualname____doc__r   r   r*   r+   propertyr-   r1   r3   staticmethodr8   r:   r<   r>   rA   r%   rE   rH   rK   r   r   r   r   r      s2    
5*
	



r   )	metaclass)
__future__r   typingabcr   
contextlibr   socketr   r!   TYPE_CHECKING_async.responser   backendr   backend._async._baser	   util._async.traffic_policer
   
exceptionsr   r   r   r   r   r   r   r   r   r   <module>   s    	