
    h-U                       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jR                  d      Z* ejR                  d      Z+ddZ, e-dd      D  ci c]  } |  e,|        c} Z. G d dej^                        Z0 G d d      Z1yc c} w )    )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	   [ -
-]c                    	 t        j                  |       j                  j                         }dj                  dt        |       j                         d|dg      S # t        $ r d}Y :w xY w)N    s	   HTTP/1.1        
)http
HTTPStatusphraseencode
ValueErrorjoinstr)status_coder"   s     JD:\jyotish\venv\Lib\site-packages\uvicorn/protocols/http/httptools_impl.py_get_status_liner)       sd    -44;;= 88\3{#3#:#:#<dFGTUU  s   -A A*)A*d   iX  c                      e Zd Z	 d	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 ddZddZddZddZddZddZ	dd	Z
dd
Zd dZddZd!dZddZd"dZd#dZddZd$dZddZddZddZddZddZddZy)%HttpToolsProtocolNc                j   |j                   s|j                          || _        |j                  | _        |xs t        j                         | _        t        j                  d      | _
        t        j                  d      | _        | j                  j                         | _        t        j                  |       | _        	 | j                   j#                  d       |j&                  | _        |j(                  | _        |j*                  | _        || _        d | _        |j0                  | _        || _        |j4                  | _        |j6                  | _        d | _        d | _        d | _        d | _        d | _         tC               | _"        d | _#        d | _$        d| _%        d | _&        y # t$        $ r Y w xY w)Nzuvicorn.errorzuvicorn.accessT)lenient_data_after_closeF)'loadedloadconfig
loaded_appappasyncioget_event_looplooplogging	getLoggerloggeraccess_loggerhasHandlers
access_log	httptoolsHttpRequestParserparserset_dangerous_lenienciesAttributeErrorws_protocol_class	root_pathlimit_concurrency	app_statetimeout_keep_alive_tasktimeout_keep_aliveserver_stateconnectionstasks	transportflowserverclientschemer   pipelinescopeheadersexpect_100_continuecycle)selfr1   rH   rE   _loops        r(   __init__zHttpToolsProtocol.__init__,   sv    }}KKM$$5W335	''8$../?@,,88:11$7	KK00$0O
 "(!9!9))!'!9!9" <@$"(";"; )'33!''
 -1!%	.2.27;NSg !%
26#( +/
=  		s    F& &	F21F2c                   | j                   j                  |        || _        t        |      | _        t        |      | _        t        |      | _        t        |      rdnd| _
        | j                  j                  t        k  r?| j                  rd| j                  z  nd}| j                  j                  t        d|       y y )Nhttpsr    %s:%d -  z%sHTTP connection made)rI   addrK   r   rL   r   rM   r   rN   r   rO   r9   levelr   log)rU   rK   prefixs      r(   connection_madez!HttpToolsProtocol.connection_madeb   s     	T""	*	$Y/%i0!'	!2g;;/15Z$++-"FKKOOO-EvN 0r   c                h   | j                   j                  |        | j                  j                  t        k  r>| j
                  rd| j
                  z  nd}| j                  j                  t        d|       | j                  r'| j                  j                  sd| j                  _	        | j                  $| j                  j                  j                          | j                  | j                  j                          |*| j                  j                          | j!                          d | _        y )NrZ   r[   z%sHTTP connection lostT)rI   discardr9   r]   r   rN   r^   rT   response_completedisconnectedmessage_eventsetrL   resume_writingrK   close_unset_keepalive_if_requiredr?   )rU   excr_   s      r(   connection_lostz!HttpToolsProtocol.connection_lostq   s      &;;/15Z$++-"FKKOOO-EvN::djj::&*DJJ#::!JJ$$((*99 II$$&;NN  "--/r   c                     y N rU   s    r(   eof_receivedzHttpToolsProtocol.eof_received   s    r   c                `    | j                   "| j                   j                          d | _         y y rm   )rF   cancelro   s    r(   ri   z.HttpToolsProtocol._unset_keepalive_if_required   s-    ''3((//1+/D( 4r   c                    g }d }| j                   D ]Z  \  }}|dk(  r:|j                  d      D cg c]   }|j                         j                         " }}|dk(  sK|j                         }\ d|v r|S y c c}w )N
   connection   ,s   upgrade)rR   splitlowerstrip)rU   
