
    nbi0[                       U 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	m
Z
 d dlmZ ej        rd dlmZ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 ddlmZ  G d deej                  Z G d d          Z  G d d          Z! G d d          Z" G d d          Z#ej$        ee%f         Z&de'd<   ej(        e&ej)        e&         f         Z*de'd<    G d d          Z+dS )    )annotationsN)	b64encode)datetime	timedelta)token_bytes)	SSLSocket
SSLContext
TLSVersion   )_TYPE_SOCKET_OPTIONS   )AsyncLowLevelResponse)HTTPHeaderDict)DEFAULT_BLOCKSIZEDEFAULT_KEEPALIVE_DELAY)BytesQueueBufferc                      e Zd ZdZdZdZdZdS )HttpVersionz6Describe possible SVN protocols that can be supported.zHTTP/1.1zHTTP/2.0zHTTP/3.0N)__name__
__module____qualname____doc__h11h2h3     l/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/urllib3_future/backend/_base.pyr   r      s%        @@
C 
B	BBBr   r   c                  &    e Zd Zd	dZd
dZddZdS )ConnectionInforeturnNonec                    d | _         d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _	        d | _
        d | _        d S N)established_latencyhttp_versioncertificate_dercertificate_dictissuer_certificate_derissuer_certificate_dictdestination_addressciphertls_versiontls_handshake_latencyresolution_latencyrequest_sent_latencyselfs    r   __init__zConnectionInfo.__init__"   s~    59  15 .2  	
 59#  	$
 <@  #'.27;"48 7;!!!r   strc                    t          | j        | j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        | j        d          S )N)r%   r'   r(   r)   r*   r+   r,   r-   r.   r&   r/   r0   )r4   r%   r'   r(   r)   r*   r+   r,   r-   r.   r&   r/   r0   r1   s    r   __repr__zConnectionInfo.__repr__D   se    '+'?#'#7$($9*.*E+/+G'+'?+#/)-)C $ 1&*&=(,(A 
 
 	
r   boolc                    | j         d uS r$   )r'   r1   s    r   is_encryptedzConnectionInfo.is_encryptedV   s    #4//r   Nr!   r"   r!   r4   r!   r7   )r   r   r   r3   r6   r9   r   r   r   r    r    !   sQ         ;  ;  ;  ;D
 
 
 
