
    7iWU                         d dl mZ d dlZd dlZd dlZddlmZ ddlmZm	Z	m
Z
 dddZ ed	      Z G d
 d      Z G d d      Z G d de      Z G d de      Zy)    )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                   F    e Zd ZdZdZdZeZeZd Zd Z	d Z
d Zd Zd
dZy	)ThreadedTaskDispatcherz6A Task Dispatcher that creates a thread for each task.r   c                    t               | _        t               | _        t	        j
                         | _        t	        j                  | j                        | _        t	        j                  | j                        | _	        y N)
setthreadsr   queue	threadingLocklock	Conditionqueue_cvthread_exit_cvselfs    @/var/www/html/venv/lib/python3.12/site-packages/waitress/task.py__init__zThreadedTaskDispatcher.__init__2   sO    uW
NN$	!++DII6'11$))<    c                 j    t        j                  |d| |f      }d|_        |j                          y )Nz	waitress-)targetnameargsT)r   Threaddaemonstart)r   r#   	thread_nots       r   start_new_threadz'ThreadedTaskDispatcher.start_new_thread9   s4    )I; 7yl
 		r!   c                    	 | j                   5  | j                  so| j                  dk(  r`| xj                  dz  c_        | j                  j                          | xj                  dz  c_        | j                  s| j                  dk(  r`| j                  dkD  ri| xj                  dz  c_        | xj                  dz  c_        | j                  j                  |       | j                  j                          	 d d d        y | j                  j                         }d d d        	 j                          5# 1 sw Y   xY w# t        $ r | j                  j                  d       Y 5w xY w)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_threadz%ThreadedTaskDispatcher.handler_thread@   s(    ,**A)= %%*%MM&&(%%*% **A)= ??Q&%%*%OOq(OLL((3''..0, , zz))+, K% , ,$ ! K%%&CTJKs+   A;D7
A/D7D7%E 7E %E+*E+c                    | j                   5  | j                  }d}t        |      | j                  z
  }||k  r`||v r
|dz   }||v r
|j	                  |       |dz  }| j                  | j                  |       | xj                  dz  c_        |dz   }||k  r`||kD  r2| xj                  ||z
  z  c_        | j                  j                          d d d        y # 1 sw Y   y xY w)Nr   r   )
