o
    ɝi                     @  s   d dl mZ d dlZd dlmZ d dlmZ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Literal)status)is_async_callable)run_in_threadpool)HTTPException)Request)PlainTextResponseResponse)MessageReceiveScopeSend)	WebSocketc                   @  s4   e Zd Zdd	d
ZdddZdddZdddZdS )HTTPEndpointscoper   receiver   sendr   returnNonec                   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/ocr-read/venv/lib/python3.10/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]c                 C     |    S r   dispatch	__await__r    r"   r"   r#   r3         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!   requesthandler_namehandleris_asyncresponser"   r"   r#   r2       s   "zHTTPEndpoint.dispatchr9   r   r   c                   s6   dd | ji}d| jv rtd|dtdd|dS )NAllowz, appi  )status_codeheaderszMethod Not Allowed)joinr,   r   r
   r   )r!   r9   rA   r"   r"   r#   r8   ,   s
   
zHTTPEndpoint.method_not_allowedNr   r   r   r   r   r   r   r   r   r/   r   r   )r9   r   r   r   )__name__
__module____qualname__r.   r3   r2   r8   r"   r"   r"   r#   r      s
    


r   c                   @  s`   e Zd ZU dZde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)d!d"ZdS )*WebSocketEndpointNz'Literal['text', 'bytes', 'json'] | Noneencodingr   r   r   r   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/   c                 C  r0   r   r1   r    r"   r"   r#   r3   ?   r4   zWebSocketEndpoint.__await__c              
     s   t | j| j| jd}| |I d H  tj}zSz5	 | I d H }|d dkr9| ||I d H }| ||I d H  n|d dkrJt	|
dpGtj}nqW n ty] } ztj}|d }~ww W | ||I d H  d S | ||I d H  w )N)r   r   Tr   zwebsocket.receivezwebsocket.disconnectcode)r   r   r   r   
on_connectr   WS_1000_NORMAL_CLOSUREdecode
on_receiveintr6   	ExceptionWS_1011_INTERNAL_ERRORon_disconnect)r!   rK   
close_codemessagedataexcr"   r"   r#   r2   B   s,   *zWebSocketEndpoint.dispatchrK   r   rV   r   r   c                   s  | j dkrd|vr|jtjdI d H  td|d S | j dkr7d|vr3|jtjdI d H  td|d S | j dkrm|dd urH|d }n|d d}zt|W S  tj	j
yl   |jtjdI d H  tdw | j d u szJ d	| j  |dr|d S |d S )
Ntext)rL   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 )rJ   closer   WS_1003_UNSUPPORTED_DATARuntimeErrorr6   rO   r[   loadsdecoderJSONDecodeError)r!   rK   rV   rY   r"   r"   r#   rO   W   s.   



zWebSocketEndpoint.decodec                   s   |  I dH  dS )z3Override to handle an incoming websocket connectionN)accept)r!   rK   r"   r"   r#   rM   s   s   zWebSocketEndpoint.on_connectrW   c                      dS )z0Override to handle an incoming websocket messageNr"   )r!   rK   rW   r"   r"   r#   rP   w       zWebSocketEndpoint.on_receiverU   rQ   c                   rc   )z,Override to handle a disconnecting websocketNr"   )r!   rK   rU   r"   r"   r#   rT   z   rd   zWebSocketEndpoint.on_disconnectrC   rD   rE   )rK   r   rV   r   r   r   )rK   r   r   r   )rK   r   rW   r   r   r   )rK   r   rU   rQ   r   r   )rF   rG   rH   rJ   __annotations__r.   r3   r2   rO   rM   rP   rT   r"   r"   r"   r#   rI   6   s   
 





rI   )
__future__r   r[   collections.abcr   typingr   r   r   	starletter   starlette._utilsr   starlette.concurrencyr	   starlette.exceptionsr
   starlette.requestsr   starlette.responsesr   r   starlette.typesr   r   r   r   starlette.websocketsr   r   rI   r"   r"   r"   r#   <module>   s    %