o
    .j]$                     @  s   d dl m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 ejr;d dlmZ dd	lmZmZ ejd
ddZejeef ZedZG dd dZdS )    )annotationsN   )ssl)
stdlib_ssl)DEFAULT_BLOCKSIZE)ProxySchemeUnsupported)Literal)_TYPE_PEER_CERT_RET_TYPE_PEER_CERT_RET_DICT_SelfTSSLTransport)bound_ReturnValuec                   @  s  e Zd ZdZedddZ			ddddZdddZdddZdddZ	e
dddZddd%d&Zddd*d+Z		'ddd0d1Zddd4d5Zddd6d7Zdd8d9Zdd:d;Zej	<ddd@dAZejddDdAZdddGdAZddHdIZddKdLZe
ddMdNZddOdPZddQdRZddTdUZddVdWZddZd[Zdd\d]Zej d^krddbdcZ!ddgdhZ"ejddidjZ#ejddkdjZ#	dddldjZ#ddmdnZ$dddpdqZ%ejddtduZ&ejddxduZ&ejdd{duZ&		dddduZ&dS )r   aL  
    The SSLTransport wraps an existing socket and establishes an SSL connection.

    Contrary to Python's implementation of SSLSocket, it allows you to chain
    multiple TLS connections together. It's particularly useful if you need to
    implement TLS within TLS.

    The class supports most of the socket API operations.
    ssl_contextssl.SSLContextreturnNonec                 C  s   t | ds	tddS )z
        Raises a ProxySchemeUnsupported if the provided ssl_context can't be used
        for TLS in TLS.

        The only requirement is that the ssl_context provides the 'wrap_bio'
        methods.
        wrap_biozXTLS in TLS requires SSLContext.wrap_bio() which isn't available on non-native SSLContextN)hasattrr   )r    r   U/home/thesage/.local/lib/python3.10/site-packages/urllib3_future/util/ssltransport.py$_validate_ssl_context_for_tls_in_tls%   s
   

z1SSLTransport._validate_ssl_context_for_tls_in_tlsNTsocketsocket.socketserver_hostname
str | Nonesuppress_ragged_eofsboolc              	   C  s   || _ || _tttjtjg}|D ]!}| | _| | _	z|j
| j| j	|d| _W  n ty4   Y qw tdt| d| | jj dS )zV
        Create an SSLTransport around socket using the provided ssl_context.
        )r   zQSSLTransport could not find a compatible MemoryBIO for the provided ssl_context ()N)r   r   listdictfromkeysr   	MemoryBIO_stdlib_sslincomingoutgoingr   sslobj	TypeErrortype_ssl_io_loopdo_handshake)selfr   r   r   r   _bio_factories
_MemoryBIOr   r   r   __init__5   s,   

