
    hP                    h   d dl mZ d dlZd dlZd dlZd dl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dZ( e)dd      D  ci c]  } |  e(|        c} Z* G d dejV                        Z, G d d      Z-yc c} w )    )annotationsN)AnyCallableLiteral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)ServerStatec                |    	 t        j                  |       j                  j                         S # t        $ r Y yw xY w)N    )http
HTTPStatusphraseencode
ValueErrorstatus_codes    DD:\jyotish\venv\Lib\site-packages\uvicorn/protocols/http/h11_impl.py_get_status_phraser'      s7    {+2299;; s   ,/ 	;;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y)H11ProtocolNc                <   |j                   s|j                          || _        |j                  | _        |xs t        j                         | _        t        j                  d      | _
        t        j                  d      | _        | j                  j                         | _        t        j                  t        j                   |j"                  |j"                  nt$              | _        |j(                  | _        |j*                  | _        |j,                  | _        || _        d | _        |j2                  | _        || _        |j6                  | _        |j8                  | _        d | _        d | _        d | _        d | _         d | _!        d | _"        d | _#        d | _$        y )Nzuvicorn.errorzuvicorn.access)%loadedloadconfig
loaded_appappasyncioget_event_looplooplogging	getLoggerloggeraccess_loggerhasHandlers
access_logh11
ConnectionSERVERh11_max_incomplete_event_sizer	   connws_protocol_class	root_pathlimit_concurrency	app_statetimeout_keep_alive_tasktimeout_keep_aliveserver_stateconnectionstasks	transportflowserverclientschemescopeheaderscycle)selfr.   rE   rB   _loops        r&   __init__zH11Protocol.__init__'   sW    }}KKM$$5W335	''8$../?@,,88:NNJJ33? 002	
	 "(!9!9))!'!9!9" DH$"(";"; )'33!''
 -1!%	.2.27; !%
26+/
r   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)rF   addrH   r   rI   r   rJ   r   rK   r   rL   r6   levelr   log)rP   rH   prefixs      r&   connection_madezH11Protocol.connection_madeX   s     	T""	*	$Y/%i0!'	!2g;;/15Z$++-"FKKOOO-EvN 0r   c                <   | 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                  t        j                  k7  r0t        j                         }	 | j                  j                  |       | j                  $| j                  j"                  j%                          | j&                  | j&                  j)                          |+| j*                  j-                          | j/                          y y # t        j                   $ r Y w xY w)NrU   rV   z%sHTTP connection lostT)rF   discardr6   rX   r   rK   rY   rO   response_completedisconnectedr>   	our_stater:   ERRORConnectionClosedsendLocalProtocolErrormessage_eventsetrI   resume_writingrH   close_unset_keepalive_if_required)rP   excrZ   events       r&   connection_lostzH11Protocol.connection_lostg   s'     &;;/15Z$++-"FKKOOO-EvN::djj::&*DJJ#99#))+((*E		u%
 ::!JJ$$((*99 II$$&;NN  "--/  )) s   &F FFc                     y N rP   s    r&   eof_receivedzH11Protocol.eof_received   s    r   c                `    | j                   "| j                   j                          d | _         y y rn   )rC   cancelrp   s    r&   ri   z(H11Protocol._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)rN   splitlowerstrip)rP   
connectionupgradenamevaluetokens         r&   _get_upgradezH11Protocol._get_upgrade   s    
<<KD%}$AFTARSARekkm113AR
Sz!++-	 (
 #N Ts   %A5c                    | j                   yy)NFT)r?   rp   s    r&   _should_upgrade_to_wsz!H11Protocol._should_upgrade_to_ws   s    !!)r   c                    d}| j                   j                  |       | 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.)r6   warningr   )rP   msgs     r&   _unsupported_upgrade_warningz(H11Protocol._unsupported_upgrade_warning   sD    ,C ))+ \CKK$ ,r   c                t    | j                         }|dk(  r| j                         ry|| j                          y)Ns	   websocketTF)r   r   r   )rP   r{   s     r&   _should_upgradezH11Protocol._should_upgrade   s;    ##%l"t'A'A'C--/r   c                z    | j                          | j                  j                  |       | j                          y rn   )ri   r>   receive_datahandle_events)rP   datas     r&   data_receivedzH11Protocol.data_received   s,    ))+		t$r   c                
   	 	 | j                   j                         }|t        j                  u ry |t        j                  u r| j                  j                          y t        |t        j                        r|j                  D cg c]  \  }}|j                         |f c}}| _        |j                  j!                  d      \  }}}t#        |j%                  d            }| j&                  |z   }	| j&                  j)                  d      |z   }
