a
    h                     @  s   d dl mZ d dlZd dlmZ d dlmZ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mZmZ d dlmZ G dd dZG dd dZdS )    )annotationsN)	Generator)AnyCallable)status)is_async_callable)run_in_threadpool)HTTPException)Request)PlainTextResponseResponse)MessageReceiveScopeSend)	WebSocketc                   @  sL   e Zd ZdddddddZdd	d
dZdd	ddZdddddZdS )HTTPEndpointr   r   r   Nonescopereceivesendreturnc                   s:   |d dksJ | _ | _| _ fdddD  _d S )Ntypehttpc                   s$   g | ]}t  | d d ur|qS N)getattrlower).0methodself O/var/www/html/assistant/venv/lib/python3.9/site-packages/starlette/endpoints.py
<listcomp>   s   z)HTTPEndpoint.__init__.<locals>.<listcomp>)GETHEADPOSTPUTPATCHDELETEOPTIONS)r   r   r   _allowed_methodsr!   r   r   r   r"   r    r#   __init__   s    
zHTTPEndpoint.__init__Generator[Any, None, None]r   c                 C  s   |    S r   dispatch	__await__r    r"   r"   r#   r3      s    zHTTPEndpoint.__await__c                   s   t | j| jd}|jdkr(t| ds(dn|j }t| || j}t|}|r\||I d H }nt	||I d H }|| j| j| j
I d H  d S )N)r   r&   headget)r
   r   r   r   hasattrr   r   method_not_allowedr   r   r   )r!   requestZhandler_namehandleris_asyncresponser"   r"   r#   r2       s    "zHTTPEndpoint.dispatchr
   r   )r8   r   c                   s4   dd | ji}d| jv r&td|dtdd|dS )NZAllowz, Zappi  )status_codeheaderszMethod Not Allowed)joinr,   r   r	   r   )r!   r8   r=   r"   r"   r#   r7   ,   s    
zHTTPEndpoint.method_not_allowedN)__name__
__module____qualname__r.   r3   r2   r7   r"   r"   r"   r#   r      s   r   c                   @  s   e Zd ZU dZded< dddddd	d
ZddddZddddZddddddZdddddZ	ddddddZ
dddddd ZdS )!WebSocketEndpointNz
str | Noneencodingr   r   r   r   r   c                 C  s&   |d dksJ || _ || _|| _d S )Nr   	websocket)r   r   r   r-   r"   r"   r#   r.   9   s    zWebSocketEndpoint.__init__r/   r0   c                 C  s   |    S r   r1   r    r"   r"   r#   r3   ?   s    zWebSocketEndpoint.__await__c              
     s   t | j| j| jd}| |I d H  tj}zzh| I d H }|d dkrn| ||I d H }| ||I d H  q.|d dkr.t	|
dptj}qq.W n. ty } ztj}|W Y d }~n
d }~0 0 W | ||I d H  n| ||I d H  0 d S )N)r   r   r   zwebsocket.receivezwebsocket.disconnectcode)r   r   r   r   
on_connectr   ZWS_1000_NORMAL_CLOSUREdecode
on_receiveintr5   	ExceptionZWS_1011_INTERNAL_ERRORon_disconnect)r!   rD   
close_codemessagedataexcr"   r"   r#   r2   B   s    zWebSocketEndpoint.dispatchr   r   r   )rD   rM   r   c                   s  | j dkr6d|vr.|jtjdI d H  td|d S | j dkrld|vrd|jtjdI d H  td|d S | j dkr|dd ur|d }n|d d}zt|W S  tj	j
y   |jtjdI d H  tdY n0 | j d u sJ d	| j  |dr
|d S |d S )
Ntext)rE   z/Expected text websocket messages, but got bytesbytesz/Expected bytes websocket messages, but got textjsonzutf-8zMalformed JSON data received.z!Unsupported 'encoding' attribute )rC   closer   ZWS_1003_UNSUPPORTED_DATARuntimeErrorr5   rG   rR   loadsdecoderJSONDecodeError)r!   rD   rM   rP   r"   r"   r#   rG   W   s*    



zWebSocketEndpoint.decode)rD   r   c                   s   |  I dH  dS )z3Override to handle an incoming websocket connectionN)accept)r!   rD   r"   r"   r#   rF   s   s    zWebSocketEndpoint.on_connect)rD   rN   r   c                   s   dS )z0Override to handle an incoming websocket messageNr"   )r!   rD   rN   r"   r"   r#   rH   w   s    zWebSocketEndpoint.on_receiverI   )rD   rL   r   c                   s   dS )z,Override to handle a disconnecting websocketNr"   )r!   rD   rL   r"   r"   r#   rK   z   s    zWebSocketEndpoint.on_disconnect)r?   r@   rA   rC   __annotations__r.   r3   r2   rG   rF   rH   rK   r"   r"   r"   r#   rB   6   s   
rB   )
__future__r   rR   collections.abcr   typingr   r   Z	starletter   Zstarlette._utilsr   Zstarlette.concurrencyr   Zstarlette.exceptionsr	   Zstarlette.requestsr
   Zstarlette.responsesr   r   Zstarlette.typesr   r   r   r   Zstarlette.websocketsr   r   rB   r"   r"   r"   r#   <module>   s   %