o
    96dM                     @   s&  d dl Z d dlZd dlZd dlmZmZmZmZmZm	Z	m
Z
mZ d dlmZ d dlZd dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZm Z m!Z! d d	l"m#Z#m$Z$m%Z%m&Z&m'Z' d d
l(m)Z) de*de+fddZ,dd e-ddD Z.G dd de j/Z0G dd dZ1dS )    N)AnyCallableDictListLiteralOptionalTuplecast)unquote)!DEFAULT_MAX_INCOMPLETE_EVENT_SIZE)ASGI3ApplicationASGIReceiveEventASGISendEventHTTPRequestEventHTTPResponseBodyEventHTTPResponseStartEvent	HTTPScope)Config)TRACE_LOG_LEVEL)CLOSE_HEADERHIGH_WATER_LIMITFlowControlservice_unavailable)get_client_addrget_local_addrget_path_with_query_stringget_remote_addris_ssl)ServerStatestatus_codereturnc                 C   s(   z	t | j W S  ty   Y dS w )N    )http
HTTPStatusphraseencode
ValueError)r    r'   vC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\uvicorn/protocols/http/h11_impl.py_get_status_phrase.   s
   r)   c                 C   s   i | ]}|t |qS r'   )r)   ).0r   r'   r'   r(   
<dictcomp>5   s    
r+   d   iX  c                   @   s  e Zd Z	d,dededeeef dee	j
 ddf
ddZd	e	jddfd
dZdee ddfddZd-ddZd-ddZdee fddZdefddZdeddfddZd-ddZdejddfddZdeddf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 ).H11ProtocolNconfigserver_state	app_state_loopr    c                 C   s   |j s|  || _|j| _|pt | _t	d| _
t	d| _| j | _ttj|jd ur3|jnt| _|j| _|j| _|j| _|| _d | _|j| _|| _|j| _|j| _d | _d | _d | _d | _ d | _!d | _"d | _#d | _$d S )Nzuvicorn.errorzuvicorn.access)%Zloadedloadr.   Z
loaded_appappasyncioget_event_looplooplogging	getLoggerloggeraccess_loggerhasHandlers
access_logh11
ConnectionZSERVERZh11_max_incomplete_event_sizer   connws_protocol_class	root_pathlimit_concurrencyr0   timeout_keep_alive_tasktimeout_keep_aliver/   connectionstasks	transportflowserverclientschemescopeheaderscycle)selfr.   r/   r0   r1   r'   r'   r(   __init__;   s>   

zH11Protocol.__init__rG   c                 C   sz   | j |  || _t|| _t|| _t|| _t	|rdnd| _
| jjtkr;| jr/d| j nd}| jtd| d S d S )Nhttpsr"   %s:%d -  z%sHTTP connection made)rE   addrG   r   rH   r   rI   r   rJ   r   rK   r9   levelr   log)rO   rG   prefixr'   r'   r(   connection_madel   s   


zH11Protocol.connection_madeexcc                 C   s   | j |  | jjtkr| jrd| j nd}| jtd| | jr)| jjs)d| j_	| j
jtjkrGt }z| j
| W n
 tjyF   Y nw | jd urR| jj  | jd ur\| j  |d u rk| j  |   d S d S )NrR   rS   z%sHTTP connection lostT)rE   discardr9   rU   r   rJ   rV   rN   response_completedisconnectedr?   	our_stater=   ERRORConnectionClosedsendZLocalProtocolErrormessage_eventsetrH   resume_writingrG   close_unset_keepalive_if_required)rO   rY   rW   eventr'   r'   r(   connection_lost{   s*   



zH11Protocol.connection_lostc                 C      d S Nr'   rO   r'   r'   r(   eof_received   s   zH11Protocol.eof_receivedc                 C   s"   | j d ur| j   d | _ d S d S ri   )rC   cancelrj   r'   r'   r(   re      s   


z(H11Protocol._unset_keepalive_if_requiredc                 C   sT   g }d }| j D ]\}}|dkrdd |dD }|dkr!| }qd|v r(|S d S )N
   connectionc                 S   s   g | ]}|   qS r'   )lowerstrip)r*   tokenr'   r'   r(   
<listcomp>   s    z,H11Protocol._get_upgrade.<locals>.<listcomp>   ,s   upgrade)rM   splitrn   )rO   
connectionupgradenamevaluer'   r'   r(   _get_upgrade   s   zH11Protocol._get_upgradec                 C   s>   | j d u r| jjdkrd}| j| d}| j| dS dS )NautozUnsupported upgrade request.zNo supported WebSocket library detected. Please use "pip install 'uvicorn[standard]'", or install 'websockets' or 'wsproto' manually.FT)r@   r.   wsr9   warning)rO   msgr'   r'   r(   _should_upgrade_to_ws   s   
z!H11Protocol._should_upgrade_to_wsdatac                 C   s    |    | j| |   d S ri   )re   r?   Zreceive_datahandle_events)rO   r~   r'   r'   r(   data_received   s   zH11Protocol.data_receivedc           
      C   sd  	 z| j  }W n tjy    d}| j| | | Y d S w |tju r(d S |tju r4| j	
  d S t|tjrdd |jD | _|jd\}}}d| jjdd|jd	| j| j| j|jd	| jt|d	||| j| j d
