o
    Oh>                  	   @  s\  U d dl mZ d dlZd dlmZmZ d dlmZ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 erCd d	lmZ dd
lmZ d dlZejdkrSd dlmZ ner[d dlmZ dZejejhZedddZeG dd deZ g dZ!e" Z#de$d< e!D ]Z%ee& e#'e(ee% W d   n1 sw   Y  qeG dd dee  Z)dS )    )annotationsN)contextmanagersuppress)TYPE_CHECKINGoverload   )socket)ConflictDetectorfinal)HalfCloseableStreamListener)	Generator)
SocketType)      )Bufferi   returnGenerator[None, None, None]c               
   c  sP    zd V  W d S  t y' }  z| jtv rtdd td|  | d } ~ ww )Nzthis socket was already closedzsocket connection broken: )OSErrorerrno_closed_stream_errnostrioClosedResourceErrorBrokenResourceError)exc r   S/home/air/yokohama/back/venv/lib/python3.10/site-packages/trio/_highlevel_socket.py)_translate_socket_errors_to_stream_errors+   s   
r   c                   @  s   e Zd ZdZd*ddZd+d
dZd,ddZd,ddZd-d.ddZd,ddZ	e
d/ddZe
d0d dZ	d-d1d"dZe
d2d#d$Ze
d3d&d$Zd4d5d)d$ZdS )6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.

    r   r   r   Nonec                 C  s   t |tjs
td|jtjkrtd|| _td| _	t
t | tjtjd W d    n1 s4w   Y  ttdr^t
t | tjtjd W d    d S 1 sWw   Y  d S 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tsocketr   	TypeErrortypeSOCK_STREAM
ValueErrorr   r	   _send_conflict_detectorr   r   
setsockoptIPPROTO_TCPTCP_NODELAYhasattrr    )selfr   r   r   r   __init__O   s    



"zSocketStream.__init__databytes | bytearray | memoryviewc                   sV  | j jr
td| j t x t|d}|sB| j  dkr%tdtj	 I d H  	 W d    W d    W d    d S d}|t
|k rs||d  }| j |I d H }W d    n1 sdw   Y  ||7 }|t
|k sJW d    n1 s}w   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   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,   r.   
total_sent	remainingsentr   r   r   send_allm   s8   


"zSocketStream.send_allc              	     s   | j 6 | j dkrtjt  | j I d H  W d    n1 s%w   Y  W d    d S W d    d S 1 s=w   Y  d S )Nr0   )r'   r   r3   r   r   r   wait_writabler,   r   r   r   wait_send_all_might_not_block~   s   "z*SocketStream.wait_send_all_might_not_blockc              	     s   | j @ tj I d H  | jjr	 W d    d S t  | jtj	 W d    n1 s/w   Y  W d    d S W d    d S 1 sGw   Y  d S N)
r'   r   r4   r5   r   r1   r   shutdownr"   SHUT_WRr=   r   r   r   send_eof   s   "zSocketStream.send_eofN	max_bytes
int | Nonebytesc                   sZ   |d u rt }|dk rtdt  | j|I d H W  d    S 1 s&w   Y  d S )Nr   zmax_bytes must be >= 1)DEFAULT_RECEIVE_SIZEr&   r   r   recv)r,   rC   r   r   r   receive_some   s   $zSocketStream.receive_somec                   s    | j   tj I d H  d S r?   r   closer   r4   r5   r=   r   r   r   aclose   s   
zSocketStream.acloselevelintoptionvalueint | Bufferc                 C     d S r?   r   )r,   rL   rN   rO   r   r   r   r(         zSocketStream.setsockoptlengthc                 C  rQ   r?   r   r,   rL   rN   rO   rS   r   r   r   r(      rR   int | Buffer | Nonec                 C  sR   |du r|du rt d| j|||S |dur t d|d| j||||S )zlSet an option on the underlying socket.

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

        NzKinvalid value for argument 'value', must not be None when specifying lengthz$invalid value for argument 'value': z%, must be None when specifying optlen)r#   r   r(   rT   r   r   r   r(      s   
c                 C  rQ   r?   r   )r,   rL   rN   r   r   r   
getsockopt   rR   zSocketStream.getsockopt
buffersizec                 C  rQ   r?   r   r,   rL   rN   rW   r   r   r   rV      rR   r   int | bytesc                 C  s&   |dkr| j ||S | j |||S )zCheck the current value of an option on the underlying socket.

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

        r   )r   rV   rX   r   r   r   rV      s   	r   r   r   r   )r.   r/   r   r   r   r   r?   )rC   rD   r   rE   )rL   rM   rN   rM   rO   rP   r   r   )
rL   rM   rN   rM   rO   r   rS   rM   r   r   )
rL   rM   rN   rM   rO   rU   rS   rD   r   r   )rL   rM   rN   rM   r   rM   )rL   rM   rN   rM   rW   rM   r   rE   )r   )rL   rM   rN   rM   rW   rM   r   rY   )__name__
__module____qualname____doc__r-   r;   r>   rB   rH   rK   r   r(   rV   r   r   r   r   r   6   s&    





r   )EPERMECONNABORTEDEPROTOENETDOWNENOPROTOOPT	EHOSTDOWNENONETEHOSTUNREACH
EOPNOTSUPPENETUNREACHENOSRESOCKTNOSUPPORTEPROTONOSUPPORT	ETIMEDOUT
ECONNRESETzset[int]_ignorable_accept_errnosc                   @  s.   e Zd ZdZdddZdd	d
Zd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.

    r   r   r   r   c                 C  sf   t |tjs
td|jtjkrtdz
|tjtj	}W n	 t
y'   Y nw |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&   rV   
SOL_SOCKETSO_ACCEPTCONNr   r   )r,   r   	listeningr   r   r   r-   x  s   
zSocketListener.__init__r   c              
     sh   	 z| j  I dH \}}W t|S  ty2 } z|jtv r"tjd|jtvr( W Y d}~nd}~ww q)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``.

        TN)	r   acceptr   r   r   r   r   ro   r   )r,   sock_r   r   r   r   rt     s   

zSocketListener.acceptc                   s    | j   tj I dH  dS )z.Close this listener and its underlying socket.NrI   r=   r   r   r   rK     s   
zSocketListener.acloseNrZ   )r   r   r[   )r\   r]   r^   r_   r-   rt   rK   r   r   r   r   rp   f  s
    

rp   )r   r   )*
__future__r   r   
contextlibr   r   typingr   r   r    r   r"   _utilr	   r
   abcr   r   collections.abcr   _socketr   sysversion_infor   typing_extensionsrF   EBADFENOTSOCKr   r   r   _ignorable_accept_errno_namessetro   __annotations__nameAttributeErroraddgetattrrp   r   r   r   r   <module>   sF   

  
