
     i;                     $   S SK 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J	r	J
r
  S SKJrJr  S SKJr  Sr\R                   " S5      r\R$                  " \5      r " S S	5      r " S
 S\ R,                  5      rS rS rS rS rS r " S S5      rg)    N)TOKEN_RE)ConfigurationProblemInvalidHeaderInvalidHeaderName)SERVER_SOFTWARESERVER)utili?z[ \t\x21-\x7e\x80-\xff]*c                   0    \ rS rSrSS jrS rS rS rSrg)	FileWrapper   c                 b    Xl         X l        [        US5      (       a  UR                  U l        g g )Nclose)filelikeblksizehasattrr   )selfr   r   s      D/var/www/ias/venv/lib/python3.13/site-packages/gunicorn/http/wsgi.py__init__FileWrapper.__init__   s)     8W%%!DJ &    c                 j    U R                   R                  U R                  5      nU(       a  U$ [        eN)r   readr   
IndexError)r   keydatas      r   __getitem__FileWrapper.__getitem__#   s(    }}!!$,,/Kr   c                     U $ r    r   s    r   __iter__FileWrapper.__iter__)   s    r   c                 j    U R                   R                  U R                  5      nU(       a  U$ [        er   )r   r   r   StopIteration)r   r   s     r   __next__FileWrapper.__next__,   s(    }}!!$,,/Kr   )r   r   r   N)i    )	__name__
__module____qualname____firstlineno__r   r   r"   r&   __static_attributes__r    r   r   r   r      s    (r   r   c                        \ rS rSrS rS rSrg)WSGIErrorsWrapper3   c                 T   [         R                  " S5      nUR                  n/ U l        UR                  S:X  a.  U R                  R                  [        R                  5        USS  nU H;  n[        US5      (       d  M  U R                  R                  UR                  5        M=     g )Nzgunicorn.error-   stream)
logging	getLoggerhandlersstreamserrorlogappendsysstderrr   r3   )r   cfgr8   r6   hs        r   r   WSGIErrorsWrapper.__init__5   s     $$%56$$<<3LL

+|HAq(####AHH- r   c                     U R                    H%  n UR                  U5        UR	                  5         M'     g ! [         a#    UR                  UR                  S5      5         NAf = f)NzUTF-8)r7   writeUnicodeErrorencodeflush)r   r   r3   s      r   r@   WSGIErrorsWrapper.writeE   sR    llF3T" LLN #   3T[[123s   7*A$#A$)r7   N)r(   r)   r*   r+   r   r@   r,   r    r   r   r.   r.   3   s    . r   r.   c           	      T    [        U 5      SSU R                  S:  S[        S[        S.$ )Nr2   r   Fr2   T)zwsgi.errorszwsgi.versionzwsgi.multithreadzwsgi.multiprocesszwsgi.run_oncezwsgi.file_wrapperzwsgi.input_terminatedr   )r.   workersr   r   )r<   s    r   base_environrH   N   s1    (-!!kkAo(!%*	 	r   c                    [        U5      nUR                  U R                  UU R                  U R                  U R
                  SSR                  U R                   Vs/ s H  n[        U5      PM     sn5      -  S.5        U$ s  snf )NzHTTP/%s.)z
wsgi.inputzgunicorn.socketREQUEST_METHODQUERY_STRINGRAW_URISERVER_PROTOCOL)	rH   updatebodymethodqueryurijoinversionstr)reqsockr<   envvs        r   default_environr[   [   sq    
s
CJJhh**		77$sxx0MAQ0M'NN  J 1Ns   Bc                 ~    U R                   nU(       d  0 $ US   US   [        US   5      US   [        US   5      S.$ )Nproxy_protocolclient_addrclient_port
proxy_addr
proxy_port)PROXY_PROTOCOLREMOTE_ADDRREMOTE_PORT
PROXY_ADDR
PROXY_PORT)proxy_protocol_inforV   )rW   infos     r   proxy_environri   h   sT    ""D	 /0M*4./<($|,- r   c                    ^ ^^ U UU4S jnU$ )a  Create a wsgi.early_hints callback for sending 103 Early Hints.

This allows WSGI applications to send 103 Early Hints responses
before the final response, enabling browsers to preload resources.

Args:
    req: The request object
    sock: The socket to write to
    resp: The Response object to check if headers have been sent

Returns:
    A callback function that accepts a list of (name, value) header tuples
    and sends a 103 Early Hints response.

Note:
    - Early hints are only sent for HTTP/1.1 or later clients
    - HTTP/1.0 clients will silently ignore the callback
    - Multiple calls are allowed (sending multiple 103 responses)
    - Calls after response has started are silently ignored
c                 h  > TR                   (       a  gTR                  S:  a  gSnU  Hj  u  p#[        U[        5      (       a  UR	                  S5      n[        U[        5      (       a  UR	                  S5      nX SU S3R                  S5      -  nMl     US-  n[        R                  " TU5        g)zSend 103 Early Hints response.

Args:
    headers: List of (name, value) header tuples, typically Link headers
             Example: [('Link', '</style.css>; rel=preload; as=style')]
N)r2   r2   s   HTTP/1.1 103 Early Hints
latin-1: 
   
)headers_sentrU   
isinstancebytesdecoderB   r	   r@   )headersresponsenamevaluerW   resprX   s       r   send_early_hints4_make_early_hints_callback.<locals>.send_early_hints   s      ;; 3"KD$&&{{9-%''Y/&5'.55i@@H # 	G

