
    f j4S                       d dl mZ 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 d dlZd dl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j)        d          Z* ej)        d          Z+ddZ,d  e-dd          D             Z. G d dej/                  Z0 G d d          Z1dS )    )annotationsN)TimerHandle)deque)AnyCallableLiteralcast)ASGI3ApplicationASGIReceiveEventASGISendEventHTTPRequestEvent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intreturnbytesc                    	 t          j        |           j                                        }n# t          $ r d}Y nw xY wd                    dt          |                                           d|dg          S )N    s	   HTTP/1.1        
)http
HTTPStatusphraseencode
ValueErrorjoinstr)r   r&   s     yC:\Users\Terasoftware\OneDrive\Desktop\faahhh\fyndo\fyndo\venv\Lib\site-packages\uvicorn/protocols/http/httptools_impl.py_get_status_liner,       s|    --4;;==   88\3{#3#3#:#:#<#<dFGTUUUs   +. ==c                .    i | ]}|t          |          S  )r,   ).0r   s     r+   
<dictcomp>r0   (   s#    ]]]k{,[99]]]r!   d   iX  c                      e Zd Z	 d1d2dZd3dZd4dZd5dZd5dZd6dZd7dZ	d8dZ
d9dZd5dZd:d!Zd5d"Zd;d$Zd<d'Zd5d(Zd=d*Zd5d+Zd5d,Zd5d-Zd5d.Zd5d/Zd5d0ZdS )>HttpToolsProtocolNconfigr   server_stater   	app_statedict[str, Any]_loop asyncio.AbstractEventLoop | Noner   Nonec                   |j         s|                                 || _        |j        | _        |pt          j                    | _        t          j	        d          | _
        t          j	        d          | _        | j                                        | _        t          j        |           | _        |j        | _        |j        | _        |j        | _        || _        d | _        |j        | _        || _        |j        | _        |j        | _        d | _        d | _        d | _        d | _        d | _        t?                      | _         d | _!        d | _"        d| _#        d | _$        d S )Nzuvicorn.errorzuvicorn.accessF)%loadedloadr4   
loaded_appappasyncioget_event_looplooplogging	getLoggerloggeraccess_loggerhasHandlers
access_log	httptoolsHttpRequestParserparserws_protocol_class	root_pathlimit_concurrencyr6   timeout_keep_alive_tasktimeout_keep_aliver5   connectionstasks	transportflowserverclientschemer   pipelinescopeheadersexpect_100_continuecycle)selfr4   r5   r6   r8   s        r+   __init__zHttpToolsProtocol.__init__,   s>    } 	KKMMM$5W355	'88$./?@@,88::1$77!'!9)!'!9" <@$"("; )'3!'
 -1!%	.2.27;NSgg !%
26#( +/


r!   rS   asyncio.Transportc                   | j                             |            || _        t          |          | _        t          |          | _        t          |          | _        t          |          rdnd| _
        | j        j        t          k    r6| j        r
d| j        z  nd}| j                            t          d|           d S d S )Nhttpsr$   %s:%d -  z%sHTTP connection made)rQ   addrS   r   rT   r   rU   r   rV   r   rW   rE   levelr   log)r]   rS   prefixs      r+   connection_madez!HttpToolsProtocol.connection_madeZ   s     	T""""	**	$Y//%i00!'	!2!2>gg;/ 	O15DZ$+--"FKOOO-EvNNNNN	O 	Or!   excException | Nonec                    | j                             |            | j        j        t          k    r4| j        r
d| j        z  nd}| j                            t          d|           | j        r| j        j        sd| j        _	        | j        | j        j
                                         | j        | j                                         |-| j                                         |                                  d | _        d S )Nrb   rc   z%sHTTP connection lostT)rQ   discardrE   re   r   rV   rf   r\   response_completedisconnectedmessage_eventsetrT   resume_writingrS   close_unset_keepalive_if_requiredrK   )r]   ri   rg   s      r+   connection_lostz!HttpToolsProtocol.connection_losti   s      &&&;/ 	O15DZ$+--"FKOOO-EvNNN: 	+dj: 	+&*DJ#: 	+J$((***9 	'I$$&&& 	0N  """--///r!   c                    d S Nr.   r]   s    r+   eof_receivedzHttpToolsProtocol.eof_received|   s    r!   c                X    | j         "| j                                          d | _         d S d S rv   )rO   cancelrw   s    r+   rs   z.HttpToolsProtocol._unset_keepalive_if_required   s:    ' 	0(//111+/D(((	0 	0r!   bytes | Nonec                    g }d }| j         D ]D\  }}|dk    rd |                    d          D             }|dk    r|                                }Ed|v r|S d S )N
   connectionc                Z    g | ](}|                                                                 )S r.   )lowerstrip)r/   tokens     r+   
