o
    sDit                     @  s  d Z 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Zddl	Z	ddlm
Z
mZmZmZmZ ddlmZmZmZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddl m!Z!m"Z"m#Z# ddl$m%Z% zddl&m'Z'm(Z( dZ)W n e*y   dZ)Y nw z
ddl+m,Z, dZ-W n e*y   dZ-e(Z,Y nw ddl.m/Z/m0Z0m1Z1 erddl2m3Z3 ddl4m5Z5 e6dj7Z8e6dj7Z9dZ:e;ge/ej<R Z<dTddZ=ej>dkrdUd"d#Z?	dVdWd+d,Z@ndXd.d#Z?	dVdYd/d,Z@dTd0d1ZAdZd3d4ZBd[d5d6ZCd\d8d9ZDd:ejEv ZFej>dkZGd]d>d?ZHd^d@dAZIG dBdC dCZJG dDdE dEeJZKG dFdG dGeJZLG dHdI dIeZMd_dJdKZNefd`dPdQZOefdadRdSZPdS )bz&Internal network layer helper methods.    )annotationsN)AbstractEventLoopBaseTransportBufferedProtocolFuture	Transport)TYPE_CHECKINGAnyOptionalUnion)_csotssl_support)create_task)MAX_MESSAGE_SIZE)
decompress)ProtocolError_OperationCancelled)_UNPACK_REPLY_OpMsg_OpReply)_errno_from_exception)SSLError	SSLSocketTF)_sslConn)BLOCKING_IO_LOOKUP_ERRORBLOCKING_IO_READ_ERRORBLOCKING_IO_WRITE_ERROR)AsyncConnection)
Connectionz<iiiiz<iiBg      ?sockUnion[socket.socket, _sslConn]bufbytesreturnNonec              
     s   |   }| d t }zDz(tr(t| ttfr(tjt	| |||dI d H  ntj|
| ||dI d H  W n tjyJ } ztd|d }~ww W | | d S | | w )N        timeout	timed out)
gettimeout
settimeoutasyncioget_running_loop	_HAVE_SSL
isinstancer   r   wait_for_async_socket_sendall_sslsock_sendallTimeoutErrorsocketr'   )r   r!   r'   loopexc r6   S/home/alumno/antzosa8961/venv/lib/python3.10/site-packages/pymongo/network_layer.pyasync_socket_sendallK   s   
r8   win32r4   r   c           	        s  t |}d}d
dd}|t|k rz|| ||d  7 }W n ty } z|  }|dkr4td	d t|trW| }|	||| z|I d H  W |
| n|
| w t|trz| }|||| z|I d H  W || n|| w trt|tr| }|	||| z|||| |I d H  W |
| || n|
| || w W Y d }~nd }~ww |t|k sd S d S )Nr   futFuture[Any]r#   r$   c                 S     |   rd S | d  d S Ndone
set_resultr:   r6   r6   r7   	_is_readyc      z,_async_socket_sendall_ssl.<locals>._is_ready!Underlying socket has been closedr:   r;   r#   r$   )
memoryviewlensendBLOCKING_IO_ERRORSfilenor   r.   r   create_future
add_readerremove_readerr   
add_writerremove_writer_HAVE_PYOPENSSLr   )	r   r!   r4   viewsentrB   r5   fdr:   r6   r6   r7   r0   ]   sH   





r0   connr   lengthintonceOptional[bool]rG   c                   s  t t|}d}ddd}||k rz | ||d  }|dkr$td|r-|d | W S ||7 }W n ty } z|  }	|	d	krGtd
d t|trj|	 }
|
|	||
 z|
I d H  W ||	 n||	 w t|tr|	 }
||	||
 z|
I d H  W ||	 n||	 w trt|tr|	 }
|
|	||
 z||	||
 |
I d H  W ||	 ||	 n||	 ||	 w W Y d }~nd }~ww ||k s|S )Nr   r:   r;   r#   r$   c                 S  r<   r=   r>   rA   r6   r6   r7   rB      rC   z,_async_socket_receive_ssl.<locals>._is_readyconnection closedrD   rE   rF   )rG   	bytearray	recv_intoOSErrorrJ   rK   r   r.   r   rL   rM   rN   r   rO   rP   rQ   r   )rU   rV   r4   rX   mv
total_readrB   readr5   rT   r:   r6   r6   r7   _async_socket_receive_ssl   sT   