$0 0 0 0 0 0r   r    c                      e Zd Z	 	 d$d%d
Zed&d            Zd'dZd&dZd&dZd&dZ	d(dZ
d(dZd)d*dZd+dZd)d,dZd-dZd.d/d"Zd0d#ZdS )1DirectStreamAccessN	stream_idintreadgtyping.Callable[[int | None, int | None, bool, bool], tuple[bytes, bool, HTTPHeaderDict | None]] | Nonewrite0typing.Callable[[bytes, int, bool], None] | Noner!   r"   c                p     | _          fd _        nd  _         fd _        d S d  _        d S )Nc                .     | j         | d u|          S r$   
_stream_id)amtforA   r2   s     r   <lambda>z-DirectStreamAccess.__init__.<locals>.<lambda>m   s    S$/3d?B O O r   c                (     | j         |          S r$   rG   )bufeotr2   rC   s     r   rK   z-DirectStreamAccess.__init__.<locals>.<lambda>s   s    sDOS!A!A r   )rH   _read_write)r2   r?   rA   rC   s   ` ``r   r3   zDirectStreamAccess.__init__[   se     $ POOOO JJ DJAAAAA KKK DKKKr   r7   c                &    | j         d u o| j        d u S r$   )rO   rP   r1   s    r   closedzDirectStreamAccess.closedx   s    zT!9dkT&99r   b	bytearrayc                    | j         t          d          |                     t          |                    }t          |          dk    rdS ||d t          |          <   t          |          S )Nz!read operation on a closed streamr   )rO   OSErrorrecvlen)r2   rS   temps      r   readintozDirectStreamAccess.readinto|   sc    :=>>>yyQ  t99>>1!AkD		kNt99r   c                    | j         d uS r$   )rO   r1   s    r   readablezDirectStreamAccess.readable   s    z%%r   c                    | j         d uS r$   )rP   r1   s    r   writablezDirectStreamAccess.writable   s    {$&&r   c                    dS NFr   r1   s    r   seekablezDirectStreamAccess.seekable   s    ur   c                    dS Nr   r1   s    r   filenozDirectStreamAccess.fileno       rr   c                    dS rc   r   r1   s    r   namezDirectStreamAccess.name   rf   r   r   _DirectStreamAccess__bufsize_DirectStreamAccess__flagsbytesc                8    |                      |          \  }}}|S r$   )recv_extended)r2   ri   rj   data_s        r   rW   zDirectStreamAccess.recv   s     ''	22
ar   
int | None)tuple[bytes, bool, HTTPHeaderDict | None]c                ~    | j         t          d          |                      |d          \  }}}|rd | _         |||fS )Nzstream closed errorF)rO   rV   )r2   ri   rn   rN   trailerss        r   rm   z DirectStreamAccess.recv_extended   sQ     :/000"jjE::c8 	DJS(""r   _DirectStreamAccess__datac                ^    | j         t          d          |                      |d           d S Nstream write not permittedFrP   rV   )r2   rt   rj   s      r   sendallzDirectStreamAccess.sendall   s3    ;6777FE"""""r   c                x    | j         t          d          |                      |d           t          |          S rv   )rP   rV   rX   )r2   rt   s     r   rC   zDirectStreamAccess.write   s9    ;6777FE"""6{{r   F!_DirectStreamAccess__close_streamc                ^    | j         t          d          |                      ||           d S )Nrw   rx   )r2   rt   r{   s      r   sendall_extendedz#DirectStreamAccess.sendall_extended   s3    ;6777FN+++++r   c                    | j         |                      dd           d | _         | j        |                     d d           d | _        d S d S )Nr   T)rP   rO   r1   s    r   closezDirectStreamAccess.close   sT    ;"KKT"""DK:!JJtT"""DJJJ "!r   )NN)r?   r@   rA   rB   rC   rD   r!   r"   r<   )rS   rT   r!   r@   r!   r@   )r   )ri   r@   rj   r@   r!   rk   )ri   rp   r!   rq   )rt   rk   rj   r@   r!   r"   )rt   rk   r!   r@   )F)rt   rk   r{   r7   r!   r"   r:   )r   r   r   r3   propertyrR   rZ   r\   r^   ra   re   rh   rW   rm   ry   rC   r}   r   r   r   r   r>   r>   Z   sT        BF    : : : : X:
 
 
 
& & & &' ' ' '             # # # ## # # # #   , , , , ,     r   r>   c                      e Zd ZdZdddddddd+dZed,d            Zed-d            Zej        d.d"            Zed/d#            Z	d0d%Z
d1d2d(Zd3d)Zd3d*ZdS )4LowLevelResponsezImplemented for backward compatibility purposes. It is there to impose http.client like
    basic response object. So that we don't have to change urllib3 tested behaviors.N)	authorityportr?   sockdsastream_abortmethodr4   statusr@   versionreasonheadersr   body[typing.Callable[[int | None, int | None], tuple[bytes, bool, HTTPHeaderDict | None]] | Noner   
str | Noner   rp   r?   r   socket.socket | Noner   DirectStreamAccess | Noner   #typing.Callable[[int], None] | Nonec               N   || _         || _        || _        || _        || _        || _        | j        d u}|du | _        | j        | _        || _        || _	        d| _
        | j        dk    od| j                            d          k    | _        d | _        d | _        d| _        | j        s2| j                            d          }|rt!          |          nd | _        d| _        |
| _        d | _        || _        || _        |	| _        t/                      | _        d | _        d | _        d S )NFr      chunkedztransfer-encodingzcontent-length)r   r   r   msg_method#_LowLevelResponse__internal_read_strR   _eotr   r   
debuglevelgetr   
chunk_leftlength
will_closer@   data_in_count_sock_fp_dsa_stream_abortrH   r    _LowLevelResponse__buffer_excess_LowLevelResponse__promisers   )r2   r   r   r   r   r   r   r   r   r?   r   r   r   has_bodycontent_lengths                  r   r3   zLowLevelResponse.__init__   s8   ( "&*$6%'K	 #	  !LBQ9=P0Q0Q#Q 	 '+"& 	 | 	J!X\\*:;;N1?I#n---TDK 
 
+/	)#1A1C1C15/3r   r!   +socket.SocketIO | DirectStreamAccess | Nonec                   t          j        dt          d           | j        9| j        dk    s | j        dk    rd| j        cxk    rdk     r
n n| j        S t          | j        | j        	                    d          | _        | j        S )Naf  This is a rather awkward situation. A program (probably) tried to access the socket object directly, thus bypassing our state-machine protocol (amongst other things). This is currently unsupported and dangerous. Errors will occurs if you negotiated HTTP/2 or later versions. We tried to be rather strict on the backward compatibility between urllib3 and urllib3-future, but this is rather complicated to support (e.g. direct socket access). You are probably better off using our higher level read() function. Please open an issue at https://github.com/jawah/urllib3.future/issues to gain support or insights on it.r   e   CONNECT   i,  rb)
warningswarnDeprecationWarningr   r   r   r   AttributeErrorr   makefiler1   s    r   fpzLowLevelResponse.fp  s    " 	
 	
 	
 :{c!!	))cT[.F.F.F.F3.F.F.F.F.Fy  ! 8z**400DHxr   ResponsePromise | Nonec                    | j         S r$   )r   r1   s    r   from_promisezLowLevelResponse.from_promise1  s
    ~r   valueResponsePromiser"   c                R    |j         | j        k    rt          d          || _        d S )NzCTrying to assign a ResponsePromise to an unrelated LowLevelResponse)r?   rH   
ValueErrorr   r2   r   s     r   r   zLowLevelResponse.from_promise5  s3    ?do--U   r   c                    | j         S )z'Original HTTP verb used in the request.)r   r1   s    r   r   zLowLevelResponse.method=  s     |r   r7   c                    | j         S )z:Here we do not create a fp sock like http.client Response.)rR   r1   s    r   isclosedzLowLevelResponse.isclosedB  s
    {r   _LowLevelResponse__sizerk   c                   | j         du s| j        t          d          |dk    rdS t          | j                  }|d uo|dk    o||k    }| j        du rY|sW|                     || j                  \  }| _        | _        | j                            |           t          | j                  }| j        	                    ||dk    r|n|          }t          |          }||z  }| j        r|dk    rd | _
        d| _         d | _        | j        r|r|nd | _        n| j        | xj        |z  c_        | xj        |z  c_        |S )NTzI/O operation on closed file.r   r   F)rR   r   r   rX   r   r   rH   rs   putr   r   r   r   r   r   r   )r2   r   buf_capacitydata_ready_to_gorn   size_ins         r   rA   zLowLevelResponse.readF  s   ;$$"9"A/   Q;;34/00$N<!#3N8N 	 9&6-1-D-D. .*D$)T]  $$T***t344L#''(VaZZFF\
 
 d))9 	**!%DDKDJ< 	#.:DllDOO[$KK7"KKg%r   c                    | j         H| j        du rA| j        |                      | j                   d| _        d | _         d| _        d | _        d S d S d S )NFT)r   r   rH   rR   r   r1   s    r   abortzLowLevelResponse.aborts  se    )yE!!?.&&t777 	%)"" 			 *)!!r   c                >    d | _         d| _        d | _        d | _        d S )NT)r   rR   r   r   r1   s    r   r   zLowLevelResponse.close}  s#    "&
			r   )r   r4   r   r@   r   r@   r   r4   r   r   r   r   r   r   r   rp   r?   rp   r   r   r   r   r   r   )r!   r   )r!   r   )r   r   r!   r"   r;   r<   r$   )r   rp   r!   rk   r:   )r   r   r   r   r3   r   r   r   setterr   r   rA   r   r   r   r   r   r   r      s3       X X !% $%))-<@%G4 G4 G4 G4 G4 G4R    X<    X        X   + + + + +Z! ! ! !     r   r   c                      e Zd Zd"dZ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ej        d)d            Zd*dZd+dZd,d Zd!S )-r   connBaseBackendr?   r@   request_headerslist[tuple[bytes, bytes]]
parameters
typing.Anyr!   r"   c                    t          t          d                                        d          | _        || _        || _        d | _        || _        || _        d S )N   ascii)	r   r   decode_uid_connrH   	_response_request_headers_parameters)r2   r   r?   r   r   s        r   r3   zResponsePromise.__init__  sR     #;r??33::7CC	"&
(JN /CMr   otherobjectr7   c                P    t          |t                    sdS | j        |j        k    S r`   )
isinstancer   uid)r2   r   s     r   __eq__zResponsePromise.__eq__  s(    %11 	5x59$$r   r4   c                B    d| j          d| j        j         d| j         dS )Nz<ResponsePromise 'z' z Stream[z]>)r   r   _http_vsn_strr?   r1   s    r   r6   zResponsePromise.__repr__  s.    dDHdd
0HddRVR`ddddr   c                    | j         S r$   )r   r1   s    r   r   zResponsePromise.uid  s
    yr   c                    | j         S r$   )r   r1   s    r   r   zResponsePromise.request_headers  s    $$r   c                    | j         S r$   rG   r1   s    r   r?   zResponsePromise.stream_id  s
    r   c                    | j         d uS r$   r   r1   s    r   is_readyzResponsePromise.is_ready  s    ~T))r   (LowLevelResponse | AsyncLowLevelResponsec                ,    | j         st          | j         S r$   )r   rV   r1   s    r   responsezResponsePromise.response  s    ~ 	M~r   r   c                    || _         d S r$   r   r   s     r   r   zResponsePromise.response  s    r   keyc                    || j         |<   d S r$   r   )r2   r   r   s      r   set_parameterzResponsePromise.set_parameter  s     %r   typing.Any | Nonec                2    || j         v r| j         |         nd S r$   r   )r2   r   s     r   get_parameterzResponsePromise.get_parameter  s"    (+t/?(?(?t$$TIr   rn   dict[str, typing.Any]c                :    | j                             |           d S r$   )r   update)r2   rn   s     r   update_parametersz!ResponsePromise.update_parameters  s    %%%%%r   N)
r   r   r?   r@   r   r   r   r   r!   r"   )r   r   r!   r7   r;   )r!   r   r   r<   )r!   r   )r   r   r!   r"   )r   r4   r   r   r!   r"   )r   r4   r!   r   )rn   r   r!   r"   )r   r   r   r3   r   r6   r   r   r   r?   r   r   r   r   r   r   r   r   r   r   r     sZ       N N N N% % % %
e e e e    X % % % X%    X * * * X*    X
 _   _& & & &J J J J& & & & & &r   r   ztyping.TypeAlias_HostPortTypeQuicPreemptiveCacheTypec                  H   e Zd ZU dZdZded<   ded<   ej        Zded<   ej	        ej
        d	d
fgZded<   dZded<   dZded<   eZdddefeddeddid&Zdjd*Zedkd,            Zedld.            Zedmd0            Zednd1            Zedod2            Zedpd3            Zedpd4            Zedod5            Zedpd6            Zedod7            Zdqd9Zdqd:Z drd<Z!dqd=Z"	 	 	 	 	 	 	 	 	 dsdtdJZ#	 	 	 dudvdNZ$	 	 dwdxdSZ%dydVZ&	 dzdddWd{d]Z'dd^d|daZ(dqdbZ)ddcd}dgZ*dqdhZ+dS )~r   aF  
    The goal here is to detach ourselves from the http.client package.
    At first, we'll strictly follow the methods in http.client.HTTPConnection. So that
    we would be able to implement other backend without disrupting the actual code base.
    Extend that base class in order to ship another backend with urllib3.
    Nz)typing.ClassVar[list[HttpVersion] | None]supported_svnztyping.ClassVar[str]schemezsocket.SocketKinddefault_socket_kindr   tcpz%typing.ClassVar[_TYPE_SOCKET_OPTIONS]default_socket_optionsFr7   is_verifiedzbool | Noneproxy_is_verifiedrd   )socket_optionsdisabled_svnpreemptive_quic_cachekeepalive_delayhostr4   r   rp   timeoutint | float | Nonesource_addresstuple[str, int] | None	blocksizer@   r  _TYPE_SOCKET_OPTIONS | Noner  set[HttpVersion] | Noner  QuicPreemptiveCacheType | Noner  float | int | Nonec                  || _         || _        || _        || _        || _        t
          j        | _        || _        d | _	        d | _
        t          j        | _        d | _        d | _        d | _        t#                      | _        ||nt'                      | _        || _        | j        rFt-          | j                  t-          t/          t                              k    rt1          d          d | _        i | _        i | _        i | _        d | _        d | _        |	| _        d | _         tC          j"                    | _#        d S )Nz\You disabled every supported protocols. The HTTP connection object is left with no outcomes.)$r  r   r  r  r
  r   r   socket_kindr  r   r   r   r   _svn_tunnel_host_tunnel_port_tunnel_schemedict_tunnel_headersset_disabled_svn_preemptive_quic_cacherX   listRuntimeError	conn_info	_promises_promises_per_stream_pending_responses_start_last_request_cached_http_vsn_keepalive_delay_connected_attime	monotonic_last_used_at)
r2   r  r   r  r  r
  r  r  r  r  s
             r   r3   zBaseBackend.__init__  s=    		,"&:,6:	JN(3	(,(,*.9=-9-E\\355&;# 	4%&&#d;.?.?*@*@@@"r  
 1557@B!  	 59 ,0  	 ,0$(N$4$4r   itemr   r!   c                    |j         | j        v S r$   )r   r  )r2   r'  s     r   __contains__zBaseBackend.__contains__  s    x4>))r   floatc                    | j         S r$   )r&  r1   s    r   last_used_atzBaseBackend.last_used_at      !!r   float | Nonec                    | j         S r$   )r#  r1   s    r   connected_atzBaseBackend.connected_at!  r-  r   set[HttpVersion]c                    | j         S r$   )r  r1   s    r   r  zBaseBackend.disabled_svn%  r-  r   c                ,    | j         J | j         j        S )2Reimplemented for backward compatibility purposes.)r  r   r1   s    r   r   zBaseBackend._http_vsn_str)  s     y$$$yr   c                    | j         J | j        Kt          | j         j                            d          d                             dd                    | _        | j        S )r4  N/rd   . )r  r!  r@   r   splitreplacer1   s    r   	_http_vsnzBaseBackend._http_vsn/  s\     y$$$ ($'	(=(=c(B(B2(F(N(NsTV(W(W$X$XD!$$r   c                    t           r$   NotImplementedErrorr1   s    r   is_saturatedzBaseBackend.is_saturated7      !!r   c                "    | j          o| j         S r$   )r  r  r1   s    r   is_idlezBaseBackend.is_idle;  s    >!A$*A&AAr   c                    t           r$   r=  r1   s    r   max_stream_countzBaseBackend.max_stream_count?  r@  r   c                    t           r$   r=  r1   s    r   is_multiplexedzBaseBackend.is_multiplexedC  r@  r   c                    t           r$   r=  r1   s    r   max_frame_sizezBaseBackend.max_frame_sizeG  r@  r   r"   c                    t           )z+Upgrade conn from svn ver to max supported.r=  r1   s    r   _upgradezBaseBackend._upgradeK  r@  r   c                    t           )z>Emit proper CONNECT request to the http (server) intermediary.r=  r1   s    r   _tunnelzBaseBackend._tunnelO  r@  r   r   c                    t           )zRun protocol initialization from there. Return None to ensure that the child
        class correctly create the socket / connection.r=  r1   s    r   	_new_connzBaseBackend._new_connS  
     "!r   c                    t           )zhShould be called after _new_conn proceed as expected.
        Expect protocol handshake to be done here.r=  r1   s    r   
_post_connzBaseBackend._post_connX  rO  r   ssl_contextSSLContext | Noneca_certsr   ca_cert_dirca_cert_dataNone | str | bytesssl_minimum_versionssl_maximum_version	cert_filekey_filekey_passwordc
                    t           )zThis method serve as bypassing any default tls setup.
        It is most useful when the encryption does not lie on the TCP layer. This method
        WILL raise NotImplementedError if the connection is not concerned.r=  )
r2   rR  rT  rU  rV  rX  rY  rZ  r[  r\  s
             r   _custom_tlszBaseBackend._custom_tls]  s
     "!r   httpr   typing.Mapping[str, str] | Nonec                    t           )zPrepare the connection to set up a tunnel. Does NOT actually do the socket and http connect.
        Here host:port represent the target (final) server and not the intermediary.r=  )r2   r  r   r   r   s        r   
set_tunnelzBaseBackend.set_tunneln  s
     "!r   r   url	skip_hostskip_accept_encodingc                    t           )zFIt is the first method called, setting up the request initial context.r=  )r2   r   rc  rd  re  s        r   
putrequestzBaseBackend.putrequesty  
     "!r   headervaluesc                    t           )zFor a single header name, assign one or multiple value. This method is called right after putrequest()
        for each entries.r=  )r2   ri  rj  s      r   	putheaderzBaseBackend.putheader  rO  r   )encode_chunkedexpect_body_afterwardmessage_bodybytes | Nonerm  rn  r   c                   t           )z6This method conclude the request context construction.r=  )r2   ro  rm  rn  s       r   
endheaderszBaseBackend.endheaders  rh  r   )promisers  r   c                   t           )zFetch the HTTP response. You SHOULD not retrieve the body in that method, it SHOULD be done
        in the LowLevelResponse, so it enable stream capabilities and remain efficient.
        r=  )r2   rs  s     r   getresponsezBaseBackend.getresponse  s
     "!r   c                    t           )z9End the connection, do some reinit, closing of fd, etc...r=  r1   s    r   r   zBaseBackend.close  r@  r   )rN   rn   bytes | bytearrayrN   c                   t           )zThe send() method SHOULD be invoked after calling endheaders() if and only if the request
        context specify explicitly that a body is going to be sent.r=  )r2   rn   rN   s      r   sendzBaseBackend.send  rh  r   c                    t           )zSend a PING to the remote peer.r=  r1   s    r   pingzBaseBackend.ping  r@  r   )r  r4   r   rp   r  r  r  r	  r
  r@   r  r  r  r  r  r  r  r  )r'  r   r!   r7   )r!   r*  )r!   r.  )r!   r1  r;   r   r<   r:   )r!   r   )	NNNNNNNNN)rR  rS  rT  r   rU  r   rV  rW  rX  rp   rY  rp   rZ  r   r[  r   r\  r   r!   r7   )NNr_  )
r  r4   r   rp   r   r`  r   r4   r!   r"   )FF)
r   r4   rc  r4   rd  r7   re  r7   r!   r"   )ri  r4   rj  r4   r!   r"   r$   )ro  rp  rm  r7   rn  r7   r!   r   )rs  r   r!   r   )rn   rw  rN   r7   r!   r   ),r   r   r   r   r   __annotations__socketSOCK_STREAMr   IPPROTO_TCPTCP_NODELAYr   r   r   r   response_classr   r   r3   r)  r   r,  r0  r  r   r;  r?  rB  rD  rF  rH  rJ  rL  rN  rQ  r^  rb  rg  rl  rr  ru  r   ry  r{  r   r   r   r   r     s          @DMCCCC    -3-????? 
	V/E:E    
 K &*))))%N
  &(15*95 7M04@D.E95 95 95 95 95 95v* * * * " " " X" " " " X" " " " X"    X
 % % % X% " " " X" B B B XB " " " X" " " " X" " " " X"" " " "" " " "" " " "
" " " " *.#"&+/*.*. $##'" " " " "(  37	" 	" 	" 	" 	"  %*" " " " "" " " " &*"  %&+" " " " " " 48" " " " " "" " " " 	" " " " " "" " " " " "r   r   ),
__future__r   enumr}  r$  typingr   base64r   r   r   secretsr   TYPE_CHECKINGsslr   r	   r
   _typingr   _asyncr   _collectionsr   	_constantr   r   util.responser   r4   Enumr   r    r>   r   r   Tupler@   r   r|  MutableMappingOptionalr   r   r   r   r   <module>r     sy   " " " " " " "            ( ( ( ( ( ( ( (      	 .5555555555......------ ) ) ) ) ) ) B B B B B B B B , , , , , ,    #ty   60 60 60 60 60 60 60 60rh h h h h h h hV| | | | | | | |~8& 8& 8& 8& 8& 8& 8& 8&v #),sCx"8 8 8 8 8,2,A6?=11-     
e" e" e" e" e" e" e" e" e" e"r   