a
    xd8                  	   @   s   d dl Z d dlmZ d dlZddlmZ ddlmZm	Z	 ddl
mZmZ dZe je jhZedd	 ZG d
d dee	dZg dZe ZeD ],Zzeee e W q ey   Y q0 qG dd dee e	dZdS )    N)contextmanager   )socket)ConflictDetectorFinal)HalfCloseableStreamListeneri   c               
   c   s^   z
d V  W nN t yX }  z6| jtv r2tdd ntd| | W Y d } ~ n
d } ~ 0 0 d S )Nzthis socket was already closedzsocket connection broken: {})OSErrorerrno_closed_stream_errnostrioClosedResourceErrorZBrokenResourceErrorformat)exc r   N/var/www/html/Ranjet/env/lib/python3.9/site-packages/trio/_highlevel_socket.py)_translate_socket_errors_to_stream_errors   s    

r   c                   @   sT   e Zd ZdZdd Zdd Zdd Zdd	 ZdddZdd Z	dd Z
dddZd
S )SocketStreamuf  An implementation of the :class:`trio.abc.HalfCloseableStream`
    interface based on a raw network socket.

    Args:
      socket: The Trio socket object to wrap. Must have type ``SOCK_STREAM``,
          and be connected.

    By default for TCP sockets, :class:`SocketStream` enables ``TCP_NODELAY``,
    and (on platforms where it's supported) enables ``TCP_NOTSENT_LOWAT`` with
    a reasonable buffer size (currently 16 KiB) – see `issue #72
    <https://github.com/python-trio/trio/issues/72>`__ for discussion. You can
    of course override these defaults by calling :meth:`setsockopt`.

    Once a :class:`SocketStream` object is constructed, it implements the full
    :class:`trio.abc.HalfCloseableStream` interface. In addition, it provides
    a few extra features:

    .. attribute:: socket

       The Trio socket object that this stream wraps.

    c                 C   s   t |tjstd|jtjkr(td|| _td| _	z| 
tjtjd W n ty`   Y n0 ttdrz| 
tjtjd W n ty   Y n0 d S )Nz*SocketStream requires a Trio socket objectz*SocketStream requires a SOCK_STREAM socketz;another task is currently sending data on this SocketStreamTTCP_NOTSENT_LOWATi @  )
isinstancetsocket
SocketType	TypeErrortypeSOCK_STREAM
ValueErrorr   r   _send_conflict_detector
setsockoptIPPROTO_TCPTCP_NODELAYr	   hasattrr   )selfr   r   r   r   __init__>   s"    

zSocketStream.__init__c                    s<  | j jrtd| j t  t|}|s| j  dkrJtdtj	 I d H  W d    W d    W d    d S d}|t
|k r||d  "}| j |I d H }W d    n1 s0    Y  ||7 }qW d    n1 s0    Y  W d    n1 s0    Y  W d    n1 s.0    Y  d S )Nz!can't send data after sending EOFzsocket was already closedr   )r   did_shutdown_SHUT_WRr   r   r   r   
memoryviewfilenolowlevel
checkpointlensend)r!   data
total_sent	remainingsentr   r   r   send_all`   s    



(0zSocketStream.send_allc              	      st   | j Z | j dkrtjt   | j I d H  W d    n1 sH0    Y  W d    n1 sf0    Y  d S )Nr#   )r   r   r&   r   r   r   Zwait_writabler!   r   r   r   wait_send_all_might_not_blockq   s
    z*SocketStream.wait_send_all_might_not_blockc              	      s   | j l tj I d H  | jjr0W d    d S t  | jtj	 W d    n1 sZ0    Y  W d    n1 sx0    Y  d S N)
r   r   r'   r(   r   r$   r   shutdownr   SHUT_WRr0   r   r   r   send_eofx   s    zSocketStream.send_eofNc                    sX   |d u rt }|dk rtdt " | j|I d H W  d    S 1 sJ0    Y  d S )Nr   zmax_bytes must be >= 1)DEFAULT_RECEIVE_SIZEr   r   r   recv)r!   Z	max_bytesr   r   r   receive_some   s    zSocketStream.receive_somec                    s   | j   tj I d H  d S r2   r   closer   r'   r(   r0   r   r   r   aclose   s    
zSocketStream.aclosec                 C   s   | j |||S )zlSet an option on the underlying socket.

        See :meth:`socket.socket.setsockopt` for details.

        )r   r   )r!   leveloptionvaluer   r   r   r      s    zSocketStream.setsockoptr   c                 C   s*   |dkr| j ||S | j |||S dS )zCheck the current value of an option on the underlying socket.

        See :meth:`socket.socket.getsockopt` for details.

        r   N)r   
getsockopt)r!   r<   r=   Z
buffersizer   r   r   r?      s    	zSocketStream.getsockopt)N)r   )__name__
__module____qualname____doc__r"   r/   r1   r5   r8   r;   r   r?   r   r   r   r   r   &   s   "

r   )	metaclass)EPERMECONNABORTEDZEPROTOZENETDOWNZENOPROTOOPTZ	EHOSTDOWNZENONETZEHOSTUNREACH
EOPNOTSUPPZENETUNREACHZENOSRZESOCKTNOSUPPORTZEPROTONOSUPPORTZ	ETIMEDOUT
ECONNRESETc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	SocketListenera  A :class:`~trio.abc.Listener` that uses a listening socket to accept
    incoming connections as :class:`SocketStream` objects.

    Args:
      socket: The Trio socket object to wrap. Must have type ``SOCK_STREAM``,
          and be listening.

    Note that the :class:`SocketListener` "takes ownership" of the given
    socket; closing the :class:`SocketListener` will also close the socket.

    .. attribute:: socket

       The Trio socket object that this stream wraps.

    c                 C   sf   t |tjstd|jtjkr(tdz|tjtj	}W n t
yN   Y n0 |s\td|| _d S )Nz,SocketListener requires a Trio socket objectz,SocketListener requires a SOCK_STREAM socketz*SocketListener requires a listening socket)r   r   r   r   r   r   r   r?   
SOL_SOCKETSO_ACCEPTCONNr	   r   )r!   r   Z	listeningr   r   r   r"   O  s    zSocketListener.__init__c              
      sh   z| j  I dH \}}W n@ tyX } z(|jtv r8tj|jtvrD W Y d}~q d}~0 0 t|S q dS )a#  Accept an incoming connection.

        Returns:
          :class:`SocketStream`

        Raises:
          OSError: if the underlying call to ``accept`` raises an unexpected
              error.
          ClosedResourceError: if you already closed the socket.

        This method handles routine errors like ``ECONNABORTED``, but passes
        other errors on to its caller. In particular, it does *not* make any
        special effort to handle resource exhaustion errors like ``EMFILE``,
        ``ENFILE``, ``ENOBUFS``, ``ENOMEM``.

        N)	r   acceptr	   r
   r   r   r   _ignorable_accept_errnosr   )r!   sock_r   r   r   r   rL   _  s    

zSocketListener.acceptc                    s   | j   tj I dH  dS )z.Close this listener and its underlying socket.Nr9   r0   r   r   r   r;   {  s    
zSocketListener.acloseN)r@   rA   rB   rC   r"   rL   r;   r   r   r   r   rI   >  s   rI   )r
   
contextlibr   r    r   r   Z_utilr   r   abcr   r   r6   EBADFENOTSOCKr   r   r   Z_ignorable_accept_errno_namessetrM   nameaddgetattrAttributeErrorrI   r   r   r   r   <module>   s*   
 z