o
    .j`                     @  sH  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mZ d dlmZm	Z	 d dl
mZ ejrDd 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mZmZ ddlmZ G dd deejZ G dd dZ!G dd dZ"G dd dZ#G d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 dZ,dS )    )annotationsN)	b64encode)datetime	timedelta)token_bytes)	SSLSocket
SSLContext
TLSVersion   )_TYPE_SOCKET_OPTIONS   )AsyncLowLevelResponse)HTTPHeaderDict)DEFAULT_BLOCKSIZEDEFAULT_KEEPALIVE_DELAYDEFAULT_BACKGROUND_WATCH_WINDOWDEFAULT_KEEPALIVE_IDLE_WINDOW)BytesQueueBufferc                   @  s   e Zd ZdZdZdZdZdS )HttpVersionz6Describe possible SVN protocols that can be supported.HTTP/1.1zHTTP/2.0zHTTP/3.0N)__name__
__module____qualname____doc__h11h2h3 r   r   Q/home/thesage/.local/lib/python3.10/site-packages/urllib3_future/backend/_base.pyr      s
    r   c                   @  s*   e Zd ZdddZdddZdd	d
ZdS )ConnectionInforeturnNonec                 C  sR   d | _ 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tls_ech_acceptedrequest_sent_latencyselfr   r   r   __init__&   s   
zConnectionInfo.__init__strc                 C  s>   t | j| 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$   r-   r/   )r3   r#   r%   r&   r'   r(   r)   r*   r+   r,   r.   r$   r-   r/   r0   r   r   r   __repr__I   s    zConnectionInfo.__repr__boolc                 C  
   | j d uS r"   )r%   r0   r   r   r   is_encrypted\      
zConnectionInfo.is_encryptedNr    r!   r    r3   r    r5   )r   r   r   r2   r4   r7   r   r   r   r   r   %   s    

#r   c                   @  s   e Zd Z		d2d3d
dZed4ddZd5ddZd4ddZd4ddZd4ddZ	d6ddZ
d6ddZd7d8d!d"Zd9d%d&Zd7d:d(d)Zd;d*d+Zd<d=d.d/Zd>d0d1ZdS )?DirectStreamAccessN	stream_idintreadmtyping.Callable[[int | None, int | None, bool, bool], tuple[list[bytes], bool, HTTPHeaderDict | None]] | Nonewrite0typing.Callable[[bytes, int, bool], None] | Noner    r!   c                   sZ   |_  d ur fdd_nd _t _d_d ur(fdd_d S d _d S )Nc                   s    | j | d u|S r"   
_stream_id)amtfo)r?   r1   r   r   <lambda>s   s    z-DirectStreamAccess.__init__.<locals>.<lambda>Fc                   s   |  j |S r"   rC   )bufeot)r1   rA   r   r   rG   ~      )rD   _readr   _buffer_eot_write)r1   r=   r?   rA   r   )r?   r1   rA   r   r2   a   s   

zDirectStreamAccess.__init__r5   c                 C  s   | j d u o	| jd u S r"   )rK   rN   r0   r   r   r   closed   s   zDirectStreamAccess.closedb	bytearrayc                 C  sH   | j d u r	td| t|}t|dkrdS ||d t|< t|S )Nz!read operation on a closed streamr   )rK   OSErrorrecvlen)r1   rP   tempr   r   r   readinto   s   
zDirectStreamAccess.readintoc                 C  r6   r"   )rK   r0   r   r   r   readable   r8   zDirectStreamAccess.readablec                 C  r6   r"   )rN   r0   r   r   r   writable   r8   zDirectStreamAccess.writablec                 C     dS NFr   r0   r   r   r   seekable      zDirectStreamAccess.seekablec                 C  rY   Nr   r0   r   r   r   fileno   r\   zDirectStreamAccess.filenoc                 C  rY   r]   r   r0   r   r   r   name   r\   zDirectStreamAccess.namer   _DirectStreamAccess__bufsize_DirectStreamAccess__flagsbytesc                 C  s   |  |\}}}|S r"   )recv_extended)r1   ra   rb   data_r   r   r   rS      s   zDirectStreamAccess.recv
int | None)tuple[bytes, bool, HTTPHeaderDict | None]c                 C  s   | j d u r	tdd }| js%t| jdkr%|  |d\}| _}| j| t| jr>| j|d ur7|dkr7|nt| j}nd}| joIt| jdk}|rOd | _ |||fS )Nzstream closed errorr   F    )rK   rR   rM   rT   rL   put_manyget)r1   ra   trailerschunksre   rI   r   r   r   rd      s"   


z DirectStreamAccess.recv_extended_DirectStreamAccess__datac                 C  s"   | j d u r	td|  |d d S Nstream write not permittedFrN   rR   )r1   rn   rb   r   r   r   sendall      
zDirectStreamAccess.sendallc                 C  s&   | j d u r	td|  |d t|S ro   )rN   rR   rT   )r1   rn   r   r   r   rA      s   
zDirectStreamAccess.writeF!_DirectStreamAccess__close_streamc                 C  s"   | j d u r	td|  || d S )Nrp   rq   )r1   rn   rt   r   r   r   sendall_extended   rs   z#DirectStreamAccess.sendall_extendedc                 C  s@   | j d ur|  dd d | _ | jd ur| d d d | _d S d S )Nri   T)rN   rK   r0   r   r   r   close   s   


zDirectStreamAccess.close)NN)r=   r>   r?   r@   rA   rB   r    r!   r;   )rP   rQ   r    r>   r    r>   )r   )ra   r>   rb   r>   r    rc   )ra   rg   r    rh   )rn   rc   rb   r>   r    r!   )rn   rc   r    r>   )F)rn   rc   rt   r5   r    r!   r9   )r   r   r   r2   propertyrO   rV   rW   rX   r[   r_   r`   rS   rd   rr   rA   ru   rv   r   r   r   r   r<   `   s$    #






!
r<   c                   @  s   e Zd ZdZdddddddd3ddZed4ddZed5d d!Zejd6d%d!Zed7d&d'Z	d8d)d*Z
d9d:d-d.Zd;d/d0Zd;d1d2ZdS )<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methodr3   statusr>   versionreasonheadersr   bodyatyping.Callable[[int | None, int | None], tuple[list[bytes], bool, HTTPHeaderDict | None]] | Nonerz   
str | Noner{   rg   r=   r|   socket.socket | Noner}   DirectStreamAccess | Noner~   #typing.Callable[[int], None] | Nonec                C  s   || _ || _|| _|| _|| _|| _| jd up|d u}|du | _| j| _|| _|| _	d| _
| jdko9d| jdk| _d | _d | _d| _| jsV| jd}|rSt|nd | _d| _|
| _d | _|| _|| _|	| _t | _d | _d | _d S )NFr      chunkedztransfer-encodingzcontent-length)r   r   r   msg_method#_LowLevelResponse__internal_read_strO   rM   rz   r{   
debuglevelrk   r   
chunk_leftlength
will_closer>   data_in_count_sock_fp_dsa_stream_abortrD   r    _LowLevelResponse__buffer_excess_LowLevelResponse__promiserl   )r1   r   r   r   r   r   r   rz   r{   r=   r|   r}   r~   has_bodycontent_lengthr   r   r   r2      s<   

zLowLevelResponse.__init__r    +socket.SocketIO | DirectStreamAccess | Nonec                 C  sf   | j d u r$| jdks| jdkr"d| j  krdk r"| jS  t| jS t| jd u r0| j d| _| jS )Ne   CONNECT   i,  rb)r   r   r   r   AttributeErrorr   makefiler0   r   r   r   fp2  s   


zLowLevelResponse.fpResponsePromise | Nonec                 C     | j S r"   )r   r0   r   r   r   from_promiseB     zLowLevelResponse.from_promisevalueResponsePromiser!   c                 C  s   |j | jkr
td|| _d S )NzCTrying to assign a ResponsePromise to an unrelated LowLevelResponse)r=   rD   
ValueErrorr   r1   r   r   r   r   r   F  s
   
c                 C  r   )z'Original HTTP verb used in the request.)r   r0   r   r   r   r   N  s   zLowLevelResponse.methodr5   c                 C  r   )z:Here we do not create a fp sock like http.client Response.)rO   r0   r   r   r   isclosedS  r   zLowLevelResponse.isclosed_LowLevelResponse__sizerc   c                 C  s$  | j du s
| jd u rtd|dkrdS t| j}|d uo$|dko$||k}| jdu rC|sC| || j\}| _| _| j| t| j}|rU| j	|d urR|dkrR|n|nd}t|}||8 }| jrr|dkrrd | _
| jsrd| _ d | _| jr}|ry|nd | _n| jd ur|  j|8  _|  j|7  _|S )NTzI/O operation on closed file.r   ri   F)rO   r   r   rT   r   rM   rD   rl   rj   rk   r   r   r   r   r   r   r   )r1   r   buf_capacitydata_ready_to_gorm   re   size_inr   r   r   r?   W  sD   


zLowLevelResponse.readc                 C  sN   | j d ur#| jdu r%| jd ur|  | j d| _d | _ d| _d | _d S d S d S )NFT)r   rM   rD   rO   r   r0   r   r   r   abort  s   



zLowLevelResponse.abortc                 C  s   d | _ d| _d | _d | _d S )NT)r   rO   r   r   r0   r   r   r   rv     s   
zLowLevelResponse.close)r   r3   r   r>   r   r>   r   r3   r   r   r   r   rz   r   r{   rg   r=   rg   r|   r   r}   r   r~   r   )r    r   )r    r   )r   r   r    r!   r:   r;   r"   )r   rg   r    rc   r9   )r   r   r   r   r2   rx   r   r   setterr   r   r?   r   rv   r   r   r   r   ry      s*    I

2
ry   c                   @  s   e Zd Zd-ddZd.ddZd/ddZed/ddZed0ddZed1ddZ	ed2ddZ
ed3ddZejd4d!dZd5d#d$Zd6d&d'Zd7d*d+Zd,S )8r   connBaseBackendr=   r>   request_headerslist[tuple[bytes, bytes]]
parameters
typing.Anyr    r!   c                 K  s6   t tdd| _|| _|| _d | _|| _|| _d S )N   ascii)	r   r   decode_uid_connrD   	_response_request_headers_parameters)r1   r   r=   r   r   r   r   r   r2     s   
zResponsePromise.__init__otherobjectr5   c                 C  s   t |tsdS | j|jkS rZ   )
isinstancer   uid)r1   r   r   r   r   __eq__  s   
zResponsePromise.__eq__r3   c                 C  s    d| j  d| jj d| j dS )Nz<ResponsePromise 'z' z Stream[z]>)r   r   _http_vsn_strr=   r0   r   r   r   r4     s    zResponsePromise.__repr__c                 C  r   r"   )r   r0   r   r   r   r     r   zResponsePromise.uidc                 C  r   r"   )r   r0   r   r   r   r     r   zResponsePromise.request_headersc                 C  r   r"   rC   r0   r   r   r   r=     r   zResponsePromise.stream_idc                 C  r6   r"   r   r0   r   r   r   is_ready     
zResponsePromise.is_ready(LowLevelResponse | AsyncLowLevelResponsec                 C  s   | j st| j S r"   )r   rR   r0   r   r   r   response  s   zResponsePromise.responser   c                 C  s
   || _ d S r"   r   r   r   r   r   r     r   keyc                 C  s   || j |< d S r"   r   )r1   r   r   r   r   r   set_parameter  rJ   zResponsePromise.set_parametertyping.Any | Nonec                 C  s   || j v r
| j | S d S r"   r   )r1   r   r   r   r   get_parameter  s   zResponsePromise.get_parameterre   dict[str, typing.Any]c                 C  s   | j | d S r"   )r   update)r1   re   r   r   r   update_parameters  s   z!ResponsePromise.update_parametersN)
r   r   r=   r>   r   r   r   r   r    r!   )r   r   r    r5   r:   )r    r   rw   r;   )r    r   )r   r   r    r!   )r   r3   r   r   r    r!   )r   r3   r    r   )re   r   r    r!   )r   r   r   r2   r   r4   rx   r   r   r=   r   r   r   r   r   r   r   r   r   r   r     s&    




r   ztyping.TypeAlias_HostPortTypeQuicPreemptiveCacheTypec                   @  s  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eeddd(d)Zdd-d.Zedd/d0Zedd2d3Zedd5d6Zedd8d9Zedd:d;Zedd<d=Zedd>d?Zedd@dAZeddBdCZeddDdEZ eddFdGZ!ddIdJZ"ddKdLZ#ddNdOZ$ddPdQZ%									ddd^d_Z&			`dddcddZ'		dddidjZ(ddmdnZ)	ddddoddudvZ*ddwddzd{Z+dd|d}Z,dd~dddZ-ddd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_optionsFr5   is_verifiedzbool | Noneproxy_is_verifiedr^   )socket_optionsdisabled_svnpreemptive_quic_cachekeepalive_delaybackground_watch_delaykeepalive_idle_windowhostr3   r{   rg   timeoutint | float | Nonesource_addresstuple[str, int] | None	blocksizer>   r   _TYPE_SOCKET_OPTIONS | Noner   set[HttpVersion] | Noner   QuicPreemptiveCacheType | Noner   float | int | Noner   r   c                C  s   || _ || _|| _|| _|| _tj| _|| _d | _	d | _
tj| _d | _d | _d | _t | _|d ur3|nt | _|| _| jrLt| jtttkrLtdd | _i | _i | _i | _d | _d | _|	| _|
| _ || _!d | _"t#$ | _%d| _&d | _'d S )Nz\You disabled every supported protocols. The HTTP connection object is left with no outcomes.g        )(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_cacherT   listRuntimeError	conn_info	_promises_promises_per_stream_pending_responses_start_last_request_cached_http_vsn_keepalive_delay_background_watch_delay_keepalive_idle_window_connected_attime	monotonic_last_used_at_recv_size_ema_ech_config)r1   r   r{   r   r   r   r   r   r   r   r   r   r   r   r   r2     sL   

