o
    i)                     @  s   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	 d	eZG d
d deZG dd deZdS )    )annotationsN   )ConnectErrorConnectTimeoutExceptionMapping	ReadErrorReadTimeout
WriteErrorWriteTimeoutmap_exceptions)is_socket_readable   )SOCKET_OPTIONNetworkBackendNetworkStreamc                   @  sj   e Zd ZdZdZ		d&d'ddZd(ddZd)d*ddZd)d+ddZd,ddZ			d&d-d d!Z
d.d$d%ZdS )/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 @  Nsocksocket.socketssl_contextssl.SSLContextserver_hostname
str | Nonetimeoutfloat | Nonec                 C  sN   || _ t | _t | _|j| j| j|d| _| j | | | jj	 d S )N)incomingoutgoingr   )
_sockssl	MemoryBIO	_incoming	_outgoingwrap_biossl_obj
settimeout_perform_iodo_handshake)selfr   r   r   r    r'   Q/home/kim/smarthome/.venv/lib/python3.10/site-packages/httpcore/_backends/sync.py__init__"   s   

zTLSinTLSStream.__init__func typing.Callable[..., typing.Any]return
typing.Anyc              
   C  s   d }	 d }z| }W n t jt jfy# } z	|j}W Y d }~nd }~ww | j| j  |t jkrG| j	| j
}|rB| j| n| j  |d u rM|S qN)r   SSLWantReadErrorSSLWantWriteErrorerrnor   sendallr    readSSL_ERROR_WANT_READrecvTLS_RECORD_SIZEr   write	write_eof)r&   r*   retr1   ebufr'   r'   r(   r$   6   s$   


zTLSinTLSStream._perform_io	max_bytesintbytesc              
   C  sd   t jttti}t| | j| t	t
| t| jj|W  d    S 1 s+w   Y  d S r.   )socketr   r   OSErrorr   r   r   r#   typingcastr>   r$   	functoolspartialr"   r3   r&   r<   r   exc_mapr'   r'   r(   r3   O   s   
$zTLSinTLSStream.readbufferNonec                 C  s   t jttti}t|, | j| |r/| t	
| jj|}||d  }|sW d    d S W d    d S 1 s:w   Y  d S r.   )r?   r   r
   r@   r	   r   r   r#   r$   rC   rD   r"   r7   )r&   rG   r   rF   Znsentr'   r'   r(   r7   W   s   
"zTLSinTLSStream.writec                 C     | j   d S r.   r   closer&   r'   r'   r(   rK   _      zTLSinTLSStream.closer   c                 C  s   t  r.   )NotImplementedError)r&   r   r   r   r'   r'   r(   	start_tlsb   s   zTLSinTLSStream.start_tlsinfostrc                 C  sV   |dkr| j S |dkr| j S |dkr| j S |dkr | jS |dkr)t| jS d S NZ
ssl_objectclient_addrZserver_addrr?   Zis_readable)r"   r   getsocknamegetpeernamer   r&   rP   r'   r'   r(   get_extra_infoj   s   


zTLSinTLSStream.get_extra_infoNN)r   r   r   r   r   r   r   r   )r*   r+   r,   r-   r.   r<   r=   r   r   r,   r>   rG   r>   r   r   r,   rH   r,   rH   r   r   r   r   r   r   r,   r   rP   rQ   r,   r-   )__name__
__module____qualname____doc__r6   r)   r$   r3   r7   rK   rO   rW   r'   r'   r'   r(   r      s    

r   c                   @  sR   e Zd Zd ddZd!d"ddZd!d#ddZd$ddZ		d%d&ddZd'ddZdS )(
SyncStreamr   r   r,   rH   c                 C  s
   || _ d S r.   )r   )r&   r   r'   r'   r(   r)   y   s   
zSyncStream.__init__Nr<   r=   r   r   r>   c                 C  sR   t jttti}t| | j| | j|W  d    S 1 s"w   Y  d S r.   )	r?   r   r   r@   r   r   r   r#   r5   rE   r'   r'   r(   r3   |   s
   

$zSyncStream.readrG   c                 C  s   |sd S t jttti}t|' |r.| j| | j|}||d  }|sW d    d S W d    d S 1 s9w   Y  d S r.   )	r?   r   r
   r@   r	   r   r   r#   send)r&   rG   r   rF   nr'   r'   r(   r7      s   
"zSyncStream.writec                 C  rI   r.   rJ   rL   r'   r'   r(   rK      rM   zSyncStream.closer   r   r   r   r   c                 C  s   t jttti}t|E z't| jtj	r$t
| j|||W W  d    S | j| |j| j|d}W n tyE } z|   |d }~ww W d    t|S 1 sSw   Y  t|S )N)r   )r?   r   r   r@   r   r   
isinstancer   r   	SSLSocketr   r#   wrap_socket	ExceptionrK   rb   )r&   r   r   r   rF   r   excr'   r'   r(   rO      s0   




zSyncStream.start_tlsrP   rQ   r-   c                 C  sf   |dkrt | jtjr| jjS |dkr| j S |dkr!| j S |dkr(| jS |dkr1t| jS d S rR   )re   r   r   rf   _sslobjrT   rU   r   rV   r'   r'   r(   rW      s   


zSyncStream.get_extra_info)r   r   r,   rH   r.   rY   rZ   r[   rX   r\   r]   )	r^   r_   r`   r)   r3   r7   rK   rO   rW   r'   r'   r'   r(   rb   x   s    

rb   c                   @  s.   e Zd Z			ddddZ		ddddZdS )SyncBackendNhostrQ   portr=   r   r   local_addressr   socket_options%typing.Iterable[SOCKET_OPTION] | Noner,   r   c                 C  s   |d u rg }||f}|d u rd n|df}t jttti}t|& t j|||d}	|D ]}
|	j|
  q*|	t jt j	d W d    t
|	S 1 sHw   Y  t
|	S )Nr   )source_addressr   )r?   r   r   r@   r   r   create_connection
setsockoptIPPROTO_TCPTCP_NODELAYrb   )r&   rl   rm   r   rn   ro   addressrq   rF   r   optionr'   r'   r(   connect_tcp   s(   


		zSyncBackend.connect_tcppathc                 C  s   t jdkr	td|d u rg }tjttti}t|' ttj	tj
}|D ]}|j|  q%|| || W d    t|S 1 sDw   Y  t|S )Nwin32z:Attempted to connect to a UNIX socket on a Windows system.)sysplatformRuntimeErrorr?   r   r   r@   r   r   AF_UNIXSOCK_STREAMrs   r#   connectrb   )r&   ry   r   ro   rF   r   rw   r'   r'   r(   connect_unix_socket   s&   



zSyncBackend.connect_unix_socket)NNN)rl   rQ   rm   r=   r   r   rn   r   ro   rp   r,   r   rX   )ry   rQ   r   r   ro   rp   r,   r   )r^   r_   r`   rx   r   r'   r'   r'   r(   rk      s    !rk   )
__future__r   rC   r?   r   r{   rA   _exceptionsr   r   r   r   r   r	   r
   r   Z_utilsr   baser   r   r   r   rb   rk   r'   r'   r'   r(   <module>   s    (
aC