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_sslsock_sendallTimeoutErrorsocketr'   )r   r!   r'   loopexc r6   Q/var/www/html/olx_land/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   futr   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sentrA   r5   fdr:   r6   r6   r7   r0   ]   sH   





r0   connr   lengthintonceOptional[bool]rF   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=   r@   r6   r6   r7   rA      rB   z,_async_socket_receive_ssl.<locals>._is_readyconnection closedrC   rD   rE   )rF   	bytearray	recv_intoOSErrorrI   rJ   r   r.   r   rK   rL   rM   r   rN   rO   rP   r   )rT   rU   r4   rW   mv
total_readrA   readr5   rS   r:   r6   r6   r7   _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?)rF   rG   rH   rI   r+   sleepmaxmin)r   r!   ra   rQ   total_length
total_sentbackoffrR   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   rb   rY   rc   rd   )	rF   rZ   r[   r\   rI   r+   re   rf   rg   )rT   rU   ra   rW   r]   r^   rj   r_   r6   r6   r7   r`      s,   c                 C  s   |  | d S r<   )sendall)r   r!   r6   r6   r7   rk         rk   r   c                   s"   	 | j jrd S ttI d H  qr<   )cancel_context	cancelledr+   re   _POLL_TIMEOUTrT   r6   r6   r7   _poll_cancellation   s   rq   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)rW   r&   r(   )r)   r*   r+   r,   r-   r.   r   r   r/   r`   _async_socket_receiver2   r3   r'   )r   rU   sock_timeoutr'   r4   errr6   r6   r7   async_receive_data_socket   s,   

ru   socket.socketc                   sX   t t|}d}||k r*|| ||d  I d H }|dkr"td||7 }||k s|S )Nr   rY   )rF   rZ   sock_recv_intor\   )rT   rU   r4   r]   
bytes_readchunk_lengthr6   r6   r7   rr     s   rr   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.FrC   NTpendingr   )r_   r'   operation cancelledr(   )rT   r   rJ   hasattrr}   time	monotonicrf   rg   ro   socket_checkerselectrm   rn   r   r3   r'   )rT   r{   r   	timed_outreadable	remainingr'   r6   r6   r7   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(   rY   )rZ   rF   rT   r)   _PYPYr   r   get_timeoutset_conn_timeoutrf   r   r   rg   ro   r[   rI   rm   rn   r   r3   r'   r\   r   errnoEINTR)
rT   rU   r{   r!   r]   rx   orig_timeoutshort_timeoutry   r5   r6   r6   r7   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 )NetworkingInterfaceBaserT   r	   c                 C  
   || _ d S r<   rp   selfrT   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)rT   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 )AsyncNetworkingInterfacerT   !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   rT   r)   r   r6   r6   r7   r)     s   z#AsyncNetworkingInterface.gettimeoutr'   r$   c                 C  s   | j d | d S r   rT   r*   r   r6   r6   r7   r*     s   z#AsyncNetworkingInterface.settimeoutc                   s(   | j d   | j d  I d H  d S r   )rT   r   wait_closedr   r6   r6   r7   r     s   zAsyncNetworkingInterface.closer   c                 C  s   | j d  S )Nr   rT   r   r   r6   r6   r7   r     rl   z#AsyncNetworkingInterface.is_closingPyMongoProtocolc                 C  s
   | j d S r   rp   r   r6   r6   r7   r     s   
z!AsyncNetworkingInterface.get_connrv   c                 C  s   | j d dS )Nr   r3   )rT   get_extra_infor   r6   r6   r7   r     s   zAsyncNetworkingInterface.sock)rT   r   r#   r   r   r#   r$   r   )r#   r   )r#   rv   )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 )%NetworkingInterfacerT   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<   )rT   r   r   r6   r6   r7   r     rl   zNetworkingInterface.closer   c                 C  r   r<   r   r   r6   r6   r7   r     r   zNetworkingInterface.is_closingc                 C     | j S r<   rp   r   r6   r6   r7   r        zNetworkingInterface.get_connc                 C  r   r<   rp   r   r6   r6   r7   r     r   zNetworkingInterface.sockrV   c                 C  r   r<   )rT   rJ   r   r6   r6   r7   rJ     r   zNetworkingInterface.filenobufferr"   c                 C  s   | j |S r<   )rT   r[   )r   r   r6   r6   r7   r[     s   zNetworkingInterface.recv_into)rT   r    r   r   r   r   )r#   r    )r#   rV   )r   r"   r#   rV   )r   r   r   r   r)   r*   r   r   r   r   r   rJ   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)	transportrF   rZ   _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,   rK   _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_sizerV   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 rY   )r   r   AttributeErrorr\   r   r   popleftr   r+   r,   rK   r   appendremover   r   )	r   r   r   r   read_waiterop_codecompressor_idresponse_todatar6   r6   r7   r_     sB   



zPyMongoProtocol.readsizehintrF   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   rF   rZ   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   rY   Nr   Fr   T)r   r\   r   r   r   process_headerr   r   r   r   r   rF   rZ   r   r   process_compression_headerr   r   r   pause_readingr   r   r+   r,   rK   r>   r?   r   r   )r   r   r5   resultr6   r6   r7   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   rU   _r   r   expecting_compressionr6   r6   r7   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   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   rV   r#   r   )r   rV   r#   rF   )r   rV   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'   )rT   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~   )rT   r)   r   r   get_deadliner   r   rf   r   rq   r   r_   r+   waitFIRST_COMPLETEDcancelrG   r3   r'   r   r   KeyErrorr   keysr   CancelledError)rT   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  rT   r)   r   r   r   r   r   r  r   r   r  r  )rT   r   r   r{   r'   rU   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)
rT   r   rU   rV   r4   r   rW   rX   r#   rF   )r   r    r!   r"   ra   r   r#   r$   )
rT   r   rU   rV   ra   r   rW   rX   r#   rF   )rT   r   r#   r$   )r   r    rU   rV   r#   rF   )rT   rv   rU   rV   r4   r   r#   rF   )rT   r   r{   r|   r#   r$   )rT   r   rU   rV   r{   r|   r#   rF   )rT   r   r!   r"   r#   r$   )rT   r   r   r   r   rV   r#   r  )rT   r   r   r   r   rV   r#   r  )P__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   rP   pymongo.ssl_supportr   r   r   pymongo.asynchronous.poolr   pymongo.synchronous.poolr   Structunpackr   r  ro   BlockingIOErrorrI   r8   platformr0   r`   rk   rq   ru   rr   versionr   r   r   r   r   r   r   r
  r  r  r6   r6   r6   r7   <module>   s   


,
6






!8 
X4