zBaseBackend.__init__itemr   r    c                 C  s   |j | jv S r"   )r   r   )r1   r  r   r   r   __contains__;  s   zBaseBackend.__contains__c                 C  s(   t | jdks| jtju rdS | jdkS )Nr   Ti  )rT   r   r   r   r   r  r0   r   r   r   _fast_recv_mode>  s   
zBaseBackend._fast_recv_modefloatc                 C  r   r"   )r  r0   r   r   r   last_used_atD  r   zBaseBackend.last_used_atfloat | Nonec                 C  r   r"   )r  r0   r   r   r   connected_atH  r   zBaseBackend.connected_atset[HttpVersion]c                 C  r   r"   )r   r0   r   r   r   r   L  r   zBaseBackend.disabled_svnc                 C  s   | j du rdS | j jS )2Reimplemented for backward compatibility purposes.Nr   )r   r   r0   r   r   r   r   P  s   
zBaseBackend._http_vsn_strc                 C  s>   | j du rdS | jdu rt| j jdd dd| _| jS )r  Nr   /r^   . )r   r   r>   r   splitreplacer0   r   r   r   	_http_vsnW  s
   

 zBaseBackend._http_vsnc                 C     t r"   NotImplementedErrorr0   r   r   r   is_saturated`     zBaseBackend.is_saturatedc                 C  s   | j  o| j S r"   )r   r   r0   r   r   r   is_idled  s   zBaseBackend.is_idlec                 C  r  r"   r  r0   r   r   r   expect_pongh  r  zBaseBackend.expect_pongc                 C  r  r"   r  r0   r   r   r   is_multiplexedl  r  zBaseBackend.is_multiplexedc                 C  r  r"   r  r0   r   r   r   max_frame_sizep  r  zBaseBackend.max_frame_sizer!   c                 C  r  )z+Upgrade conn from svn ver to max supported.r  r0   r   r   r   _upgradet  r  zBaseBackend._upgradec                 C  r  )z>Emit proper CONNECT request to the http (server) intermediary.r  r0   r   r   r   _tunnelx  r  zBaseBackend._tunnelr   c                 C  r  )zRun protocol initialization from there. Return None to ensure that the child
        class correctly create the socket / connection.r  r0   r   r   r   	_new_conn|     zBaseBackend._new_connc                 C  r  )zhShould be called after _new_conn proceed as expected.
        Expect protocol handshake to be done here.r  r0   r   r   r   