4"r   r    )rW   rX   rx   ry   s   ``` r   _make_early_hints_callbackr{   w   s    *#6 r   c                    [        XU5      n[        XU5      nS n[        R                  R	                  SS5      nU R
                  (       a  UR                  S5        U R                   HX  u  pU	S:X  a  U
nO!U	S:X  a  U
nOU	S:X  a  XS'   M#  U	S:X  a  XS'   M/  S	U	R                  S
S5      -   nX;   a  Xk   < SU
< 3n
XU'   MZ     U R                  US'   [        U[        5      (       a  X&S'   OB[        U[        5      (       a  UR                  5       US'   OUS   US'   [        US   5      US'   [        U[        5      (       a  UR                  S5      n[        U5      S:X  a  U(       av  UR                  S5      n[        U5      S:X  aU  U R                  S:X  a  UR!                  S5        OEU R                  S:X  a  UR!                  S5        O#UR!                  S5        OUR!                  S5        US   US'   [        US   5      US'   U R"                  nU(       a7  UR%                  U5      (       d  ['        SU< SU< 35      eU[        U5      S  n[(        R*                  " U5      US'   XS'   UR-                  [/        U 5      5        [1        XU5      US'   [3        U S5      (       a  U R4                  US'   U R6                  US'   XV4$ ) NSCRIPT_NAME s   HTTP/1.1 100 Continue

HOSTzCONTENT-TYPECONTENT_TYPEzCONTENT-LENGTHCONTENT_LENGTHHTTP_r1   _,zwsgi.url_schemerc   r   r2   rd   :httpP   httpsi  SERVER_NAMESERVER_PORTzRequest path z! does not start with SCRIPT_NAME 	PATH_INFOzwsgi.early_hintspriority_weightzgunicorn.http2.priority_weightz"gunicorn.http2.priority_depends_on)Responser[   osenvironget_expected_100_continuesendrt   replaceschemerq   rV   rr   rs   splitlenr9   path
startswithr   r	   unquote_to_wsgi_strrO   ri   r{   r   r   priority_depends_on)rW   rX   clientserverr<   rx   r   hostscript_namehdr_name	hdr_valuer   	path_infos                r   creater      s   Cs#D c-G D**..3K
!!		23
  #{{vD&#K'&/N#))(1$% ((c22>#*<;I #  +( "%G &#!'	FE	"	"!'!'!$VAY &#c"v;!Cv;!#zzV+b)w.c*b) b!#AYGM ^GM I##K00&K)* * c+./0	33I>GK(M NN=%& #=S"MG s%&&474G4G018;8O8O45=r   c                   f    \ rS rSrS rS rS rSS jrS rS r	S	 r
S
 rS rS rS rS rS rSrg)r   i  c                     Xl         X l        [        U l        S U l        SU l        SU l        / U l        SU l        S U l	        SU l
        SU l        X0l        g )NFr   )rW   rX   r   rU   statuschunked
must_closert   rp   response_lengthsentupgrader<   )r   rW   rX   r<   s       r   r   Response.__init__  sR    	!#	r   c                     SU l         g )NT)r   r!   s    r   force_closeResponse.force_close  s	    r   c                    U R                   (       d  U R                  R                  5       (       a  gU R                  c  U R                  (       a  gU R                  R
                  S:X  a  gU R                  S:  d  U R                  S;   a  gg)NTFHEAD      i0  )r   rW   should_closer   r   rQ   status_coder!   s    r   r   Response.should_close!  sg    ??dhh3355+t||88??f$c!T%5%5%Cr   Nc                    U(       aG   U R                   (       a2  U R                  (       a!  [        R                  " US   US   US   5        S nOU R                   b  [	        S5      eXl          [        U R                   R                  5       S   5      U l        U R                  U5        U R                  5       U l        U R                  $ ! S nf = f! [         a
    S U l         NLf = f)Nr   r2      zResponse headers already set!)r   rp   r	   reraiseAssertionErrorintr   r   
ValueErrorprocess_headers
is_chunkedr   r@   )r   r   rt   exc_infos       r   start_responseResponse.start_response,  s     ;;4#4#4LL!hqk8A;G[[$ !@AA
	$"4;;#4#4#6q#9:D 	W%(zz!    	$#D	$s   AC .+C CC&%C&c                    U GHg  u  p#[        U[        5      (       d  [        SU-  5      e[        R                  " U5      (       d  [        SU-  5      e[        U[        5      (       d  [        SU-  5      e[        R	                  U5      (       d  [        SU-  5      eUR                  S5      nUR                  5       nUS:X  a  [        U5      U l        Ov[        R                  " U5      (       a[  US:X  a  UR                  5       S:X  a  SU l        O6US:X  a0  UR                  5       S:X  a  U R                  R!                  X#45        GMK  U R                  R!                  X#45        GMj     g )	Nz%r is not a stringz%rz 	zcontent-length
connectionr   T	websocket)rq   rV   	TypeErrorr   	fullmatchr   HEADER_VALUE_REr   striplowerr   r   r	   
is_hoppishr   rt   r9   )r   rt   rv   rw   lnames        r   r   Response.process_headersD  s*   "KDdC(( 4t ;<<%%d++'t44eS)) 4u <==",,U33#D5L11 KK&EJJLE(('*5z$&&L({{}	1'+i'{{}3++TM: LL.; #r   c                     U R                   b  gU R                  R                  S::  a  gU R                  R                  S:X  a  gU R                  S;   a  gg)NFrF   r   r   T)r   rW   rU   rQ   r   r!   s    r   r   Response.is_chunkedd  sQ     +XX'XX__&+ r   c                    U R                   (       a  SnOU R                  5       (       a  SnOSnSU R                  R                  S   < SU R                  R                  S   < SU R                  < S	3S
U R                  -  S[
        R                  " 5       -  SU-  /nU R                  (       a  UR                  S5        U$ )Nr   r   z
keep-alivezHTTP/r   rJ   r2    rn   zServer: %s
z
Date: %s
zConnection: %s
zTransfer-Encoding: chunked
)	r   r   rW   rU   r   r	   	http_dater   r9   )r   r   rt   s      r   default_headersResponse.default_headersu  s    <<"J   J%J $(88#3#3A#6#'88#3#3A#6Et||+T^^-- :-
 <<NN;<r   c           
      f   U R                   (       a  g U R                  5       nUR                  U R                   VVs/ s H  u  p#U< SU< S3PM     snn5        SSR	                  U5      -  n[
        R                  " U R                  [
        R                  " US5      5        SU l         g s  snnf )Nrm   rn   z%s
r~   rl   T)	rp   r   extendrt   rT   r	   r@   rX   to_bytestring)r   tosendkrZ   
header_strs        r   send_headersResponse.send_headers  s    %%'Fq!,FG/


499d00YGH 	 Gs   B-
c                    U R                  5         [        U[        5      (       d  [        SU-  5      e[	        U5      nUnU R
                  bH  U R                  U R
                  :  a  g [        U R
                  U R                  -
  U5      nX2:  a  US U nU R                  (       a  US:X  a  g U =R                  U-  sl        [        R                  " U R                  XR                  5        g )Nz%r is not a byter   )r   rq   rr   r   r   r   r   minr   r	   r@   rX   )r   argarglenr   s       r   r@   Response.write  s    #u%%.455S+yyD000--		96BF'6l <<FaK		V	

499c<<0r   c                 2    U R                   R                  SL$ )NF)r<   sendfiler!   s    r   can_sendfileResponse.can_sendfile  s    xx  --r   c                    U R                   R                  (       d  U R                  5       (       d  g[        R                  " UR
                  5      (       d  gUR
                  R                  5       n [        R                  " US[        R                  5      nU R                  c%  [        R                  " U5      R                  nXC-
  nOU R                  n U R!                  5         U R#                  5       (       a/  SU-  nU R$                  R'                  UR)                  S5      5        US:  a$  U R$                  R+                  UR
                  X5S9  U R#                  5       (       a  U R$                  R'                  S5        [        R                  " X#[        R,                  5        g! [        [        R                  4 a     gf = f)NFr   z%X
zutf-8)offsetcountro   T)r<   is_sslr   r	   
has_filenor   filenor   lseekSEEK_CURr   fstatst_sizeOSErrorioUnsupportedOperationr   r   rX   sendallrB   r   SEEK_SET)r   respiterr   r   filesizenbytes
chunk_sizes          r   r   Response.sendfile  sQ   88??$"3"3"5"5x0011""))+	XXfa5F##+88F+33!*-- 	??!F*JIIj//89A:IIx00N??IIg&
-! 001 		s   3AF, F, ,G	G	c                 f    U R                  U5      (       d  U H  nU R                  U5        M     g g r   )r   r@   )r   r   items      r   
write_fileResponse.write_file  s,    }}X&& 

4  ! 'r   c                     U R                   (       d  U R                  5         U R                  (       a"  [        R                  " U R
                  S5        g g )Nr   )rp   r   r   r	   write_chunkrX   r!   s    r   r   Response.close  s7      <<TYY, r   )r<   r   rt   rp   r   rW   r   r   rX   r   r   r   rU   r   )r(   r)   r*   r+   r   r   r   r   r   r   r   r   r@   r   r   r   r   r,   r    r   r   r   r     sE    	0/@"(!1..B!
-r   r   )r   r4   r   rer:   gunicorn.http.messager   gunicorn.http.errorsr   r   r   gunicornr   r   r	   BLKSIZEcompiler   r5   r(   logr   	RawIOBaser.   rH   r[   ri   r{   r   r   r    r   r   <module>r     s   
 
  	 	 
 * W W ,   **89! 0 6

0faHI- I-r   