connectionupgradenamevaluetokens         r(   _get_upgradezHttpToolsProtocol._get_upgrade   s    
<<KD%}$AFTARSARekkm113AR
Sz!++-	 (
 #N Ts   %A5c                    | j                   yy)NFT)rB   ro   s    r(   _should_upgrade_to_wsz'HttpToolsProtocol._should_upgrade_to_ws   s    !!)r   c                    | j                   j                  d       | j                         sd}| j                   j                  |       y y )NzUnsupported upgrade request.zNo supported WebSocket library detected. Please use "pip install 'uvicorn[standard]'", or install 'websockets' or 'wsproto' manually.)r9   warningr   )rU   msgs     r(   _unsupported_upgrade_warningz.HttpToolsProtocol._unsupported_upgrade_warning   s@    :;))+ \CKK$ ,r   c                P    | j                         }|dk(  xr | j                         S )Ns	   websocket)r~   r   )rU   rz   s     r(   _should_upgradez!HttpToolsProtocol._should_upgrade   s)    ##%,&G4+E+E+GGr   c                v   | j                          	 | j                  j                  |       y # t        j                  $ r1 d}| j
                  j                  |       | j                  |       Y y t        j                  $ r5 | j                         r| j                          Y y | j                          Y y w xY w)NzInvalid HTTP request received.)ri   r?   	feed_datar=   HttpParserErrorr9   r   send_400_responseHttpParserUpgrader   handle_websocket_upgrader   )rU   datar   s      r(   data_receivedzHttpToolsProtocol.data_received   s    ))+	4KK!!$'(( 	2CKK$""3'** 	4##%--/113		4s   . AB812B8%B87B8c                   | j                   j                  t        k  r>| j                  rd| j                  z  nd}| j                   j	                  t        d|       | j
                  j                  |        | j                  d   j                         }|d| j                  dg}| j                  d   D ]  \  }}||d|d	gz  } |j                  d	       | j                  | j                  | j                  | j                  
      }|j                  | j                          |j#                  dj%                  |             | j                   j'                  |       y )NrZ   r[   z%sUpgrading to WebSocketmethodr   s    HTTP/1.1
rR      : r   )r1   rH   rE   r   )r9   r]   r   rN   r^   rI   rb   rQ   r#   urlappendrB   r1   rH   rE   r`   rK   r   r%   set_protocol)rU   r_   r   outputr{   r|   protocols          r(   r   z*HttpToolsProtocol.handle_websocket_upgrade   s   ;;/15Z$++-"FKKOOO-GP  &H%,,.$*:;::i0KD%tUE733F 1g));;**nn * 

 	  0sxx/0##H-r   c           	        t         d   g}| j                  j                  D ]  \  }}|j                  |d|dg        |j                  ddt	        t        |            j                  d      z   dz   dd|j                  d      g       | j                  j                  dj                  |             | j                  j                          y )	Ni  r   r   s)   content-type: text/plain; charset=utf-8
s   content-length: asciis   connection: close
r   )STATUS_LINErH   default_headersextendr&   lenr#   rK   writer%   rh   )rU   r   contentr{   r|   s        r(   r   z#HttpToolsProtocol.send_400_response   s    s#$,,<<KD%NND%89 =>#c#c(m&:&:7&CCgM(

