
    i                        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
        r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  G d de          ZdS )    )annotationsN)ABCMeta)contextmanager)timeout   )HttpVersion)DirectStreamAccess)HTTPResponse)TrafficPolice)BaseSSLErrorProtocolErrorReadTimeoutErrorSSLErrorMustRedialErrorc                  
   e Zd ZdZd%dZed&d            Zed&d            Zed'd	            Z	d(dZ
ed)d            Zed*d            Zed+d            Zed,d            Zed-d            Zd.dZd%dZd/dZd0d Zd1d#Zd$S )2ExtensionFromHTTPzRepresent an extension that can be negotiated just after a "101 Switching Protocol" HTTP response.
    This will considerably ease downstream integration.returnNonec                0    d | _         d | _        d | _        d S N)_dsa	_response_police_officerselfs    h/root/projects/butler/venv/lib/python3.11/site-packages/urllib3_future/contrib/webextensions/protocol.py__init__zExtensionFromHTTP.__init__   s    /3	.259    "typing.Generator[None, None, None]c              #  r  K   d}	 	 dV  n# t           $ rC}d}| j        r!t          | j        d          r| j        j        nd}t	          |dd          |d}~wt
          $ rd}dt          |          vrt          |          |d}| j        r!t          | j        d          r| j        j        nd}t	          |dd          |d}~wt          t          f$ r}t          d||          |d}~ww xY wd}|s| j        r|                                  dS dS dS # |s| j        r|                                  w w w xY 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pools       r   _read_error_catcherz%ExtensionFromHTTP._read_error_catcher    s      
)	!K  M M M!
 ~*1$.'*J*JDN(( 
 'tT3DEE1L M M M-SVV;;"1++1,!
 ~*1$.'*J*JDN(( 
 'tT3DEE1L_- K K K#$?!$?$?CCJK J  ! > !JJLLLLL! !! !	  ! > !JJLLLL!!s>    D 
C->AC-!AC  C-C((C--D !D6c              #    K   d}	 	 dV  n# t           $ rA}| j        r!t          | j        d          r| j        j        nd}t	          |dd          |d}~wt
          $ r}t          |          |d}~wt          $ r}t          d||          |d}~ww xY wd}|s| j        r| 	                                 dS dS dS # |s| j        r| 	                                 w w w xY w)r!   FNr"   r#   r$   T)
r%   r   r&   r"   r   r   r   r(   r   r)   r*   s       r   _write_error_catcherz&ExtensionFromHTTP._write_error_catcherV   s\      
	!K  M M M ~*1$.'*J*JDN(( 
 'tT3DEE1L ) ) )qkkq( K K K#$?!$?$?CCJK J  ! > !JJLLLLL! !! !	  ! > !JJLLLL!!s=    B= 
B<ABA//B<BBB= =!Cdict[str, typing.Any]c                    i S )zIReturn prerequisites. Must be passed as additional parameters to urlopen. r   s    r   urlopen_kwargsz ExtensionFromHTTP.urlopen_kwargs   s	     	r   responser
   c                    |j         t          |j         d          st          d          |j         j        | _        |j        | _        || _        dS )zEThe HTTP server gave us the go-to start negotiating another protocol.Nr   zJAttempt to start an HTTP extension without direct I/O access to the stream)_fpr&   RuntimeErrorr   r   r   )r   r5   s     r   startzExtensionFromHTTP.start   sT    <wx|V'D'D\   L%	'7!r   boolc                    | j         d u S r   )r   r   s    r   closedzExtensionFromHTTP.closed   s    yD  r   set[HttpVersion]c                     t           )z3Hint about supported parent SVN for this extension.NotImplementedErrorr3   r   r   supported_svnzExtensionFromHTTP.supported_svn   
     "!r   r'   c                     t           r   r?   r3   r   r   implementationz ExtensionFromHTTP.implementation       !!r   set[str]c                     t           )z%Recognized schemes for the extension.r?   r3   r   r   supported_schemesz#ExtensionFromHTTP.supported_schemes   rB   r   schemec                    t           )zJConvert the extension scheme to a known http scheme (either http or https)r?   )rI   s    r   scheme_to_http_schemez'ExtensionFromHTTP.scheme_to_http_scheme   rB   r   http_versionr   dict[str, str]c                    t           )zHSpecific HTTP headers required (request) before the 101 status response.r?   )r   rL   s     r   headerszExtensionFromHTTP.headers   rE   r   c                    t           )z"End/Notify close for sub protocol.r?   r   s    r   r)   zExtensionFromHTTP.close   rE   r   str | bytes | Nonec                    t           )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.
        r?   r   s    r   next_payloadzExtensionFromHTTP.next_payload   s
     "!r   bufstr | bytesc                    t           )zDispatch a buffer to remote.r?   )r   rT   s     r   send_payloadzExtensionFromHTTP.send_payload   rE   r   callback+typing.Callable[[str | bytes | None], None]c                    t           )zSet up a callback that will be invoked automatically once a payload is received.
        Meaning that you stop calling manually next_payload().r?   )r   rX   s     r   
on_payloadzExtensionFromHTTP.on_payload   rB   r   N)r   r   )r   r   )r   r1   )r5   r
   r   r   )r   r:   )r   r=   )r   r'   )r   rF   )rI   r'   r   r'   )rL   r   r   rM   )r   rQ   )rT   rU   r   r   )rX   rY   r   r   )__name__
__module____qualname____doc__r   r   r.   r0   propertyr4   r9   r<   staticmethodrA   rD   rH   rK   rO   r)   rS   rW   r[   r3   r   r   r   r      s       ; ;: : : :
 3! 3! 3! ^3!j (! (! (! ^(!T    X	" 	" 	" 	" ! ! ! X! " " " \" " " " \" " " " \" " " " \"" " " "" " " "" " " "" " " "" " " " " "r   r   )	metaclass)
__future__r   typingabcr   
contextlibr   socketr   r%   TYPE_CHECKINGbackendr   backend._baser	   r5   r
   util.traffic_policer   
exceptionsr   r   r   r   r   r   r3   r   r   <module>rm      s3   " " " " " "        % % % % % % + + + + + +	 5&&&&&&333333((((((444444             f" f" f" f" f"' f" f" f" f" f" f"r   