
    ;Ig.                       d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 ddlmZ ddl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 ddl	mZmZmZ ddlmZ ddl m!Z! ddl"m#Z# g dZ$ G d de!      Z%dddddddedddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ&	 	 d	 	 	 	 	 	 	 ddZ'y)    )annotationsN)Sequence)Any   )ClientProtocol)HeadersLike)ClientExtensionFactory) enable_client_permessage_deflate)validate_subprotocols)
USER_AGENTResponse)
CONNECTINGEvent)
LoggerLikeOriginSubprotocol)	parse_uri   )
Connection)Deadline)connectunix_connectClientConnectionc                  t     e Zd ZdZddd	 	 	 	 	 	 	 	 	 d
 fdZdedf	 	 	 	 	 	 	 ddZd fdZd fd	Z xZ	S )r   a  
    :mod:`threading` implementation of a WebSocket client connection.

    :class:`ClientConnection` provides :meth:`recv` and :meth:`send` methods for
    receiving and sending messages.

    It supports iteration to receive messages::

        for message in websocket:
            process(message)

    The iterator exits normally when the connection is closed with close code
    1000 (OK) or 1001 (going away) or without a close code. It raises a
    :exc:`~websockets.exceptions.ConnectionClosedError` when the connection is
    closed with any other code.

    The ``close_timeout`` and ``max_queue`` arguments have the same meaning as
    in :func:`connect`.

    Args:
        socket: Socket connected to a WebSocket server.
        protocol: Sans-I/O connection.

    
      close_timeout	max_queuec               b    |  t        j                         | _        t        |   ||||       y )Nr   )	threadingr   response_rcvdsuper__init__)selfsocketprotocolr   r   	__class__s        S/var/www/html/answerous/venv/lib/python3.12/site-packages/websockets/sync/client.pyr$   zClientConnection.__init__4   s5     	&__.'	 	 	
    Nc                
   | j                  t              5  | j                  j                         | _        |%| j                  j
                  j                  |       ||| j                  j
                  d<   | j                  j                  | j                         ddd       | j                  j                  |      st        d      | j                  j                  | j                  j                  y# 1 sw Y   \xY w)z1
        Perform the opening handshake.

        )expected_stateNz
User-Agentztimed out during handshake)send_contextr   r'   r   requestheadersupdatesend_requestr"   waitTimeoutErrorhandshake_exc)r%   additional_headersuser_agent_headertimeouts       r)   	handshakezClientConnection.handshakeE   s     j9 	5==002DL!-$$++,>? ,5F$$\2MM&&t||4	5 !!&&w/;<< ==&&2----- 3	5 	5s   BC99Dc                    | j                   4t        |t              sJ || _         | j                  j	                          yt
        |   |       y)z.
        Process one incoming event.

        N)response
isinstancer   r"   setr#   process_event)r%   eventr(   s     r)   r=   zClientConnection.process_eventa   sG     == eX...!DM""$ G!%(r*   c                    	 t         |           | j                  j                          y# | j                  j                          w xY w)zI
        Read incoming data from the socket and process events.

        N)r#   recv_eventsr"   r<   )r%   r(   s    r)   r@   zClientConnection.recv_eventso   s:    
	%G! ""$D""$s	   , A)
r&   zsocket.socketr'   r   r   float | Noner   *int | None | tuple[int | None, int | None]returnNone)r5   HeadersLike | Noner6   
str | Noner7   rA   rC   rD   )r>   r   rC   rD   )rC   rD   )
__name__
__module____qualname____doc__r$   r   r8   r=   r@   __classcell__)r(   s   @r)   r   r      s    < ')@B

 !

 $
 >
 

& 26(2 $	... &. 	.
 
.8)	% 	%r*   r   deflater   i   r   )socksslserver_hostnameorigin
extensionssubprotocolsr5   r6   compressionopen_timeoutr   max_sizer   loggercreate_connectionc                  |/d|v r+|j                  d      }t        j                  dt               t	        |       }|j
                  s|t        d      |j                  dd      }|j                  dd      }|r||t        d      ||t        d	      |t        |       |	d