| _|  }|dkr|  r| | d S | j d urt!| j"| j kst!| j#| j krt$}d}| j| n| j%}t&| j| j | j'| j	| j| j(| j)| j*j+t,- | j.d
| _/| j01| j/2|}	|	3| j#j4 | j#5|	 nQt|tj6r| j j7tj8u rq | j/ j9|j:7  _9t!| j/j9t;kr| j	
  | j/j<=  n$t|tj>r1| j j7tj8u r'| j'?  | j @  q d| j/_A| j/j<=  q)NTzInvalid HTTP request received.c                 S   s   g | ]
\}}|  |fqS r'   )rn   )r*   keyrw   r'   r'   r(   rq      s    z-H11Protocol.handle_events.<locals>.<listcomp>   ?r"   z2.3)versionspec_versionascii)typeZasgihttp_versionrI   rJ   rK   methodrA   pathraw_pathquery_stringrM   states	   websocketzExceeded concurrency limit.)
rL   r?   rG   rH   r9   r:   r<   default_headersra   on_responseF)Br?   Z
next_eventr=   ZRemoteProtocolErrorr9   r{   send_400_responseZ	NEED_DATAZPAUSEDrH   pause_reading
isinstanceRequestrM   target	partitionr.   Zasgi_versionr   decoderI   rJ   rK   r   rA   r
   r0   copyrL   rx   r}   handle_websocket_upgraderB   lenrE   rF   r   r3   RequestResponseCyclerG   r:   r<   r/   r   r4   Eventon_response_completerN   r6   create_taskrun_asgiadd_done_callbackrZ   rT   Datar]   DONEbodyr~   r   ra   rb   EndOfMessageresume_readingstart_next_cycle	more_body)
rO   rf   r|   r   _r   ru   r3   messagetaskr'   r'   r(   r      s   










zH11Protocol.handle_eventsrf   c                 C   s   | j jtkr| jrd| j nd}| j td| | j|  |jd|jdg}| j	D ]\}}||d|dg7 }q)|
d | j| j| j| jd}|| j |d	| | j| d S )
NrR   rS   z%sUpgrading to WebSocket    s    HTTP/1.1
s   : s   
)r.   r/   r0   r!   )r9   rU   r   rJ   rV   rE   rZ   r   r   rM   appendr@   r.   r/   r0   rX   rG   r   joinset_protocol)rO   rf   rW   outputrv   rw   protocolr'   r'   r(   r     s    
z$H11Protocol.handle_websocket_upgrader|   c                 C   s   t d }ddg}tjd||d}| j|}| j| | jjtj|ddd}| j| | jjt	 d}| j| | j
  d S )Ni  s   content-types   text/plain; charset=utf-8rm   s   closer   rM   reasonr   r~   rf   )STATUS_PHRASESr=   Responser?   r`   rG   writer   r%   r   rd   )rO   r|   r   rM   rf   r   r'   r'   r(   r   &  s   zH11Protocol.send_400_responsec                 C   s~   | j  jd7  _| j rd S |   | j| j| j| _	| j
  | jjtju r;| jjtju r=| j  |   d S d S d S )N   )r/   Ztotal_requestsrG   
is_closingre   r6   
call_laterrD   timeout_keep_alive_handlerrC   rH   r   r?   r]   r=   r   Ztheir_stater   r   rj   r'   r'   r(   r   8  s   


z H11Protocol.on_response_completec                 C   s@   | j du s	| j jrt }| j| | j  dS d| j _dS )zG
        Called by the server to commence a graceful shutdown.
        NF)	rN   r[   r=   r_   r?   r`   rG   rd   
