
    O=d(0                         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dS )    N)	HEADER_RE)InvalidHeaderInvalidHeaderName)SERVER_SOFTWARESERVERi?z[\x00-\x1F\x7F]c                       e Zd ZddZd ZdS )FileWrapper    c                 ^    || _         || _        t          |d          r|j        | _        d S d S )Nclose)filelikeblksizehasattrr   )selfr   r   s      <D:\Sites\api_v1\venv\Lib\site-packages\gunicorn/http/wsgi.py__init__zFileWrapper.__init__   s9     8W%% 	(!DJJJ	( 	(    c                 V    | j                             | j                  }|r|S t          N)r   readr   
IndexError)r   keydatas      r   __getitem__zFileWrapper.__getitem__"   s,    }!!$,// 	Kr   N)r
   )__name__
__module____qualname__r   r    r   r   r	   r	      s7        ( ( ( (    r   r	   c                       e Zd Zd Zd ZdS )WSGIErrorsWrapperc                 $   t          j        d          }|j        }g | _        |j        dk    r.| j                            t          j                   |dd          }|D ]1}t          |d          r| j                            |j	                   2d S )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6$<3L
+++|H 	. 	.Aq(## .##AH---	. 	.r   c                     | j         D ]e}	 |                    |           n8# t          $ r+ |                    |                    d                     Y nw xY w|                                 fd S )NzUTF-8)r(   writeUnicodeErrorencodeflush)r   r   r$   s      r   r0   zWSGIErrorsWrapper.write;   s    l 	 	F3T"""" 3 3 3T[[11222223LLNNNN	 	s   !2AAN)r   r   r   r   r0   r   r   r   r    r    )   s2        . . .     r   r    c           	      X    t          |           dd| j        dk    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   s7    (--!!kAo(!%*	 	 	r   c                     t          |          }|                    | j        || j        | j        | j        dd                    d | j        D                       z  d           |S )NzHTTP/%s.c                 ,    g | ]}t          |          S r   )str).0vs     r   
<listcomp>z#default_environ.<locals>.<listcomp>Y   s    0M0M0MAQ0M0M0Mr   )z
wsgi.inputzgunicorn.socketREQUEST_METHODQUERY_STRINGRAW_URISERVER_PROTOCOL)r7   updatebodymethodqueryurijoinversion)reqsockr-   envs       r   default_environrM   Q   sr    
s

CJJh*	7$sxx0M0M0M0M0M'N'NN     Jr   c                     | 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_infor;   )rJ   infos     r   proxy_environr[   ^   sa    "D 	 /0M*4.//<($|,--  r   c                 d   t          | ||          }t          | ||          }d }t          j                            dd          }| j        D ]\  }	}
|	dk    r.|
                                dk    r|                    d           n*|	dk    r|
}n!|	dk    r|
}n|	dk    r|
|d<   W|	d	k    r|
|d
<   cd|	                    dd          z   }||v r||         d|
}
|
||<   | j	        |d<   t          |t                    r||d<   nPt          |t                    r|                                |d<   n#|d         |d<   t          |d                   |d<   t          |t                    r|                    d          }t          |          dk    r|r|                    d          }t          |          dk    rW| j	        dk    r|                    d           nL| j	        dk    r|                    d           n+|                    d           n|                    d           |d         |d<   t          |d                   |d<   | j        }|r|                    |d          d         }t%          j        |          |d<   ||d<   |                    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_schemerU   r   r#   rV   :httpP   httpsi  SERVER_NAMESERVER_PORT	PATH_INFO)ResponserM   osenvirongetheaderslowersendreplacescheme
isinstancer;   bytesdecodesplitlenr*   pathutilunquote_to_wsgi_strrC   r[   )rJ   rK   clientserverr-   respro   hostscript_namehdr_name	hdr_valuer   	path_infos                r   creater   m   s   Cs##D c4--G D*..33K  #{ ! !)x  N22		:;;;DD&&#KK''&/GN#)))(1G$%((c222'>>#*3<<<;I  "%G &# 0!'	FE	"	" 0!'!'!$VAY &# "c""v;;! "Cv;;!##zV++b))))w..c****b))) b!!!#AYGM ^^GM I 7OOK33A6	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dS )rm   c                     || _         || _        t          | _        d | _        d| _        d| _        g | _        d| _        d | _	        d| _
        d| _        || _        d S )NFr   )rJ   rK   r   rI   statuschunked
must_closerq   headers_sentresponse_lengthsentupgrader-   )r   rJ   rK   r-   s       r   r   zResponse.__init__   s\    	!#	r   c                     d| _         d S )NT)r   r   s    r   force_closezResponse.force_close   s    r   c                     | j         s| j                                        rdS | j        | j        rdS | j        j        dk    rdS | j        dk     s	| j        dv rdS dS )NTFHEAD      i0  )r   rJ   should_closer   r   rE   status_coder   s    r   r   zResponse.should_close   st    ? 	dh3355 	4+t|+58?f$$5c!!T%5%C%C5tr   Nc                    |rA	 | j         r/| j        r(t          j        |d         |d         |d                    d }n# d }w xY w| j         t	          d          || _         	 t          | j                                         d                   | _        n# t          $ r
 d | _        Y nw xY w| 	                    |           | 
                                | _        | j        S )Nr   r#      zResponse headers already set!)r   r   r|   reraiseAssertionErrorintry   r   