%ra   dummyc                   s   t |}t|}d}d}||k rMz| ||d  }W n ty/   t|I d H  d}Y nw |dkr<t|d d}nt|d d}||7 }||k sd S d S )Nr   MbP?   Mb?)rG   rH   rI   rJ   r+   sleepmaxmin)r   r!   rb   rR   total_length
total_sentbackoffrS   r6   r6   r7   r0      s"   c                   s   t t|}d}d}||k rZz| ||d  }|dkr!td|r*|d | W S W n ty>   t|I d H  d}Y nw |dkrKt|d d}nt|d d}||7 }||k s|S )Nr   rc   rZ   rd   re   )	rG   r[   r\   r]   rJ   r+   rf   rg   rh   )rU   rV   rb   rX   r^   r_   rk   r`   r6   r6   r7   ra      s,   c                 C  s   |  | d S r=   )sendall)r   r!   r6   r6   r7   rl         rl   r   c                   s"   	 | j jrd S ttI d H  qr=   )cancel_context	cancelledr+   rf   _POLL_TIMEOUTrU   r6   r6   r7   _poll_cancellation   s   rr   c              
     s   |   }|}| d t }zIz5tr2t| ttfr2tjt	| ||dd|dI d H W W | | S tjt
| |||dI d H W W | | S  tjyY } ztd|d }~ww | | w )Nr%   T)rX   r&   r(   )r)   r*   r+   r,   r-   r.   r   r   r/   ra   _async_socket_receiver2   r3   r'   )r   rV   sock_timeoutr'   r4   errr6   r6   r7   async_receive_data_socket   s,   