_post_conn  r#  zBaseBackend._post_conn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
           
      C  r  )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  )
r1   r%  r'  r(  r)  r+  r,  r-  r.  r/  r   r   r   _custom_tls  s   zBaseBackend._custom_tlshttpr   typing.Mapping[str, str] | Nonec                 C  r  )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  )r1   r   r{   r   r   r   r   r   
set_tunnel  s   	zBaseBackend.set_tunnelr   url	skip_hostskip_accept_encodingc                 C  r  )zFIt is the first method called, setting up the request initial context.r  )r1   r   r4  r5  r6  r   r   r   
putrequest     zBaseBackend.putrequestheadervaluesc                 G  r  )zFor a single header name, assign one or multiple value. This method is called right after putrequest()
        for each entries.r  )r1   r9  r:  r   r   r   	putheader  r#  zBaseBackend.putheader)encode_chunkedexpect_body_afterwardmessage_bodybytes | Noner<  r=  r   c                C  r  )z6This method conclude the request context construction.r  )r1   r>  r<  r=  r   r   r   
endheaders  r8  zBaseBackend.endheaders)promiserA  ry   c                C  r  )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  )r1   rA  r   r   r   getresponse  s   zBaseBackend.getresponsec                 C  r  )z9End the connection, do some reinit, closing of fd, etc...r  r0   r   r   r   rv     r  zBaseBackend.close)rI   re   bytes | bytearrayrI   c                C  r  )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  )r1   re   rI   r   r   r   send  r8  zBaseBackend.sendc                 C  r  )zSend a PING to the remote peer.r  r0   r   r   r   ping  r  zBaseBackend.ping)r   r3   r{   rg   r   r   r   r   r   r>   r   r   r   r   r   r   r   r   r   r   r   r   )r  r   r    r5   r;   )r    r  )r    r  )r    r  r:   rw   r9   )r    r   )	NNNNNNNNN)r%  r&  r'  r   r(  r   r)  r*  r+  rg   r,  rg   r-  r   r.  r   r/  r   r    r5   )NNr1  )
r   r3   r{   rg   r   r2  r   r3   r    r!   )FF)
r   r3   r4  r3   r5  r5   r6  r5   r    r!   )r9  r3   r:  r3   r    r!   r"   )r>  r?  r<  r5   r=  r5   r    r   )rA  r   r    ry   )re   rC  rI   r5   r    r   )/r   r   r   r   r   __annotations__socketSOCK_STREAMr   IPPROTO_TCPTCP_NODELAYr   r   r   ry   response_classr   r   r   r   r2   r	  rx   r
  r  r  r   r   r  r  r  r  r  r  r   r!  r"  r$  r0  r3  r7  r;  r@  rB  rv   rD  rE  r   r   r   r   r     s   
 
F







r   )-
__future__r   enumrG  r  typingbase64r   r   r   secretsr   TYPE_CHECKINGsslr   r   r	   _typingr   _asyncr   _collectionsr   	_constantr   r   r   r   util.responser   r3   Enumr   r   r<   ry   r   Tupler>   r   rF  MutableMappingOptionalr   r   r   r   r   r   <module>   s6    ;  6;