7#	
 	SXXg./r   c           
        d| _         d| _        g | _        d| j                  j                  ddd| j
                  | j                  | j                  | j                  | j                  | j                  j                         d	| _        y )Nr   Fr    z2.3)versionspec_version1.1)	typeasgihttp_versionrM   rN   rO   rC   rR   state)r   rS   rR   r1   asgi_versionrM   rN   rO   rC   rE   copyrQ   ro   s    r(   on_message_beginz"HttpToolsProtocol.on_message_begin   sl    #(  $ 8 8%P!kkkkkk||^^((*


r   c                .    | xj                   |z  c_         y rm   )r   )rU   r   s     r(   on_urlzHttpToolsProtocol.on_url   s    Cr   c                    |j                         }|dk(  r|j                         dk(  rd| _        | j                  j                  ||f       y )Ns   expects   100-continueT)rw   rS   rR   r   )rU   r{   r|   s      r(   	on_headerzHttpToolsProtocol.on_header   s@    zz|9/!A'+D$T5M*r   c                |   | j                   j                         }| j                   j                         }|j                  d      | j                  d<   |dk7  r|| j                  d<   | j                   j                         r| j                         ry t        j                  | j                        }|j                  }|j                  d      }d|v rt        j                  j                  |      }| j                  |z   }| j                  j                  d      |z   }|| j                  d<   || j                  d<   |j                   xs d| j                  d	<   | j"                  ht%        | j&                        | j"                  k\  s"t%        | j(                        | j"                  k\  r$t*        }d
}	| j,                  j/                  |	       n| j0                  }| j2                  }
t5        | j                  | j6                  | j8                  | j,                  | j:                  | j<                  | j>                  j@                  tC        jD                         | jF                  |dk7  | jH                        | _        |
|
jJ                  ru| jL                  jO                  | j2                  jQ                  |            }|jS                  | j(                  jT                         | j(                  jW                  |       y | j8                  jY                          | jZ                  j]                  | j2                  |f       y )Nr   r   r   r   %pathraw_pathr   query_stringzExceeded concurrency limit.z1.0)rQ   rK   rL   r9   r:   r<   r   re   rS   
keep_aliveon_response)/r?   get_http_version
get_methoddecoderQ   should_upgrader   r=   	parse_urlr   r   urllibparseunquoterC   r#   queryrD   r   rI   rJ   r   r9   r   r3   rT   RequestResponseCyclerK   rL   r:   r<   rH   r   r4   EventrS   on_response_completerc   r6   create_taskrun_asgiadd_done_callbackrb   r\   pause_readingrP   
appendleft)rU   r   r   
parsed_urlr   r   	full_pathfull_raw_pathr3   messageexisting_cycletasks               r(   on_headers_completez%HttpToolsProtocol.on_headers_complete   sp   {{335'')%}}W5

85 )5DJJ~&;;%%'D,@,@,B((2
??w'$;<<''-DNNT)	--g6A&

6!.

:%/%5%5%<

>" !!-  !T%;%;;s4::RVRhRh?h%C3GKK(((C)**nn;;,, --==!--/ $ 8 8#u,11

 !^%E%E99(()<)<S)ABD""4::#5#56JJNN4  II##%MM$$djj#%67r   c                   | j                   j                         r| j                         s| j                  j                  ry | j                  xj
                  |z  c_        t        | j                  j
                        t        kD  r| j                  j                          | j                  j                  j                          y rm   )r?   r   r   rT   rc   bodyr   r   rL   r   re   rf   )rU   r   s     r(   on_bodyzHttpToolsProtocol.on_body*  sz    KK&&(T-A-A-C

HdHd

4tzz"22II##%

  $$&r   c                    | j                   j                         r| j                         s| j                  j                  ry d| j                  _        | j                  j                  j                          y )NF)r?   r   r   rT   rc   	more_bodyre   rf   ro   s    r(   on_message_completez%HttpToolsProtocol.on_message_complete2  sN    KK&&(T-A-A-C

HdHd$



  $$&r   c                ^   | j                   xj                  dz  c_        | j                  j                         ry | j	                          | j
                  j                          | j                  r| j                  j                         \  }}| j                  j                  |j                  |            }|j                  | j                  j                         | j                  j                  |       y | j                  j!                  | j"                  | j$                        | _        y )N   )rH   total_requestsrK   
