a
    &wh2                     @   s   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	m
Z
 d dlmZmZ d dlmZ dZedZeeZG dd	 d	ZG d
d de jZdd Zdd Zdd Zdd ZG dd dZdS )    N)TOKEN_RE)ConfigurationProblemInvalidHeaderInvalidHeaderName)SERVER_SOFTWARESERVER)utili?z[ \t\x21-\x7e\x80-\xff]*c                   @   s   e Zd ZdddZdd ZdS )FileWrapper    c                 C   s"   || _ || _t|dr|j| _d S )Nclose)filelikeblksizehasattrr   )selfr   r    r   L/var/www/battlenet.uz/venv/lib/python3.9/site-packages/gunicorn/http/wsgi.py__init__   s    
zFileWrapper.__init__c                 C   s   | j | j}|r|S td S N)r   readr   
IndexError)r   keydatar   r   r   __getitem__#   s    zFileWrapper.__getitem__N)r
   )__name__
__module____qualname__r   r   r   r   r   r   r	      s   
r	   c                   @   s   e Zd Zdd Zdd ZdS )WSGIErrorsWrapperc                 C   s`   t d}|j}g | _|jdkr:| jtj |dd  }|D ]}t|dr>| j|j	 q>d S )Nzgunicorn.error-   stream)
logging	getLoggerhandlersstreamserrorlogappendsysstderrr   r   )r   cfgr$   r"   hr   r   r   r   ,   s    


zWSGIErrorsWrapper.__init__c              	   C   sJ   | j D ]>}z|| W n" ty:   ||d Y n0 |  qd S )NzUTF-8)r#   writeUnicodeErrorencodeflush)r   r   r   r   r   r   r*   <   s    
zWSGIErrorsWrapper.writeN)r   r   r   r   r*   r   r   r   r   r   *   s   r   c              	   C   s    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(   r   r   r   base_environE   s    r0   c                 C   sB   t |}|| j|| j| j| jdddd | jD  d |S )NzHTTP/%s.c                 S   s   g | ]}t |qS r   )str).0vr   r   r   
<listcomp>Z       z#default_environ.<locals>.<listcomp>)z
wsgi.inputzgunicorn.socketREQUEST_METHODQUERY_STRINGZRAW_URIZSERVER_PROTOCOL)r0   updatebodymethodqueryurijoinversion)reqsockr(   envr   r   r   default_environR   s    rC   c                 C   s:   | j }|si S |d |d t|d |d t|d dS )NZproxy_protocolclient_addrZclient_portZ
proxy_addrZ
proxy_port)ZPROXY_PROTOCOLREMOTE_ADDRREMOTE_PORTZ
PROXY_ADDRZ
PROXY_PORT)Zproxy_protocol_infor2   )r@   infor   r   r   proxy_environ_   s    

rH   c                 C   s(  t | ||}t| ||}d }tjdd}| jD ]\}	}
|	dkrX|
 dkr|d nB|	dkrf|
}n4|	dkrt|
}n&|	dkr|
|d< q0n|	d	kr|
|d
< q0d|	dd }||v rd|| |
f }
|
||< q0| j	|d< t
|tr||d< n6t
|tr| |d< n|d |d< t|d |d< t
|tr|d}t|dkr|r|d}t|dkr| j	dkrz|d n"| j	dkr|d n
|d n
|d |d |d< t|d |d< | j}|r||std||f |t|d  }t||d< ||d< |t|  ||fS )NZSCRIPT_NAME ZEXPECTz100-continues   HTTP/1.1 100 Continue

ZHOSTzCONTENT-TYPECONTENT_TYPEzCONTENT-LENGTHCONTENT_LENGTHZHTTP_r   _z%s,%szwsgi.url_schemerE   r   r   rF   :httpP   httpsi  ZSERVER_NAMEZSERVER_PORTz2Request path %r does not start with SCRIPT_NAME %rZ	PATH_INFO)ResponserC   osenvirongetheaderslowersendreplacescheme
isinstancer2   bytesdecodesplitlenr%   path
startswithr   r   Zunquote_to_wsgi_strr9   rH   )r@   rA   clientserverr(   resprS   hostscript_nameZhdr_nameZ	hdr_valuer   Z	path_infor   r   r   createn   sp    






rf   c                   @   sv   e Zd Zdd Zdd Zdd Zddd	Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )rQ   c                 C   sL   || _ || _t| _d | _d| _d| _g | _d| _d | _	d| _
d| _|| _d S )NFr   )r@   rA   r   r?   statuschunked
must_closerU   headers_sentresponse_lengthsentupgrader(   )r   r@   rA   r(   r   r   r   r      s    zResponse.__init__c                 C   s
   d| _ d S )NT)ri   r   r   r   r   force_close   s    zResponse.force_closec                 C   sT   | j s| j rdS | jd us$| jr(dS | jjdkr8dS | jdk sL| jdv rPdS dS )NTFHEAD      i0  )ri   r@   should_closerk   rh   r;   status_codern   r   r   r   rt      s    zResponse.should_closeNc                 C   s   |r<z.| j r,| jr,t|d |d |d  W d }qNd }0 n| j d urNtd|| _ zt| j  d | _W n ty   d | _Y n0 | 	| | 
 | _| jS )Nr   r      zResponse headers already set!)rg   rj   r   reraiseAssertionErrorintr]   ru   
ValueErrorprocess_headers
is_chunkedrh   r*   )r   rg   rU   exc_infor   r   r   start_response   s    


zResponse.start_responsec                 C   s   |D ]\}}t |ts"td| t|s8td| t |tsNtd| t|sdtd| |d}|	 }|dkrt
|| _nLt|r|dkr|	 dkrd| _q|dkr|	 dkr| j||f q| j||f qd S )	Nz%r is not a stringz%rz 	zcontent-length
connectionrm   TZ	websocket)rZ   r2   	TypeErrorr   	fullmatchr   HEADER_VALUE_REr   striprV   ry   rk   r   Z
is_hoppishrm   rU   r%   )r   rU   namevaluelnamer   r   r   r{      s,    





zResponse.process_headersc                 C   s@   | j d urdS | jjdkrdS | jjdkr.dS | jdv r<dS dS )NFr.   rp   rr   T)rk   r@   r?   r;   ru   rn   r   r   r   r|     s    

zResponse.is_chunkedc                 C   sl   | j rd}n|  rd}nd}d| jjd | jjd | jf d| j dt  d	| g}| jrh|d
 |S )Nrm   r   z
keep-alivezHTTP/%s.%s %s
r   r   zServer: %s
z
Date: %s
zConnection: %s
zTransfer-Encoding: chunked
)	rm   rt   r@   r?   rg   r   Z	http_daterh   r%   )r   r   rU   r   r   r   default_headers/  s    

zResponse.default_headersc                 C   sV   | j r
d S |  }|dd | jD  dd| }t| jt|d d| _ d S )Nc                 S   s   g | ]\}}d ||f qS )z%s: %s
r   )r3   kr4   r   r   r   r5   G  r6   z)Response.send_headers.<locals>.<listcomp>z%s
rI   zlatin-1T)	rj   r   extendrU   r>   r   r*   rA   Zto_bytestring)r   tosend
header_strr   r   r   send_headersC  s    zResponse.send_headersc                 C   s   |    t|tstd| t|}|}| jd urj| j| jkrDd S t| j| j |}||k rj|d | }| jr||dkr|d S |  j|7  _t	
| j|| j d S )Nz%r is not a byter   )r   rZ   r[   r   r^   rk   rl   minrh   r   r*   rA   )r   argZarglenr   r   r   r   r*   M  s    

zResponse.writec                 C   s   | j jduS )NF)r(   sendfilern   r   r   r   can_sendfiled  s    zResponse.can_sendfilec              	   C   s   | j js|  sdS t|js$dS |j }z:t|dtj	}| j
d u r`t|j}|| }n| j
}W n ttjfy   Y dS 0 |   |  rd| }| j|d |dkr| jj|j||d |  r| jd t||tj dS )NFr   z%X
zutf-8)offsetcounts   
T)r(   Zis_sslr   r   Z
has_filenor   filenorR   lseekSEEK_CURrk   fstatst_sizeOSErrorioUnsupportedOperationr   r|   rA   sendallr,   r   SEEK_SET)r   respiterr   r   filesizenbytes
chunk_sizer   r   r   r   g  s.    



zResponse.sendfilec                 C   s"   |  |s|D ]}| | qd S r   )r   r*   )r   r   itemr   r   r   
write_file  s    
zResponse.write_filec                 C   s&   | j s|   | jr"t| jd d S )Nr6   )rj   r   rh   r   Zwrite_chunkrA   rn   r   r   r   r     s    zResponse.close)N)r   r   r   r   ro   rt   r~   r{   r|   r   r   r*   r   r   r   r   r   r   r   r   rQ      s   
 
!rQ   )r   r    rR   rer&   Zgunicorn.http.messager   Zgunicorn.http.errorsr   r   r   Zgunicornr   r   r   ZBLKSIZEcompiler   r!   r   logr	   	RawIOBaser   r0   rC   rH   rf   rQ   r   r   r   r   <module>   s$   

Z