d| j*                  j,                  dd|j.                  j%                  d      | j0                  | j2                  | j4                  |j6                  j%                  d      | j&                  |	|
|| j                  | j8                  j;                         d| _        | j?                         r| jA                  |       y | jB                  htE        | jF                        | jB                  k\  s"tE        | jH                        | jB                  k\  r$tJ        }d}| j                  j                  |       n| jL                  }| jO                          tQ        | j<                  | j                   | jR                  | j                  | j                  | jT                  | jV                  | jX                  jZ                  t]        j^                         | j`                  	
      | _1        | jd                  jg                  | jb                  ji                  |            }|jk                  | jH                  jl                         | jH                  jo                  |       nt        |t        jp                        r| j                   jr                  t        jt                  u r| jb                  xjv                  |jx                  z  c_;        tE        | jb                  jv                        tz        kD  r| j                  j                          | jb                  j|                  j                          nt        |t        j                        r| j                   jr                  t        jt                  u r6| jR                  j                          | j                   j                          d
| jb                  _C        | jb                  j|                  j                          | j                   j                  t        j                  k(  ry # t        j                  $ r1 d}| j                  j                  |       | j                  |       Y y w xY wc c}}w )NzInvalid HTTP request received.   ?asciir   z2.3)versionspec_version)typeasgihttp_versionrJ   rK   rL   methodr@   pathraw_pathquery_stringrN   statezExceeded concurrency limit.)
rM   r>   rH   rI   r6   r7   r9   default_headersre   on_responseF)Fr>   
next_eventr:   RemoteProtocolErrorr6   r   send_400_response	NEED_DATAPAUSEDrI   pause_reading
isinstanceRequestrN   rx   target	partitionr   decoder@   r"   r.   asgi_versionr   rJ   rK   rL   r   rB   copyrM   r   handle_websocket_upgraderA   lenrF   rG   r   r0   ri   RequestResponseCyclerH   r7   r9   rE   r   r1   Eventon_response_completerO   r3   create_taskrun_asgiadd_done_callbackr]   rW   Datar`   DONEbodyr   r   re   rf   EndOfMessageresume_readingstart_next_cycle	more_bodytheir_state
MUST_CLOSE)rP   rk   r   keyr}   r   _r   r   	full_pathfull_raw_pathr0   messagetasks                 r&   r   zH11Protocol.handle_events   s   		,,. %#**$
 		'')E3;;/GL}}U}ee 4}U,1LL,B,B4,H)!\xw78 NNT1	 $ 5 5g > I"(,(@(@RWX$)$6$6$=$=g$F"kk"kk"kk#ll11':!%% -$0#||!^^002
 '')11%8 ))5(()T-C-CCs4::Z^ZpZpGp-C;GKK''0((C 1131**"nn;;"&"4"4#$($5$5$E$E")--/ $ 9 9
 yy,,TZZ-@-@-EF&&tzz'9'9:

t$E388,99&&#((2

5::-tzz'*::II++-

((,,.E3#3#3499&&#((2NN113II..0',

$

((,,.99((CNN:  ** 6##C(&&s+	$  Vs   T UAUUc                   | j                   j                  t        k  r>| j                  rd| j                  z  nd}| j                   j	                  t        d|       | j
                  j                  |        |j                  d|j                  dg}| j                  D ]  \  }}||d|dgz  } |j                  d       | j                  | j                  | j                  | j                        }|j                  | j                          |j#                  d	j%                  |             | j                   j'                  |       y )
NrU   rV   z%sUpgrading to WebSocket    s    HTTP/1.1
s   : s   
)r.   rE   rB   r   )r6   rX   r   rK   rY   rF   r]   r   r   rN   appendr?   r.   rE   rB   r[   rH   r   joinset_protocol)rP   rk   rZ   outputr|   r}   protocols          r&   r   z$H11Protocol.handle_websocket_upgrade  s   ;;/15Z$++-"FKKOOO-GP  &,,ell4DE<<KD%tUE733F (g));;**nn * 

 	  0sxx/0##H-r   c                4   t         d   }ddg}t        j                  d||      }| j                  j	                  |      }| j
                  j                  |       | j                  j	                  t        j                  |j                  d                  }| j
                  j                  |       | j                  j	                  t        j                               }| j
                  j                  |       | j
                  j                          y )Ni  s   content-types   text/plain; charset=utf-8ru   s   closer%   rN   reasonr   r   rk   )STATUS_PHRASESr:   Responser>   rc   rH   writer   r"   r   rh   )rP   r   r   rN   rk   r   s         r&   r   zH11Protocol.send_400_response#  s    $;%.
 gfM&V$chhCJJw4G&HIV$c&6&6&89V$r   c                &   | j                   xj                  dz  c_        | j                  j                         ry | j	                          | j
                  j                  | j                  | j                        | _	        | j                  j                          | j                  j                  t        j                  u rR| j                  j                   t        j                  u r+| j                  j#                          | j%                          y y y )N   )rE   total_requestsrH   