ValueErrorprocess_headers
is_chunkedr   r0   )r   r   rq   exc_infos       r   start_responsezResponse.start_response   s     	B ; H4#4 HL!hqk8A;GGG4[$ !@AAA
	$"4;#4#4#6#6q#9::D 	$ 	$ 	$#D	$ 	W%%%((zs   6= A"1B B('B(c                    |D ]\  }}t          |t                    st          d|z            t          j        |          rt          d|z            t          |t                    st          d|z            t                              |          rt          d|z            |                                }|	                                                                }|dk    rt          |          | _        nt          j        |          r|dk    r2|	                                                                dk    rd| _        n^|dk    rX|	                                                                dk    r.| j                            |                                |f           | j                            |                                |f           d S )Nz%r is not a stringz%rzcontent-length
connectionr   T	websocket)rv   r;   	TypeErrorr   searchr   HEADER_VALUE_REr   striprr   r   r   r|   
is_hoppishr   rq   r*   )r   rq   namevaluelnames        r   r   zResponse.process_headers   s   " 	7 	7KD%dC(( = 4t ;<<<%% 5't444eS)) > 4u <===%%e,, 2#D5L111KKMMEJJLL&&((E((('*5zz$$&& 
L(({{}}**,,	99'+i''{{}}**,,;;++TZZ\\5,ABBB Lu 566669	7 	7r   c                 v    | j         dS | j        j        dk    rdS | j        j        dk    rdS | j        dv rdS dS )NFr5   r   r   T)r   rJ   rI   rE   r   r   s    r   r   zResponse.is_chunked  sU     +5X''5X_&&5++ 5tr   c                 ,   | j         rd}n|                                 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|                    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   rJ   rI   r   r|   	http_dater   r*   )r   r   rq   s      r   default_headerszResponse.default_headers'  s    < 	&"JJ   	& JJ%J $(8#3A#6#6#6#'8#3A#6#6#6Et|+T^--- :-
 < 	=NN;<<<r   c                     | j         rd S |                                 }|                    d | j        D                        dd                    |          z  }t          j        | j        t          j        |d                     d| _         d S )Nc                 $    g | ]\  }}|d |dS )z: r   r   )r<   kr=   s      r   r>   z)Response.send_headers.<locals>.<listcomp>?  s)    FFFAqqq!!!,FFFr   z%s
r^   zlatin-1T)	r   r   extendrq   rH   r|   r0   rK   to_bytestring)r   tosend
header_strs      r   send_headerszResponse.send_headers;  s     	F%%''FFFFFGGG/

49d0YGGHHH r   c                    |                                   t          |t                    st          d|z            t	          |          }|}| j        ?| j        | j        k    rd S t          | j        | j        z
  |          }||k     r
|d |         }| j        r|dk    rd S | xj        |z  c_        t          j
        | j        || j                   d S )Nz%r is not a byter   )r   rv   rw   r   rz   r   r   minr   r|   r0   rK   )r   argarglenr   s       r   r0   zResponse.writeE  s    #u%% 	6.4555S+yD000-	96BBF'6'l < 	FaKKF		V		
49c4<00000r   c                     | j         j        duS )NF)r-   sendfiler   s    r   can_sendfilezResponse.can_sendfile\  s    x --r   c                    | j         j        s|                                 sdS t          j        |j                  sdS |j                                        }	 t          j        |dt          j	                  }| j
        t          j        |          j        }||z
  }n| j
        }n# t          t          j        f$ r Y dS w xY w|                                  |                                 r2d|z  }| j                            |                    d                     | j                            |j        |           |                                 r| j                            d           t          j        ||t          j                   dS )NFr   z%X
zutf-8)counts   
T)r-   is_sslr   r|   
has_filenor   filenorn   lseekSEEK_CURr   fstatst_sizeOSErrorioUnsupportedOperationr   r   rK   sendallr2   r   SEEK_SET)r   respiterr   offsetfilesizenbytes
chunk_sizes          r   r   zResponse.sendfile_  s}   8? 	$"3"3"5"5 	5x011 	5"))++	Xfa55F#+8F++3!F*-01 	 	 	55	 	?? 	:!F*JIj//88999	8,F;;;?? 	'Ig&&&
---ts   AB& &C ?C c                 h    |                      |          s|D ]}|                     |           d S d S r   )r   r0   )r   r   items      r   
write_filezResponse.write_file  sN    }}X&& 	!  ! !

4    	! 	!! !r   c                     | j         s|                                  | j        rt          j        | j        d           d S d S )Nr   )r   r   r   r|   write_chunkrK   r   s    r   r   zResponse.close  sN      	 < 	-TY,,,,,	- 	-r   r   )r   r   r   r   r   r   r   r   r   r   r   r0   r   r   r   r   r   r   r   rm   rm      s            	 	 	   07 7 7>  "  (! ! !1 1 1.. . .  B! ! !
- - - - -r   rm   )r   r%   rn   rer+   gunicorn.http.messager   gunicorn.http.errorsr   r   gunicornr   r   gunicorn.utilr|   BLKSIZEcompiler   r&   r   logobjectr	   	RawIOBaser    r7   rM   r[   r   rm   r   r   r   <module>r      s   
			  				 				 



 + + + + + + A A A A A A A A , , , , , , , ,       "*/00g!!    &          6
 
 

 
 
  Q Q QhH- H- H- H- H-v H- H- H- H- H-r   