k(  rt        |      }n|	t        d|	       t        |
      }|t        }	 ||rgt        j                  t        j                  t        j                        }|j                  |j                                |J |j!                  |       nL|j#                  d|j                                t        j$                  |j&                  |j(                  ffi |}|j                  d       |s/|j+                  t        j,                  t        j.                  d       |j
                  rg|t1        j2                         }||j&                  }|j                  |j                                |j5                  ||      }|j                  d       t7        ||||||      } |||||      }	 |j=                  |||j                                |S # t8        $ r ||j;                           w xY w# t8        $ r, |j?                          |j@                  jC                           w xY w)a	  
    Connect to the WebSocket server at ``uri``.

    This function returns a :class:`ClientConnection` instance, which you can
    use to send and receive messages.

    :func:`connect` may be used as a context manager::

        from websockets.sync.client import connect

        with connect(...) as websocket:
            ...

    The connection is closed automatically when exiting the context.

    Args:
        uri: URI of the WebSocket server.
        sock: Preexisting TCP socket. ``sock`` overrides the host and port
            from ``uri``. You may call :func:`socket.create_connection` to
            create a suitable TCP socket.
        ssl: Configuration for enabling TLS on the connection.
        server_hostname: Host name for the TLS handshake. ``server_hostname``
            overrides the host name from ``uri``.
        origin: Value of the ``Origin`` header, for servers that require it.
        extensions: List of supported extensions, in order in which they
            should be negotiated and run.
        subprotocols: List of supported subprotocols, in order of decreasing
            preference.
        additional_headers (HeadersLike | None): Arbitrary HTTP headers to add
            to the handshake request.
        user_agent_header: Value of  the ``User-Agent`` request header.
            It defaults to ``"Python/x.y.z websockets/X.Y"``.
            Setting it to :obj:`None` removes the header.
        compression: The "permessage-deflate" extension is enabled by default.
            Set ``compression`` to :obj:`None` to disable it. See the
            :doc:`compression guide <../../topics/compression>` for details.
        open_timeout: Timeout for opening the connection in seconds.
            :obj:`None` disables the timeout.
        close_timeout: Timeout for closing the connection in seconds.
            :obj:`None` disables the timeout.
        max_size: Maximum size of incoming messages in bytes.
            :obj:`None` disables the limit.
        max_queue: High-water mark of the buffer where frames are received.
            It defaults to 16 frames. The low-water mark defaults to ``max_queue
            // 4``. You may pass a ``(high, low)`` tuple to set the high-water
            and low-water marks. If you want to disable flow control entirely,
            you may set it to ``None``, although that's a bad idea.
        logger: Logger for this client.
            It defaults to ``logging.getLogger("websockets.client")``.
            See the :doc:`logging guide <../../topics/logging>` for details.
        create_connection: Factory for the :class:`ClientConnection` managing
            the connection. Set it to a wrapper or a subclass to customize
            connection handling.

    Any other keyword arguments are passed to :func:`~socket.create_connection`.

    Raises:
        InvalidURI: If ``uri`` isn't a valid WebSocket URI.
        OSError: If the TCP connection fails.
        InvalidHandshake: If the opening handshake fails.
        TimeoutError: If the opening handshake times out.

    Nssl_contextzssl_context was renamed to sslz-ssl argument is incompatible with a ws:// URIunixFpathzmissing path argumentz(path and sock arguments are incompatiblerL   zunsupported compression: r7   T)rO   )rP   rQ   rR   rU   rV   r   )"popwarningswarnDeprecationWarningr   secure
ValueErrorr   r
   r   r   r&   AF_UNIXSOCK_STREAM
settimeoutr7   r   
setdefaultrW   hostport
setsockoptIPPROTO_TCPTCP_NODELAY
ssl_modulecreate_default_contextwrap_socketr   	Exceptioncloser8   close_socketrecv_events_threadjoin)urirM   rN   rO   rP   rQ   rR   r5   r6   rS   rT   r   rU   r   rV   rW   kwargswsurirZ   r[   deadliner'   
connections                          r)   r   r   {   s   z {}.jj',	

 cNE<<COHII FE*Dzz&$/D<DL455$"2GHHl+i5jA
		 4[MBCC
 %H ,4 <}}V^^V5G5GH 0 0 23'''T"!!)X-=-=-?@//UZZ0HSFSOOD! OOF..0B0BDI <<{ 779&"'**OOH,,./??4?IDOOD! "!%
 ''	

		
 !  JJL  !%%**,s   F	J	 &!J) 	J&)5Kc                r    |'|j                  d      |j                  d      d}nd}t        d|d| d|S )a  
    Connect to a WebSocket server listening on a Unix socket.

    This function accepts the same keyword arguments as :func:`connect`.

    It's only available on Unix.

    It's mainly useful for debugging servers listening on Unix sockets.

    Args:
        path: File system path to the Unix socket.
        uri: URI of the WebSocket server. ``uri`` defaults to
            ``ws://localhost/`` or, when a ``ssl`` is provided, to
            ``wss://localhost/``.

    rN   rY   zws://localhost/zwss://localhost/T)rs   rZ   r[    )getr   )r[   rs   rt   s      r)   r   r   A  sG    * {::e$M)B)J#C$C;sD;F;;r*   )$rs   strrM   zsocket.socket | NonerN   zssl_module.SSLContext | NonerO   rF   rP   zOrigin | NonerQ   z'Sequence[ClientExtensionFactory] | NonerR   zSequence[Subprotocol] | Noner5   rE   r6   rF   rS   rF   rT   rA   r   rA   rU   z
int | Noner   rB   rV   zLoggerLike | NonerW   ztype[ClientConnection] | Nonert   r   rC   r   )NN)r[   rF   rs   rF   rt   r   rC   r   )(
__future__r   r&   rN   rk   r!   r]   collections.abcr   typingr   clientr   datastructuresr   extensions.baser	   extensions.permessage_deflater
   r/   r   http11r   r   r'   r   r   r   r   r   rs   r   rw   r   utilsr   __all__r   r   r   ry   r*   r)   <module>r      s   "     $  # ( 4 L + ) ( 4 4  "  :^%z ^%J "&(,"& :>15-1$.'!#"$ <> $7;/C	C 	C
 
&C  C C 8C /C +C "C C C   !C$ %C& :'C* +C. 5/C0 1C2 3CN <
<	< < 	<r*   