<listcomp>z2HttpToolsProtocol._get_upgrade.<locals>.<listcomp>   s,    SSSekkmm1133SSSr!      ,s   upgrade)rZ   splitr   )r]   
connectionupgradenamevalues        r+   _get_upgradezHttpToolsProtocol._get_upgrade   s    
< 	( 	(KD%}$ TSSTARARSSS
z! (++--# 	Ntr!   r   boolc                    |dk    r	| j         dS | j        j        dk    r8d}| 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)rL   r4   wsrE   warning)r]   r   msgs      r+   _should_upgrade_to_wsz'HttpToolsProtocol._should_upgrade_to_ws   sm    l" 	t'= 	4;>V# 	%0CK$$$ \CK$$$ur!   c                T    |                                  }|                     |          S rv   )r   r   )r]   r   s     r+   _should_upgradez!HttpToolsProtocol._should_upgrade   s'    ##%%))'222r!   datar   c                   |                                   	 | j                            |           d S # t          j        $ r5 d}| j                            |           |                     |           Y d S t          j        $ rD | 	                                }| 
                    |          r|                                  Y d S Y d S w xY w)NzInvalid HTTP request received.)rs   rK   	feed_datarI   HttpParserErrorrE   r   send_400_responseHttpParserUpgrader   r   handle_websocket_upgrade)r]   r   r   r   s       r+   data_receivedzHttpToolsProtocol.data_received   s    ))+++
	0K!!$'''''( 	 	 	2CK$$$""3'''FF* 	0 	0 	0''))G))'22 0--//////0 0 0	0s   2 A C5ACCc                   | j         j        t          k    r4| j        r
d| j        z  nd}| j                             t          d|           | j                            |            | j        d                                         }|d| j	        dg}| j        d         D ]\  }}||d|d	gz  }|
                    d	           |                     | j        | j        | j        
          }|                    | j                   |                    d                    |                     | j                            |           d S )Nrb   rc   z%sUpgrading to WebSocketmethodr"   s    HTTP/1.1
rZ      : r#   )r4   r5   r6   r!   )rE   re   r   rV   rf   rQ   rl   rY   r'   urlappendrL   r4   r5   r6   rh   rS   r   r)   set_protocol)r]   rg   r   outputr   r   protocols          r+   r   z*HttpToolsProtocol.handle_websocket_upgrade   sE   ;/ 	Q15DZ$+--"FKOOO-GPPP  &&&H%,,..$*:;:i0 	4 	4KD%tUE733FFg));*n * 
 

 	  000sxx//000##H-----r!   r   r*   c           	        t           d         g}| j        j        D ]\  }}|                    |d|dg           |                    ddt	          t          |                                        d          z   dz   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_LINEr5   default_headersextendr*   lenr'   rS   writer)   rr   )r]   r   contentr   r   s        r+   r   z#HttpToolsProtocol.send_400_response   s    s#$,< 	: 	:KD%NND%89999>#c#c((mm&:&:7&C&CCgM(