r   r   lenr-   addr+   r7   r.   r   
notify_all)r   countr   r)   runnings        r   set_thread_countz'ThreadedTaskDispatcher.set_thread_countW   s    YY 	+llGI'lT__4GE/7* )AI  7*I&1%%d&9&99E!!Q&!%M	 E/ 7U?2((*!	+ 	+ 	+s   9CAC7CC"c                    | j                   5  | j                  j                  |       | j                  j	                          t        | j                        }t        | j                        | j                  z
  | j                  z
  }||kD  r| j                  j                  d||z
         d d d        y # 1 sw Y   y xY w)NzTask queue depth is %d)r   r   appendr   r1   r9   r   r-   r.   r   warning)r   r6   
queue_sizeidle_threadss       r   add_taskzThreadedTaskDispatcher.add_taskj   s    YY 	JJd#MM  "TZZJt||,t>ARARRLL(!!)),j<.G	 	 	s   BB44B=c                 ~   | j                  d       | j                  }t        j                         |z   }| j                  5  |r[t        j                         |k\  r&| j                  j                  dt        |             n| j                  j                  d       |r[|r| j                  }t        |      dkD  r%| j                  j                  dt        |             |r#|j                         }|j                          |r#| j                  j                          	 d d d        y	 d d d        y# 1 sw Y   yxY w)Nr   z%d thread(s) still runningg?zCanceling %d pending task(s)TF)r>   r   timer   r   rA   r9   r   r/   r   r2   cancelr   r;   )r   cancel_pendingtimeoutr   
expirationr   r6   s          r   shutdownzThreadedTaskDispatcher.shutdownu   s   a ,,YY[7*
YY 	99;*,KK''(Dc'lS##((-	 
 

u:>KK''(FE
S ==?DKKM  ((*	 	 	  !	  s   AD3A%D3D33D<N)T   )__name__
__module____qualname____doc__r-   r.   r   r   r    r+   r7   r>   rD   rK    r!   r   r   r   *   s8    @JLFL=K.+&	r!   r   c                   z    e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZeZd Zd Zed        ZddZd	 Zd
 Zd Zd Zd Zy)TaskFz200 OKr   Nc                 `    || _         || _        g | _        |j                  }|dvrd}|| _        y )N)1.01.1rU   )channelrequestresponse_headersversion)r   rW   rX   rZ   s       r   r    zTask.__init__   s5     "//.(Gr!   c                     	 | j                          | j                          | j                          y # t        $ r+ d| _        | j
                  j                  j                  r Y y w xY w)NT)r(   executefinishOSErrorclose_on_finishrW   adjlog_socket_errorsr   s    r   r3   zTask.service   sT    	JJLLLNKKM 	#'D ||11 2	s   03 1A'&A'c                     | j                   j                  d      xs8 | j                   j                  d      xs | j                   j                  d       S )N1204304)status
startswithr   s    r   has_bodyzTask.has_body   sN     KK""3' -{{%%e,-{{%%e,
 	
r!   c                     | j                   sWd }| j                  D ])  \  }}|j                         dk(  s|j                         }+ || j                  j	                  d       d| _        y )N
Connection)rj   closeT)wrote_headerrY   
capitalizelowerr@   r_   )r   connection_close_header
headername	headervals       r   set_close_on_finishzTask.set_close_on_finish   sr       &*#)-)>)> @%
I((*l:.7oo.?+@ '.%%,,-DE#r!   c                    | j                   }| j                  j                  j                  dd      j	                         }g }d }d }d }| j
                  D ]w  \  }}dj                  |j                  d      D 	cg c]  }	|	j                          c}	      }|dk(  r| j                  r|}nW|dk(  r|}|dk(  r|}|j                  ||f       y || _        |J| j                  >| j                  r2t        | j                        }| j
                  j                  d|f       |dk(  rE|dk(  r/|s| j                          n| j
                  j                  d	       n| j                          nr|d
k(  rb|dk(  r| j                          |sV| j                  r"| j
                  j                  d       d| _        | j                  s| j                          nt!        d      | j"                  j$                  j&                  j(                  }
|s |
r?| j
                  j                  d|
f       n!| j
                  j                  d|
xs df       |s0| j
                  j                  dt+        | j,                        f       d| j                    d| j.                   }t1        | j
                  d       D cg c]  }d|z  	 }}|g|z   }ddj                  |      z  }|j3                  d      S c c}	w c c}w )N
CONNECTION -zContent-LengthDateServerrU   r   )rj   z
Keep-AliverV   rk   )zTransfer-EncodingchunkedTzneither HTTP/1.0 or HTTP/1.1ViawaitresszHTTP/ c                     | d   S )Nr   rQ   )xs    r   <lambda>z,Task.build_response_header.<locals>.<lambda>  s    PQRSPT r!   )keyz%s: %sz%s

z
latin-1)rZ   rX   headersgetrn   rY   joinsplitrm   rh   r@   content_lengthstrrr   chunked_responser_   AssertionErrorrW   serverr`   identr   
start_timerf   sortedencode)r   rZ   r   rY   content_length_headerdate_headerserver_headerrp   rq   r~   r   
first_linehv
next_lineslinesress                   r   build_response_headerzTask.build_response_header   s   ,,\\))--lB?EEG
 $%)%:%: 	=!J	:;K;KC;P"Qa1<<>"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
 HrM

 
 z)V[[//zz)$$_ #RR
s   9K,
3K1c                     g }| j                   D ],  \  }}|j                         dk(  r|j                  ||f       . || _         y )Ncontent-length)rY   rn   r@   )r   rY   header_nameheader_values       r   remove_content_length_headerz!Task.remove_content_length_header  sV    )-)>)> 	A%K  "&66##[,$?@	A
 !1r!   c                 6    t        j                          | _        y r   )rF   r   r   s    r   r(   z
Task.start'  s    ))+r!   c                     | j                   s| j                  d       | j                  r| j                  j	                  d       y y )Nr!   s   0

)rl   writer   rW   
write_soonr   s    r   r]   zTask.finish*  s6      JJsO  LL##L1 !r!   c                 6   | j                   st        d      | j                  }| j                  s(| j	                         }|j                  |       d| _        |r| j                  r|}| j                  }| j                  r@t        t        |            dd  j                         j                  d      dz   }||dz   z  }nh|f|d || j                  z
   }| xj                  t        |      z  c_        ||k7  r1| j                  s%| j                  j!                  d|z         d| _        |r|j                  |       y y |r[| xj                  t        |      z  c_        | j"                  s0| j                  j!                  d| j$                  z         d| _        y y y )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RuntimeErrorrW   rl   r   r   rh   r   r   hexr9   upperr   content_bytes_writtenlogged_write_excessr   rA   logged_write_no_bodyrf   )r   datarW   rhtowritecls         r   r   z
Task.write1  s   }}RSS,,  ++-Br" $DDMMG$$B$$c$i.,224;;IFP4'>)@d&@&@!@A**c'l:*d?4+C+CKK''HJLM 04D,""7+  &&#d)3&,,##IKO;;W -1) - r!   )returnN)rM   rN   rO   r_   rf   rl   r   r   r   r   r   r   r   r   r    r3   propertyrh   rr   r   r   r(   r]   r   rQ   r!   r   rS   rS      s{    OFLJN HF 
 

