
    +h)                        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        J/var/www/html/venv/lib/python3.12/site-packages/httpcore/_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   sv    %+^^['9$UG$ 	JJ!!'*;;t''	(9(9$,,:K:KY(WX	 	 	s   A,B""B+c                @   t         j                  t        t        t        i}t        |      5  | j                  j                  |       |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   r    r?   r@   r   r3   )r"   bufferr%   rC   nsents        r&   r3   zTLSinTLSStream.writeW   s}    %+^^\7J$WG$ 	(JJ!!'*(():):4<<;M;Mv)VW 	( 	( 	(s   ABBc                8    | j                   j                          y r*   r   closer"   s    r&   rI   zTLSinTLSStream.close_       

r(   c                    t               r*   )NotImplementedError)r"   r$   r   r%   s       r&   	start_tlszTLSinTLSStream.start_tlsb   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_infoj   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^   r_   r>   rE   r>   r%   r^   r_   Noner_   rd   r$   r\   r   r]   r%   r^   r_   r   rX   strr_   r`   )__name__
__module____qualname____doc__r2   r'   r    r/   r3   rI   rN   rY    r(   r&   r   r      s     O '+ $44 $4 $	4
 4(. 
2( '+ $	$#$ $$ 	$
 
$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__y   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  |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   r   r   send)r"   rE   r%   rC   ns        r&   r3   zSyncStream.write   sn    %+^^\7J$WG$ 	$

%%g.JJOOF+ 	$ 	$ 	$s   A A99Bc                8    | j                   j                          y r*   rH   rJ   s    r&   rI   zSyncStream.close   rK   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	ExceptionrI   ro   )r"   r$   r   r%   rC   r#   excs          r&   rN   zSyncStream.start_tls   s     NNN\%
 G$ 	djj#--8 *

K'	 	 JJ))'2&22

O 3 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 rP   )rw   r   r   rx   _sslobjrU   rV   r   rW   s     r&   rY   zSyncStream.get_extra_info   s    <Jtzz3==$I::%%%= ::))++= ::))++8::= %djj11r(   )r#   r[   r_   rd   r*   ra   rc   re   rZ   rf   rg   )	ri   rj   rk   r'   r/   r3   rI   rN   rY   rm   r(   r&   ro   ro   x   sN    .	$ '+ $	 #  $  	 
 
 :r(   ro   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_NODELAYro   )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   connectro   )r"   pathr%   r   rC   r#   r   s          r&   connect_unix_socketzSyncBackend.connect_unix_socket   s     <<7"L  !N NNN\%
 G$ 	==1C1CDD( )()OOG$LL	 $	 $s   A+CC)NNN)r   rh   r   rb   r%   r^   r   r]   r   %typing.Iterable[SOCKET_OPTION] | Noner_   r   rZ   )r   rh   r%   r^   r   r   r_   r   )ri   rj   rk   r   r   rm   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   ro   r   rm   r(   r&   <module>r      s[    "   
 
 	 	 	 ( > >^] ^B@ @F6 . 6 r(   