o
    96dT                     @   sV  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZmZmZm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 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. e/dZ0e/dZ1de2de3fddZ4dd e5ddD Z6G dd de j7Z8G dd dZ9dS )    N)TimerHandle)deque)
AnyCallableDequeDictListLiteralOptionalTupleUnioncast)ASGI3ApplicationASGIReceiveEventASGISendEventHTTPDisconnectEvent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)ServerStates   [ -()<>@,;:[]={} 	\"]s   [ -]status_codereturnc                 C   sH   z
t | j }W n ty   d}Y nw ddt|  d|dgS )N    s	   HTTP/1.1        
)http
HTTPStatusphraseencode
ValueErrorjoinstr)r"   r)    r.   |C:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\uvicorn/protocols/http/httptools_impl.py_get_status_line6   s   r0   c                 C   s   i | ]}|t |qS r.   )r0   ).0r"   r.   r.   r/   
<dictcomp>>   s    
r2   d   iX  c                   @   sh  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e d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ddfd d!Zd=d"d#Zd$eddfd%d&Zd'ed(eddfd)d*Zd=d+d,Zd-eddfd.d/Zd=d0d1Zd=d2d3Z d=d4d5Z!d=d6d7Z"d=d8d9Z#d=d:d;Z$dS )>HttpToolsProtocolNconfigserver_state	app_state_loopr#   c                 C   s   |j s|  || _|j| _|pt | _t	d| _
t	d| _| j | _t| | _|j| _|j| _|j| _|| _d | _|j| _|| _|j| _|j| _d | _d | _d | _d | _d | _t | _ d | _!d | _"d| _#d | _$d S )Nzuvicorn.errorzuvicorn.accessF)%Zloadedloadr5   Z
loaded_appappasyncioget_event_looplooplogging	getLoggerloggeraccess_loggerhasHandlers
access_log	httptoolsZHttpRequestParserparserws_protocol_class	root_pathlimit_concurrencyr7   timeout_keep_alive_tasktimeout_keep_aliver6   connectionstasks	transportflowserverclientschemer   pipelinescopeheadersexpect_100_continuecycle)selfr5   r6   r7   r8   r.   r.   r/   __init__D   s8   
zHttpToolsProtocol.__init__rM   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)rK   addrM   r   rN   r   rO   r   rP   r    rQ   r@   levelr   log)rW   rM   prefixr.   r.   r/   connection_mader   s   


z!HttpToolsProtocol.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d ur4| jj
  | jd ur>| j  |d u rK| j  |   d | _d S )NrZ   r[   z%sHTTP connection lostT)rK   discardr@   r]   r   rP   r^   rV   response_completedisconnectedmessage_eventsetrN   resume_writingrM   close_unset_keepalive_if_requiredrE   )rW   ra   r_   r.   r.   r/   connection_lost   s   




z!HttpToolsProtocol.connection_lostc                 C      d S Nr.   rW   r.   r.   r/   eof_received   s   zHttpToolsProtocol.eof_receivedc                 C   s"   | j d ur| j   d | _ d S d S rl   )rI   cancelrm   r.   r.   r/   ri      s   


z.HttpToolsProtocol._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)r1   tokenr.   r.   r/   
<listcomp>   s    z2HttpToolsProtocol._get_upgrade.<locals>.<listcomp>   ,s   upgrade)rT   splitrq   )rW   
connectionupgradenamevaluer.   r.   r/   _get_upgrade   s   zHttpToolsProtocol._get_upgraderx   c                 C   sF   |dkr| j d urdS | jjdkr!d}| j| d}| j| dS )Ns	   websocketTautozUnsupported upgrade request.zNo supported WebSocket library detected. Please use "pip install 'uvicorn[standard]'", or install 'websockets' or 'wsproto' manually.F)rF   r5   wsr@   warning)rW   rx   msgr.   r.   r/   _should_upgrade_to_ws   s   z'HttpToolsProtocol._should_upgrade_to_wsc                 C   s   |   }| |S rl   )r{   r   )rW   rx   r.   r.   r/   _should_upgrade   s   
z!HttpToolsProtocol._should_upgradedatac                 C   s   |    z	| j| W d S  tjy%   d}| j| | | Y d S  tjy?   | 	 }| 
|r<|   Y d S Y d S w )NzInvalid HTTP request received.)ri   rE   	feed_datarD   ZHttpParserErrorr@   r~   send_400_responseZHttpParserUpgrader{   r   handle_websocket_upgrade)rW   r   r   rx   r.   r.   r/   data_received   s   

