
    +hN0                        d dl Z d dl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	 d dl
mZmZ d dl
mZ dZ ej                  d      Z ej"                  e      Z G d d	e      Z G d
 de j,                        Zd Zd Zd Zd Z G d de      Zy)    N)	HEADER_RE)InvalidHeaderInvalidHeaderName)SERVER_SOFTWARESERVER)utili?z[\x00-\x1F\x7F]c                       e Zd ZddZd Zy)FileWrapperc                 \    || _         || _        t        |d      r|j                  | _        y y )Nclose)filelikeblksizehasattrr   )selfr   r   s      E/var/www/html/venv/lib/python3.12/site-packages/gunicorn/http/wsgi.py__init__zFileWrapper.__init__   s*     8W%!DJ &    c                 `    | j                   j                  | j                        }|r|S t        N)r   readr   
IndexError)r   keydatas      r   __getitem__zFileWrapper.__getitem__"   s(    }}!!$,,/Kr   N)i    )__name__
__module____qualname__r   r    r   r   r
   r
      s    (r   r
   c                       e Zd Zd Zd Zy)WSGIErrorsWrapperc                 @   t        j                  d      }|j                  }g | _        |j                  dk(  r.| j                  j                  t        j                         |dd  }|D ]4  }t        |d      s| j                  j                  |j                         6 y )Nzgunicorn.error-   stream)
logging	getLoggerhandlersstreamserrorlogappendsysstderrr   r$   )r   cfgr)   r'   hs        r   r   zWSGIErrorsWrapper.__init__+   s     $$%56$$<<3LL

+|H 	.Aq(###AHH-	.r   c                     | j                   D ]$  }	 |j                  |       |j	                          & y # t        $ r# |j                  |j                  d             Y >w xY w)NzUTF-8)r(   writeUnicodeErrorencodeflush)r   r   r$   s      r   r0   zWSGIErrorsWrapper.write;   sW    ll 	F3T" LLN	   3T[[123s   5)A! A!N)r   r   r   r   r0   r   r   r   r    r    )   s    . r   r    c           	      T    t        |       dd| j                  dkD  dt        dt        dS )Nr#   r   Fr#   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_environr7   D   s1    (-!!kkAo(!%*	 	r   c                    t        |      }|j                  | j                  || j                  | j                  | j
                  ddj                  | j                  D cg c]  }t        |       c}      z  d       |S c c}w )NzHTTP/%s.)z
wsgi.inputzgunicorn.socketREQUEST_METHODQUERY_STRINGRAW_URISERVER_PROTOCOL)	r7   updatebodymethodqueryurijoinversionstr)reqsockr-   envvs        r   default_environrJ   Q   sm    
s
CJJhh**		77$sxx0MAQ0M'NN  J 1Ns   Bc                 t    | j                   }|si S |d   |d   t        |d         |d   t        |d         dS )Nproxy_protocolclient_addrclient_port
proxy_addr
proxy_port)PROXY_PROTOCOLREMOTE_ADDRREMOTE_PORT
PROXY_ADDR
PROXY_PORT)proxy_protocol_inforE   )rF   infos     r   proxy_environrX   ^   sT    ""D	 /0M*4./<($|,- r   c                    t        | ||      }t        | ||      }d }t        j                  j	                  dd      }| j
                  D ]}  \  }	}
|	dk(  r%|
j                         dk(  r8|j                  d       n&|	dk(  r|
}n|	dk(  r|
}n|	dk(  r|
|d<   K|	d	k(  r|
|d
<   Vd|	j                  dd      z   }||v r
||   d|
}
|
||<    | j                  |d<   t        |t              r||d<   n=t        |t              r|j                         |d<   n|d   |d<   t        |d         |d<   t        |t              r|j                  d      }t        |      dk(  r|rs|j                  d      }t        |      dk(  re| j                  dk(  r|j!                  d       nD| j                  dk(  r|j!                  d       n#|j!                  d       n|j!                  d       |d   |d<   t        |d         |d<   | j"                  }|r|j                  |d      d   }t%        j&                  |      |d<   ||d<   |j)                  t+        |              ||fS )NSCRIPT_NAME EXPECTz100-continues   HTTP/1.1 100 Continue

HOSTzCONTENT-TYPECONTENT_TYPEzCONTENT-LENGTHCONTENT_LENGTHHTTP_r"   _,zwsgi.url_schemerR   r   r#   rS   :httpP   httpsi  SERVER_NAMESERVER_PORT	PATH_INFO)ResponserJ   osenvirongetheaderslowersendreplacescheme
isinstancerE   bytesdecodesplitlenr*   pathr   unquote_to_wsgi_strr>   rX   )rF   rG   clientserverr-   resprl   hostscript_namehdr_name	hdr_valuer   	path_infos                r   creater   m   s`   Cs#D c4-G D**..3K  #{{ !)x N2		:;D&#K'&/GN#))(1G$%((c22'>#*3<;I '!, "%G &#!'	FE	"!'!'!$VAY &#c"v;!Cv;!#zzV+b)w.c*b) b!#AYGM ^GM IOOK3A6	33I>GK(GM NN=%&=r   c                   \    e Zd Zd Zd Zd ZddZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zy)rj   c                     || _         || _        t        | _        d | _        d| _        d| _        g | _        d| _        d | _	        d| _
        d| _        || _        y )NFr   )rF   rG   r   rD   statuschunked
