a
     d                     @   s   d dl Z d dl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 )    N)status)is_async_callable)run_in_threadpool)HTTPException)Request)PlainTextResponseResponse)MessageReceiveScopeSend)	WebSocketc                   @   sN   e Zd ZeeeddddZejdddZ	dddd	Z
eed
ddZdS )HTTPEndpointN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 \/var/www/html/stable-diffusion-webui/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__r   c                 C   s   |    S r   dispatch	__await__r   r   r   r   r-      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   r,      s    zHTTPEndpoint.dispatch)r2   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   r2   r7   r   r   r   r1   /   s    
zHTTPEndpoint.method_not_allowed)__name__
__module____qualname__r   r
   r   r)   typing	Generatorr-   r,   r   r   r1   r   r   r   r   r      s   r   c                   @   s   e Zd ZU dZeje ed< ee	e
ddddZejdddZddd	d
ZeeejdddZeddddZeejddddZeeddddZdS )WebSocketEndpointNencodingr   c                 C   s&   |d dksJ || _ || _|| _d S )Nr   	websocket)r   r   r   r(   r   r   r   r)   =   s    zWebSocketEndpoint.__init__r*   c                 C   s   |    S r   r+   r   r   r   r   r-   C   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intr/   	ExceptionZWS_1011_INTERNAL_ERRORon_disconnect)r   r@   
close_codemessagedataexcr   r   r   r,   F   s"    zWebSocketEndpoint.dispatch)r@   rI   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)rA   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 )r?   closer   ZWS_1003_UNSUPPORTED_DATARuntimeErrorr/   rC   rN   loadsdecoderJSONDecodeError)r   r@   rI   rL   r   r   r   rC   ]   s0    




zWebSocketEndpoint.decode)r@   r   c                    s   |  I dH  dS )z3Override to handle an incoming websocket connectionN)accept)r   r@   r   r   r   rB   |   s    zWebSocketEndpoint.on_connect)r@   rJ   r   c                    s   dS )z0Override to handle an incoming websocket messageNr   )r   r@   rJ   r   r   r   rD      s    zWebSocketEndpoint.on_receive)r@   rH   r   c                    s   dS )z,Override to handle a disconnecting websocketNr   )r   r@   rH   r   r   r   rG      s    zWebSocketEndpoint.on_disconnect)r9   r:   r;   r?   r<   Optionalstr__annotations__r   r
   r   r)   r=   r-   r,   r   r	   AnyrC   rB   rD   rE   rG   r   r   r   r   r>   9   s   
r>   )rN   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   r>   r   r   r   r   <module>   s   +