o
    7'h)  ã                   @  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'   úMC:\Users\shubh\Videos\agent\nova\Lib\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 ©NÚ
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   rX   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   rc   )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   )rf   r   r   rg   Ú_sslobjrU   rV   r   rW   r'   r'   r(   rX   ­   s   


zSyncStream.get_extra_info)r   r   r,   rH   r.   rZ   r[   r\   rY   r]   r^   )	r_   r`   ra   r)   r3   r7   rK   rO   rX   r'   r'   r'   r(   rc   x   s    

ürc   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_NODELAYrc   )r&   rm   rn   r   ro   rp   Úaddressrr   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_STREAMrt   r#   Úconnectrc   )r&   rz   r   rp   rF   r   rx   r'   r'   r(   Úconnect_unix_socketÚ   s&   
ÿþ


ûúzSyncBackend.connect_unix_socket)NNN)rm   rQ   rn   r=   r   r   ro   r   rp   rq   r,   r   rY   )rz   rQ   r   r   rp   rq   r,   r   )r_   r`   ra   ry   r‚   r'   r'   r'   r(   rl   »   s    ú!ürl   )Ú
__future__r   rC   r?   r   r|   rA   Ú_exceptionsr   r   r   r   r   r	   r
   r   Ú_utilsr   Úbaser   r   r   r   rc   rl   r'   r'   r'   r(   Ú<module>   s    (
aC