
    D_	hWU                         S SK Jr  S SKrS SKrS SKrSSKJr  SSKJrJ	r	J
r
  SSS.r\" S	5      r " S
 S5      r " S S5      r " S S\5      r " S S\5      rg)    )dequeN   )ReadOnlyFileBasedBuffer)build_http_dateloggerqueue_loggerCONTENT_LENGTHCONTENT_TYPE)r	   r
   )
connection
keep-alivezproxy-authenticatezproxy-authorizationtetrailersztransfer-encodingupgradec                   P    \ rS rSrSrSrSr\r\rS r	S r
S rS rS rSS	 jrS
rg)ThreadedTaskDispatcher*   z6A Task Dispatcher that creates a thread for each task.r   c                    [        5       U l        [        5       U l        [        R
                  " 5       U l        [        R                  " U R                  5      U l        [        R                  " U R                  5      U l	        g N)
setthreadsr   queue	threadingLocklock	Conditionqueue_cvthread_exit_cvselfs    K/var/www/html/fileupload/venv/lib/python3.13/site-packages/waitress/task.py__init__ThreadedTaskDispatcher.__init__2   sO    uW
NN$	!++DII6'11$))<    c                 f    [         R                  " USU 3U4S9nSUl        UR                  5         g )Nz	waitress-)targetnameargsT)r   Threaddaemonstart)r   r%   	thread_nots       r    start_new_thread'ThreadedTaskDispatcher.start_new_thread9   s4    )I; 7yl
 		r#   c                     U R                      U R                  (       dw  U R                  S:X  ag  U =R                  S-  sl        U R                  R                  5         U =R                  S-  sl        U R                  (       d  U R                  S:X  a  Mg  U R                  S:  ai  U =R                  S-  sl        U =R                  S-  sl        U R                  R                  U5        U R                  R                  5          S S S 5        g U R                  R                  5       nS S S 5         WR                  5         GMD  ! , (       d  f       N"= f! [         a    U R                  R                  SW5         N<f = f)Nr   r   zException when servicing %r)r   r   
stop_countactive_countr   waitr   discardr   notifypopleftserviceBaseExceptionr   	exception)r   r+   tasks      r    handler_thread%ThreadedTaskDispatcher.handler_thread@   s   **A)= %%*%MM&&(%%*% **A)= ??Q&%%*%OOq(OLL((3''..0  zz))+  K% $ ! K%%&CTJKs+   BEA0EE3E 
E&F ?F c                    U R                      U R                  nSn[        U5      U R                  -
  nXA:  ad  X2;   a  US-   nX2;   a  M  UR	                  U5        US-  nU R                  U R                  U5        U =R                  S-  sl        US-   nXA:  a  Md  XA:  a1  U =R                  XA-
  -  sl        U R                  R                  5         S S S 5        g ! , (       d  f       g = f)Nr   r   )
r   r   lenr0   addr-   r:   r1   r   
notify_all)r   countr   r+   runnings        r    set_thread_count'ThreadedTaskDispatcher.set_thread_countW   s    YYllGI'lT__4G/* )AI  *I&1%%d&9&99E!!Q&!%M	 / 7?2((*! YYs   ;C
AC6C
C*c                    U R                      U R                  R                  U5        U R                  R	                  5         [        U R                  5      n[        U R                  5      U R                  -
  U R                  -
  nX#:  a  U R                  R                  SX#-
  5        S S S 5        g ! , (       d  f       g = f)NzTask queue depth is %d)r   r   appendr   r4   r=   r   r0   r1   r   warning)r   r9   
queue_sizeidle_threadss       r    add_taskThreadedTaskDispatcher.add_taskj   s    YYJJd#MM  "TZZJt||,t>ARARRL(!!)),j.G YYs   BB33
Cc                    U R                  S5        U R                  n[        R                  " 5       U-   nU R                     U(       ac  [        R                  " 5       U:  a&  U R                  R                  S[        U5      5        O$U R                  R                  S5        U(       a  Mc  U(       a  U R                  n[        U5      S:  a%  U R                  R                  S[        U5      5        U(       a)  UR                  5       nUR                  5         U(       a  M)  U R                  R                  5          S S S 5        g S S S 5        g! , (       d  f       g= f)Nr   z%d thread(s) still runningg?zCanceling %d pending task(s)TF)rB   r   timer   r   rF   r=   r   r2   r   r5   cancelr   r?   )r   cancel_pendingtimeoutr   
expirationr   r9   s          r    shutdownThreadedTaskDispatcher.shutdownu   s    a ,,YY[7*
YY99;*,KK''(Dc'lS##((-	 '
 

u:>KK''(FE
S ==?DKKM e ((* Y    ! Y  s   A)E-A5E$E
E )r   r   r   r   r   N)T   )__name__
__module____qualname____firstlineno____doc__r0   r1   r   r   r!   r-   r:   rB   rI   rQ   __static_attributes__ r#   r    r   r   *   s8    @JLFL=K.+&	r#   r   c                       \ rS rSrSrSrSrSrSrSr	Sr
SrSrSr\rS rS r\S 5       rSS	 jrS
 rS rS rS rS rSrg)Task   Fz200 OKr   Nc                 ^    Xl         X l        / U l        UR                  nUS;  a  SnX0l        g )N)1.01.1r_   )channelrequestresponse_headersversion)r   ra   rb   rd   s       r    r!   Task.__init__   s/     "//.(Gr#   c                      U R                  5         U R                  5         U R                  5         g ! [         a0    SU l        U R
                  R                  R                  (       a  e  g f = f)NT)r*   executefinishOSErrorclose_on_finishra   adjlog_socket_errorsr   s    r    r6   Task.service   sT    	JJLLLNKKM 	#'D ||11 2	s   03 7A-,A-c                     U R                   R                  S5      =(       d=    U R                   R                  S5      =(       d    U R                   R                  S5      (       + $ )N1204304)status
startswithr   s    r    has_bodyTask.has_body   sN     KK""3' -{{%%e,-{{%%e,
 	
r#   c                     U R                   (       d[  S nU R                   H+  u  p#UR                  5       S:X  d  M  UR                  5       nM-     Uc  U R                  R	                  S5        SU l        g )N
Connection)rw   closeT)wrote_headerrc   
capitalizelowerrE   rj   )r   connection_close_header
headername	headervals       r    set_close_on_finishTask.set_close_on_finish   si       &*#)-)>)>%
((*l:.7oo.?+ *? '.%%,,-DE#r#   c                 f   U R                   nU R                  R                  R                  SS5      R	                  5       n/ nS nS nS nU R
                   H  u  pxSR                  UR                  S5       V	s/ s H  oR                  5       PM     sn	5      nUS:X  a  U R                  (       a  UnOM_  US:X  a  UnUS:X  a  UnUR                  Xx45        M     X0l        UcP  U R                  bC  U R                  (       a2  [        U R                  5      nU R
                  R                  SU45        US:X  aK  US:X  a4  U(       d  U R                  5         OU R
                  R                  S	5        OU R                  5         OUS
:X  ar  US:X  a  U R                  5         U(       dT  U R                  (       a"  U R
                  R                  S5        SU l        U R                  (       d  U R                  5         O[!        S5      eU R"                  R$                  R&                  R(                  n
U(       d%  U
(       a  U R
                  R                  SU
45        O&U R
                  R                  SU
=(       d    S45        U(       d0  U R
                  R                  S[+        U R,                  5      45        SU R                    SU R.                   3n[1        U R
                  S S9 Vs/ s H  nSU-  PM
     nnU/U-   nSSR                  U5      -  nUR3                  S5      $ s  sn	f s  snf )N
CONNECTION -zContent-LengthDateServerr_   r   )rw   z
Keep-Aliver`   rx   )zTransfer-EncodingchunkedTzneither HTTP/1.0 or HTTP/1.1ViawaitresszHTTP/ c                     U S   $ )Nr   rZ   )xs    r    <lambda>,Task.build_response_header.<locals>.<lambda>  s    PQRSPTr#   )keyz%s: %sz%s

z
latin-1)rd   rb   headersgetr{   rc   joinsplitrz   rt   rE   content_lengthstrr   chunked_responserj   AssertionErrorra   serverrk   identr   
start_timerr   sortedencode)r   rd   r   rc   content_length_headerdate_headerserver_headerr}   r~   r   r   
first_linehv
next_lineslinesress                   r    build_response_headerTask.build_response_header   s   ,,\\))--lB?EEG
 $%)%:%:!J:;K;KC;P"Q;Pa<<>;P"QRJ--==,5)V#'X% ) ##Z$;<! &;& !1 ")##/$'(;(;$<!!!((*:<Q)RSe\),,,.))001MN((*W$((*( ==))001QR,0D)++,,. !!?@@ ##''--%%,,h->?!!((%1D*)EF!!((&/$//2R)STT\\N!DKK=9

 %+4+@+@n$U
$UbHrM$U 	 
 z)V[[//zz)$$_ #RR
s   8L)
-L.c                     / nU R                    H-  u  p#UR                  5       S:X  a  M  UR                  X#45        M/     Xl         g )Ncontent-length)rc   r{   rE   )r   rc   header_nameheader_values       r    remove_content_length_header!Task.remove_content_length_header  sI    )-)>)>%K  "&66##[$?@ *?
 !1r#   c                 8    [         R                   " 5       U l        g r   )rL   r   r   s    r    r*   
Task.start'  s    ))+r#   c                     U R                   (       d  U R                  S5        U R                  (       a  U R                  R	                  S5        g g )Nr#   s   0

)ry   writer   ra   
write_soonr   s    r    rh   Task.finish*  s6      JJsO  LL##L1 !r#   c                    U R                   (       d  [        S5      eU R                  nU R                  (       d(  U R	                  5       nUR                  U5        SU l        U(       a  U R                  (       a  UnU R                  nU R                  (       a?  [        [        U5      5      SS  R                  5       R                  S5      S-   nXAS-   -  nOmUbj  US XPR                  -
   nU =R                  [        U5      -  sl        XA:w  a6  U R                  (       d%  U R                  R!                  SU-  5        SU l        U(       a  UR                  U5        g g U(       a`  U =R                  [        U5      -  sl        U R"                  (       d0  U R                  R!                  SU R$                  -  5        SU l        g g g )Nz1start_response was not called before body writtenT   r   s   
z`application-written content exceeded the number of bytes specified by Content-Length header (%s)zfapplication-written content was ignored due to HTTP response that may not contain a message-body: (%s))completeRuntimeErrorra   ry   r   r   rt   r   r   hexr=   upperr   content_bytes_writtenlogged_write_excessr   rF   logged_write_no_bodyrr   )r   datara   rhtowritecls         r    r   
Task.write1  s   }}RSS,,  ++-Br" $DDMMG$$B$$c$i.,224;;IFP'>)@&@&@!@A**c'l:*?4+C+CKK''HJLM 04D,""7+  &&#d)3&,,##IKO;;W -1) - r#   )
ra   r   rj   r   r   rb   rc   r   rd   ry   )returnN)rT   rU   rV   rW   rj   rr   ry   r   r   r   r   r   r   r   r   r!   r6   propertyrt   r   r   r   r*   rh   r   rY   rZ   r#   r    r\   r\      s{    OFLJN HF 
 

$Y%v1&2&1r#   r\   c                   "    \ rS rSrSrSrS rSrg)	ErrorTaskiZ  z(An error task produces an error responseTc                 P   U R                   R                  R                  R                  nU R                  R
                  nUR                  U5      u  p4nX0l        U R                  R                  U5        U R                  5         [        U5      U l        U R                  U5        g r   )ra   r   rk   r   rb   errorto_responserr   rc   extendr   r=   r   r   )r   r   err   r   bodys         r    rg   ErrorTask.execute_  s|    ##''--LL !e 4$$W-  "!$i

4r#   )r   rr   N)rT   rU   rV   rW   rX   r   rg   rY   rZ   r#   r    r   r   Z  s    2Hr#   r   c                   (    \ rS rSrSrSrS rS rSrg)WSGITaskij  z8A WSGI task produces a response from a WSGI application.Nc                   ^  T R                  5       nS
U 4S jjnT R                  R                  R                  X5      nSn [	        U[
        5      (       a  T R                  nUR                  U5      nU(       ay  XV:w  a  Ub  T R                  5         UT l        T R                  S5        T R                  R                  U5        Sn U(       a#  [        US5      (       a  UR                  5         g g g S nU Hc  nUcC  [        U5      nT R                  c+  S n	[        US5      (       a  [        U5      n	U	S:X  a  UT l        U(       d  MR  T R                  U5        Me     T R                  nUb{  T R                  U:w  ak  T R                  R                   S:w  aQ  T R#                  5         T R                  R                   S:w  a'  T R$                  R'                  S	T R                  U5        U(       a#  [        US5      (       a  UR                  5         g g g ! U(       a#  [        US5      (       a  UR                  5         f f f = f)Nc                   > TR                   (       a  U(       d  [        S5      eU(       a!   TR                  (       a  US   e/ Tl         S nSTl         [	        U [
        5      (       d  [        SU -  5      eSU ;   d  SU ;   a  [        S5      eU Tl        U H  u  p4[	        U[
        5      (       d  [        SU< S	X44< 35      e[	        U[
        5      (       d  [        S
U< S	X44< 35      eSU;   d  SU;   a  [        S5      eSU;   d  SU;   a  [        S5      eUR                  5       nUS:X  a  [        U5      Tl
        M  U[        ;   d  M  [        SU-  5      e   TR                  R                  U5        TR                  $ ! S nf = f)Nz?start_response called a second time without providing exc_info.r   Tzstatus %s is not a string
z5carriage return/line feed character present in statuszHeader name z is not a string in zHeader value z;carriage return/line feed character present in header valuez:carriage return/line feed character present in header namer   zS%s is a "hop-by-hop" header; it cannot be used by a WSGI application (see PEP 3333))r   r   ry   rc   
isinstancer   
ValueErrorrr   r{   intr   
hop_by_hopr   r   )rr   r   exc_infokvklr   s         r    start_response(WSGITask.execute.<locals>.start_responser  s   }}X$U  $((
 'qk) 13-#H DMfc**$%@6%IJJv~ K  !DK  !!S))(&qe+?zJ  "!S))('u,@!
K  19	$U  19	$T  WWY))*-a&D':%(<>?@ /  8 !!((1 ::[  $Hs   F FTr#   Frx   __len__r   HEADzVapplication returned too few bytes (%s) for specified Content-Length (%s) via app_iterr   )get_environmentra   r   applicationr   r   r   preparer   r   r   hasattrrx   r=   r   rb   commandr   r   rF   )
r   environr   app_itercan_close_app_iterr   sizefirst_chunk_lenchunkapp_iter_lens
   `         r    rg   WSGITask.executeo  s    &&(>	B <<&&227K!5	!($;<<((''+z> ==?.2+JJsO
 LL++H5).&H "gh&@&@  'A!E #O!"*&)%jO
 **2'+"8Y77+.x=L'1,2AD/ 5JJu%! "$ $$B~--38L8LPV8V ,,.||++v5++M 66	 "gh&@&@  'A!!gh&@&@  'A!s   BH 4AH 
BH ,I c                 `   U R                   nUb  U$ U R                  nUR                  nU R                  nUR                  nUR
                  R                  nUR                  S5      (       a  SUR                  S5      -   nU(       a1  X6:X  a  SnO)US-   nUR                  U5      (       a  U[        U5      S n0 SUR                  S   _SUR                  S   _S[        UR                  S   5      _S	UR                  R                  5       _S
[        UR                  5      _SUR                  _SUR
                  R                   _SSU R"                  -  _SU_SU_SUR$                  _SUR&                  _SUR(                  _SS_S[*        R,                  _SS_SS_SUR/                  5       [0        SS.En[3        UR4                  5      R7                  5        H.  u  p[8        R;                  US5      n
U
c  SU-   n
X;  d  M*  XU
'   M0     U R                  R<                  US'   Xl         U$ )zReturns a WSGI environment.N/r   REMOTE_ADDRr   REMOTE_HOSTREMOTE_PORTr   REQUEST_METHODSERVER_PORTSERVER_NAMESERVER_SOFTWARESERVER_PROTOCOLzHTTP/%sSCRIPT_NAME	PATH_INFOREQUEST_URIQUERY_STRINGzwsgi.url_schemezwsgi.version)r   r   zwsgi.errorszwsgi.multithreadTzwsgi.multiprocessF)zwsgi.run_oncez
wsgi.inputzwsgi.file_wrapperzwsgi.input_terminatedHTTP_zwaitress.client_disconnected)r   rb   pathra   r   rk   
url_prefixrs   lstripr=   addrr   r   r   effective_portserver_namer   rd   request_uriquery
url_schemesysstderrget_body_streamr   dictr   itemsrename_headersr   check_client_disconnected)r   r   rb   r   ra   r   r   url_prefix_with_trailing_slashr   valuemykeys              r    r   WSGITask.get_environment  sl   ,,N,,||,,ZZ**
??3 S))D ! 
 2<c1A.??#ABBJ 12D
7<<?
 7<<?
 3w||A/
 goo335
 3v445
 6--
 vzz//
 y4<<7
 :
 
  7..!
" GMM#
$ w11%
( F)
, 3::-
. /
0  1
2 #!113!8%)9
> w/557JC"&&sD1E}##!& 8 37,,2X2X./ r#   )r   r   r   rc   rr   )	rT   rU   rV   rW   rX   r   rg   r   rY   rZ   r#   r    r   r   j  s    BG|!|Or#   r   )collectionsr   r  r   rL   buffersr   	utilitiesr   r   r   r	  	frozensetr   r   r\   r   r   rZ   r#   r    <module>r     sp     
   , < < '"
 	
` `FJ1 J1Z  Rt Rr#   