a
    �ÏOc(0  ã                   @   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	 d dl
mZmZ d dlmZ dZe d¡Ze e¡ZG dd„ deƒZG d	d
„ d
e jƒZdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZdS )é    N)Ú	HEADER_RE)ÚInvalidHeaderÚInvalidHeaderName)ÚSERVER_SOFTWAREÚSERVERiÿÿÿ?z[\x00-\x1F\x7F]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   úI/var/www/html/gsl.tools/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_environD   s    ør.   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>Y   ó    z#default_environ.<locals>.<listcomp>)z
wsgi.inputzgunicorn.socketÚREQUEST_METHODÚQUERY_STRINGZRAW_URIZSERVER_PROTOCOL)r.   ÚupdateÚbodyÚmethodÚqueryÚuriÚjoinÚversion)ÚreqÚsockr&   Úenvr   r   r   Údefault_environQ   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_infor0   )r>   Úinfor   r   r   Úproxy_environ^   s    

ûrF   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 rÂd|| |
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à| |d¡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_schemerC   r   r   rD   ú:ÚhttpéP   Úhttpsi»  ZSERVER_NAMEZSERVER_PORTZ	PATH_INFO)ÚResponserA   ÚosÚenvironÚgetÚheadersÚlowerÚsendÚreplaceÚschemeÚ
isinstancer0   ÚbytesÚdecodeÚsplitÚlenr#   ÚpathÚutilZunquote_to_wsgi_strr7   rF   )r>   r?   ÚclientÚserverr&   ÚresprQ   ÚhostÚscript_nameZhdr_nameZ	hdr_valuer   Z	path_infor   r   r   Úcreatem   sd    






rd   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 )rO   c                 C   sL   || _ || _t| _d | _d| _d| _g | _d| _d | _	d| _
d| _|| _d S )NFr   )r>   r?   r   r=   ÚstatusÚchunkedÚ
must_closerS   Ú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)rg   ©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  )rg   r>   Úshould_closeri   rf   r9   Ústatus_coderl   r   r   r   rr   Ô   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!)re   rh   r^   ÚreraiseÚAssertionErrorÚintr[   rs   Ú
ValueErrorÚprocess_headersÚ
is_chunkedrf   r(   )r   re   rS   Úexc_infor   r   r   Ústart_responseß   s    


zResponse.start_responsec                 C   sþ   |D ]ô\}}t |tƒs"td| ƒ‚t |¡r8td| ƒ‚t |tƒsNtd| ƒ‚t |¡rdtd| ƒ‚| ¡ }| 	¡  ¡ }|dkrŒt
|ƒ| _nXt |¡rä|dkr¶| 	¡  ¡ dkrâd| _q|dkr| 	¡  ¡ dkr| j | ¡ |f¡ q| j | ¡ |f¡ qd S )Nz%r is not a stringz%rzcontent-lengthÚ
connectionrk   TZ	websocket)rX   r0   Ú	TypeErrorr   Úsearchr   ÚHEADER_VALUE_REr   ÚstriprT   rw   ri   r^   Z
is_hoppishrk   rS   r#   )r   rS   ÚnameÚvalueÚlnamer   r   r   ry   ÷   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,   rn   rp   T)ri   r>   r=   r9   rs   rl   r   r   r   rz     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 )Nrk   r	   z
keep-alivezHTTP/%s.%s %s
r   r   zServer: %s
z
Date: %s
zConnection: %s
zTransfer-Encoding: chunked
)	rk   rr   r>   r=   re   r^   Z	http_daterf   r#   )r   r}   rS   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   )r1   Úkr2   r   r   r   r3   ?  r4   z)Response.send_headers.<locals>.<listcomp>z%s
rG   zlatin-1T)	rh   r…   ÚextendrS   r<   r^   r(   r?   Zto_bytestring)r   ÚtosendÚ
header_strr   r   r   Úsend_headers;  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Š   rX   rY   r~   r\   ri   rj   Úminrf   r^   r(   r?   )r   ÚargZarglenrˆ   r   r   r   r(   E  s    

zResponse.writec                 C   s   | j jduS )NF)r&   Úsendfilerl   r   r   r   Úcan_sendfile\  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 |  ¡  |  ¡ r®d| }| j | d¡¡ | jj|j|d� |  ¡ rÔ| j d¡ t ||tj¡ dS )NFr   z%X
zutf-8)Úcounts   
T)r&   Zis_sslrŽ   r^   Z
has_filenor
   ÚfilenorP   ÚlseekÚSEEK_CURri   ÚfstatÚst_sizeÚOSErrorÚioÚUnsupportedOperationrŠ   rz   r?   Úsendallr*   r�   ÚSEEK_SET)r   Úrespiterr�   ÚoffsetÚfilesizeÚnbytesÚ
chunk_sizer   r   r   r�   _  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 )Nr4   )rh   rŠ   rf   r^   Zwrite_chunkr?   rl   r   r   r   r	   …  s    zResponse.close)N)r   r   r   r   rm   rr   r|   ry   rz   r…   rŠ   r(   rŽ   r�   r    r	   r   r   r   r   rO   Á   s   

!rO   )r–   r   rP   Úrer$   Zgunicorn.http.messager   Zgunicorn.http.errorsr   r   Zgunicornr   r   Zgunicorn.utilr^   ZBLKSIZEÚcompiler€   r   r   ÚlogÚobjectr   Ú	RawIOBaser   r.   rA   rF   rd   rO   r   r   r   r   Ú<module>   s$   

T