is_closingri   r3   
call_laterrD   timeout_keep_alive_handlerrC   rI   r   r>   r`   r:   r   r   r   r   rp   s    r&   r   z H11Protocol.on_response_complete5  s    ((A-(>>$$& 	))+'+yy';';D<S<SUYUtUt'u$ 			  " 99#((*tyy/D/D/PII&&(  0Q*r   c                    | j                   | j                   j                  rJt        j                         }| j                  j                  |       | j                  j                          yd| j                   _        y)zG
        Called by the server to commence a graceful shutdown.
        NF)	rO   r^   r:   rb   r>   rc   rH   rh   
keep_aliverP   rk   s     r&   shutdownzH11Protocol.shutdownH  sT     ::!=!=((*EIINN5!NN  "$)DJJ!r   c                8    | j                   j                          y)z\
        Called by the transport when the write buffer exceeds the high water mark.
        N)rI   pause_writingrp   s    r&   r   zH11Protocol.pause_writingS  s     			!r   c                8    | j                   j                          y)z_
        Called by the transport when the write buffer drops below the low water mark.
        N)rI   rg   rp   s    r&   rg   zH11Protocol.resume_writingY  s     			  "r   c                    | j                   j                         sJt        j                         }| j                  j                  |       | j                   j                          yy)zk
        Called on a keep-alive connection if no new data is received after a short
        delay.
        N)rH   r   r:   rb   r>   rc   rh   r   s     r&   r   z&H11Protocol.timeout_keep_alive_handler_  sG    
 ~~((*((*EIINN5!NN  " +r   rn   )
r.   r   rE   r   rB   zdict[str, Any]rQ   z asyncio.AbstractEventLoop | NonereturnNone)rH   asyncio.Transportr   r   )rj   zException | Noner   r   r   r   )r   zbytes | None)r   bool)r   bytesr   r   )rk   zh11.Requestr   r   )r   strr   r   )__name__
__module____qualname__rR   r[   rl   rq   ri   r   r   r   r   r   r   r   r   r   r   r   rg   r   ro   r   r&   r*   r*   &   s     37.0.0 ".0 "	.0
 0.0 
.0bO*O	O020


%`D.&$!&	*"##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| _        |j                  | _        d| _        d| _        d| _        d| _        y )NFTr   )rM   r>   rH   rI   r6   r7   r9   r   re   r   r_   r   !they_are_waiting_for_100_continuewaiting_for_100_continuer   r   response_startedr^   )rP   rM   r>   rH   rI   r6   r7   r9   r   re   r   s              r&   rR   zRequestResponseCycle.__init__k  s     
	"	*$.*& "(,(N(N% 	 !&!&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 rn   ro   ro   r   r&   <lambda>z/RequestResponseCycle.run_asgi.<locals>.<lambda>  s    tr   )rM   receiverc   r6   errorrH   rh   r   r_   send_500_responser^   BaseExceptionr   )rP   r0   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   ddddgd}| j                  |       d {    dddd	}| j                  |       d {    y 7 $7 w)
