o
    sZh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 d S )Nclose)filelikeblksizehasattrr   )selfr   r    r   A/var/www/auris/lib/python3.10/site-packages/gunicorn/http/wsgi.py__init__   s
   
zFileWrapper.__init__c                 C   s   | j | j}|r|S t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w |  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   s    z#default_environ.<locals>.<listcomp>)z
wsgi.inputzgunicorn.socketREQUEST_METHODZQUERY_STRINGZRAW_URIZSERVER_PROTOCOL)r0   updatebodymethodqueryurijoinversion)reqsockr(   envr   r   r   default_environR   s   rA   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   

rF   c                 C   s  t | ||}t| ||}d }tjdd}| jD ]L\}	}
|	dkr,|
 dkr+|d n |	dkr3|
}n|	dkr:|
}n|	dkrC|
|d< q|	d	krL|
|d
< qd|	dd }||v r`d|| |
f }
|
||< q| j	|d< t
|trt||d< nt
|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r|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-TYPEZCONTENT_TYPEzCONTENT-LENGTHZCONTENT_LENGTHZHTTP_r   _z%s,%szwsgi.url_schemerC   r   r   rD   :httpP   httpsi  ZSERVER_NAMEZSERVER_PORTz2Request path %r does not start with SCRIPT_NAME %rZ	PATH_INFO)ResponserA   osenvirongetheaderslowersendreplacescheme
isinstancer2   bytesdecodesplitlenr%   path
startswithr   r   Zunquote_to_wsgi_strr7   rF   )r>   r?   clientserverr(   resprO   hostscript_nameZhdr_nameZ	hdr_valuer   Z	path_infor   r   r   createn   st   













rb   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 )rM   c                 C   sL   || _ || _t| _d | _d| _d| _g | _d| _d | _	d| _
d| _|| _d S )NFr   )r>   r?   r   r=   statuschunked
must_closerQ   headers_sentresponse_lengthsentupgrader(   )r   r>   r?   r(   r   r   r   r      s   
zResponse.__init__c                 C   s
   d| _ d S )NT)re   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rdS | jdk s&| jdv r(dS dS )NTFHEAD      i0  )re   r>   should_closerg   rd   r9   status_coderj   r   r   r   rp      s   zResponse.should_closeNc                 C   s   |rz| j r| jrt|d |d |d  W d }nd }w | j d ur&td|| _ zt| j  d | _W n tyA   d | _Y nw | 	| | 
 | _| jS )Nr   r      zResponse headers already set!)rc   rf   r   reraiseAssertionErrorintrY   rq   
ValueErrorprocess_headers
is_chunkedrd   r*   )r   rc   rQ   exc_infor   r   r   start_response   s"   



zResponse.start_responsec                 C   s   |D ]q\}}t |tstd| t|std| t |ts'td| t|s2td| |d}|	 }|dkrEt
|| _n&t|rk|dkrX|	 dkrWd| _n|dkrj|	 dkrj| j||f q| j||f qd S )	Nz%r is not a stringz%rz 	zcontent-length
connectionri   TZ	websocket)rV   r2   	TypeErrorr   	fullmatchr   HEADER_VALUE_REr   striprR   ru   rg   r   Z
is_hoppishri   rQ   r%   )r   rQ   namevaluelnamer   r   r   rw      s0   





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.   rl   rn   T)rg   r>   r=   r9   rq   rj   r   r   r   rx     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r4|d
 |S )Nri   r   z
keep-alivezHTTP/%s.%s %s
r   r   zServer: %s
z
Date: %s
zConnection: %s
zTransfer-Encoding: chunked
)	ri   rp   r>   r=   rc   r   Z	http_daterd   r%   )r   r{   rQ   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  s    z)Response.send_headers.<locals>.<listcomp>z%s
rG   zlatin-1T)	rf   r   extendrQ   r<   r   r*   r?   Zto_bytestring)r   tosendZ
header_strr   r   r   send_headersC  s   
zResponse.send_headersc                 C   s   |    t|tstd| t|}|}| jd ur5| j| jkr"d S t| j| j |}||k r5|d | }| jr>|dkr>d S |  j|7  _t	
| j|| j d S )Nz%r is not a byter   )r   rV   rW   r|   rZ   rg   rh   minrd   r   r*   r?   )r   argZarglenr   r   r   r   r*   M  s   

zResponse.writec                 C   s   | j jduS )NF)r(   sendfilerj   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 r0t|j}|| }n| j
}W n ttjfyA   Y dS w |   |  rWd| }| j|d |dkre| jj|j||d |  ro| jd t||tj dS )NFr   z%X
zutf-8)offsetcounts   
T)r(   Zis_sslr   r   Z
has_filenor   filenorN   lseekSEEK_CURrg   fstatst_sizeOSErrorioUnsupportedOperationr   rx   r?   sendallr,   r   SEEK_SET)r   respiterr   r   filesizenbytes
chunk_sizer   r   r   r   g  s2   


zResponse.sendfilec                 C   s&   |  |s|D ]	}| | qd S 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 d S )N    )rf   r   rd   r   Zwrite_chunkr?   rj   r   r   r   r     s
   zResponse.closer   )r   r   r   r   rk   rp   rz   rw   rx   r   r   r*   r   r   r   r   r   r   r   r   rM      s    
 
!rM   )r   r    rN   rer&   Zgunicorn.http.messager   Zgunicorn.http.errorsr   r   r   Zgunicornr   r   r   ZBLKSIZEcompiler~   r!   r   logr	   	RawIOBaser   r0   rA   rF   rb   rM   r   r   r   r   <module>   s&   

Z