7##	
 	
 	
 	SXXg..///r!   c           
         d| _         d| _        g | _        d| j        j        ddd| j        | j        | j        | j        | j        | j	        
                                d	| _        d S )Nr!   Fr$   z2.4)versionspec_version1.1)	typeasgihttp_versionrU   rV   rW   rM   rZ   state)r   r[   rZ   r4   asgi_versionrU   rV   rW   rM   r6   copyrY   rw   s    r+   on_message_beginz"HttpToolsProtocol.on_message_begin   sj    #(  $ 8%PP!kkk|^((**

 




r!   r   c                &    | xj         |z  c_         d S rv   )r   )r]   r   s     r+   on_urlzHttpToolsProtocol.on_url   s    Cr!   r   r   c                    |                                 }|dk    r|                                 dk    rd| _        | j                            ||f           d S )Ns   expects   100-continueT)r   r[   rZ   r   )r]   r   r   s      r+   	on_headerzHttpToolsProtocol.on_header   sX    zz||9 	,/!A 	,'+D$T5M*****r!   c                |   | j                                         }| j                                         }|                    d          | j        d<   |dk    r
|| j        d<   | j                                         r|                                 rd S t          j        | j	                  }|j
        }|                    d          }d|v rt          j                            |          }| j        |z   }| j                            d          |z   }|| j        d<   || j        d<   |j        pd| j        d	<   | j        ^t%          | j                  | j        k    st%          | j                  | j        k    r$t*          }d
}	| j                            |	           n| j        }| j        }
t5          | j        | j        | j        | j        | j        | j        | j        j         tC          j"                    | j#        |dk    | j$                  | _        |
|
j%        rm| j&        '                    | j        (                    |                    }|)                    | j        j*                   | j        +                    |           d S | j        ,                                 | j-        .                    | j        |f           d S )Nr   r   r   r   %pathraw_pathr!   query_stringzExceeded concurrency limit.z1.0)rY   rS   rT   rE   rF   rH   r   ro   r[   
keep_aliveon_response)/rK   get_http_version
get_methoddecoderY   should_upgrader   rI   	parse_urlr   r   urllibparseunquoterM   r'   queryrN   r   rQ   rR   r   rE   r   r?   r\   RequestResponseCyclerS   rT   rF   rH   r5   r   r@   Eventr[   on_response_completerm   rB   create_taskrun_asgiadd_done_callbackrl   rd   pause_readingrX   
appendleft)r]   r   r   
parsed_urlr   r   	full_pathfull_raw_pathr?   messageexisting_cycletasks               r+   on_headers_completez%HttpToolsProtocol.on_headers_complete   s   {3355''))%}}W55
85  	6)5DJ~&;%%'' 	D,@,@,B,B 	F(22
?w''$; 	.<''--DNT)	--g66A&
6!.
:%/%5%<
>" ! 	 !!T%;;	?B4:RVRh?h	 &C3GK(((((C)*n;, -=!-// $ 8#u,1
 
 

  	8^%E 	89(()<)<S)A)ABBD""4:#5666JNN4      I##%%%M$$dj#%677777r!   bodyc                X   | j                                         r|                                 s| j        j        rd S | j        xj        |z  c_        t          | j        j                  t          k    r| j        	                                 | j        j
                                         d S rv   )rK   r   r   r\   rm   r   r   r   rT   r   ro   rp   )r]   r   s     r+   on_bodyzHttpToolsProtocol.on_body   s    K&&(( 	T-A-A-C-C 	
Hd 	F
4tz"22 	&I##%%%
 $$&&&&&r!   c                    | j                                         r|                                 s| j        j        rd S d| j        _        | j        j                                         d S )NF)rK   r   r   r\   rm   	more_bodyro   rp   rw   s    r+   on_message_completez%HttpToolsProtocol.on_message_complete(  sc    K&&(( 	T-A-A-C-C 	
Hd 	F$

 $$&&&&&r!   c                *   | j         xj        dz  c_        | j                                        rd S |                                  | j                                         | j        r| j                                        \  }}| j	        
                    |                    |                    }|                    | j        j                   | j                            |           d S | j	                            | j        | j                  | _        d S )N   )r5   total_requestsrS   
is_closingrs   rT   resume_readingrX   poprB   r   r   r   rR   rl   rd   
call_laterrP   timeout_keep_alive_handlerrO   )r]   r\   r?   r   s       r+   r   z&HttpToolsProtocol.on_response_complete.  s    ((A-((>$$&& 	F))+++ 		  """ = 	**,,JE39(()<)<==D""4:#5666JNN4     +/9+?+?')H, ,D(((r!   c                z    | j         | j         j        r| j                                         dS d| j         _        dS )zG
        Called by the server to commence a graceful shutdown.
        NF)r\   rm   rS   rr   r   rw   s    r+   shutdownzHttpToolsProtocol.shutdownF  sD     : 	*!= 	*N  """""$)DJ!!!r!   c                8    | j                                          dS )z\
        Called by the transport when the write buffer exceeds the high water mark.
        N)rT   pause_writingrw   s    r+   r   zHttpToolsProtocol.pause_writingO  s     		!!!!!r!   c                8    | j                                          dS )z_
        Called by the transport when the write buffer drops below the low water mark.
        N)rT   rq   rw   s    r+   rq   z HttpToolsProtocol.resume_writingU  s     		  """""r!   c                n    | 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)rS   r   rr   rw   s    r+   r   z,HttpToolsProtocol.timeout_keep_alive_handler[  s>    
 ~((** 	#N  """""	# 	#r!   rv   )