rv   socket.socketc                   sX   t t|}d}||k r*|| ||d  I d H }|dkr"td||7 }||k s|S )Nr   rZ   )rG   r[   sock_recv_intor]   )rU   rV   r4   r^   
bytes_readchunk_lengthr6   r6   r7   rs     s   rs   PyPyr   deadlineOptional[float]c                 C  s   | j j}d}| dkrdS 	 t|dr| dkrd}n"|r4|t  }|dkr+d}tt|t	d}nt	}| j
j|d|d}| jjrGtd|rKdS |rRtd	q)
zABlock until at least one byte is read, or a timeout, or a cancel.FrD   NTpendingr   )r`   r'   operation cancelledr(   )rU   r   rK   hasattrr~   time	monotonicrg   rh   rp   socket_checkerselectrn   ro   r   r3   r'   )rU   r|   r   	timed_outreadable	remainingr'   r6   r6   r7   wait_for_read$  s*   
r   c           
   
   C  s  t |}t|}d}| j }z||k rzBtstr3t| | t r2|d ur2| 	t
|t  d n|d urDtt
|t  dt}nt}| 	| | j||d  }W n^ tyl   | jjrftdd tdd  tjy   | jjr|tdd tsts| js|d ur|t  dk r Y q ty }	 z| jjrtdd t|	tjkrW Y d }	~	q d }	~	ww |dkrtd||7 }||k sW | 	| |S W | 	| |S | 	| w )Nr   r   r(   rZ   )r[   rG   rU   r)   _PYPY_WINDOWSr   r   get_timeoutset_conn_timeoutrg   r   r   rh   rp   r\   rJ   rn   ro   r   r3   r'   is_sdamr]   r   errnoEINTR)
rU   rV   r|   r!   r^   ry   orig_timeoutshort_timeoutrz   r5   r6   r6   r7   receive_dataE  sh   







-
-r   c                   @  s^   e Zd ZdddZedddZdddZdddZdddZedddZ	edddZ
dS )NetworkingInterfaceBaserU   r	   c                 C  
   || _ d S r=   rq   selfrU   r6   r6   r7   __init__     
z NetworkingInterfaceBase.__init__r#   c                 C     t r=   NotImplementedErrorr   r6   r6   r7   r)        z"NetworkingInterfaceBase.gettimeoutr'   float | Noner$   c                 C  r   r=   r   r   r'   r6   r6   r7   r*        z"NetworkingInterfaceBase.settimeoutc                 C  r   r=   r   r   r6   r6   r7   close  r   zNetworkingInterfaceBase.closeboolc                 C  r   r=   r   r   r6   r6   r7   
is_closing  r   z"NetworkingInterfaceBase.is_closingc                 C  r   r=   r   r   r6   r6   r7   get_conn  r   z NetworkingInterfaceBase.get_connc                 C  r   r=   r   r   r6   r6   r7   r     r   zNetworkingInterfaceBase.sockN)rU   r	   )r#   r	   r'   r   r#   r$   r#   r   )__name__
__module____qualname__r   propertyr)   r*   r   r   r   r   r6   r6   r6   r7   r     s    



r   c                      sf   e Zd Zd fddZedddZdddZdddZdddZedddZ	edddZ
  ZS )AsyncNetworkingInterfacerU   !tuple[Transport, PyMongoProtocol]c                      t  | d S r=   superr   r   	__class__r6   r7   r        z!AsyncNetworkingInterface.__init__r#   r   c                 C  s   | j d jS N   rU   r)   r   r6   r6   r7   r)     s   z#AsyncNetworkingInterface.gettimeoutr'   r$   c                 C  s   | j d | d S r   rU   r*   r   r6   r6   r7   r*     s   z#AsyncNetworkingInterface.settimeoutc                   s(   | j d   | j d  I d H  d S r   )rU   r   wait_closedr   r6   r6   r7   r     s   zAsyncNetworkingInterface.closer   c                 C  s   | j d  S )Nr   rU   r   r   r6   r6   r7   r     rm   z#AsyncNetworkingInterface.is_closingPyMongoProtocolc                 C  s
   | j d S r   rq   r   r6   r6   r7   r     s   
z!AsyncNetworkingInterface.get_connrw   c                 C  s   | j d dS )Nr   r3   )rU   get_extra_infor   r6   r6   r7   r     s   zAsyncNetworkingInterface.sock)rU   r   r#   r   r   r#   r$   r   )r#   r   )r#   rw   )r   r   r   r   r   r)   r*   r   r   r   r   __classcell__r6   r6   r   r7   r     s    


r   c                      sv   e Zd Zd fddZdddZdddZd ddZd!ddZed"ddZ	ed"ddZ
d#ddZd$ddZ  ZS )%NetworkingInterfacerU   r    c                   r   r=   r   r   r   r6   r7   r     r   zNetworkingInterface.__init__r#   r   c                 C  
   | j  S r=   r   r   r6   r6   r7   r)     r   zNetworkingInterface.gettimeoutr'   r$   c                 C  s   | j | d S r=   r   r   r6   r6   r7   r*     r   zNetworkingInterface.settimeoutc                 C  s   | j   d S r=   )rU   r   r   r6   r6   r7   r     rm   zNetworkingInterface.closer   c                 C  r   r=   r   r   r6   r6   r7   r     r   zNetworkingInterface.is_closingc                 C     | j S r=   rq   r   r6   r6   r7   r        zNetworkingInterface.get_connc                 C  r   r=   rq   r   r6   r6   r7   r     r   zNetworkingInterface.sockrW   c                 C  r   r=   )rU   rK   r   r6   r6   r7   rK     r   zNetworkingInterface.filenobufferbytes | memoryviewc                 C  s   | j |S r=   )rU   r\   )r   r   r6   r6   r7   r\     s   zNetworkingInterface.recv_into)rU   r    r   r   r   r   )r#   r    )r#   rW   )r   r   r#   rW   )r   r   r   r   r)   r*   r   r   r   r   r   rK   r\   r   r6   r6   r   r7   r     s    




r   c                   @  s   e Zd Zd3d4ddZd5d	d
Zed6ddZd7ddZd8ddZd9ddZ	d:ddZ
d;d!d"Zd<d$d%Zd=d'd(Zd3d>d+d,Zd3d>d-d.Zd3d>d/d0Zd?d1d2ZdS )@r   Nr'   r}   c                 C  s   d | _ ttd| _d| _ttd| _d| _d | _d| _d| _	d| _
d| _d| _d| _d | _|| _d| _d | _t| _d | _t  | _t | _t | _d S )N   r   	   TF)	transportrG   r[   _header_header_index_compression_header_compression_index_message_message_index_expecting_header_expecting_compression_message_size_op_code_connection_lost_read_waiter_timeout_is_compressed_compressor_idr   _max_message_size_response_tor+   r,   rL   _closedcollectionsdeque_pending_messages_done_messagesr   r6   r6   r7   r     s*   
zPyMongoProtocol.__init__r   r#   r$   c                 C  r   r=   r   r   r6   r6   r7   r*     r   zPyMongoProtocol.settimeoutc                 C  r   )zGThe configured timeout for the socket that underlies our protocol pair.r   r   r6   r6   r7   r)     s   zPyMongoProtocol.gettimeoutr   r   c                 C  s   || _ | j tt dS )zCalled exactly once when a connection is made.
        The transport argument is the transport representing the write side of the connection.
        N)r   set_write_buffer_limitsr   )r   r   r6   r6   r7   connection_made  s   zPyMongoProtocol.connection_mademessager"   c                   s.   | j  r
td| j | | j   dS )z/Write a message to this connection's transport.zConnection is closedN)r   r   r]   writeresume_reading)r   r   r6   r6   r7   r     s
   
zPyMongoProtocol.write
request_idOptional[int]max_message_sizerW   tuple[bytes, int]c           	   	     s  | j rz| j   W n ty   tddw || _| jr'| j I dH }n8| j r3| j  r3tdt	 
 }| j| z|I dH }W || jv rQ| j| n|| jv r^| j| w w |r|\}}}}|dury||krytd|d||durt||}||fS td)zARead a single MongoDB Wire Protocol message from this connection.zconnection is already closedNGot response id  but expected rZ   )r   r   AttributeErrorr]   r   r   popleftr   r+   r,   rL   r   appendremover   r   )	r   r   r   r   read_waiterop_codecompressor_idresponse_todatar6   r6   r7   r`   	  sB   



