
    D_	hK                         S SK r S SK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  SSKJr   " S S	\5      r " S
 S\R$                  5      rg)    N)OverflowableBufferReadOnlyFileBasedBuffer)HTTPRequestParser)	ErrorTaskWSGITask)InternalServerError   )	wasyncorec                       \ rS rSrSrSrg)ClientDisconnected   z3Raised when attempting to write to a closed socket. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       N/var/www/html/fileupload/venv/lib/python3.13/site-packages/waitress/channel.pyr   r      s    =r   r   c                       \ rS rSrSr\r\r\	r
SrSrSrSrSrSrSrSS jrS rS rS	 rSS
 jrS rS rS rS rSS jrSS jrS rSS jrSS jrS r S r!S r"S r#Sr$g)HTTPChannel   z
Setting self.requests = [somerequest] prevents more requests from being
received until the out buffers have been flushed.

Setting self.requests = [] allows more requests to be received.
Nr   Fc                    Xl         X@l        [        UR                  5      /U l        [
        R
                  " 5       =U l        U l        UR                  [        R                  [        R                  5      U l        [        R                  " 5       U l        [        R                   " 5       U l        [$        R&                  R)                  XUS9  SU l        X0l        / U l        g )N)mapT)serveradjr   outbuf_overflowoutbufstimecreation_timelast_activity
getsockoptsocket
SOL_SOCKET	SO_SNDBUFsendbuf_len	threadingLockrequests_lock	Conditionoutbuf_lockr
   
dispatcher__init__	connectedaddrrequests)selfr   sockr0   r   r   s         r   r.   HTTPChannel.__init__8   s    *3+>+>?@26))+=T/??6+<+<f>N>NO '^^-$..0%%dc%:	r   c                 $    U R                   (       + $ )z
This method is inserted into the environment of any created task so it
may occasionally check if the client has disconnected and interrupt
execution.
)r/   r2   s    r   check_client_disconnected%HTTPChannel.check_client_disconnectedJ   s     >>!!r   c                 f    U R                   =(       d    U R                  =(       d    U R                  $ N)total_outbufs_len
will_closeclose_when_flushedr6   s    r   writableHTTPChannel.writableS   s$    
 %%SSD<S<SSr   c                 l   U R                   (       d  U R                  nO3U R                  U R                  R                  :  a  U R
                  nOS nU R                  U5        U R                  (       a  U R                  (       d  SU l        SU l        U R                  (       a  U R                  5         g g )NFT)
r1   _flush_somer;   r   
send_bytes_flush_some_if_lockable_flush_exceptionr=   r<   handle_close)r2   flushs     r   handle_writeHTTPChannel.handle_writeZ   s    
 }} $$E##txx':'::
 00E Ee$""4+A+A&+D#"DO?? r   c                    U(       a	   U" US9S4$ g ! [          a@    U R                  R                  (       a  U R                  R	                  S5        SU l         g[         a%    U R                  R	                  S5        SU l         gf = f)Ndo_closeFSocket errorT)FTz"Unexpected exception when flushing)OSErrorr   log_socket_errorslogger	exceptionr<   	Exception)r2   rF   rK   s      r   rD   HTTPChannel._flush_exceptionz   s~    %x0%88   %88--KK)).9"&$ %%%&JK"&$	%s    AB	+B	B	c                     U R                   =(       dR    U R                  =(       d?    [        U R                  5      U R                  R
                  :  =(       d    U R                  (       + $ r:   )r<   r=   lenr1   r   channel_request_lookaheadr;   r6   s    r   readableHTTPChannel.readable   sS     OO &&&&4==!DHH$F$FF& %%	
 	
r   c                 p    U R                  U R                  R                  5      nU(       a,  [        R                  " 5       U l	        U R                  U5        g SU l        g ! [         aI    U R                  R                  (       a  U R
                  R                  S5        U R                  5          g f = f)NrL   F)recvr   
recv_bytesrM   rN   rO   rP   rE   r    r"   receivedr/   )r2   datas     r   handle_readHTTPChannel.handle_read   s    	99TXX001D !%DMM$ #DN  	xx))%%n5	s   %A" "AB54B5c                 l   SU R                   l        Sn[        U5      nU R                     U R                  S   R                  U5        U =R                  U-  sl        U =R                  U-  sl        SU l        U R                  5         SSS5        SU R                   l
        g! , (       d  f       N = f)z
Send a 100-Continue header to the client. This is either called from
receive (if no requests are running and the client expects it) or at
the end of service (if no more requests are queued and a request has
been read partially that expects it).
Fs   HTTP/1.1 100 Continue

TN)requestexpect_continuerT   r,   r   appendcurrent_outbuf_countr;   sent_continuerA   	completed)r2   outbuf_payload	num_bytess      r   send_continueHTTPChannel.send_continue   s     (-$9'	LL##N3%%2%""i/"!%D  "' s   A B%%
B3c                    U(       d  gU R                      U R                  (       d  U R                  (       a
   SSS5        gU(       Gak  U R                  c   U R	                  U R
                  5      U l        U R                  R                  U5      nU R                  R                  (       aM  U R                  R                  (       a2  U R                  (       d!  U R                  (       d  U R                  5         U R                  R                  (       a  SU l
        U R                  R                  (       dY  U R                  R                  U R                  5        [        U R                  5      S:X  a  U R                   R#                  U 5        SU l        U[        U5      :  a  OXS nU(       a  GMk  SSS5        g! , (       d  f       g= f)zP
Receives input asynchronously and assigns one or more requests to the
channel.
FNr	   T)r*   r<   r=   ra   parser_classr   r[   rb   headers_finishedr1   re   ri   rf   emptyrc   rT   r   add_task)r2   r\   ns      r   r[   HTTPChannel.received   s>     $"9"9   <<'#'#4#4TXX#>DLLL))$/ LL0055 MM ..&&(<<))).D&<<--,,T\\:t}}-2
 !KK006#'DLD	>BxC $  Z [  Z s   $F>E0F>>
Gc                 T   U R                   R                  S5      (       ai   U R                  US9  U R                  U R                  R
                  :  a  U R                   R                  5         U R                   R                  5         g g ! U R                   R                  5         f = fNFrJ   )r,   acquirerA   r;   r   outbuf_high_watermarknotifyrelease)r2   rK   s     r   rC   #HTTPChannel._flush_some_if_lockable   s     ##E**+  ( 3))DHH,J,JJ$$++-  ((* +   ((*s   AB B'c                 n   SnSn U R                   S   nUR                  5       nUS:  al  UR                  U R                  5      nU R	                  XaS9nU(       a0  UR                  US5        XW-  nX'-  nU =R                  U-  sl        OSnOPUS:  a  Ml  [        U R                   5      S:  a-  U R                   R                  S5      n UR                  5         OSnU(       a  OM  U(       a  [        R                  " 5       U l        gg! [         a    U R                  R                  S5         NTf = f)Nr   FTrJ   r	   z'Unexpected error when closing an outbuf)r   __len__getr'   sendskipr;   rT   popcloserQ   rO   rP   r    r"   )	r2   rK   sentdobreakoutbuf	outbuflenchunknum_senttocloses	            r   rA   HTTPChannel._flush_some  s%    \\!_F (Ia-

4#3#3499U9>KK$/)I$D**h6* #G a-" t||$q("ll..q1GY
 #GE H !%D % Y--.WXYs   D %D43D4c                 ~   U R                      U R                   H  n UR                  5         M     SU l        SU l        U R                   R                  5         S S S 5        [        R                  R                  U 5        g ! [         a    U R                  R                  S5         M  f = f! , (       d  f       NZ= f)Nz.Unknown exception while trying to close outbufr   F)r,   r   r   rQ   rO   rP   r;   r/   rv   r
   r-   )r2   r   s     r   rE   HTTPChannel.handle_close3  s    ,,LLN ' &'D""DN##%  	""4( ! KK))H	 s-   B.B,B.%B+'B.*B++B..
B<c                     [         R                  R                  X5        X R                  R                  U R
                  '   g)zDSee wasyncore.dispatcher

This hook keeps track of opened channels.
N)r
   r-   add_channelr   active_channels_fileno)r2   r   s     r   r   HTTPChannel.add_channelA  s.    
 	((348##DLL1r   c                     U R                   n[        R                  R                  X5        U R                  R
                  nX#;   a  X2	 gg)zDSee wasyncore.dispatcher

This hook keeps track of closed channels.
N)r   r
   r-   del_channelr   r   )r2   r   fdacs       r   r   HTTPChannel.del_channelI  s?    
 \\((3[[((8 r   c                 N   U R                   (       d  [        eU(       Ga  U R                     U R                  5         U R                   (       d  [        e[	        U5      n[        U[        5      (       a]  U R                  R                  U5        [        U R                  R                  5      nU R                  R                  U5        SU l        OU R                  U R                  R                  :  aA  [        U R                  R                  5      nU R                  R                  U5        SU l        U R                  S   R                  U5        U =R                  U-  sl        U =R                  U-  sl        U R                  U R                  R                  :  ah  U R!                  U R"                  SS9u  pEU(       d+  U(       a$  U R                  U R                  R                  :  a  U R$                  R'                  5         S S S 5        U$ g! , (       d  f       W$ = f)Nr   r`   FrJ   )r/   r   r,   #_flush_outbufs_below_high_watermarkrT   
isinstancer   r   rc   r   r   r   rd   ru   r;   rB   rD   rA   r   pull_trigger)r2   r\   rh   nextbufflushedrP   s         r   
write_soonHTTPChannel.write_soonY  s   ~~ %$ !!88:~~,,I	d$;<<LL''-01I1IJGLL''001D-00DHH4R4RR #5TXX5M5M"N++G4451LL$++D1--:-&&)3&))TXX-@-@@+/+@+@((5 ,A ,(W
 "&11TXX5H5HH002E "H M "!H s   GH
H$c                    U R                   U R                  R                  :  Ga  U R                     U R	                  U R
                  SS9u  pU(       a>  U R                  R                  5         U R                  R                  5          S S S 5        g U R                  (       a  U R                   U R                  R                  :  ak  U R                  R                  5         U R                  R                  5         U R                  (       a&  U R                   U R                  R                  :  a  Mk  S S S 5        g g ! , (       d  f       g = frs   )
r;   r   ru   r,   rD   rA   r   r   waitr/   )r2   _rP   s      r   r   /HTTPChannel._flush_outbufs_below_high_watermark  s     !!DHH$B$BB!!!%!6!6t7G7GRW!6!X KK,,.$$))+ "! NN..1O1OOKK,,.$$))+	 NN..1O1OO "! C!!s   AD>BD>>
Ec                    U R                   S   nUR                  (       a  U R                  X5      nOU R                  X5      n U R                  (       a  UR                  5         OSUl         UR                  (       aH  U R0                     SU l        U R                    H  nUR5                  5         M     / U l         SSS5        GOG[7        U R                   5      S:  a  U R9                  5         U R:                  S:  a  U R                  R<                  U l        UR5                  5         U R0                     U R                   R?                  S5        U R                  (       a-  U R                   (       a  U R@                  RC                  U 5        OuU R                  (       ad  U R                  bW  U R                  RD                  (       a<  U R                  RF                  (       a!  U RH                  (       d  U RK                  5         SSS5        U R                  (       a  U R@                  RM                  5         [N        RN                  " 5       U l(        g! [         a=    U R                  R                  SUR                  R                  -  5        SUl         GN,[         Ga,    U R                  R                  SUR                  R                  -  5        UR                  (       d  U R                  R                   (       a  ["        R$                  " 5       nOSnUR&                  nUR(                  nU R+                  U R                  5      n[-        U5      Ul        XFl         US   UR(                  S'   O! [.         a     Of = fU R                  X5      n UR                  5          GN>! [         a    SUl          GNSf = fSUl         GNaf = f! , (       d  f       GN= f! , (       d  f       GN= f)	zUExecute one request. If there are more, we add another task to the
server at the end.r   Tz$Client disconnected while serving %szException while serving %sz:The server encountered an unexpected internal server error
CONNECTIONNr	   ))r1   errorerror_task_class
task_classr/   serviceclose_on_finishr   rO   infora   pathrQ   rP   wrote_headerr   expose_tracebacks	traceback
format_excversionheadersrl   r   KeyErrorr*   r=   r   rT   r   rd   ru   r~   r   ro   rb   rm   re   ri   r   r    r"   )r2   ra   taskbodyreq_versionreq_headerserr_requests          r   r   HTTPChannel.service  s    --"==((7D??41D!	,~~'+$> ##*.'#}}GMMO  - " $# 4==!A%88: ((1,,0HH,J,J)MMO ##!!!$>>dmmKK((.NN04455 ..
 &&( $" >>KK$$&!YY[c " 	(KKCdllFWFWWX#'D  	,KK!!">ARAR"RS$$88--$//1DWD%oo%oo"//9$7$=! '2#8CL8QK''5 ,,T?0LLN) 0+/D((0 (,$3	,8 $#< $#s{   !I 'I 2O8CO&AOC	O%M87O8
NONON--O>OO
OO
O#&
O5c                 b    SU l         SU l        [        R                  " 5       U l        / U l        g)z%Cancels all pending / active requestsTFN)r<   r/   r    r"   r1   r6   s    r   cancelHTTPChannel.cancel  s%    !YY[r   )r0   r   r=   r/   r!   rd   r"   r,   r   ra   r1   r*   r'   re   r   r;   r<   r:   )T)%r   r   r   r   r   r   r   r   r   r   rl   ra   r"   r<   r=   re   r;   rd   r.   r7   r>   rG   rD   rV   r]   ri   r[   rC   rA   rE   r   r   r   r   r   r   r   r   r   r   r   r      s     J $L GMJM$"T @% 
 #"'$6p+/b)9
 /b,.a)Fr   r   )r$   r(   r    r   waitress.buffersr   r   waitress.parserr   waitress.taskr   r   waitress.utilitiesr    r
   rQ   r   r-   r   r   r   r   <module>r      sB        H - - 2 > >j)&& jr   