r4   r   r5   r   r6   r7   r8   r9   r   r:   )rS   r_   r   r:   )ri   rj   r   r:   r   r:   )r   r{   )r   r{   r   r   )r   r   )r   r   r   r:   )r   r*   r   r:   )r   r   r   r:   )r   r   r   r   r   r:   )r   r   r   r:   )__name__
__module____qualname__r^   rh   rt   rx   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rq   r   r.   r!   r+   r3   r3   +   s        37+0 +0 +0 +0 +0\O O O O   &   0 0 0 0

 
 
 
   3 3 3 30 0 0 0. . . .(    
 
 
 
"   + + + +38 38 38 38j' ' ' '' ' ' '   0* * * *" " " "# # # ## # # # # #r!   r3   c                  6    e Zd Zd!dZd"dZd#dZd$dZd%dZd S )&r   rY   r   rS   r_   rT   r   rE   logging.LoggerrF   rH   r   r   list[tuple[bytes, bytes]]ro   asyncio.Eventr[   r   r   Callable[..., None]c                   || _         || _        || _        || _        || _        || _        || _        || _        || _        d| _	        |
| _
        |	| _        d| _        d| _        d| _        d| _        d | _        d| _        d S )NFr!   Tr   )rY   rS   rT   rE   rF   rH   r   ro   r   rn   r   waiting_for_100_continuer   r   response_startedrm   chunked_encodingexpected_content_length)r]   rY   rS   rT   rE   rF   rH   r   ro   r[   r   r   s               r+   r^   zRequestResponseCycle.__init__e  s     
"	*$.*& "$(;% 	 !&!&-1'($$$r!   r?   r
   r   r:   c                  K   	  || j         | j        | j                   d {V }|7d}| j                            ||           | j                                         n| j        s>| j        s7d}| j                            |           | 	                                 d {V  n| j
        s<| j        s5d}| j                            |           | j                                         np# t          $ rc}d}| j                            ||           | j        s| 	                                 d {V  n| j                                         Y d }~nd }~ww xY wd | _        d S # d | _        w xY w)Nz4ASGI callable should return None, but returned '%s'.z1ASGI callable returned without starting response.z3ASGI callable returned without completing response.zException in ASGI application
)exc_infoc                     d S rv   r.   r.   r!   r+   <lambda>z/RequestResponseCycle.run_asgi.<locals>.<lambda>  s    t r!   )rY   receivesendrE   errorrS   rr   r   rn   send_500_responserm   BaseExceptionr   )r]   r?   resultr   ri   s        r+   r   zRequestResponseCycle.run_asgi  s     	,3
DL$)       F  'L!!#v...$$&&&&* '43D 'I!!#&&&,,..........+ 'D4E 'K!!#&&&$$&&&'  	' 	' 	'3CKcC000( ',,..........$$&&&	'*  ,|D||D++++s0   "C( CE" (
E2AEE" EE" "
E,c                   K   |                      ddg dd           d {V  |                      dddd           d {V  d S )	Nhttp.response.starti  ))s   content-types   text/plain; charset=utf-8)   content-lengths   21)r}      close)r   statusrZ   http.response.bodys   Internal Server ErrorFr   r   r   )r   rw   s    r+   r  z&RequestResponseCycle.send_500_response  s      ii-   

 

 
	
 
	
 
	
 
	
 
	
 
	
 
	
 ii!5?Wfkllmmmmmmmmmmmr!   r   r   c                8	  K   |d         }| j         j        r&| j        s| j                                          d {V  | j        rd S | j        s|dk    rd}t          ||z            t          d|          }d| _        d| _        |d         }| j        t          |
                    dg                     z   }t          | j        d         v rt          |vr|t          gz   }| j        rY| j                            d	t!          | j                  | j        d
         t#          | j                  | j        d         |           t$          |         g}|D ]\  }}t&                              |          rt          d          t*                              |          rt          d          |                                }|dk    r5| j        .t1          |                                          | _        d| _        nR|dk    r'|                                dk    rd| _        d| _        n%|dk    r|                                dk    rd| _        |                    |d|dg           | j        1| j        d
         dk    r |dvrd| _        |                    d           |                    d           | j                            d                     |                     d S | j!        s|dk    rd}t          ||z            t          tD          |
                    dd                    }	|
                    dd          }