must_closern   headers_sentresponse_lengthsentupgrader-   )r   rF   rG   r-   s       r   r   zResponse.__init__   sX    	!#	r   c                     d| _         y )NT)r   r   s    r   force_closezResponse.force_close   s	    r   c                     | j                   s| j                  j                         ry| j                  | j                  ry| j                  j
                  dk(  ry| j                  dk  s| j                  dv ryy)NTFHEAD      i0  )r   rF   should_closer   r   r@   status_coder   s    r   r   zResponse.should_close   sd    ??dhh335+t||88??f$c!T%5%5%Cr   Nc                    |r<	 | j                   r,| j                  r t        j                  |d   |d   |d          d }n| j                   t	        d      || _         	 t        | j                   j                         d         | _        | j                  |       | j                         | _        | j                  S # d }w xY w# t        $ r
 d | _        Y Kw xY w)Nr   r#      zResponse headers already set!)r   r   r   reraiseAssertionErrorintrv   r   
ValueErrorprocess_headers
is_chunkedr   r0   )r   r   rn   exc_infos       r   start_responsezResponse.start_response   s     ;;4#4#4LL!hqk8A;G[[$ !@AA
	$"4;;#4#4#6q#9:D 	W%(zz!    	$#D	$s   8B; +C ;B?CCc                 *   |D ]  \  }}t        |t              st        d|z        t        j                  |      rt        d|z        t        |t              st        d|z        t        j	                  |      rt        d|z        |j                         }|j                         j                         }|dk(  rt        |      | _        nt        j                  |      r|dk(  r)|j                         j                         dk(  rYd| _        nQ|dk(  rL|j                         j                         dk(  r+| j                  j!                  |j                         |f       c| j                  j!                  |j                         |f        y )Nz%r is not a stringz%rzcontent-length
