
    <fh>                       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rd d	lmZ dd
lmZ d dlZej0                  dk\  rd dlmZ nerd dlmZ dZej8                  ej:                  hZedd       Ze G d de             Z g dZ! e"       Z#de$d<   e!D ]+  Z% ee&      5  e#jO                   e(ee%             ddd       - e G d dee                 Z)y# 1 sw Y   KxY w)    )annotationsN)contextmanagersuppress)TYPE_CHECKINGoverload   )socket)ConflictDetectorfinal)HalfCloseableStreamListener)	Generator)
SocketType)      )Bufferi   c               #     K   	 d  y # t         $ rF} | j                  t        v rt        j                  d      d t        j
                  d|        | d } ~ ww xY ww)Nzthis socket was already closedzsocket connection broken: )OSErrorerrno_closed_stream_errnostrioClosedResourceErrorBrokenResourceError)excs    I/var/www/zara/venv/lib/python3.12/site-packages/trio/_highlevel_socket.py)_translate_socket_errors_to_stream_errorsr   +   s^     X X99--**+KLRVV**-Gu+MNTWW	Xs%   A	 A	AAAAAc                      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	e
dd	       Ze
dd
       Z	 d	 	 	 	 	 	 	 	 	 ddZe
dd       Ze
dd       ZdddZy)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                :   t        |t        j                        st        d      |j                  t        j
                  k7  rt        d      || _        t        d      | _	        t        t              5  | j                  t        j                  t        j                  d       d d d        t        t        d      rHt        t              5  | j                  t        j                  t        j                   d       d d d        y y # 1 sw Y   bxY w# 1 sw Y   y xY w)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	   s     r   __init__zSocketStream.__init__O   s    &'"4"45HII;;'---IJJ'7I(
$ g 	LOOG//1D1DdK	L 7/0 '" W 3 3W5N5NPUVW W 1	L 	LW Ws   40D0DDDc           	       K   | j                   j                  rt        j                  d      | j                  5  t               5  t        |      5 }|sr| j                   j                         dk(  rt        j                  d      t        j                  j                          d {    	 d d d        d d d        d d d        y d}|t        |      k  rE||d  5 }| j                   j                  |       d {   }d d d        |z  }|t        |      k  rEd d d        d d d        d d d        y 7 7 ;# 1 sw Y   :xY w# 1 sw Y   *xY w# 1 sw Y   .xY w# 1 sw Y   y xY ww)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sents        r   send_allzSocketStream.send_allm   sL    ;;++**+NOO)) 	+:< +% 
+;;--/25"&":":;V"WW"mm66888
++	+ 	+ "#J$s4y0!*+. E))-)9)9))D#DDE"d*
 %s4y0
++	+ 	+ 9
 $EE E
