
    osj                        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m	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZmZmZ  G d d	e      Z G d
 de      Z G d de      Zy)    )annotationsN   )ConnectErrorConnectTimeoutExceptionMapping	ReadErrorReadTimeout
WriteErrorWriteTimeoutmap_exceptions)is_socket_readable   )SOCKET_OPTIONNetworkBackendNetworkStreamc                      e Zd ZdZdZ	 	 d	 	 	 	 	 	 	 ddZ	 	 	 	 ddZdddZdddZddZ		 	 d	 	 	 	 	 	 	 dd	Z
dd
Zy)TLSinTLSStreamz
    Because the standard `SSLContext.wrap_socket` method does
    not work for `SSLSocket` objects, we need this class
    to implement TLS stream using an underlying `SSLObject`
    instance in order to support TLS on top of TLS.
    i @  Nc                P   || _         t        j                         | _        t        j                         | _        |j                  | j                  | j                  |      | _        | j                   j                  |       | j                  | j                  j                         y )N)incomingoutgoingserver_hostname)
_sockssl	MemoryBIO	_incoming	_outgoingwrap_biossl_obj
settimeout_perform_iodo_handshake)selfsockssl_contextr   timeouts        K/root/.hermes/venv/lib/python3.12/site-packages/httpcore2/_backends/sync.py__init__zTLSinTLSStream.__init__"   sy     
"++^^^^+ , 
 	

g&223    c                   d }	 d }	  |       }| j                  j                  | j                  j                                |t         j                  k(  r]| j                  j                  | j                        }|r| j                  j                  |       n| j                  j                          ||S # t         j                  t         j                  f$ r}|j                  }Y d }~d }~ww xY wN)r   SSLWantReadErrorSSLWantWriteErrorerrnor   sendallr   readSSL_ERROR_WANT_READrecvTLS_RECORD_SIZEr   write	write_eof)r"   funcretr-   ebufs         r&   r    zTLSinTLSStream._perform_io6   s     E f JJt~~2245///jjood&:&:;NN((-NN,,.}
#  ((#*?*?@   s   B6 6#C/C**C/c           
     \   t         j                  t        t        t        i}t        |      5  | j                  j                  |       t        j                  t        | j                  t        j                  | j                  j                  |                  cd d d        S # 1 sw Y   y xY wr*   )socketr%   r	   OSErrorr   r   r   r   typingcastbytesr    	functoolspartialr   r/   r"   	max_bytesr%   exc_maps       r&   r/   zTLSinTLSStream.readO   sx    %+^^['9$UG$ 	iJJ!!'*;;ud&6&6y7H7HIZIZ\e7f&gh	i 	i 	is   A,B""B+c                V   t         j                  t        t        t        i}t        |      5  | j                  j                  |       t        |      }|rA| j                  t        j                  | j                  j                  |            }||d  }|rAd d d        y # 1 sw Y   y xY wr*   )r:   r%   r   r;   r
   r   r   r   
memoryviewr    r?   r@   r   r3   )r"   bufferr%   rC   viewnsents         r&   r3   zTLSinTLSStream.writeU   s    %+^^\7J$WG$ 	$JJ!!'*f%D(():):4<<;M;Mt)TUEF| 	$ 	$ 	$s   A)BB(c                8    | j                   j                          y r*   r   closer"   s    r&   rK   zTLSinTLSStream.close^       