zPyMongoProtocol.readsizehintrG   c                 C  s\   | j r| jsttd| _| jS | jr| j| jd S | jr&| j| j	d S | j| j
d S )a8  Called to allocate a new receive buffer.
        The asyncio loop calls this method expecting to receive a non-empty buffer to fill with data.
        If any data does not fit into the returned buffer, this method will be called again until
        either no data remains or an empty buffer is returned.
        i @  N)r   r   rG   r[   r   r   r   r   r   r   r   )r   r   r6   r6   r7   
get_buffer+  s   	zPyMongoProtocol.get_buffernbytesc              
   C  s  |dkr|  td dS | jrdS | jrU|  j|7  _| jdkrSd| _z|  \| _| _| _| _	W n t
yJ } z|  | W Y d}~dS d}~ww tt| j| _dS | j	rq|  j|7  _| jdkrod| _	|  \| _| _dS |  j|7  _| j| jkrd| _| j  | jr| j }nt  }| r|  d dS || j| j| j| jf | j| d| _d| _d| _d| _d| _d| _d| _d| _dS dS )z9Called when the buffer was updated with the received datar   rZ   Nr   Fr   T)r   r]   r   r   r   process_headerr   r   r   r   r   rG   r[   r   r   process_compression_headerr   r   r   pause_readingr   r   r+   r,   rL   r?   r@   r   r   )r   r   r5   resultr6   r6   r7   buffer_updated@  sh   





zPyMongoProtocol.buffer_updatedtuple[int, int, int, bool]c                 C  s   t | j\}}}}d}|dkr!|dkrtd|dd}|d8 }|dkr-td|d	|| jkr>td|d
| jd|d |||fS )z&Unpack a MongoDB Wire Protocol header.F     Message length (zA) not longer than standard OP_COMPRESSED message header size (25)Tr   r   3) not longer than standard message header size (16)*) is larger than server max message size ())_UNPACK_HEADERr   r   r   )r   rV   _r   r   expecting_compressionr6   r6   r7   r   {  s(   


zPyMongoProtocol.process_headertuple[int, int]c                 C  s   t | j\}}}||fS )z2Unpack a MongoDB Wire Protocol compression header.)_UNPACK_COMPRESSION_HEADERr   )r   r   r  r   r6   r6   r7   r     s   z*PyMongoProtocol.process_compression_headerr5   Optional[Exception]c                 C  sJ   t | j}|D ]}| s|d u r|d  n|| | j| qd S r=   )listr   r?   r@   set_exceptionr   r   )r   r5   r~   msgr6   r6   r7   _resolve_pending_messages  s   

