
    Ojg                    L   d dl mZ d dlZd dlZd dl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mZmZ g d	Z	 d d
lmZ d dlmZmZ dddd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZ G d d      Zy# e$ r& dddd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZY 5w xY w)    )annotationsN)Any	AwaitableCallableLiteral   )RequestResponse)PathLike   )ServerServerConnectionserve)route
unix_routeRouter)NotFound)MapRequestRedirect)server_namesslcreate_routerc                  	 |dnd}|dur|||d<   |t         } || ||      	|j                  dd      	j                  }n	 	 	 	 	 	 d	fd}t        	j                  g|d|i|S )	a
  
        Create a WebSocket server dispatching connections to different handlers.

        This feature requires the third-party library `werkzeug`_:

        .. code-block:: console

            $ pip install werkzeug

        .. _werkzeug: https://werkzeug.palletsprojects.com/

        :func:`route` accepts the same arguments as
        :func:`~websockets.sync.server.serve`, except as described below.

        The first argument is a :class:`werkzeug.routing.Map` that maps URL patterns
        to connection handlers. In addition to the connection, handlers receive
        parameters captured in the URL as keyword arguments.

        Here's an example::

            from websockets.asyncio.router import route
            from werkzeug.routing import Map, Rule

            async def channel_handler(websocket, channel_id):
                ...

            url_map = Map([
                Rule("/channel/<uuid:channel_id>", endpoint=channel_handler),
                ...
            ])

            # set this event to exit the server
            stop = asyncio.Event()

            async with route(url_map, ...) as server:
                await stop.wait()

        Refer to the documentation of :mod:`werkzeug.routing` for details.

        If you define redirects with ``Rule(..., redirect_to=...)`` in the URL map,
        when the server runs behind a reverse proxy that modifies the ``Host``
        header or terminates TLS, you need additional configuration:

        * Set ``server_name`` to the name of the server as seen by clients. When
          not provided, websockets uses the value of the ``Host`` header.

        * Set ``ssl=True`` to generate ``wss://`` URIs without enabling TLS.
          Under the hood, this bind the URL map with a ``url_scheme`` of
          ``wss://`` instead of ``ws://``.

        There is no need to specify ``websocket=True`` in each rule. It is added
        automatically.

        Like :func:`~websockets.sync.server.serve`, :func:`route` returns a
        :class:`~websockets.sync.server.Server` that you can also run with
        :meth:`~websockets.sync.server.Server.serve_forever`.

        Args:
            url_map: Mapping of URL patterns to connection handlers.
            server_name: Name of the server as seen by clients. If :obj:`None`,
                websockets uses the value of the ``Host`` header.
            ssl: Configuration for enabling TLS on the connection. Set it to
                :obj:`True` if a reverse proxy terminates TLS connections.
            create_router: Factory for the :class:`Router` dispatching requests to
                handlers. Set it to a wrapper or a subclass to customize routing.

        NwswssTr   process_requestc                   K    | |      }t        |t              r