r(   c                    t               r*   )NotImplementedError)r"   r$   r   r%   s       r&   	start_tlszTLSinTLSStream.start_tlsa   s     "##r(   c                    |dk(  r| j                   S |dk(  r| j                  j                         S |dk(  r| j                  j                         S |dk(  r| j                  S |dk(  rt	        | j                        S y N
ssl_objectclient_addrserver_addrr:   is_readable)r   r   getsocknamegetpeernamer   r"   infos     r&   get_extra_infozTLSinTLSStream.get_extra_infoi   sv    <<<= ::))++= ::))++8::= %djj11r(   NN)r#   socket.socketr$   ssl.SSLContextr   
str | Noner%   float | None)r5   z typing.Callable[..., typing.Any]return
typing.Anyr*   rB   intr%   r`   ra   r>   rF   r>   r%   r`   ra   Nonera   rf   r$   r^   r   r_   r%   r`   ra   r   rZ   strra   rb   )__name__
__module____qualname____doc__r2   r'   r    r/   r3   rK   rP   r[    r(   r&   r   r      s     O '+ $44 $4 $	4
 4(. 
2i$ '+ $	$#$ $$ 	$
 
$r(   r   c                  T    e Zd ZddZd	d
dZd	ddZddZ	 	 d	 	 	 	 	 	 	 ddZddZy)
SyncStreamc                    || _         y r*   )r   )r"   r#   s     r&   r'   zSyncStream.__init__x   s	    
r(   Nc                    t         j                  t        t        t        i}t        |      5  | j                  j                  |       | j                  j                  |      cd d d        S # 1 sw Y   y xY wr*   )	r:   r%   r	   r;   r   r   r   r   r1   rA   s       r&   r/   zSyncStream.read{   sS    %+^^['9$UG$ 	.JJ!!'*::??9-	. 	. 	.s   6A,,A5c                    |sy t         j                  t        t        t        i}t        |      5  t        |      }|r>| j                  j                  |       | j                  j                  |      }||d  }|r>d d d        y # 1 sw Y   y xY wr*   )
r:   r%   r   r;   r
   r   rE   r   r   send)r"   rF   r%   rC   rG   ns         r&   r3   zSyncStream.write   sx    %+^^\7J$WG$ 	 f%D

%%g.JJOOD)ABx 	  	  	 s   ABBc                8    | j                   j                          y r*   rJ   rL   s    r&   rK   zSyncStream.close   rM   r(   c                   t         j                  t        t        t        i}t        |      5  	 t        | j                  t        j                        r!t        | j                  |||      cd d d        S | j                  j                  |       |j                  | j                  |      }	 d d d        t        |      S # t        $ r}| j                          |d }~ww xY w# 1 sw Y   t              S xY w)N)r   )r:   r%   r   r;   r   r   
isinstancer   r   	SSLSocketr   r   wrap_socket	ExceptionrK   rq   )r"   r$   r   r%   rC   r#   excs          r&   rP   zSyncStream.start_tls   s     NNN\%
 G$ 	djj#--8 *$**k?T[\	 	 JJ))'2&224::2_D	 $  

		 $s.   C";B?38B??	CCCC""C5c                T   |dk(  r:t        | j                  t        j                        r| j                  j                  S |dk(  r| j                  j                         S |dk(  r| j                  j                         S |dk(  r| j                  S |dk(  rt        | j                        S y rR   )ry   r   r   rz   _sslobjrW   rX   r   rY   s     r&   r[   zSyncStream.get_extra_info   s    <Jtzz3==$I::%%%= ::))++= ::))++8::= %djj11r(   )r#   r]   ra   rf   r*   rc   re   rg   r\   rh   ri   )	rk   rl   rm   r'   r/   r3   rK   rP   r[   ro   r(   r&   rq   rq   w   sN    .
  '+ $	 #  $  	 
 
 2r(   rq   c                  N    e Zd Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 d	 	 	 	 	 	 	 ddZy)SyncBackendNc                   |g }||f}|d n|df}t         j                  t        t        t        i}t        |      5  t        j                  |||      }	|D ]  }
 |	j                  |
   |	j                  t         j                  t         j                  d       d d d        t        |	      S # 1 sw Y   t        	      S xY w)Nr   )source_addressr   )r:   r%   r   r;   r   r   create_connection
setsockoptIPPROTO_TCPTCP_NODELAYrq   )r"   hostportr%   local_addresssocket_optionsaddressr   rC   r#   options              r&   connect_tcpzSyncBackend.connect_tcp   s     !N,!.!6]A<NNNN\%

 G$ 	G++-D
 ) )()OOF..0B0BAF	G $	G $s   AB--C c                   t         j                  dk(  rt        d      |g }t        j                  t
        t        t        i}t        |      5  t        j                  t        j                  t        j                        }|D ]  } |j                  |   |j                  |       |j                  |       d d d        t        |      S # 1 sw Y   t              S xY w)Nwin32z:Attempted to connect to a UNIX socket on a Windows system.)sysplatformRuntimeErrorr:   r%   r   r;   r   r   AF_UNIXSOCK_STREAMr   r   connectrq   )r"   pathr%   r   rC   r#   r   s          r&   connect_unix_socketzSyncBackend.connect_unix_socket   s     <<7"[\\!N NNN\%
 G$ 	==1C1CDD( )()OOG$LL	 $	 $s   A+CC)NNN)r   rj   r   rd   r%   r`   r   r_   r   %typing.Iterable[SOCKET_OPTION] | Nonera   r   r\   )r   rj   r%   r`   r   r   ra   r   )rk   rl   rm   r   r   ro   r(   r&   r   r      s    
 !%$(@D     	 
 "  >  
 B !%@D	     >	 
 
 r(   r   )
__future__r   r?   r:   r   r   r<   _exceptionsr   r   r   r   r	   r
   r   r   _utilsr   baser   r   r   r   rq   r   ro   r(   r&   <module>r      sY    "   
 
 	 	 	 ( > >]] ]@= =@4 . 4 r(   