+ 
++ +	+ 	+s   8E(EEAE'D4
(E-E5E=	E(ED8	:D6;D8	?EE#E+	E(4E6D8	8E=EE	EE	EE%!E(c                .  K   | j                   5  | j                  j                         dk(  rt        j                  t               5  | j                  j                          d {    d d d        d d d        y 7 # 1 sw Y   xY w# 1 sw Y   y xY ww)Nr/   )r'   r	   r2   r   r   r   wait_writabler,   s    r   wait_send_all_might_not_blockz*SocketStream.wait_send_all_might_not_block~   s     )) 	2{{!!#r)...:< 2kk//1112	2 	2 22 2	2 	2sF   B8B	A=%A;&A=*B	2	B;A==B	B		BBc                n  K   | j                   5  t        j                  j                          d {    | j                  j
                  r
	 d d d        y t               5  | j                  j                  t        j                         d d d        d d d        y 7 i# 1 sw Y   xY w# 1 sw Y   y xY wwN)
r'   r   r3   r4   r	   r0   r   shutdownr"   SHUT_WRr>   s    r   send_eofzSocketStream.send_eof   s     )) 	6--**,,, {{//	6 	6 ;< 6$$W__56	6 	6,
6 6	6 	6sP   B5"B)BB)	B5
B) *B
B)	B5B)B&	"B))B2.B5Nc                   K   |t         }|dk  rt        d      t               5  | j                  j	                  |       d {   cd d d        S 7 # 1 sw Y   y xY ww)Nr   zmax_bytes must be >= 1)DEFAULT_RECEIVE_SIZEr&   r   r	   recv)r,   	max_bytess     r   receive_somezSocketStream.receive_some   s\     ,Iq=56668 	5)))44	5 	54	5 	5s.   #A AAA
A AAA c                   K   | j                   j                          t        j                  j	                          d {    y 7 wrA   r	   closer   r3   r4   r>   s    r   aclosezSocketStream.aclose   s,     mm&&(((   <AAAc                     y rA    )r,   leveloptionvalues       r   r(   zSocketStream.setsockopt   s    PS    c                     y rA   rP   r,   rQ   rR   rS   lengths        r   r(   zSocketStream.setsockopt   s    UXrT   c                    |*|t        d      | j                  j                  |||      S |t        d|d      | j                  j                  ||||      S )zlSet an option on the underlying socket.

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

        zKinvalid 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(   rV   s        r   r(   zSocketStream.setsockopt   sv     >}a  ;;))%??6ui?de  {{%%eVUFCCrT   c                     y rA   rP   )r,   rQ   rR   s      r   
getsockoptzSocketStream.getsockopt   s    :=rT   c                     y rA   rP   r,   rQ   rR   
buffersizes       r   rZ   zSocketStream.getsockopt   s    MPrT   c                ~    |dk(  r| j                   j                  ||      S | j                   j                  |||      S )zCheck the current value of an option on the underlying socket.

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

        r   )r	   rZ   r\   s       r   rZ   zSocketStream.getsockopt   s;     ?;;))%88;;))%DDrT   r	   r   returnNone)r7   zbytes | bytearray | memoryviewr`   ra   r`   ra   rA   )rH   
int | Noner`   bytes)rQ   intrR   re   rS   zint | Bufferr`   ra   )
rQ   re   rR   re   rS   ra   rW   re   r`   ra   )
rQ   re   rR   re   rS   zint | Buffer | NonerW   rc   r`   ra   )rQ   re   rR   re   r`   re   )rQ   re   rR   re   r]   re   r`   rd   )r   )rQ   re   rR   re   r]   re   r`   zint | bytes)__name__
__module____qualname____doc__r-   r;   r?   rD   rI   rM   r   r(   rZ   rP   rT   r   r   r   6   s    .W<+"265) S SX X "DD D #	D
 D 
D0 = =P PErT   r   )EPERMECONNABORTEDEPROTOENETDOWNENOPROTOOPT	EHOSTDOWNENONETEHOSTUNREACH
EOPNOTSUPPENETUNREACHENOSRESOCKTNOSUPPORTEPROTONOSUPPORT	ETIMEDOUT
ECONNRESETzset[int]_ignorable_accept_errnosc                  (    e Zd ZdZddZddZddZy)	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                P   t        |t        j                        st        d      |j                  t        j
                  k7  rt        d      	 |j                  t        j                  t        j                        }|st        d      || _        y # t        $ r
 Y || _        y w xY w)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&   rZ   
SOL_SOCKETSO_ACCEPTCONNr   r	   )r,   r	   	listenings      r   r-   zSocketListener.__init__x  s    &'"4"45JKK;;'---KLL	O))'*<*<g>S>STI
  !MNN  	
 	s   .B 	B%$B%c                  K   	 	 | j                   j                          d{   \  }}t        |      S 7 # t        $ r@}|j                  t
        v rt        j                  d|j                  t        vr Y d}~nd}~ww xY ww)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   r   ry   )r,   sock_r   s       r   r   zSocketListener.accept  s     " * $ 2 2 44a $D)) 5 99 5522<99$<< = s7   B7 57 B7 	B  6A;6B;B  Bc                   K   | j                   j                          t        j                  j	                          d{    y7 w)z.Close this listener and its underlying socket.NrK   r>   s    r   rM   zSocketListener.aclose  s,     mm&&(((rN   Nr_   )r`   r   rb   )rf   rg   rh   ri   r-   r   rM   rP   rT   r   r{   r{   f  s      *8)rT   r{   )r`   zGenerator[None, None, None])*
__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setry   __annotations__nameAttributeErroraddgetattrr{   rP   rT   r   <module>r      s   "  / *   * .)# 
w '(   
KK	NN	  X X WE& WE WEd! . &)U ( *) ;D	.	! ; $$WUD%9:; ;;
 @)Xl+ @) @); ;s   6C--C6	