
    9h                        S SK Jr  S SKrS SKrS SKrS SKJrJ	r	J
r
Jr  S SKJr  S SKJrJr  SSKJrJr  SS	KJrJrJr  / S
Qr " S S5      rSSSS.             SS jjr S       SS jjrg)    )annotationsN)Any	AwaitableCallableLiteral)NotFound)MapRequestRedirect   )RequestResponse   )ServerServerConnectionserve)route
unix_routeRouterc                  v    \ rS rSrSr  S       SS jjrSS jrSS jrSS jr      SS jr	SS	 jr
S
rg)r      z*WebSocket router supporting :func:`route`.Nc                x    Xl         X l        X0l        U R                   R                  5        H
  nSUl        M     g )NT)url_mapserver_name
url_scheme
iter_rules	websocket)selfr   r   r   rules        ^C:\Suresh\moveshuttle\MDcreated\moveengine\venv\Lib\site-packages\websockets/asyncio/router.py__init__Router.__init__   s2     &$LL++-D!DN .    c                R    U R                   c  UR                  S   $ U R                   $ )NHost)r   headers)r   
connectionrequests      r   get_server_nameRouter.get_server_name!   s)    #??6**###r"   c                |    UR                  [        R                  R                  SU 35      nX#R                  S'   U$ )Nz	Found at Location)respondhttp
HTTPStatusFOUNDr%   )r   r&   urlresponses       r   redirectRouter.redirect'   s8    %%doo&;&;y=NO'*$r"   c                V    UR                  [        R                  R                  S5      $ )Nz	Not Found)r,   r-   r.   	NOT_FOUNDr   r&   s     r   	not_foundRouter.not_found,   s    !!$//";";[IIr"   c                   U R                   R                  U R                  X5      U R                  S9n [        R
                  R                  UR                  5      nUR                  UR                  UR                  S9u  pVXVsUl        Ul        g! [         a%  nU R                  XR                  5      s SnA$ SnAf[         a    U R                  U5      s $ f = f)zRoute incoming request.)r   r   )	path_info
query_argsN)r   bindr(   r   urllibparseurlparsepathmatchqueryr
   r2   new_urlr   r7   handlerhandler_kwargs)r   r&   r'   url_map_adapterparsedrD   kwargsr2   s           r   route_requestRouter.route_request/   s     ,,++,,ZA , 
		.\\**7<<8F-33 ++!<< 4 OG 9@5
J5  	?==-=-=>> 	.>>*--	.s$   AB 
CB=7C=CCc                X   #    UR                   " U40 UR                  D6I Sh  vN $  N7f)zHandle a connection.N)rD   rE   r6   s     r   rD   Router.handlerD   s'     ''
Pj6O6OPPPPs   !*(*)r   r   r   )Nws)r   r	   r   
str | Noner   strreturnNone)r&   r   r'   r   rP   rO   )r&   r   r0   rO   rP   r   )r&   r   rP   r   r&   r   r'   r   rP   zResponse | None)r&   r   rP   rQ   )__name__
__module____qualname____firstlineno____doc__r    r(   r2   r7   rI   rD   __static_attributes__ r"   r   r   r      sk    4
 #'	
"
"  
" 	
"
 

"$
J*5<	*Qr"   r   )r   sslcreate_routerc                  ^^	 Uc  SOSnUSLa  Ub  X%S'   Uc  [         nU" XU5      m	UR                  SS5      mTc  T	R                  nO      SUU	4S jjn[        T	R                  /UQ7SU0UD6$ )	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.

NrM   wssTrZ   process_requestc                   >#    T" X5      n[        U[        5      (       a
  UI S h  vN nUb  U$ TR                  X5      $  N7fN)
isinstancer   rI   )r&   r'   r1   _process_requestrouters      r   r^   route.<locals>.process_request   sG      (
<H(I..!)>#''
<< *s   #AAArR   )r   poprI   r   rD   )
r   r   rZ   r[   argsrH   r   r^   rb   rc   s
           @@r   r   r   I   s    R %J
$3?u7<F 	

$d+      		=(	=3:	=	= 	= R$RR6RRr"   c                     [        U 4SUS.UD6$ )a2  
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@   rH   s      r   r   r      s      9t$9&99r"   )r   r	   rf   r   r   rN   rZ   z,ssl_module.SSLContext | Literal[True] | Noner[   ztype[Router] | NonerH   r   rP   Awaitable[Server]r`   )r   r	   r@   rN   rH   r   rP   ri   )
__future__r   r-   rZ   
ssl_moduleurllib.parser=   typingr   r   r   r   werkzeug.exceptionsr   werkzeug.routingr	   r
   http11r   r   serverr   r   r   __all__r   r   r   rY   r"   r   <module>rs      s    "    4 4 ( 1 & 3 3 ,4Q 4Qt #8<)-jSjSjS jS 
6	jS
 'jS jS jS^ ::
: : 	:r"   