| d {   }||S j                  | |      S 7 wN)
isinstancer   route_request)
connectionrequestresponse_process_requestrouters      p/var/www/origus_pro_usr/data/www/origus.pro/core/.venv/lib/python3.12/site-packages/websockets/asyncio/router.pyr   zroute.<locals>.process_request   sI      ,J@h	2%-~H'#O++J@@  .s   ?=?r!   r   r"   r	   returnzResponse | None)r   popr    r   handler)
url_mapr   r   r   argskwargs
url_schemer   r$   r%   s
           @@r&   r   r   )   s    V ![Te
d?sF5M "MwZ@ JJ($/ 	 # $$ 	A,	A 	A !	A NN

 ,
 	
 	
    c                     t        | fd|d|S )aj  
        Create a WebSocket Unix server dispatching connections to different handlers.

        :func:`unix_route` combines the behaviors of :func:`route` and
        :func:`~websockets.asyncio.server.unix_serve`.

        Args:
            url_map: Mapping of URL patterns to connection handlers.
            path: File system path to the Unix socket.

        T)unixpath)r   r+   r2   r-   s      r&   r   r      s      W=4d=f==r/   c                   t        d      )Nzroute() requires werkzeugImportError)r+   r   r   r   r,   r-   s         r&   r   r      s     566r/   c                    t        d      )Nzunix_route() requires werkzeugr5   r3   s      r&   r   r       s    
 :;;r/   c                  `    e Zd ZdZ	 	 d		 	 	 	 	 	 	 d
dZddZddZddZ	 	 	 	 	 	 ddZddZ	y)r   z*WebSocket router supporting :func:`route`.Nc                z    || _         || _        || _        | j                   j                         D ]	  }d|_         y )NT)r+   r   r.   
iter_rules	websocket)selfr+   r   r.   rules        r&   __init__zRouter.__init__   s=     &$LL++- 	"D!DN	"r/   c                P    | j                   |j                  d   S | j                   S )NHost)r   headers)r<   r!   r"   s      r&   get_server_namezRouter.get_server_name   s)    #??6**###r/   c                ~    |j                  t        j                  j                  d|       }||j                  d<   |S )Nz	Found at Location)respondhttp
HTTPStatusFOUNDrA   )r<   r!   urlr#   s       r&   redirectzRouter.redirect   s:    %%doo&;&;y=NO'*$r/   c                V    |j                  t        j                  j                  d      S )Nz	Not Found)rE   rF   rG   	NOT_FOUNDr<   r!   s     r&   	not_foundzRouter.not_found   s    !!$//";";[IIr/   c                   | j                   j                  | j                  ||      | j                        }	 t        j
                  j                  |j                        }|j                  |j                  |j                        \  }}||c|_        |_        y# t        $ r&}| j                  ||j                        cY d}~S d}~wt        $ r | j                  |      cY S w xY w)zRoute incoming request.)r   r.   )	path_info
query_argsN)r+   bindrB   r.   urllibparseurlparser2   matchqueryr   rJ   new_urlr   rN   r*   handler_kwargs)r<   r!   r"   url_map_adapterparsedr*   r-   rJ   s           r&   r    zRouter.route_request   s     ,,++,,ZA , 
		.\\**7<<8F-33 ++!<< 4 OGV 9@5
J5  	?==X-=-=>> 	.>>*--	.s$   AB 	C&%C C&C&%C&c                X   K    |j                   |fi |j                   d{   S 7 w)zHandle a connection.N)r*   rY   rM   s     r&   r*   zRouter.handler   s*     'Z''
Pj6O6OPPPPs   !*(*)Nr   )r+   r   r   
str | Noner.   strr(   None)r!   r   r"   r	   r(   r^   )r!   r   rI   r^   r(   r
   )r!   r   r(   r
   r'   )r!   r   r(   r_   )
__name__
__module____qualname____doc__r>   rB   rJ   rN   r    r*    r/   r&   r   r      sk    4
 #'	
"
"  
" 	
"
 

"$
J*5<	*Qr/   r   )r+   r   r,   r   r   r]   r   z,ssl_module.SSLContext | Literal[True] | Noner   ztype[Router] | Noner-   r   r(   r   r   )r+   r   r2   zPathLike | Noner-   r   r(   r   )
__future__r   rF   r   
ssl_moduleurllib.parserS   typingr   r   r   r   http11r	   r
   r   serverr   r   r   __all__werkzeug.exceptionsr   werkzeug.routingr   r   r   r   r6   r   rd   r/   r&   <module>rn      s]   "    4 4 &  3 3 ,]>,54 #'<@-1r
r
r
  r
 :	r

 +r
 r
 
r
l !%>>> > 
	>&4Q 4Qy  <
 #'<@-1777  7 :	7
 +7 7 
7 !%<<< < 
	<<s   A8 8(B#"B#