o
    óT·j  ã                   @  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'   ú[/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/httpcore2/_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|ƒ�0 | j |¡ t|ƒ}|r3|  	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#   Ú
memoryviewr$   rC   rD   r"   r7   )r&   rG   r   rF   ÚviewÚnsentr'   r'   r(   r7   U   s   
þý"ýzTLSinTLSStream.writec                 C  ó   | j  ¡  d S r.   ©r   Úclose©r&   r'   r'   r(   rN   ^   ó   zTLSinTLSStream.closer   c                 C  s   t ƒ ‚r.   )ÚNotImplementedError)r&   r   r   r   r'   r'   r(   Ú	start_tlsa   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 ©NÚ
ssl_objectÚclient_addrÚserver_addrr?   Úis_readable)r"   r   ÚgetsocknameÚgetpeernamer   ©r&   rS   r'   r'   r(   Úget_extra_infoi   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   ©rS   rT   r,   r-   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r6   r)   r$   r3   r7   rN   rR   r]   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)   x   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|ƒ�+ t|ƒ}|r2| 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   rI   r   r#   Úsend)r&   rG   r   rF   rJ   Únr'   r'   r(   r7   �   s   
ýþ"þzSyncStream.writec                 C  rL   r.   rM   rO   r'   r'   r(   rN   �   rP   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Ú	ExceptionrN   rh   )r&   r   r   r   rF   r   Úexcr'   r'   r(   rR   �   s(   þ
ú€þÿ
÷ózSyncStream.start_tlsrS   rT   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 rU   )rk   r   r   rl   Ú_sslobjrZ   r[   r   r\   r'   r'   r(   r]   ©   s   


zSyncStream.get_extra_info)r   r   r,   rH   r.   r_   r`   ra   r^   rb   rc   )	rd   re   rf   r)   r3   r7   rN   rR   r]   r'   r'   r'   r(   rh   w   s    

ürh   c                   @  s.   e Zd Z			dddd„Z		dddd„ZdS )ÚSyncBackendNÚhostrT   Ú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_NODELAYrh   )r&   rr   rs   r   rt   ru   Úaddressrw   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_STREAMry   r#   Úconnectrh   )r&   r   r   ru   rF   r   r}   r'   r'   r(   Úconnect_unix_socketÖ   s"   
þ


ûúzSyncBackend.connect_unix_socket)NNN)rr   rT   rs   r=   r   r   rt   r   ru   rv   r,   r   r^   )r   rT   r   r   ru   rv   r,   r   )rd   re   rf   r~   r‡   r'   r'   r'   r(   rq   ·   s    ú!ürq   )Ú
__future__r   rC   r?   r   r�   rA   Ú_exceptionsr   r   r   r   r   r	   r
   r   Ú_utilsr   Úbaser   r   r   r   rh   rq   r'   r'   r'   r(   Ú<module>   s    (
`@