zHttpToolsProtocol.data_receivedc                 C   s   | j jtkr| jrd| j nd}| j td| | j|  | jd  }|d| j	dg}| jd D ]\}}||d|d	g7 }q1|
d	 | j| j| j| jd
}|| j |d| | j| d S )NrZ   r[   z%sUpgrading to WebSocketmethodr%   s    HTTP/1.1
rT      : r&   )r5   r6   r7   r$   )r@   r]   r   rP   r^   rK   rb   rS   r*   urlappendrF   r5   r6   r7   r`   rM   r   r,   set_protocol)rW   r_   r   outputry   rz   protocolr.   r.   r/   r      s"   
z*HttpToolsProtocol.handle_websocket_upgrader   c              	   C   s~   t d g}| jjD ]\}}||d|dg q	|ddtt|d d dd|dg | jd	| | j
  d S )	Ni  r   r&   s)   content-type: text/plain; charset=utf-8
s   content-length: asciis   connection: close
r$   )STATUS_LINEr6   default_headersextendr-   lenr*   rM   writer,   rh   )rW   r   contentry   rz   r.   r.   r/   r      s   
	z#HttpToolsProtocol.send_400_responsec              
   C   sJ   d| _ d| _g | _d| jjddd| j| j| j| j| j| j	
 d	| _d S )Nr$   Fr'   z2.3)versionspec_version1.1)	typeZasgihttp_versionrO   rP   rQ   rG   rT   state)r   rU   rT   r5   Zasgi_versionrO   rP   rQ   rG   r7   copyrS   rm   r.   r.   r/   on_message_begin   s   z"HttpToolsProtocol.on_message_beginr   c                 C   s   |  j |7  _ d S rl   )r   )rW   r   r.   r.   r/   on_url   s   zHttpToolsProtocol.on_urlry   rz   c                 C   s6   |  }|dkr|  dkrd| _| j||f d S )Ns   expects   100-continueT)rq   rU   rT   r   )rW   ry   rz   r.   r.   r/   	on_header   s   zHttpToolsProtocol.on_headerc           
      C   s  | j  }| j  }|d| jd< |dkr|| jd< | j  r&|  r&d S t| j	}|j
}|d}d|v r>tj|}|| jd< || jd< |jpLd| jd	< | jd urpt| j| jkset| j| jkrpt}d
}| j| n| j}| j}t| j| j| j| j| j| j| jjt  | j!|dk| j"d| _|d u s|j#r| j$%| j&|}	|	'| jj( | j)|	 d S | j*  | j+,| j|f d S )Nr   r   r   r   %pathraw_pathr$   Zquery_stringzExceeded concurrency limit.z1.0)rS   rM   rN   r@   rA   rC   r   re   rU   
keep_aliveon_response)-rE   Zget_http_version
get_methoddecoderS   should_upgrader   rD   	parse_urlr   r   urllibparseunquotequeryrH   r   rK   rL   r   r@   r~   r:   rV   RequestResponseCyclerM   rN   rA   rC   r6   r   r;   EventrU   on_response_completerc   r=   create_taskrun_asgiadd_done_callbackrb   r\   pause_readingrR   
appendleft)
rW   r   r   
parsed_urlr   r   r:   messageZexisting_cycletaskr.   r.   r/   on_headers_complete  sT   







z%HttpToolsProtocol.on_headers_completebodyc                 C   sX   | j  r	|  s| jjrd S | j j|7  _t| jjtkr$| j	  | jj
  d S rl   )rE   r   r   rV   rc   r   r   r   rN   r   re   rf   )rW   r   r.   r.   r/   on_body7  s   
zHttpToolsProtocol.on_bodyc                 C   s6   | j  r	|  s| jjrd S d| j_| jj  d S )NF)rE   r   r   rV   rc   	more_bodyre   rf   rm   r.   r.   r/   on_message_completeA  s   z%HttpToolsProtocol.on_message_completec                 C   s   | j  jd7  _| j rd S |   | j| j| j| _	| j
  | jrD| j \}}| j||}|| jj | j| d S d S )N   )r6   Ztotal_requestsrM   
is_closingri   r=   
call_laterrJ   timeout_keep_alive_handlerrI   rN   resume_readingrR   popr   r   r   rL   rb   r\   )rW   rV   r:   r   r.   r.   r/   r   I  s   

z&HttpToolsProtocol.on_response_completec                 C   s,   | j du s	| j jr| j  dS d| j _dS )zG
        Called by the server to commence a graceful shutdown.
        NF)rV   rc   rM   rh   r   rm   r.   r.   r/   shutdowna  s   zHttpToolsProtocol.shutdownc                 C      | j   dS )z\
        Called by the transport when the write buffer exceeds the high water mark.
        N)rN   pause_writingrm   r.   r.   r/   r   j     zHttpToolsProtocol.pause_writingc                 C   r   )z_
        Called by the transport when the write buffer drops below the low water mark.
        N)rN   rg   rm   r.   r.   r/   rg   p  r   z HttpToolsProtocol.resume_writingc                 C   s   | j  s| j   dS dS )zk
        Called on a keep-alive connection if no new data is received after a short
        delay.
        N)rM   r   rh   rm   r.   r.   r/   r   v  s   
z,HttpToolsProtocol.timeout_keep_alive_handlerrl   r#   N)%__name__
__module____qualname__r   r!   r   r-   r   r
   r;   AbstractEventLooprX   	Transportr`   	Exceptionrj   rn   ri   bytesr{   boolr   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   r   r.   r.   r.   r/   r4   C   sL    

.






4




	
r4   c                   @   s   e Zd Zdd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eded fddZdddZd ddZd!ddZd"ddZdS )#r   rS   r   rM   rN   r@   rA   rC   r   re   rU   r   r   ).Nc                 C   sp   || _ || _|| _|| _|| _|| _|| _|| _|| _d| _	|
| _
|	| _d| _d| _d| _d| _d | _d| _d S )NFr$   Tr   )rS   rM   rN   r@   rA   rC   r   re   r   rd   r   waiting_for_100_continuer   r   response_startedrc   chunked_encodingexpected_content_length)rW   rS   rM   rN   r@   rA   rC   r   re   rU   r   r   r.   r.   r/   rX     s$   
zRequestResponseCycle.__init__r:   r   r#   Nc              
      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   rk   rl   r.   r.   r.   r.   r/   <lambda>  s    z/RequestResponseCycle.run_asgi.<locals>.<lambda>)rS   receivesendBaseExceptionr@   errorr   send_500_responserM   rh   rd   rc   r   )rW   r:   resultra   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  )s   content-types   text/plain; charset=utf-8)rp      close)r   statusrT   http.response.bodys   Internal Server ErrorFr   r   r   )r   )rW   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| g}|D ]U\}}t|rtdt|rtd| }|dkr| jd u rt| | _d| _n|dkr| dkrd| _d| _n|dkr| dkrd| _||d|dg qs| jd u r| jd
 dkr|dvrd| _|d |d | jd | d S | j!s|dkrd}t|| tt"|