is_closingri   rL   resume_readingrP   popr6   r   r   r   rJ   rb   r\   
call_laterrG   timeout_keep_alive_handlerrF   )rU   rT   r3   r   s       r(   r   z&HttpToolsProtocol.on_response_complete8  s    ((A-(>>$$&))+ 			  " ==**,JE399(()<=D""4::#5#56JJNN4 +/99+?+?'')H)H,D(r   c                    | j                   | j                   j                  r| j                  j                          yd| j                   _        y)zG
        Called by the server to commence a graceful shutdown.
        NF)rT   rc   rK   rh   r   ro   s    r(   shutdownzHttpToolsProtocol.shutdownP  s6     ::!=!=NN  "$)DJJ!r   c                8    | j                   j                          y)z\
        Called by the transport when the write buffer exceeds the high water mark.
        N)rL   pause_writingro   s    r(   r   zHttpToolsProtocol.pause_writingY  s     			!r   c                8    | j                   j                          y)z_
        Called by the transport when the write buffer drops below the low water mark.
        N)rL   rg   ro   s    r(   rg   z HttpToolsProtocol.resume_writing_  s     			  "r   c                n    | j                   j                         s| j                   j                          yy)zk
        Called on a keep-alive connection if no new data is received after a short
        delay.
        N)rK   r   rh   ro   s    r(   r   z,HttpToolsProtocol.timeout_keep_alive_handlere  s)    
 ~~((*NN  " +r   rm   )
r1   r   rH   r   rE   zdict[str, Any]rV   z asyncio.AbstractEventLoop | NonereturnNone)rK   asyncio.Transportr   r   )rj   zException | Noner   r   r   r   )r   zbytes | None)r   bool)r   bytesr   r   )r   r&   r   r   )r   r   r   r   )r{   r   r|   r   r   r   )r   r   r   r   )__name__
__module____qualname__rW   r`   rk   rp   ri   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   r   rn   r   r(   r,   r,   +   s     373030 "30 "	30
 030 
30lO*O	O&0


%H4 .( 
"+38j''0*"##r   r,   c                  `    e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZd	dZd
dZddZy)r   c                    || _         || _        || _        || _        || _        || _        || _        || _        || _        d| _	        |
| _
        |	| _        d| _        d| _        d| _        d| _        d | _        d| _        y )NFr   Tr   )rQ   rK   rL   r9   r:   r<   r   re   r   rd   r   waiting_for_100_continuer   r   response_startedrc   chunked_encodingexpected_content_length)rU   rQ   rK   rL   r9   r:   r<   r   re   rS   r   r   s               r(   rW   zRequestResponseCycle.__init__o  s     
"	*$.*& "$(;% 	 !&!&-1'($r   c                <  K   	  || j                   | j                  | j                         d {   }|9d}| j                  j	                  ||       | j
                  j                          n| j                  sB| j                  s6d}| j                  j	                  |       | j                          d {    nP| j                  sD| j                  s8d}| j                  j	                  |       | j
                  j                          	 d | _        y 7 7 `# t        $ ri}d}| j                  j	                  ||       | j                  s| j                          d {  7   n| j
                  j                          Y d }~zd }~ww xY w# d | _        w xY w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                      y rm   rn   rn   r   r(   <lambda>z/RequestResponseCycle.run_asgi.<locals>.<lambda>  s    tr   )rQ   receivesendr9   errorrK   rh   r   rd   send_500_responserc   BaseExceptionr   )rU   r3   resultr   rj   s        r(   r   zRequestResponseCycle.run_asgi  sG    	,

DLL$)) F !L!!#v.$$&**43D3DI!!#&,,...++D4E4EK!!#&$$&+D1$ /  	'3CKKcC0((,,...$$&	'*  ,Dso   F+D DD BF 7D8AF 	FD F 	F#>F!E$" FF FF 
FFc                   K   | j                  ddg dd       d {    | j                  dddd       d {    y 7 "7 w)	Nhttp.response.starti  ))s   content-types   text/plain; charset=utf-8)   content-lengths   21)rt      close)r   statusrR   http.response.bodys   Internal Server ErrorFr   r   r   )r   ro   s    r(   r   z&RequestResponseCycle.send_500_response  sV     ii-

 
	
 
	
 ii!5?Wfklmmm
	
 	ns   AA AAAAc                  K   |d   }| j                   j                  r.| j                  s"| j                   j                          d {    | j                  ry | j                  s[|dk7  rd}t        ||z        t        d|      }d| _        d| _        |d   }| j                  t        |j                  dg             z   }t        | j                  d   v rt        |vr
|t        gz   }| j                  r`| j                  j                  d	t!        | j                        | j                  d
   t#        | j                        | j                  d   |       t$        |   g}|D ]  \  }}t&        j)                  |      rt        d      t*        j)                  |      rt        d      |j-                         }|dk(  r2| j.                  &t1        |j3                               | _        d| _        nF|dk(  r"|j-                         dk(  rd| _        d| _        n|dk(  r|j-                         dk(  rd| _        |j9                  |d|dg        | j.                  .| j                  d
   dk7  r|dvrd| _        |j;                  d       |j;                  d       | j<                  j?                  djA                  |             y | jB                  s|dk7  rd}t        ||z        t        tD        |j                  dd            }	|j                  dd      }