Nhttp.response.starti  r   r   )r   statusrN   http.response.bodys   Internal Server ErrorFr   r   r   )rc   )rP   response_start_eventresponse_body_events      r&   r   z&RequestResponseCycle.send_500_response  se     )?)8
 ii,---(,6

 ii+,,, 	. 	-s   AAAAAAc                  K   |d   }| j                   j                  r.| j                  s"| j                   j                          d {    | j                  ry | j                  sI|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$        |   }t'        j(                  |||      }| j*                  j-                  |      }| j.                  j1                  |       n0| j2                  s|dk7  rd}t        ||z        t        d|      }|j                  dd      }	|j                  dd      }
| j                  d
   dk(  rdn|	}| j*                  j-                  t'        j4                  |            }| j.                  j1                  |       |
s{d| _        | j6                  j9                          | j*                  j-                  t'        j:                               }| j.                  j1                  |       nd}t        ||z        | j2                  r| j*                  j<                  t&        j>                  u s| j@                  sH| j*                  j-                  t'        jB                                | j.                  jE                          | jG                          y y 7 0w)Nr   r   z:Expected ASGI message 'http.response.start', but got '%s'.r   TFr   rN   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.)$rI   write_pausedr_   drainr   RuntimeErrorr   r   r   listgetr   rM   r9   r7   infor   r   r   r:   r   r>   rc   rH   r   r^   r   re   rf   r   r`   r   r   rb   rh   r   )rP   r   message_typer   r   rN   r   responser   r   r   r   s               r&   rc   zRequestResponseCycle.send  s    v99!!$*;*;))//###$$44R"3#5663W=G$(D!,1D)X&F**T'++i2L-MMGtzz)44W9T!\N2""''-#DJJ/JJx(.tzz:JJ~. $F+F||PVWHYY^^(^3FNN  (''33Q"3#5662G<G;;vs+DK7I **X.&83dDYY^^#((*=^>FNN  ( )-&""&&(c.>.>.@A$$V, YCs\122!!yy""cnn4DOO		S%9%9%;<$$&	 "A $s   AM:M7L0M:c                d  K   | j                   rr| j                  j                         sXg }t        j                  d|d      }| j
                  j                  |      }| j                  j                  |       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)Nr(   Continuer   r   Fr   zhttp.disconnectzhttp.requestr   r   )r   rH   r   r:   InformationalResponser>   rc   r   r_   r^   rI   r   re   waitclearr   r   )rP   rN   rk   r   r   s        r&   r   zRequestResponseCycle.receive	  s     ((1J1J1L-/G--#wWabEYY^^%^0FNN  (,1D)  )?)?II$$&$$))+++$$& 6 6-.. #II%

 	 ,s   CD0D.AD0N)rM   r   r>   zh11.ConnectionrH   r   rI   r   r6   logging.Loggerr7   r  r9   r   r   zlist[tuple[bytes, bytes]]re   zasyncio.Eventr   zCallable[..., None]r   r   )r0   r
   r   r   r   )r   r   r   r   )r   r   )r   r   r   rR   r   r   rc   r   ro   r   r&   r   r   j  s    #'#' #' %	#'
 #' #' &#' #' 3#' %#' )#' 
#'L,8-$HTr   r   )r%   intr   r   ).
__future__r   r1   r   r4   typingr   r   r   r   urllib.parser   r:   h11._connectionr	   uvicorn._typesr
   r   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   r'   ranger   Protocolr*   r   r$   s   0r&   <module>r     s    "    / /   
 =   " + p p x x & SXX[]`RabRa;+1+>>RabA#'"" A#H
u uO
 cs   <B/