keep_aliverO   rf   r'   r'   r(   shutdownM  s
   zH11Protocol.shutdownc                 C      | j   dS )z\
        Called by the transport when the write buffer exceeds the high water mark.
        N)rH   pause_writingrj   r'   r'   r(   r   X     zH11Protocol.pause_writingc                 C   r   )z_
        Called by the transport when the write buffer drops below the low water mark.
        N)rH   rc   rj   r'   r'   r(   rc   ^  r   zH11Protocol.resume_writingc                 C   s0   | j  st }| j| | j   dS dS )zk
        Called on a keep-alive connection if no new data is received after a short
        delay.
        N)rG   r   r=   r_   r?   r`   rd   r   r'   r'   r(   r   d  s
   
z&H11Protocol.timeout_keep_alive_handlerri   r    N)!__name__
__module____qualname__r   r   r   strr   r   r4   AbstractEventLooprP   	TransportrX   	Exceptionrg   rk   re   bytesrx   boolr}   r   r   r=   r   r   r   r   r   r   rc   r   r'   r'   r'   r(   r-   :   s@    

1




[



r-   c                   @   s   e Zd Zdddejdejdedej	dej	de
d	eeeef  d
ejded ddfddZdddZdddZd ddZd!ddZdS )"r   rL   r   r?   rG   rH   r9   r:   r<   r   ra   r   ).Nr    Nc                 C   sl   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d| _
d| _|j| _d| _d| _d| _d| _d S )NFTr!   )rL   r?   rG   rH   r9   r:   r<   r   ra   r   r\   r   Z!they_are_waiting_for_100_continuewaiting_for_100_continuer   r   response_startedr[   )rO   rL   r?   rG   rH   r9   r:   r<   r   ra   r   r'   r'   r(   rP   p  s"   
zRequestResponseCycle.__init__r3   r   c              
      s^  zz|| j | j| jI d H }W n, ty< } z d}| jj||d | js-|  I d H  n| j	  W Y d }~nId }~ww |d urPd}| j|| | j	  n9| jsf| j
sfd}| j| |  I d H  n3| js| j
sd}| j| | j	  W dd | _d S W dd | _d S W dd | _d S W dd | _d S W dd | _d S W dd | _d S dd | _w )NzException in ASGI application
)exc_infoz4ASGI callable should return None, but returned '%s'.z1ASGI callable returned without starting response.z3ASGI callable returned without completing response.c                   S   rh   ri   r'   r'   r'   r'   r(   <lambda>  s    z/RequestResponseCycle.run_asgi.<locals>.<lambda>)rL   receiver`   BaseExceptionr9   errorr   send_500_responserG   rd   r\   r[   r   )rO   r3   resultrY   r|   r'   r'   r(   r     sH   
 
zRequestResponseCycle.run_asgic                    sB   ddddgd}|  |I d H  dddd	}|  |I d H  d S )
Nhttp.response.starti  r   r   )r   statusrM   http.response.bodys   Internal Server ErrorFr   r   r   )r`   )rO   Zresponse_start_eventZresponse_body_eventr'   r'   r(   r     s   z&RequestResponseCycle.send_500_responser   r   c                    s  |d }| j jr| js| j  I d H  | jrd S | js|dkr(d}t|| td|}d| _d| _|d }| jt	|
dg  }t| jd v rRt|vrR|tg }| jrl| jd	t| j| jd
 t| j| jd | t| }tj|||d}| jj|d}| j| n^| js|dkrd}t|| td|}|
dd}	|
dd}
| jd
 dkrdn|	}| jjtj|dd}| j| |
sd| _| j  | jjt d}| j| nd}t|| | jr| jjtju s| j s| jjt! d | j"  | #  d S d S )Nr   r   z:Expected ASGI message 'http.response.start', but got '%s'.r   TFr   rM   z%s - "%s %s HTTP/%s" %dr   r   r   r   r   z9Expected ASGI message 'http.response.body', but got '%s'.r   r   r!   r   HEADr   zDUnexpected ASGI message '%s' sent, after response already completed.)$rH   Zwrite_pausedr\   drainr   RuntimeErrorr	   r   r   listgetr   rL   r<   r:   infor   r   r   r=   r   r?   r`   rG   r   r[   r   ra   rb   r   r]   Z
MUST_CLOSEr   r_   rd   r   )rO   r   Zmessage_typer|   r   rM   r   responser   r   r   r~   r'   r'   r(   r`     sl   





zRequestResponseCycle.sendr   c                    s   | j r#| j s#g }tjd|dd}| jj|d}| j| d| _ | js;| j	s;| j
  | j I d H  | j  | jsA| j	rEddiS d| j| jd	}d
| _|S )Nr,   Continuer   r   Fr   zhttp.disconnectzhttp.requestr   r!   )r   rG   r   r=   ZInformationalResponser?   r`   r   r\   r[   rH   r   ra   waitclearr   r   )rO   rM   rf   r   r   r'   r'   r(   r     s*   

zRequestResponseCycle.receive)r3   r   r    Nr   )r   r   r    N)r    r   )r   r   r   r=   r>   r4   r   r   r7   Loggerr   r   r   r   r   r   rP   r   r   r`   r   r'   r'   r'   r(   r   o  s8    	


&

Jr   )2r4   r"   r7   typingr   r   r   r   r   r   r   r	   urllib.parser
   r=   Zh11._connectionr   Zuvicorn._typesr   r   r   r   r   r   r   Zuvicorn.configr   Zuvicorn.loggingr   Z#uvicorn.protocols.http.flow_controlr   r   r   r   Zuvicorn.protocols.utilsr   r   r   r   r   Zuvicorn.serverr   intr   r)   ranger   Protocolr-   r   r'   r'   r'   r(   <module>   s*    (
$	  7