$Y%v1&2&1r!   rS   c                       e Zd ZdZdZd Zy)	ErrorTaskz(An error task produces an error responseTc                 T   | j                   j                  j                  j                  }| j                  j
                  }|j                  |      \  }}}|| _        | j                  j                  |       | j                          t        |      | _        | j                  |       y r   )rW   r   r`   r   rX   errorto_responserf   rY   extendrr   r9   r   r   )r   r   erf   r   bodys         r   r\   zErrorTask.execute_  s    ##''--LL !e 4$$W-  "!$i

4r!   N)rM   rN   rO   rP   r   r\   rQ   r!   r   r   r   Z  s    2Hr!   r   c                        e Zd ZdZdZd Zd Zy)WSGITaskz8A WSGI task produces a response from a WSGI application.Nc                 
     j                         }d
 fd	} j                  j                  j                  ||      }d}	 t	        |t
              r j                  }|j                  |      }|rn||k7  r| j                          | _         j                  d        j                  j                  |       d}	 |rt        |d      r|j                          y y y d }|D ]T  }|<t        |      } j                  %d }	t        |d      rt        |      }	|	dk(  r| _        |sD j                  |       V  j                  }|x j                  |k7  ri j                  j                   dk7  rP j#                           j                  j                   dk7  r' j$                  j'                  d	 j                  |       |rt        |d      r|j                          y y y # |rt        |d      r|j                          w w w xY w)Nc                    j                   r|st        d      |r	 j                  r|d   g _        	 d }d_         t	        | t
              st        d| z        d| v sd| v rt        d      | _        |D ]  \  }}t	        |t
              st        d|d	||f      t	        |t
              st        d
|d	||f      d|v sd|v rt        d      d|v sd|v rt        d      |j                         }|dk(  rt        |      _
        |t        v st        d|z         j                  j                  |       j                  S # d }w xY w)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   rl   rY   
isinstancer   
ValueErrorrf   rn   intr   
hop_by_hopr   r   )rf   r   exc_infokvklr   s         r   start_responsez(WSGITask.execute.<locals>.start_responser  s   }}X$U  $((
 'qk) 13-#H DMfc*$%@6%IJJv~ K  !DK   1!!S)(&qe+?AzJ  "!S)('u,@!Q
K  19	$U  19	$T  WWY))*-a&D':%(<>?@ /8 !!((1 ::[  $Hs   E ETr!   Frk   __len__r   HEADzVapplication returned too few bytes (%s) for specified Content-Length (%s) via app_iterr   )get_environmentrW   r   applicationr   r   r   preparer   r   r   hasattrrk   r9   r   rX   commandrr   r   rA   )
r   environr   app_itercan_close_app_iterr   sizefirst_chunk_lenchunkapp_iter_lens
   `         r   r\   zWSGITask.executeo  s   &&(>	B <<&&227NK!5	!($;<((''+Tz> ==?.2+JJsO
 LL++H5).&H "gh&@  'A!E #O! &"*&)%jO
 **2'+"8Y7+.x=L'1,2AD/ JJu%!&$ $$B~--38L8LPV8V ,,.||++v5++M 66	 "gh&@  'A!!gh&@  'A!s   A;G  AG  &BG   "Hc                 <   | j                   }||S | j                  }|j                  }| j                  }|j                  }|j
                  j                  }|j                  d      rd|j                  d      z   }|r,||k(  rd}n$|dz   }|j                  |      r|t        |      d }i d|j                  d   d|j                  d   dt        |j                  d         d	|j                  j                         d
t        |j                        d|j                  d|j
                  j                   dd| j"                  z  d|d|d|j$                  d|j&                  d|j(                  dddt*        j,                  ddddd|j/                         t0        dd}t3        |j4                        j7                         D ],  \  }}	t8        j;                  |d      }
|
d|z   }
|
|vs(|	||
<   . | j                  j<                  |d<   || _         |S )zReturns a WSGI environment.N/ru   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   rX   pathrW   r   r`   
url_prefixrg   lstripr9   addrr   r   r   effective_portserver_namer   rZ   request_uriquery
url_schemesysstderrget_body_streamr   dictr   itemsrename_headersr   check_client_disconnected)r   r   rX   r   rW   r   r   url_prefix_with_trailing_slashr   valuemykeys              r   r   zWSGITask.get_environment  su   ,,N,,||,,ZZ**
??3 S))D z! 
 2<c1A.??#A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7 	'JC"&&sD1E}#G#!&	' 37,,2X2X./ r!   )rM   rN   rO   rP   r   r\   r   rQ   r!   r   r   r   j  s    BG|!|Or!   r   )collectionsr   r   r   rF   buffersr   	utilitiesr   r   r   r   	frozensetr   r   rS   r   r   rQ   r!   r   <module>r      sp     
   , < < '"
 	
` `FJ1 J1Z  Rt Rr!   