
    tni                        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
 ddlmZ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n# e$ r ddddd dZ	 d!d"dZY nw xY w G d d          ZdS )#    )annotationsN)AnyCallableLiteral   )RequestResponse   )ServerServerConnectionserve)route
unix_routeRouter)NotFound)MapRequestRedirect)server_namesslcreate_routerurl_mapr   argsr   r   
str | Noner   ,ssl_module.SSLContext | Literal[True] | Noner   type[Router] | Nonekwargsreturnr   c                  	 |dnd}|dur|||d<   |t           } || ||          	|                    dd          	j        }nd	fd}t          	j        g|R 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.sync.router import route
            from werkzeug.routing import Map, Rule

            def channel_handler(websocket, channel_id):
                ...

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

            with route(url_map, ...) as server:
                server.serve_forever()

        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.

        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_request
connectionr   requestr   r   Response | Nonec                P     | |          }||S                      | |          S N)route_request)r"   r#   response_process_requestrouters      S/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/websockets/sync/router.pyr!   zroute.<locals>.process_request   s8     ,+J@@'#O++J@@@    r"   r   r#   r   r   r$   )r   popr'   r   handler)
r   r   r   r   r   r   
url_schemer!   r)   r*   s
           @@r+   r   r   (   s    J ![TTe
d??sF5M "MwZ@@ JJ($// 	 # $ OA A A A A A A V^VdVVVOVvVVVr,   pathc                "    t          | fd|d|S )ag  
        Create a WebSocket Unix server dispatching connections to different handlers.

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

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

        T)unixr1   )r   r   r1   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66r,   c                     t          d          )Nzunix_route() requires werkzeugr6   r4   s      r+   r   r      s    
 :;;;r,   c                  H    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	dS ) r   z*WebSocket router supporting :func:`route`.Nr   r   r   r   r   r0   strr   Nonec                v    || _         || _        || _        | j                                         D ]	}d|_        
d S )NT)r   r   r0   
iter_rules	websocket)selfr   r   r0   rules        r+   __init__zRouter.__init__   sJ     &$L++-- 	" 	"D!DNN	" 	"r,   r"   r   r#   r   c                8    | 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,   urlr	   c                j    |                     t          j        j        d|           }||j        d<   |S )Nz	Found at Location)respondhttp
HTTPStatusFOUNDrD   )r?   r"   rF   r(   s       r+   redirectzRouter.redirect   s7    %%do&;=N=N=NOO'*$r,   c                L    |                     t          j        j        d          S )Nz	Not Found)rI   rJ   rK   	NOT_FOUNDr?   r"   s     r+   	not_foundzRouter.not_found   s    !!$/";[IIIr,   r$   c                   | j                             |                     ||          | j                  }	 t          j                            |j                  }|                    |j        |j	                  \  }}nR# t          $ r%}|                     ||j                  cY d}~S d}~wt          $ r |                     |          cY S w xY w||c|_        |_        dS )zRoute incoming request.)r   r0   )	path_info
query_argsN)r   bindrE   r0   urllibparseurlparser1   matchqueryr   rM   new_urlr   rQ   r/   handler_kwargs)r?   r"   r#   url_map_adapterparsedr/   r   rM   s           r+   r'   zRouter.route_request   s    ,++,,ZAA , 
 
		.\**7<88F-33 +!< 4  OGVV  	? 	? 	?==X-=>>>>>>>> 	. 	. 	.>>*-----	.8?5
J5ts$   AB   
C
B*$C*"CCc                (     |j         |fi |j        S )zHandle a connection.)r/   r\   rP   s     r+   r/   zRouter.handler   s     !z!*JJ
0IJJJr,   )Nr   )r   r   r   r   r0   r:   r   r;   )r"   r   r#   r   r   r:   )r"   r   rF   r:   r   r	   )r"   r   r   r	   r-   )r"   r   r   r;   )
__name__
__module____qualname____doc__rA   rE   rM   rQ   r'   r/    r,   r+   r   r      s        44
 #'	
" 
" 
" 
" 
"$ $ $ $   
J J J J   *K K K K K Kr,   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   )r   r   r1   r   r   r   r   r   )
__future__r   rJ   r   
ssl_moduleurllib.parserV   typingr   r   r   http11r   r	   serverr   r   r   __all__werkzeug.exceptionsr   werkzeug.routingr   r   r   r   r7   r   rd   r,   r+   <module>rn      s   " " " " " "          ) ) ) ) ) ) ) ) ) ) & & & & & & & & 3 3 3 3 3 3 3 3 3 3 ,
+
+O>,,,,,,555555554 #'<@-1dW dW dW dW dW dWP  > > > > > >w  < < <
 #'<@-17 7 7 7 7 7  < < < < < < <<\4K 4K 4K 4K 4K 4K 4K 4K 4K 4Ks   A A)(A)