
    bCiZ                     r   S SK r S SKr S SKrS SKrS SKJr  S SKJr  S SKJ	r
  S SKJr  S SKJr  S SKJrJrJrJrJrJrJrJrJrJrJr  S SKrS SKrSS	KJrJr  SS
K J!r!  SSK"J#r#J$r$  SSKJ%r%J&r&J'r'J(r(J)r)  SSK*J+r+J,r,  SSK-J.r.J/r/  SSK0J1r1  SSK2J3r3  SSK4J5r5  SSK6J7r7  SSK8J9r9J:r:  Sr;\(       a  SSK<J=r=  \\(\/S\S/\74   r>\\7/\\:   4   r?\(" SS\'0 0 SSSS\R                  " S5      5
      rA " S S\B5      rC " S S\B5      rD\R                  " SSSS 9 " S! S"5      5       rF\\\(\F4   \/4   rG " S# S\!5      rHg)$    N)deque)suppress)escape)
HTTPStatus)Logger)TYPE_CHECKINGAny	AwaitableCallableDequeOptionalSequenceTupleTypeUnioncast   )AbstractAccessLoggerAbstractStreamWriter)BaseProtocol)ceil_timeoutset_exception)HttpProcessingErrorHttpRequestParserHttpVersion10RawRequestMessageStreamWriter)access_loggerserver_logger)EMPTY_PAYLOADStreamReader)tcp_keepalive)HTTPException)AccessLogger)BaseRequest)ResponseStreamResponse)RequestHandlerRequestPayloadErrorPayloadAccessError)Serverr(   zasyncio.Task[None]UNKNOWN/TFc                       \ rS rSrSrSrg)r)   N   zPayload parsing error. N__name__
__module____qualname____firstlineno____doc____static_attributes__r0       N/home/james-whalen/.local/lib/python3.13/site-packages/aiohttp/web_protocol.pyr)   r)   N   s     r8   r)   c                       \ rS rSrSrSrg)r*   R   z-Payload was accessed after response was sent.r0   Nr1   r0   r8   r9   r*   r*   R   s    7r8   r*   )auto_attribsfrozenslotsc                   4    \ rS rSr% \\S'   \\S'   \\S'   Srg)_ErrInfoV   statusexcmessager0   N)	r2   r3   r4   r5   int__annotations__BaseExceptionstrr7   r0   r8   r9   r@   r@   V   s    K	Lr8   r@   c            !         ^  \ rS rSrSrSrSrSS\\\	\R                  SSS	SS
SSSS.SSS\R                  S\S\S\S\\   S\S\S\S\S\S\S\S\S\S\4 U 4S jjjrS \4S! jr\S \4S" j5       rSHS#\\   S S$4S% jjrS&\R4                  S S$4U 4S' jjrS(\\   S S$4U 4S) jjrS*\S S$4S+ jrSIS, jr S-\!S S$4S. jr"S/\S S$4S0 jr#SIS1 jr$SIS2 jr%S3\&S4\'S5\S S$4S6 jr(S7\S8\S S$4S9 jr)S7\S8\S S$4S: jr*SIS; jr+S3\&S<\S=\,\&/\-\'   4   S \.\'\4   4S> jr/SIS? jr0S3\&S@\'S<\S \4SA jr1   SJS3\&SB\S(\\   SC\\   S \'4
SD jjr2SE\3S \,\&/\-\'   4   4SF jr4SGr5U =r6$ )Kr(   `   a  HTTP protocol implementation.

RequestHandler handles incoming HTTP request. It reads request line,
request headers and request payload and calls handle_request() method.
By default it always returns with 404 response.

RequestHandler handles errors in incoming request, like bad
status line, bad headers or incomplete payload. If any error occurs,
connection gets closed.

keepalive_timeout -- number of seconds before closing
                     keep-alive connection

tcp_keepalive -- TCP keep-alive is on, default is on

debug -- enable debug mode

logger -- custom logger object

access_log_class -- custom class for access_logger

access_log -- custom logging object

access_log_format -- access log format string

loop -- Optional event loop

max_line_size -- Optional maximum header line size

max_field_size -- Optional maximum header field size

max_headers -- Optional maximum header size

