o
    KK&h                     @  s   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 d dlmZmZ ddlmZmZ dd	lmZmZmZ g d
ZG dd dZddddd ddZ	d!d"ddZdS )#    )annotationsN)Any	AwaitableCallableLiteral)NotFound)MapRequestRedirect   )RequestResponse   )ServerServerConnectionserve)route
unix_routeRouterc                   @  sR   e Zd ZdZ		dd ddZd!ddZd"ddZd#ddZd$ddZd%ddZ	dS )&r   z*WebSocket router supporting :func:`route`.Nwsurl_mapr   server_name
str | None
url_schemestrreturnNonec                 C  s,   || _ || _|| _| j  D ]}d|_qd S )NT)r   r   r   
iter_rules	websocket)selfr   r   r   rule r    L/var/www/html/venv/lib/python3.10/site-packages/websockets/asyncio/router.py__init__   s   zRouter.__init__
connectionr   requestr   c                 C  s   | j d u r
|jd S | j S )NHost)r   headers)r   r#   r$   r    r    r!   get_server_name!   s   

zRouter.get_server_nameurlr   c                 C  s$   | tjjd| }||jd< |S )Nz	Found at Location)respondhttp
HTTPStatusFOUNDr&   )r   r#   r(   responser    r    r!   redirect'   s   
zRouter.redirectc                 C  s   | tjjdS )Nz	Not Found)r*   r+   r,   	NOT_FOUNDr   r#   r    r    r!   	not_found,   s   zRouter.not_foundResponse | Nonec              
   C  s   | j j| ||| jd}ztj|j}|j|j|j	d\}}W n& t
y: } z| ||jW  Y d}~S d}~w tyG   | | Y S w |||_|_dS )zRoute incoming request.)r   r   )	path_info
query_argsN)r   bindr'   r   urllibparseurlparsepathmatchqueryr	   r/   new_urlr   r2   handlerhandler_kwargs)r   r#   r$   url_map_adapterparsedr>   kwargsr/   r    r    r!   route_request/   s$   
zRouter.route_requestc                   s   |j |fi |jI dH S )zHandle a connection.N)r>   r?   r1   r    r    r!   r>   D   s   zRouter.handler)Nr   )r   r   r   r   r   r   r   r   )r#   r   r$   r   r   r   )r#   r   r(   r   r   r   )r#   r   r   r   r#   r   r$   r   r   r3   )r#   r   r   r   )
__name__
__module____qualname____doc__r"   r'   r/   r2   rC   r>   r    r    r    r!   r      s    



r   )r   sslcreate_routerr   r   argsr   r   r   rI   ,ssl_module.SSLContext | Literal[True] | NonerJ   type[Router] | NonerB   r   Awaitable[Server]c                  s   |du rdnd}|dur|dur||d< |du rt }|| |||dd  du r.j}nd fd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.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 future to exit the server
        stop = asyncio.get_running_loop().create_future()

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


    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 actually 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.

    Nr   wssTrI   process_requestr#   r   r$   r   r   r3   c                   s8    | |}t |tr|I d H }|d ur|S | |S N)
isinstancer   rC   )r#   r$   r.   _process_requestrouterr    r!   rP      s   


zroute.<locals>.process_requestrD   )r   poprC   r   r>   )r   r   rI   rJ   rK   rB   r   rP   r    rS   r!   r   I   s   I

r   r:   c                 K  s   t | fd|d|S )aN  
    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)unixr:   )r   )r   r:   rB   r    r    r!   r      s   r   )r   r   rK   r   r   r   rI   rL   rJ   rM   rB   r   r   rN   rQ   )r   r   r:   r   rB   r   r   rN   )
__future__r   r+   rI   
ssl_moduleurllib.parser7   typingr   r   r   r   werkzeug.exceptionsr   werkzeug.routingr   r	   http11r   r   serverr   r   r   __all__r   r   r   r    r    r    r!   <module>   s"    :o