zSSLTransport.__init__r+   r   c                 C  s   | S Nr   r+   r   r   r   	__enter__]      zSSLTransport.__enter___
typing.Anyc                 G  s   |    d S r/   )close)r+   r3   r   r   r   __exit__`      zSSLTransport.__exit__intc                 C  
   | j  S r/   )r   filenor0   r   r   r   r:   c      
zSSLTransport.filenosocket.SocketKindc                 C     | j jS r/   )r   r(   r0   r   r   r   r(   f      zSSLTransport.type   lenbuffertyping.Any | Noneint | bytesc                 C  s   |  ||S r/   )_wrap_ssl_read)r+   r@   rA   r   r   r   readj   r7   zSSLTransport.readr   buflenflagsc                 C  s   |dkrt d| |S )Nr   z+non-zero flags not allowed in calls to recv)
ValueErrorrD   )r+   rF   rG   r   r   r   recvm   s   
zSSLTransport.recv_WriteBuffernbytes
int | NoneNone | int | bytesc                 C  s,   |dkrt d|d u rt|}| ||S )Nr   z0non-zero flags not allowed in calls to recv_into)rH   r@   rE   )r+   rA   rK   rG   r   r   r   	recv_intor   s
   zSSLTransport.recv_intodatabytesc              	   C  s   |dkrt dd}t|?}|d!}t|}||k r.| ||d  }||7 }||k sW d    n1 s8w   Y  W d    d S W d    d S 1 sPw   Y  d S )Nr   z.non-zero flags not allowed in calls to sendallB)rH   
memoryviewcastr@   send)r+   rO   rG   countview	byte_viewamountvr   r   r   sendall~   s   PzSSLTransport.sendallc                 C  s    |dkrt d| | jj|S )Nr   z+non-zero flags not allowed in calls to send)rH   r)   r&   write)r+   rO   rG   r   r   r   rT      s   zSSLTransport.sendc                 C  s   |  | jj d S r/   )r)   r&   unwrapr0   r   r   r   r\      s   zSSLTransport.unwrapc                 C     | j   d S r/   )r   r5   r0   r   r   r   r5         zSSLTransport.close.binary_formLiteral[False]_TYPE_PEER_CERT_RET_DICT | Nonec                 C     d S r/   r   r+   r_   r   r   r   getpeercert   s   zSSLTransport.getpeercertLiteral[True]bytes | Nonec                 C  rb   r/   r   rc   r   r   r   rd      r2   Fr	   c                 C  s   | j |S r/   )r&   rd   rc   r   r   r   rd      r7   c                 C  r9   r/   )r&   versionr0   r   r   r   rg      r;   zSSLTransport.versiontuple[str, str, int] | Nonec                 C  r9   r/   )r&   cipherr0   r   r   r   ri      r;   zSSLTransport.cipherc                 C  r=   r/   )r&   contextr0   r   r   r   rj      r>   zSSLTransport.contextc                 C  r9   r/   )r&   selected_alpn_protocolr0   r   r   r   rk      r;   z#SSLTransport.selected_alpn_protocolc                 C  r9   r/   )r&   selected_npn_protocolr0   r   r   r   rl      r;   z"SSLTransport.selected_npn_protocol!list[tuple[str, str, int]] | Nonec                 C  r9   r/   )r&   shared_ciphersr0   r   r   r   rn      r;   zSSLTransport.shared_ciphersc                 C  r9   r/   )r&   compressionr0   r   r   r   ro      r;   zSSLTransport.compressionvaluefloat | Nonec                 C  s   | j | d S r/   )r   
settimeout)r+   rp   r   r   r   rr      s   zSSLTransport.settimeoutc                 C  r9   r/   )r   
gettimeoutr0   r   r   r   rs      r;   zSSLTransport.gettimeoutwin32controloption!int | tuple[int, int, int] | boolc                 C  s   | j ||S r/   )r   ioctl)r+   ru   rv   r   r   r   rx      s   zSSLTransport.ioctl_SSLTransport__level_SSLTransport__optname_SSLTransport__valuec                 C  s   | j ||| d S r/   )r   
setsockopt)r+   ry   rz   r{   r   r   r   r|      s   zSSLTransport.setsockoptc                 C  rb   r/   r   )r+   ry   rz   r   r   r   
getsockopt   r2   zSSLTransport.getsockoptc                 C  rb   r/   r   r+   ry   rz   rF   r   r   r   r}      r2   c                 C  s&   |d u r| j ||S | j |||S r/   )r   r}   r~   r   r   r   r}      s   c                 C  r]   r/   )r   _decref_socketiosr0   r   r   r   r      r^   zSSLTransport._decref_socketiosbytearray | Nonec              
   C  sR   z
|  | jj||W S  tjy( } z|jtjkr#| jr#W Y d }~dS  d }~ww Nr   )r)   r&   rE   r#   SSLErrorerrnoSSL_ERROR_EOFr   )r+   r@   rA   er   r   r   rD      s   zSSLTransport._wrap_ssl_readfunctyping.Callable[[], None]c                 C  rb   r/   r   )r+   r   r   r   r   r)      r2   zSSLTransport._ssl_io_looptyping.Callable[[bytes], int]arg1c                 C  rb   r/   r   )r+   r   r   r   r   r   r)      r2   /typing.Callable[[int, bytearray | None], bytes]arg2c                 C  rb   r/   r   )r+   r   r   r   r   r   r   r)      s   "typing.Callable[..., _ReturnValue]None | bytes | intr   c           	   
   C  s   d}d}|rsd}z|du r|du r| }n|du r||}n|||}W n! t jyE } z|jt jt jfvr8||j}W Y d}~nd}~ww | j }| j| |du rXd}n|t jkrq| j	t
}|rl| j| n| j  |stt|S )z>Performs an I/O loop between incoming/outgoing and the socket.TNF)r#   r   r   SSL_ERROR_WANT_READSSL_ERROR_WANT_WRITEr%   rE   r   rZ   rI   r   r$   r[   	write_eoftypingrS   r   )	r+   r   r   r   should_loopretr   r   bufr   r   r   r)      s>   


	

)r   r   r   r   )NT)
r   r   r   r   r   r   r   r   r   r   )r+   r   r   r   )r3   r4   r   r   )r   r8   )r   r<   )r?   N)r@   r8   rA   rB   r   rC   )r?   r   )rF   r8   rG   r8   r   rC   r   )rA   rJ   rK   rL   rG   r8   r   rM   )r   )rO   rP   rG   r8   r   r   )rO   rP   rG   r8   r   r8   )r   r   ).)r_   r`   r   ra   )r_   re   r   rf   )F)r_   r   r   r	   )r   r   )r   rh   )r   r   )r   rm   )rp   rq   r   r   )r   rq   )ru   r8   rv   rw   r   r   )ry   r8   rz   r8   r{   rC   r   r   )ry   r8   rz   r8   r   r8   )ry   r8   rz   r8   rF   r8   r   rP   r/   )ry   r8   rz   r8   rF   rL   r   rC   )r@   r8   rA   r   r   rC   )r   r   r   r   )r   r   r   rP   r   r8   )r   r   r   r8   r   r   r   rP   )NN)r   r   r   r   r   r   r   r   )'__name__
__module____qualname____doc__staticmethodr   r.   r1   r6   r:   propertyr(   rE   rI   rN   rZ   rT   r\   r5   r   overloadrd   rg   ri   rj   rk   rl   rn   ro   rr   rs   sysplatformrx   r|   r}   r   rD   r)   r   r   r   r   r      sr    

(


















)
__future__r   r   r   r   contrib.anytlsr   r   r#   	_constantr   
exceptionsr   TYPE_CHECKINGtyping_extensionsr   _typingr	   r
   TypeVarr   Union	bytearrayrR   rJ   r   r   r   r   r   r   <module>   s    