connectionr   T	websocket)rs   rE   	TypeErrorr   searchr   HEADER_VALUE_REr   stripro   r   r   r   
is_hoppishr   rn   r*   )r   rn   namevaluelnames        r   r   zResponse.process_headers   sI   " 	7KD%dC( 4t ;<<%'t44eS) 4u <==%%e,#D5L11KKMEJJL&&(E(('*5z$&L({{}**,	9'+i'{{}**,;++TZZ\5,AB LLu 569	7r   c                     | j                   y| j                  j                  dk  ry| j                  j                  dk(  ry| j                  dv ryy)NFr5   r   r   T)r   rF   rD   r@   r   r   s    r   r   zResponse.is_chunked  sQ     +XX'XX__&+ r   c                 b   | j                   rd}n| j                         rd}nd}d| j                  j                  d   d| j                  j                  d   d| j                  d	d
| j                  z  dt        j                         z  d|z  g}| j                  r|j                  d       |S )Nr   r   z
keep-alivezHTTP/r   r9   r#    
zServer: %s
z
Date: %s
zConnection: %s
zTransfer-Encoding: chunked
)	r   r   rF   rD   r   r   	http_dater   r*   )r   r   rn   s      r   default_headerszResponse.default_headers'  s    <<"J  J%J $(88#3#3A#6#'88#3#3A#6Et||+T^^-- :-
 <<NN;<r   c           
      P   | j                   ry | j                         }|j                  | j                  D cg c]  \  }}|d|d c}}       ddj	                  |      z  }t        j                  | j                  t        j                  |d             d| _         y c c}}w )Nz: r   z%s
r[   zlatin-1T)	r   r   extendrn   rC   r   r0   rG   to_bytestring)r   tosendkrI   
header_strs        r   send_headerszResponse.send_headers;  s    %%'FAq!,FG/


499d00YGH 	 Gs   B"
c                    | j                          t        |t              st        d|z        t	        |      }|}| j
                  G| j                  | j
                  k\  ry t        | j
                  | j                  z
  |      }||k  r|d | }| j                  r|dk(  ry | xj                  |z  c_        t        j                  | j                  || j                         y )Nz%r is not a byter   )r   rs   rt   r   rw   r   r   minr   r   r0   rG   )r   argarglenr   s       r   r0   zResponse.writeE  s    #u%.455S+yyD000--		96BF'6l <<FaK		V	

499c4<<0r   c                 2    | j                   j                  duS )NF)r-   sendfiler   s    r   can_sendfilezResponse.can_sendfile\  s    xx  --r   c                 b   | j                   j                  s| j                         syt        j                  |j
                        sy|j
                  j                         }	 t        j                  |dt        j                        }| j                  %t        j                  |      j                  }||z
  }n| j                  }| j!                          | j#                         r/d|z  }| j$                  j'                  |j)                  d             |dkD  r(| j$                  j+                  |j
                  ||       | j#                         r| j$                  j'                  d       t        j                  ||t        j,                         y# t        t        j                  f$ r Y yw xY w)NFr   z%X
zutf-8)offsetcounts   
T)r-   is_sslr   r   
has_filenor   filenork   lseekSEEK_CURr   fstatst_sizeOSErrorioUnsupportedOperationr   r   rG   sendallr2   r   SEEK_SET)r   respiterr   r   filesizenbytes
chunk_sizes          r   r   zResponse.sendfile_  sK   88??$"3"3"5x001""))+	XXfa5F##+88F+33!F*-- 	??!F*JIIj//89A:IIx00vN??IIg&
-! 001 		s   #A"F F.-F.c                 X    | j                  |      s|D ]  }| j                  |        y y r   )r   r0   )r   r   items      r   
write_filezResponse.write_file  s.    }}X&  !

4 ! 'r   c                     | j                   s| j                          | j                  r!t        j                  | j
                  d       y y )Nr   )r   r   r   r   write_chunkrG   r   s    r   r   zResponse.close  s7      <<TYY, r   r   )r   r   r   r   r   r   r   r   r   r   r   r0   r   r   r   r   r   r   r   rj   rj      sD    	07>"(!1..B!
-r   rj   )r   r%   rk   rer+   gunicorn.http.messager   gunicorn.http.errorsr   r   gunicornr   r   r   BLKSIZEcompiler   r&   r   logobjectr
   	RawIOBaser    r7   rJ   rX   r   rj   r   r   r   <module>r      s    
  	 	 
 + A ,  "**/0g!&  6

QhH-v H-r   