timeout_ceil_threshold -- Optional value to specify
                          threshold to ceil() timeout
                          values

r   )_request_count
_keepalive_manager_request_handler_request_factory_tcp_keepalive_keepalive_time_keepalive_handle_keepalive_timeout_lingering_time	_messages_message_tail_waiter_task_handler_upgrade_payload_parser_request_parser_reading_pausedloggerdebug
access_logr   _close_force_close_current_request_timeout_ceil_thresholdg     R@TFi  i   g      $@i      )keepalive_timeoutr"   r]   access_log_classr_   access_log_formatr^   max_line_sizemax_headersmax_field_sizelingering_timeread_bufsizeauto_decompresstimeout_ceil_thresholdmanagerr+   loopre   r"   r]   rf   r_   rg   r^   rh   ri   rj   rk   rl   rm   rn   c                \  > [         TU ]  U5        SU l        SU l        S U l        Xl        UR                  U l        UR                  U l	        X@l
        SU l        S U l        X0l        [        U5      U l        [!        5       U l        SU l        S U l        S U l        SU l        S U l        [/        U UUU
UU[0        US9U l        SU l         [        U5      U l        XPl        Xl        Xpl        U(       a  U" Xx5      U l         OS U l         SU l!        SU l"        g ! [6        [8        4 a     NOf = f)Nr   Fg        r8   )rh   rj   ri   payload_exceptionrm   rd   )#super__init__rK   rL   rb   rM   request_handlerrN   request_factoryrO   rP   rQ   rR   rS   floatrT   r   rU   rV   rW   rX   rY   rZ   r   r)   r[   rc   	TypeError
ValueErrorr]   r^   r_   r   r`   ra   )selfro   rp   re   r"   r]   rf   r_   rg   r^   rh   ri   rj   rk   rl   rm   rn   	__class__s                    r9   rt   RequestHandler.__init__   s;   ( 	7;*1;B;R;R;B;R;R+";?"3$^4*/' 7;;?$(<M')#1+	=
 /0$	+01G+HD( 
$AQBD "&D! :& 		s   D D+*D+returnc                 t    SR                  U R                  R                  U R                  b  S5      $ S5      $ )Nz<{} {}>	connecteddisconnected)formatr{   r2   	transportrz   s    r9   __repr__RequestHandler.__repr__   s;    NN##>>5K
 	
;I
 	
r8   c                     U R                   $ N)rS   r   s    r9   re    RequestHandler.keepalive_timeout   s    &&&r8   timeoutNc                 l  #    SU l         U R                  b  U R                  R                  5         U R                  (       a  U R                  R                  5         [	        [
        R                  [
        R                  5         [        U5       ISh  vN   U R                  b.  U R                  R                  [
        R                  " 5       5        U R                  b3  U R                  R                  5       (       d  U R                  I Sh  vN   SSS5      ISh  vN   SSS5        U R                  b  U R                  R                  5         U R                  b"  U R                  R                  5         SU l        gg N Nu Ng! , ISh  vN  (       d  f       N|= f! , (       d  f       N= f7f)zDo worker process exit preparations.

We need to clean up everything and stop accepting requests.
It is especially important for keep-alive connections.
TN)ra   rR   cancelrW   r   asyncioCancelledErrorTimeoutErrorr   rb   _cancelrX   doner   close)rz   r   s     r9   shutdownRequestHandler.shutdown   s5     !!!-""))+<<LL! g,,g.B.BC#G,,((4))11'2H2H2JK%%1$:L:L:Q:Q:S:S,,,, -, D )%%'>>%NN  "!DN & -
 - -,,, DCsz   BF4F#FF#A7F	FF	F#F F#$AF4F#F	F#	F 	FF 	F##
F1-F4r   c                 @  > [         TU ]  U5        [        [        R                  U5      nU R
                  (       a  [        U5        U R                  R                  U R                  5       5      U l
        U R                  c   eU R                  R                  X5        g r   )rs   connection_mader   r   	TransportrP   r"   _loopcreate_taskstartrX   rM   )rz   r   real_transportr{   s      r9   r   RequestHandler.connection_made  sr    	*g//;.)!ZZ33DJJLA}}(((%%d;r8   rC   c                   > U R                   c  g U R                   R                  X5        [        TU ]  U5        U R                   R                  nS U l         SU l        S U l        S U l        S U l        U R                  b  U R                  R                  5         U R                  b)  Uc  [        S5      nU R                  R                  U5        U R                  b  U R                  R                  5         U(       a'  U R                  b  U R                  R                  5         S U l        U R                  b"  U R                  R!                  5         S U l        g g )NTzConnection lost)rM   connection_lostrs   handler_cancellationra   rO   rN   r[   rR   r   rb   ConnectionResetErrorr   rW   rX   rZ   feed_eof)rz   rC   r   r{   s      r9   r   RequestHandler.connection_lost%  s#   == %%d0$  $}}AA  $ $#!!-""))+  ,{*+<=!!))#.<<#LL!D$6$6$B%%'!+  ))+#'D  ,r8   parserc                     U R                   b   eXl         U R                  (       a-  U R                   R                  U R                  5        SU l        g g )Nr8   )rZ   rV   	feed_data)rz   r   s     r9   
set_parserRequestHandler.set_parserI  sJ    ##+++%  **4+=+=>!$D r8   c                     g r   r0   r   s    r9   eof_receivedRequestHandler.eof_receivedS  s    r8   datac                 |   U R                   (       d  U R                  (       a  g U R                  c  U R                  (       d  U R                  c   e U R                  R                  U5      u  p#nU=(       d    S H6  u  pgU =R                  S-  sl
        U R                  R                  Xg45        M8     U R                  nU(       a)  Ub&  UR                  5       (       d  UR                  S 5        X0l        U(       a  U(       a  X@l        g g g U R                  c.  U R                  (       a  U(       a  U =R                   U-  sl        g U(       a6  U R                  R                  U5      u  pU	(       a  U R#                  5         g g g ! [         a*  n[        SXUR                  S9[        4/nSnSn S nAGNFS nAff = f)Ni  )rB   rC   rD   Fr8   r0   r   )ra   r`   rZ   rY   r[   r   r   r@   rD   r    rK   rU   appendrW   r   
set_resultrV   r   )
rz   r   messagesupgradedtailrC   msgpayloadwaitereofs
             r9   data_receivedRequestHandler.data_receivedV  sg    '''333+/+?+?+I+I$+O(D !)B##q(#%%sn5 !/ \\FF.v{{}}!!$'$MD%)" !x !!)dmm$& ,,66t<IC

  3 ' Sc;;GW !s   F 
F;F66F;valc                 v    Xl         U R                  (       a"  U R                  R                  5         SU l        gg)z=Set keep-alive connection mode.

:param bool val: new state.
N)rL   rR   r   )rz   r   s     r9   
keep_aliveRequestHandler.keep_alive}  s1    
 !!""))+%)D" "r8   c                 j    SU l         U R                  (       a  U R                  R                  5         gg)zwClose connection.

Stop accepting new pipelining messages and close
connection when handlers done processing messages.
TN)r`   rW   r   r   s    r9   r   RequestHandler.close  s'     <<LL! r8   c                     SU l         U R                  (       a  U R                  R                  5         U R                  b"  U R                  R	                  5         SU l        gg)zForcefully close connection.TN)ra   rW   r   r   r   r   s    r9   force_closeRequestHandler.force_close  sG     <<LL!>>%NN  "!DN &r8   requestresponsetimec                     U R                   b8  U R                   R                  XU R                  R                  5       U-
  5        g g r   )r   logr   r   )rz   r   r   r   s       r9   
log_accessRequestHandler.log_access  s;     )""7djjoo6G$6NO *r8   argskwc                 `    U R                   (       a  U R                  R                   " U0 UD6  g g r   )r^   r]   rz   r   r   s      r9   	log_debugRequestHandler.log_debug  s%    ::KKt*r* r8   c                 <    U R                   R                  " U0 UD6  g r   )r]   	exceptionr   s      r9   log_exceptionRequestHandler.log_exception  s    t*r*r8   c                 f   U R                   (       d  U R                  (       d  g U R                  U R                  -   nU R                  (       a/  U R
                  R                  5       U:  a  U R                  5         g U R
                  R                  U R                  U R                  5      U l        g r   )ra   rL   rQ   rS   rW   r   r   r   
call_laterKEEPALIVE_RESCHEDULE_DELAY_process_keepaliverR   )rz   nexts     r9   r   !RequestHandler._process_keepalive  s    DOO##d&=&== <<zz 4'  " "&!6!6++##"
r8   
start_timeru   c                   #    U R                   c   e  Xl        U" U5      I S h  vN nS U l         [        USS5      (       a  [        R                  " S[
        5        U R                  XU5      I S h  vN nXE4$  NV! S U l        f = f N! [         a)  nUnU R                  XU5      I S h  vN  n S nAXE4$ S nAf[        R                   a    e [        R                   aI  nU R                  SUS9  U R                  US5      nU R                  XU5      I S h  vN  n S nAXE4$ S nAf[         a:  nU R                  USU5      nU R                  XU5      I S h  vN  n S nAXE4$ S nAff = f7f)N__http_exception__Fzlreturning HTTPException object is deprecated (#2415) and will be removed, please raise the exception insteadzRequest handler timed out.exc_infoi    )rN   rb   getattrwarningswarnDeprecationWarningfinish_responser#   r   r   r   r   handle_error	Exception)rz   r   r   ru   respresetrC   s          r9   _handle_requestRequestHandler._handle_request  s     $$000	J-(/%,W55(,% t15999 '	 ..wjIIE{7 6(,%. J-  	JD..wjIIIE, {+ %% 	## 	JNN7#NF$$Wc2D..wjIIIE  {  	J$$Wc37D..wjIIIE {	Js   E3A> A<A> B AE34B
5E3<A> >	BB 
E3
E0B:-B0.B:3E3:+E0%7D)DD)"E3)E06(E+E!E+$E3+E00E3c                 ~  #    U R                   nU R                  nUc   eU R                  nUc   eU R                  nSnU R                  c   eU R
                  c   eU R                  (       Gd,  U R                  (       d2   UR                  5       U l	        U R                  I Sh  vN    SU l	        U R                  R                  5       u  pgUR                  5       nU=R                  S-  sl        [        X5      n	[!        U["        5      (       a  U R%                  U5      n
[&        nOU R
                  n
U R	                  XgX	U5      n U R                   R)                  U R+                  XU
5      5      n UI Sh  vN u  p]AU(       a  U R/                  S5         U R0                  c  Ub  U R/                  S5        GOU R                  (       Gd  U R2                  (       aj  U R4                  (       dY  UbT  U R                   R                  5       nXl        U R8                  c%  UR;                  X-   U R<                  5      U l        GORGOPGONGOL[?        UR@                  5      U l        URC                  5       (       GdI  U RD                  nU R                  (       d  U(       a  U R/                  SU5        UR                  5       nX-   n[G        [        RH                  [        R                  5         URC                  5       (       dr  UU:  al  [K        UU-
  5       ISh  vN   URM                  5       I Sh  vN   SSS5      ISh  vN   UR                  5       nURC                  5       (       d  UU:  a  Ml  SSS5        URC                  5       (       d2  U R                  (       d!  U R/                  S5        U RO                  5         [Q        U[S        5       5        U R0                  c  Ub  U R/                  S5        OU R                  (       dw  U R2                  (       ae  U R4                  (       dT  UbP  U R                   R                  5       nXl        U R8                  c#  UR;                  X-   U R<                  5      U l        OO U R                  (       d  GM,  U R                  (       d0  SU l        U R0                  b  U R0                  RO                  5         ggg GN8! [        R                   a     SU l	        Mc  f = f! SU l	        f = f GN! [        R                  [,        4 a    U R/                  S5         U R0                  c  Ub  U R/                  S5        M  U R                  (       a  M  U R2                  (       am  U R4                  (       d\  UbV  U R                   R                  5       nXl        U R8                  c&  UR;                  X-   U R<                  5      U l        GMP  GMS  GMV  GMY  f = f GN GN GN! , ISh  vN  (       d  f       GN= f! , (       d  f       GN= f! [        R                   a    U R/                  S5         U R0                  c  Ub  U R/                  S5        GM  U R                  (       a  GM  U R2                  (       am  U R4                  (       d\  UbV  U R                   R                  5       nXl        U R8                  c&  UR;                  X-   U R<                  5      U l        GMi  GMl  GMo  GMr  [T         a<  nU RV                  (       a  U RY                  S	US
9  U R[                  5          SnAGNqSnAf[\         a+  nU RY                  SUS
9  U R[                  5          SnAGNSnAff = f! U R0                  c  Ub  U R/                  S5        f U R                  (       d}  U R2                  (       ag  U R4                  (       dV  UbR  U R                   R                  5       nXl        U R8                  c$  UR;                  X-   U R<                  5      U l        f f f    GM  f = f7f)a/  Process incoming request.

It reads request line, request headers and request payload, then
calls handle_request() method. Subclass has to override
handle_request(). start() handles various exceptions in request
or response handling. Connection is being closed always unless
keep_alive(True) specified.
Nr   z&Ignored premature client disconnectionz'Ignored premature client disconnection.z(Ignored premature client disconnection 2z'Start lingering close timer for %s sec.zUncompleted request.z'Ignored premature client disconnection zUnhandled runtime exceptionr   zUnhandled exception)/r   rX   rM   rS   rO   rN   ra   rU   create_futurerW   r   r   popleftr   requests_countr   
isinstancer@   _make_error_handlerERRORr   r   ConnectionErrorr   r   rL   r`   rQ   rR   call_atr   boolr   is_eofrT   r   r   r   readanyr   r   r*   RuntimeErrorr^   r   r   r   )rz   rp   handlerro   re   r   rD   r   r   writerru   r   taskr   nowrk   end_trC   s                     r9   r   RequestHandler.start  s     zz$$"""--""" 33$$000$$000###>>(#'#5#5#7DL,,&& $(DL#~~557GIIKE""a'"!$-F'8,,"&":":7"C"&"7"7++GdGTGEzz--((I(,*KD NN#MNR >>)d.>NN#LM***t{{,8"&**//"3C360#55=9=$'$;T=T=T:" 6  > 9 g #'t"7 ~~''%)%9%9N,,E~ #iik # 4%g&:&:G<R<RS&-nn&6&63;+7+D+D*1//*;$;$; ,E+D '+iik	 '.nn&6&63; T #>>++D4E4E'=>

g'9';< >>)d.>NN#LM**t{{,8"&**//"3C360#55=9=$'$;T=T=T:" 6  +g ###B   !%D~~)$$& * !y '-- #'DL $(DL, #-..@ NN#KL^ >>)d.>NN#LM***t{{,8"&**//"3C360#55=9=$'$;T=T=T:" 6  > 9 }4 ,E$; ,E+D+D+D TS )) HI >>)d.>NN#LM***t{{,8"&**//"3C360#55=9=$'$;T=T=T:" 6  > 9 +   #::&&'Ds&S  "" #""#83"G  ""# >>)d.>NN#LM**t{{,8"&**//"3C360#55=9=$'$;T=T=T:" 6  > 9  +s  A>`=$S  %S&S  +B`=+X. 7T <T=T X. 2`=A=`=B"X. 1.XW8 X#X7W;8X<XW>/X9A#X. B<`=A`=S   S?4T 5	`=>S??T 	T`=T +W5<X. =2`=3B`=4W55X. 8X;X>XX	X
X	X
X+&X. .%^^ 3`=B`=	^1]^ ^ ^ :^  ^^ B-`:5`=9`::`=r   c                 ,  #    U R                   b_  U R                   R                  S5        SU l        U R                  (       a,  U R                   R	                  U R                  5        SU l         UR
                  n U" U5      I Sh  vN   UR                  5       I Sh  vN   U R                  XU5        g! [         a)    Uc  [        S5      e[        SR                  U5      5      ef = f Ne NO! [         a    U R                  XU5         gf = f7f)zPrepare the response and write_eof, then log access.

This has to
be called within the context of any exception so the access logger
can get exception information. Returns True if the client disconnects
prematurely.
NFr8   z+Missing return statement on request handlerz7Web-handler should return a response instance, got {!r}T)r[   set_upgradedrY   rV   r   prepareAttributeErrorr   r   	write_eofr   r   )rz   r   r   r   prepare_meths        r9   r   RequestHandler.finish_responseZ  s     +  --e4!DM!!$$..t/A/AB%("
	<<L	w'''.."""
 OOG:6#  	|"#STT"%vd| 		 (" 	OOG:6	s`   A-D0B8 =C2 C.	C2  C0!C2 %D83C++D.C2 0C2 2DDDDrB   rD   c                    U R                  SUS9  UR                  R                  S:  a  [        S5      eSnU[        R
                  :X  a  SR                  [        R
                  5      n[        R
                  R                  nSnU R                  (       a-  [        [        5         [        R                  " 5       nSSS5        SUR                  R                  S	S
5      ;   a*  U(       a  [        U5      nSU S3nSR                  XgS9nSnOU(       a  UnUS-   U-   n[!        X$US9n	U	R#                  5         U	$ ! , (       d  f       N= f)zHandle errors.

Returns HTTP response with specific status code. Logs additional
information. It always closes current connection.
zError handling requestr   r   zMResponse is sent already, cannot send another response with the error messagez
text/plainz{0.value} {0.phrase}Nz	text/htmlAccept z<h2>Traceback:</h2>
<pre>z</pre>zV<html><head><title>{title}</title></head><body>
<h1>{title}</h1>
{msg}
</body></html>
)titler   z

)rB   textcontent_type)r   r   output_sizer   r   INTERNAL_SERVER_ERRORr   descriptionr^   r   r   	traceback
format_excheadersgethtml_escaper&   r   )
rz   r   rB   rC   rD   ctr  r   tbr   s
             r9   r   RequestHandler.handle_error  s1    	3cB >>%%)!) 
 Z555*11*2R2RSE22>>CBzzi("--/B ) goo11(B??$RB6rd&AC0 &u&.  !C&.3.v"E- )(s   'D<<
E
err_infoc                 4   ^ ^ S[         S[        4UU 4S jjnU$ )Nr   r}   c                 p   >#    TR                  U TR                  TR                  TR                  5      $ 7fr   )r   rB   rC   rD   )r   r  rz   s    r9   r   3RequestHandler._make_error_handler.<locals>.handler  s0     $$(,,8H8H s   36)r%   r'   )rz   r  r   s   `` r9   r   "RequestHandler._make_error_handler  s"    	; 	> 	 	
 r8   )r`   rb   ra   rL   rR   rQ   rS   rT   rM   rV   rU   rZ   rK   rO   rN   r[   rX   rP   rc   rY   rW   r_   r   r^   r]   r   )g      .@)r}   N)r   NN)7r2   r3   r4   r5   r6   r   	__slots__r   r$   r   
LOG_FORMATr   AbstractEventLooprw   r   r   r   r   rH   rE   rt   r   propertyre   r   r   BaseTransportr   rG   r   r	   r   r   bytesr   r   r   r   r%   r'   r   r   r   r   r   r
   r   r   r   r   r   r@   r   r7   __classcell__)r{   s   @r9   r(   r(   `   s   %N "#ID $("&7C*!-!8!8! " $! $()%H"H" ''	H"
 !H" H" H" 34H" H" H" H" H" H" H" H"  !H"" #H"$ !&%H" H"T
# 
 '5 ' '"huo " ">	<)>)> 	<4 	<"(8M#: "(t "(H% % %%% %D %N*d *t *""P"P.<PDIP	P+s +# +$ ++3 +c +d +
&%% % ";->1J"JK	%
 
~t#	$%Nw'r#"#*8#FK#	#P '+!%11 1 m$	1
 #1 
1f 	;->!::	; r8   )Ir   asyncio.streamsr  r   collectionsr   
contextlibr   htmlr   r  httpr   loggingr   typingr   r	   r
   r   r   r   r   r   r   r   r   attryarlabcr   r   base_protocolr   helpersr   r   r   r   r   r   r   r   r   r   streamsr    r!   tcp_helpersr"   web_exceptionsr#   web_logr$   web_requestr%   web_responser&   r'   __all__
web_serverr+   _RequestFactory_RequestHandlerURLr   r   r)   r*   sr@   _MsgTyper(   r0   r8   r9   <module>r8     sK         &        ; ' 0  . 0 & ) ! $ 2
I"  	 K=)N*CCD		HHSM	!) !8 8 T$d3  4 ((23\ABZ	\ Z	r8   