dd}	|
dd}
| jd
 dkrd| _n@| jrB|	r.dt#|	 |	dg}ng }|
s8|d | jd | nt#|	}|| jkrPtd |  j|8  _| j|	 |
s| jdkrjtd!d| _!| j$%  | js{| j&  | '  d S d S d"}t|| )#Nr   r   z:Expected ASGI message 'http.response.start', but got '%s'.r   TFr   rT   z%s - "%s %s HTTP/%s" %dr   r   zInvalid HTTP header name.zInvalid HTTP header value.s   content-lengths   transfer-encodings   chunkedr   rp   r   r   r&   HEAD)   i0  s   transfer-encoding: chunked
r$   r   z9Expected ASGI message 'http.response.body', but got '%s'.r   r   s   %x
s   0

z+Response content longer than Content-Lengthz,Response content shorter than Content-LengthzDUnexpected ASGI message '%s' sent, after response already completed.)(rN   Zwrite_pausedrd   drainr   RuntimeErrorr   r   r   listgetr   rS   rC   rA   infor   r   r   	HEADER_REsearchHEADER_VALUE_RErq   r   intr   r   r   r   r   rM   r   r,   rc   r   r   re   rf   rh   r   )rW   r   Zmessage_typer   r"   rT   r   ry   rz   r   r   	num_bytesr.   r.   r/   r     s   












zRequestResponseCycle.sendr   c                    s   | j r| j s| jd d| _ | js*| js*| j  | j	 I d H  | j
  | js0| jr6ddi}|S d| j| jd}d| _|S )Ns   HTTP/1.1 100 Continue

Fr   zhttp.disconnectzhttp.requestr   r$   )r   rM   r   r   rd   rc   rN   r   re   waitclearr   r   )rW   r   r.   r.   r/   r   D  s"   

	zRequestResponseCycle.receive)r:   r   r#   Nr   )r   r   r#   N)r#   r   )r   r   r   r;   r   r   r>   Loggerr   r   r   r   r   r   rX   r   r   r   r   r.   r.   r.   r/   r     s8    	


(

nr   ):r;   r'   r>   rer   Zasyncio.eventsr   collectionsr   typingr   r   r   r   r   r	   r
   r   r   r   rD   Zuvicorn._typesr   r   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!   compiler   r   r   r   r0   ranger   Protocolr4   r   r.   r.   r.   r/   <module>   s2    0(


  >