| j                  d
   dk(  rd| _        n| j.                  rT|	rdtG        |	      z  |	dg}ng }|
s|j;                  d       | j<                  j?                  djA                  |             nUtG        |	      }|| j4                  kD  rt        d       | xj4                  |z  c_        | j<                  j?                  |	       |
sr| j4                  dk7  rt        d!      d| _!        | jH                  jK                          | j6                  s| j<                  jM                          | jO                          y y d"}t        ||z        7 "w)#Nr   r   z:Expected ASGI message 'http.response.start', but got '%s'.r   TFr   rR   z%s - "%s %s HTTP/%s" %dr   r   zInvalid HTTP header name.zInvalid HTTP header value.r   s   transfer-encodings   chunkedr   rt   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.)(rL   write_pausedrd   drainr   RuntimeErrorr	   r   r   listgetr   rQ   r<   r:   infor   r   r   	HEADER_REsearchHEADER_VALUE_RErw   r   intr   r   r   r   r   rK   r   r%   rc   r   r   re   rf   rh   r   )rU   r   message_typer   r'   rR   r   r{   r|   r   r   	num_bytess               r(   r   zRequestResponseCycle.send  s    v99!!$*;*;))//###$$44R"3#5663W=G$(D!,1D)!(+K**T'++i2L-MMGtzz)44W9T!\N2""''-#DJJ/JJx(.tzz:JJ~. #;/0G&e##D)&'BCC"))%0&'CDDzz|,,1F1F1N36u||~3FD0,1D)11ekkmz6Q34D0,0D)]*u{{}/H&+DOeUG<=  '" $$,H1E1OT_gqTq(,%@ANN7#NN  '!23''33Q"3#566w{{6378DK7I zz(#v-/0,&&(3t94dGDG G NN<0$$SXXg%67I	t;;;&'TUU00I=0$$T* //14&'UVV)-&""&&(NN((*  "  YCs\122I $s   AQ,Q)P"Q,c                  K   | j                   r<| j                  j                         s"| j                  j                  d       d| _         | j                  sb| j
                  sV| j                  j                          | j                  j                          d {    | j                  j                          | j                  s| j
                  rddiS d| j                  | j                  d}d| _        |S 7 ]w)Ns   HTTP/1.1 100 Continue

Fr   zhttp.disconnectzhttp.requestr   r   )r   rK   r   r   rd   rc   rL   r   re   waitclearr   r   )rU   r   s     r(   r   zRequestResponseCycle.receive,  s     ((1J1J1LNN  !AB,1D)  )?)?II$$&$$))+++$$& 6 6-..-;TYY]a]k]k$l	 ,s   BC:C8AC:N)rQ   r   rK   r   rL   r   r9   logging.Loggerr:   r  r<   r   r   zlist[tuple[bytes, bytes]]re   zasyncio.EventrS   r   r   r   r   zCallable[..., None])r3   r
   r   r   r   )r   r   r   r   )r   r   )r   r   r   rW   r   r   r   r   rn   r   r(   r   r   n  s    %)%) %%) 	%)
 %) &%) %) 3%) %%) "%) %) )%)P,8nh3Tr   r   )r'   r  r   r   )2
__future__r   r4   r    r7   rer   asyncio.eventsr   collectionsr   typingr   r   r   r	   r=   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   Protocolr,   r   )r'   s   0r(   <module>r"     s    "    	  &  / /   " + p p x x &BJJ<=	"**89V NSSVX[_]_k{,[99_]@#(( @#F
L LM
 ^s   &C