z)PyMongoProtocol._resolve_pending_messagesc                 C  s   | j   | | d| _d S )NT)r   abortr
  r   r   r5   r6   r6   r7   r     s   


zPyMongoProtocol.closec                 C  s(   |  | | j s| jd  d S d S r=   )r
  r   r?   r@   r  r6   r6   r7   connection_lost  s   

zPyMongoProtocol.connection_lostc                   s   | j I d H  d S r=   )r   r   r6   r6   r7   r     s   zPyMongoProtocol.wait_closedr=   )r'   r}   r   r   )r   r   r#   r$   )r   r"   r#   r$   )r   r   r   rW   r#   r   )r   rW   r#   rG   )r   rW   r#   r$   )r#   r   )r#   r  )r5   r  r#   r$   r   )r   r   r   r   r*   r   r)   r   r   r`   r   r   r   r   r
  r   r  r   r6   r6   r6   r7   r     s     




"

;

r   c              
     sL   zt j| || jdI d H  W d S  t jy% } ztd|d }~ww )Nr&   r(   )r+   r/   r   r)   r2   r3   r'   )rU   r!   r5   r6   r6   r7   async_sendall  s   "r  r   r   r   Union[_OpReply, _OpMsg]c              	     sZ  | j j}t rt }n|rt | }nd}|r$t|t  d}tt	| }t| j j
||}||g}zZtj||tjdI dH \}}	|	D ]}
|
  qI|	rZt|	I dH  t|dkretd||v r| \}}zt| }W n ty   td|dt dw ||W S td tjy   |D ]}
|
  qt|I dH   w )1Receive a raw BSON message or raise socket.error.Nr   )r'   return_whenr(   Got opcode r   r   )rU   r)   r   r   get_deadliner   r   rg   r   rr   r   r`   r+   waitFIRST_COMPLETEDcancelrH   r3   r'   r   r   KeyErrorr   keysr   CancelledError)rU   r   r   r'   r|   cancellation_task	read_tasktasksr?   r~   taskr   r   unpack_replyr6   r6   r7   async_receive_message  sR   




r  c              	   C  s&  t  r	t  }n| j }|rt | }nd}tt| d|\}}}}|dur7||kr7t	d|d||dkrCt	d|d||krRt	d|d|d|d	krmt
t| d
|\}}}	tt| |d ||	}
nt| |d |}
z	t| }W ||
S  ty   t	d|dt dw )r  Nr   r   r   r   r   r   r   r   r   r   r  )r   r   r  rU   r)   r   r   r  r   r   r  r   r   r  r  )rU   r   r   r|   r'   rV   r  r   r   r   r   r  r6   r6   r7   receive_message  sD   



r   )r   r    r!   r"   r#   r$   )r   r    r!   r"   r4   r   r#   r$   )F)
rU   r   rV   rW   r4   r   rX   rY   r#   rG   )r   r    r!   r"   rb   r   r#   r$   )
rU   r   rV   rW   rb   r   rX   rY   r#   rG   )rU   r   r#   r$   )r   r    rV   rW   r#   rG   )rU   rw   rV   rW   r4   r   r#   rG   )rU   r   r|   r}   r#   r$   )rU   r   rV   rW   r|   r}   r#   rG   )rU   r   r!   r"   r#   r$   )rU   r   r   r   r   rW   r#   r  )rU   r   r   r   r   rW   r#   r  )Q__doc__
__future__r   r+   r   r   r3   structsysr   r   r   r   r   r   typingr   r	   r
   r   pymongor   r   pymongo._asyncio_taskr   pymongo.commonr   pymongo.compression_supportr   pymongo.errorsr   r   pymongo.messager   r   r   pymongo.socket_checkerr   sslr   r   r-   ImportErrorpymongo.pyopenssl_contextr   rQ   pymongo.ssl_supportr   r   r   pymongo.asynchronous.poolr   pymongo.synchronous.poolr   Structunpackr  r  rp   BlockingIOErrorrJ   r8   platformr0   ra   rl   rr   rv   rs   versionr   r   r   r   r   r   r   r   r  r  r   r6   r6   r6   r7   <module>   s   


,
6







!? 
X4