o
    hbs                     @  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 ZFd]d>d?ZGd^d@dAZHG dBdC dCZIG dDdE dEeIZJG dFdG dGeIZKG dHdI dIeZLd_dJdKZMefd`dPdQZNefdadRdSZOd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_sslZsock_sendallTimeoutErrorsocketr'   )r   r!   r'   loopexc r5   H/var/www/html/venv/lib/python3.10/site-packages/pymongo/network_layer.pyasync_socket_sendallK   s   
r7   win32r3   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   futr   r#   r$   c                 S     |   rd S | d  d S Ndone
set_resultr9   r5   r5   r6   	_is_readyc      z,_async_socket_sendall_ssl.<locals>._is_ready!Underlying socket has been closedr9   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!   r3   viewsentr@   r4   fdr9   r5   r5   r6   r0   ]   sH   





r0   connr   lengthintonceOptional[bool]rE   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   r9   r   r#   r$   c                 S  r:   r;   r<   r?   r5   r5   r6   r@      rA   z,_async_socket_receive_ssl.<locals>._is_readyconnection closedrB   rC   rD   )rE   	bytearray	recv_intoOSErrorrH   rI   r   r.   r   rJ   rK   rL   r   rM   rN   rO   r   )rS   rT   r3   rV   mv
total_readr@   readr4   rR   r9   r5   r5   r6   _async_socket_receive_ssl   sT   





%r_   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?)rE   rF   rG   rH   r+   sleepmaxmin)r   r!   r`   rP   total_length
total_sentbackoffrQ   r5   r5   r6   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   ra   rX   rb   rc   )	rE   rY   rZ   r[   rH   r+   rd   re   rf   )rS   rT   r`   rV   r\   r]   ri   r^   r5   r5   r6   r_      s,   c                 C  s   |  | d S r;   )sendall)r   r!   r5   r5   r6   rj         rj   r   c                   s"   	 | j jrd S ttI d H  qr;   )cancel_context	cancelledr+   rd   _POLL_TIMEOUTrS   r5   r5   r6   _poll_cancellation   s   rp   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)rV   r&   r(   )r)   r*   r+   r,   r-   r.   r   r   r/   r_   _async_socket_receiver1   r2   r'   )r   rT   sock_timeoutr'   r3   errr5   r5   r6   async_receive_data_socket   s,   

rt   socket.socketc                   sX   t t|}d}||k r*|| ||d  I d H }|dkr"td||7 }||k s|S )Nr   rX   )rE   rY   Zsock_recv_intor[   )rS   rT   r3   r\   
bytes_readchunk_lengthr5   r5   r6   rq     s   rq   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.FrB   NTpendingr   )r^   r'   operation cancelledr(   )rS   r   rI   hasattrr{   time	monotonicre   rf   rn   Zsocket_checkerselectrl   rm   r   r2   r'   )rS   ry   r   Z	timed_outreadable	remainingr'   r5   r5   r6   wait_for_read#  s*   
r   c           
   
   C  s  t |}t|}d}| j }z||k rz@tr1t| | t r0|d ur0| t	|t
  d n|d urBtt	|t
  dt}nt}| | | j||d  }W nM tyj   | jjrdtdd tdd  tjy   | jjrztdd t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(   rX   )rY   rE   rS   r)   _PYPYr   r   get_timeoutZset_conn_timeoutre   r~   r   rf   rn   rZ   rH   rl   rm   r   r2   r'   r[   r   errnoZEINTR)
rS   rT   ry   r!   r\   rv   orig_timeoutZshort_timeoutrw   r4   r5   r5   r6   receive_dataD  sZ   







&
&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 )NetworkingInterfaceBaserS   r	   c                 C  
   || _ d S r;   ro   selfrS   r5   r5   r6   __init__}     
z NetworkingInterfaceBase.__init__r#   c                 C     t r;   NotImplementedErrorr   r5   r5   r6   r)        z"NetworkingInterfaceBase.gettimeoutr'   float | Noner$   c                 C  r   r;   r   r   r'   r5   r5   r6   r*        z"NetworkingInterfaceBase.settimeoutc                 C  r   r;   r   r   r5   r5   r6   close  r   zNetworkingInterfaceBase.closeboolc                 C  r   r;   r   r   r5   r5   r6   
is_closing  r   z"NetworkingInterfaceBase.is_closingc                 C  r   r;   r   r   r5   r5   r6   get_conn  r   z NetworkingInterfaceBase.get_connc                 C  r   r;   r   r   r5   r5   r6   r     r   zNetworkingInterfaceBase.sockN)rS   r	   )r#   r	   r'   r   r#   r$   r#   r   )__name__
__module____qualname__r   propertyr)   r*   r   r   r   r   r5   r5   r5   r6   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 )AsyncNetworkingInterfacerS   !tuple[Transport, PyMongoProtocol]c                      t  | d S r;   superr   r   	__class__r5   r6   r        z!AsyncNetworkingInterface.__init__r#   r   c                 C  s   | j d jS N   rS   r)   r   r5   r5   r6   r)     s   z#AsyncNetworkingInterface.gettimeoutr'   r$   c                 C  s   | j d | d S r   rS   r*   r   r5   r5   r6   r*     s   z#AsyncNetworkingInterface.settimeoutc                   s(   | j d   | j d  I d H  d S r   )rS   r   wait_closedr   r5   r5   r6   r     s   zAsyncNetworkingInterface.closer   c                 C  s   | j d  S )Nr   rS   r   r   r5   r5   r6   r     rk   z#AsyncNetworkingInterface.is_closingPyMongoProtocolc                 C  s
   | j d S r   ro   r   r5   r5   r6   r     s   
z!AsyncNetworkingInterface.get_connru   c                 C  s   | j d dS )Nr   r2   )rS   Zget_extra_infor   r5   r5   r6   r     s   zAsyncNetworkingInterface.sock)rS   r   r#   r   r   r#   r$   r   )r#   r   )r#   ru   )r   r   r   r   r   r)   r*   r   r   r   r   __classcell__r5   r5   r   r6   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 )%NetworkingInterfacerS   r    c                   r   r;   r   r   r   r5   r6   r     r   zNetworkingInterface.__init__r#   r   c                 C  
   | j  S r;   r   r   r5   r5   r6   r)     r   zNetworkingInterface.gettimeoutr'   r$   c                 C  s   | j | d S r;   r   r   r5   r5   r6   r*     r   zNetworkingInterface.settimeoutc                 C  s   | j   d S r;   )rS   r   r   r5   r5   r6   r     rk   zNetworkingInterface.closer   c                 C  r   r;   r   r   r5   r5   r6   r     r   zNetworkingInterface.is_closingc                 C     | j S r;   ro   r   r5   r5   r6   r        zNetworkingInterface.get_connc                 C  r   r;   ro   r   r5   r5   r6   r     r   zNetworkingInterface.sockrU   c                 C  r   r;   )rS   rI   r   r5   r5   r6   rI     r   zNetworkingInterface.filenobufferr"   c                 C  s   | j |S r;   )rS   rZ   )r   r   r5   r5   r6   rZ     s   zNetworkingInterface.recv_into)rS   r    r   r   r   r   )r#   r    )r#   rU   )r   r"   r#   rU   )r   r   r   r   r)   r*   r   r   r   r   r   rI   rZ   r   r5   r5   r   r6   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'   rz   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)	transportrE   rY   _header_header_index_compression_header_compression_index_message_message_index_expecting_header_expecting_compression_message_size_op_code_connection_lostZ_read_waiter_timeoutZ_is_compressed_compressor_idr   _max_message_size_response_tor+   r,   rJ   _closedcollectionsdeque_pending_messages_done_messagesr   r5   r5   r6   r     s*   
zPyMongoProtocol.__init__r   r#   r$   c                 C  r   r;   r   r   r5   r5   r6   r*     r   zPyMongoProtocol.settimeoutc                 C  r   )zGThe configured timeout for the socket that underlies our protocol pair.r   r   r5   r5   r6   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   Zset_write_buffer_limitsr   )r   r   r5   r5   r6   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   r5   r5   r6   r     s
   
zPyMongoProtocol.write
request_idOptional[int]max_message_sizerU   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 rX   )r   r   AttributeErrorr[   r   r   popleftr   r+   r,   rJ   r   appendremover   r   )	r   r   r   r   Zread_waiterop_codecompressor_idresponse_todatar5   r5   r6   r^     sB   



zPyMongoProtocol.readsizehintrE   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   rE   rY   r   r   r   r   r   r   r   )r   r   r5   r5   r6   
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   rX   Nr   Fr   T)r   r[   r   r   r   process_headerr   r   r   r   r   rE   rY   r   r   process_compression_headerr   r   r   Zpause_readingr   r   r+   r,   rJ   r=   r>   r   r   )r   r   r4   resultr5   r5   r6   buffer_updated8  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   rT   _r   r   Zexpecting_compressionr5   r5   r6   r   s  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   r5   r5   r6   r     s   z*PyMongoProtocol.process_compression_headerr4   Optional[Exception]c                 C  sJ   t | j}|D ]}| s|d u r|d  n|| | j| qd S r;   )listr   r=   r>   Zset_exceptionr   r   )r   r4   r{   msgr5   r5   r6   _resolve_pending_messages  s   

z)PyMongoProtocol._resolve_pending_messagesc                 C  s   | j   | | d| _d S )NT)r   abortr   r   r   r4   r5   r5   r6   r     s   


zPyMongoProtocol.closec                 C  s(   |  | | j s| jd  d S d S r;   )r   r   r=   r>   r   r5   r5   r6   connection_lost  s   

zPyMongoProtocol.connection_lostc                   s   | j I d H  d S r;   )r   r   r5   r5   r6   r     s   zPyMongoProtocol.wait_closedr;   )r'   rz   r   r   )r   r   r#   r$   )r   r"   r#   r$   )r   r   r   rU   r#   r   )r   rU   r#   rE   )r   rU   r#   r$   )r#   r   )r#   r   )r4   r   r#   r$   r   )r   r   r   r   r*   r   r)   r   r   r^   r   r   r   r   r   r   r   r   r5   r5   r5   r6   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)   r1   r2   r'   )rS   r!   r4   r5   r5   r6   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'   Zreturn_whenr(   Got opcode r   r|   )rS   r)   r   r   get_deadliner~   r   re   r   rp   r   r^   r+   waitZFIRST_COMPLETEDcancelrF   r2   r'   r   r   KeyErrorr   keysr   ZCancelledError)rS   r   r   r'   ry   Zcancellation_taskZ	read_tasktasksr=   r{   taskr   r   unpack_replyr5   r5   r6   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   rS   r)   r~   r   r   r   r   r   r   r   r  r  )rS   r   r   ry   r'   rT   r   r   r   r   r   r  r5   r5   r6   receive_message  sD   



r  )r   r    r!   r"   r#   r$   )r   r    r!   r"   r3   r   r#   r$   )F)
rS   r   rT   rU   r3   r   rV   rW   r#   rE   )r   r    r!   r"   r`   r   r#   r$   )
rS   r   rT   rU   r`   r   rV   rW   r#   rE   )rS   r   r#   r$   )r   r    rT   rU   r#   rE   )rS   ru   rT   rU   r3   r   r#   rE   )rS   r   ry   rz   r#   r$   )rS   r   rT   rU   ry   rz   r#   rE   )rS   r   r!   r"   r#   r$   )rS   r   r   r   r   rU   r#   r   )rS   r   r   r   r   rU   r#   r   )P__doc__
__future__r   r+   r   r   r2   structsysr~   r   r   r   r   r   typingr   r	   r
   r   Zpymongor   r   Zpymongo._asyncio_taskr   Zpymongo.commonr   Zpymongo.compression_supportr   Zpymongo.errorsr   r   Zpymongo.messager   r   r   Zpymongo.socket_checkerr   sslr   r   r-   ImportErrorZpymongo.pyopenssl_contextr   rO   Zpymongo.ssl_supportr   r   r   Zpymongo.asynchronous.poolr   Zpymongo.synchronous.poolr   Structunpackr   r   rn   BlockingIOErrorrH   r7   platformr0   r_   rj   rp   rt   rq   versionr   r   r   r   r   r   r   r   r  r  r5   r5   r5   r6   <module>   s   


,
6






!8 
X4