| j        d
         dk    rd| _        n| j        r_|	rdtG          |	          z  |	dg}ng }|
s|                    d           | j                            d                     |                     nStG          |	          }|| j        k    rt          d           | xj        |z  c_        | j                            |	           |
sp| j        dk    rt          d!          d| _!        | j$        %                                 | j        s| j        &                                 | '                                 d S d S d"}t          ||z            )#Nr   r  z:Expected ASGI message 'http.response.start', but got '%s'.r   TFr	  rZ   z%s - "%s %s HTTP/%s" %dr   r   zInvalid HTTP header name.zInvalid HTTP header value.r  s   transfer-encodings   chunkedr   r}   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.)(rT   write_pausedrn   drainr   RuntimeErrorr	   r   r   listgetr   rY   rH   rF   infor   r   r   	HEADER_REsearchHEADER_VALUE_REr   r   r   r   r   r   r   r   rS   r   r)   rm   r   r   ro   rp   rr   r   )r]   r   message_typer   r   rZ   r   r   r   r   r   	num_bytess               r+   r   zRequestResponseCycle.send  s     v9! 	$$*; 	$)//######### 	F$ _	344 7R"3#56663W==G$(D!,1D)!(+K*T'++i2L2L-M-MMGtz)44 3W9T 3!\N2 "''-#DJ//Jx(.tz::J~.   #;/0G& > >e##D)) D&'BCCC"))%00 E&'CDDDzz||,, ,1F ,36u||~~3F3FD0,1D))11 ,ekkmmz6Q ,34D0,0D))]* ,u{{}}/H ,&+DOeUG<====$ BH1E1O BT_gqTq B(,%@AAANN7###N  '!2!233333' )	333 7Q"3#5666w{{637788DK77I z(#v- +/0,,& + !(3t994dGDGG G  1NN<000$$SXXg%6%67777II	t;; >&'TUUU00I=00$$T***  #/14 W&'UVVV)-&"&&((( +N((***  """""# # YCs\1222r!   r   c                  K   | j         r:| j                                        s!| j                            d           d| _         | j        sX| j        sQ| j                                         | j        	                                 d {V  | j        
                                 | j        s| j        rddiS d| j        | j        d}d| _        |S )Ns   HTTP/1.1 100 Continue

Fr   zhttp.disconnectzhttp.requestr  r!   )r   rS   r   r   rn   rm   rT   r   ro   waitclearr   r   )r]   r   s     r+   r   zRequestResponseCycle.receive"  s      ( 	21J1J1L1L 	2N  !ABBB,1D)  	')? 	'I$$&&&$))+++++++++$$&&& 	/ 6 	/-..-;TY]a]k$l$l	r!   N)rY   r   rS   r_   rT   r   rE   r   rF   r   rH   r   r   r   ro   r   r[   r   r   r   r   r   )r?   r
   r   r:   r   )r   r   r   r:   )r   r   )r   r   r   r^   r   r  r   r   r.   r!   r+   r   r   d  s        %) %) %) %)P, , , ,8n n n nh3 h3 h3 h3T     r!   r   )r   r   r   r   )2
__future__r   r@   r$   rC   rer   asyncio.eventsr   collectionsr   typingr   r   r   r	   rI   uvicorn._typesr
   r   r   r   r   r   uvicorn.configr   uvicorn.loggingr   #uvicorn.protocols.http.flow_controlr   r   r   r   uvicorn.protocols.utilsr   r   r   r   r   uvicorn.serverr   compiler  r  r,   ranger   Protocolr3   r   r.   r!   r+   <module>r+     s>   " " " " " "    				  & & & & & &       / / / / / / / / / / / /                    " ! ! ! ! ! + + + + + + p p p p p p p p p p p p x x x x x x x x x x x x x x & & & & & &BJ<==	"*899V V V V ^]UUSVX[__]]]v# v# v# v# v#( v# v# v#r	L L L L L L L L L Lr!   