o
    i¹«j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   úR/var/www/html/laksyashrimp/venv/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_METHODÚQUERY_STRINGÚRAW_URIÚSERVER_PROTOCOL)r0   ÚupdateÚbodyÚmethodÚqueryÚuriÚjoinÚversion)ÚreqÚsockr(   Úenvr   r   r   Údefault_environR   s   úrD   c                 C   s:   | 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_infor2   )rA   Úinfor   r   r   Úproxy_environ_   s   

ûrQ   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ô| |¡sìtd||f ƒ‚|t|ƒd … }t |¡|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%s,%szwsgi.url_schemerK   r   r   rL   ú:ÚhttpéP   Úhttpsi»  ÚSERVER_NAMEÚSERVER_PORTz2Request path %r does not start with SCRIPT_NAME %rÚ	PATH_INFO)ÚResponserD   ÚosÚenvironÚgetÚheadersÚlowerÚsendÚreplaceÚschemeÚ
isinstancer2   ÚbytesÚdecodeÚsplitÚlenr%   ÚpathÚ
startswithr   r   Úunquote_to_wsgi_strr:   rQ   )rA   rB   ÚclientÚserverr(   Úresprc   ÚhostÚscript_nameÚhdr_nameÚ	hdr_valuer   Ú	path_infor   r   r   Úcreaten   st   
€










€

ÿÿrz   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 )ra   c                 C   sL   || _ || _t| _d | _d| _d| _g | _d| _d | _	d| _
d| _|| _d S )NFr   )rA   rB   r   r@   ÚstatusÚchunkedÚ
must_closere   Úheaders_sentÚresponse_lengthÚsentÚupgrader(   )r   rA   rB   r(   r   r   r   r   Ê   s   
zResponse.__init__c                 C   s
   d| _ d S )NT)r}   ©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  )r}   rA   Úshould_closer   r|   r<   Ústatus_coder‚   r   r   r   rˆ   Û   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!)r{   r~   r   ÚreraiseÚAssertionErrorÚintrm   r‰   Ú
ValueErrorÚprocess_headersÚ
is_chunkedr|   r*   )r   r{   re   Ú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Ú
connectionr�   TÚ	websocket)rj   r2   Ú	TypeErrorr   Ú	fullmatchr   ÚHEADER_VALUE_REr   Ústriprf   r�   r   r   Ú
is_hoppishr�   re   r%   )r   re   ÚnameÚvalueÚlnamer   r   r   r�   þ   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.   r„   r†   T)r   rA   r@   r<   r‰   r‚   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r4| d
¡ |S )Nr�   r   z
keep-alivezHTTP/%s.%s %s
r   r   zServer: %s
z
Date: %s
zConnection: %s
zTransfer-Encoding: chunked
)	r�   rˆ   rA   r@   r{   r   Ú	http_dater|   r%   )r   r“   re   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
rS   zlatin-1T)	r~   rž   Úextendre   r?   r   r*   rB   Ú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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¤   rj   rk   r•   rn   r   r€   Úminr|   r   r*   rB   )r   ÚargÚarglenr¢   r   r   r   r*   M  s   

zResponse.writec                 C   s   | j jduS )NF)r(   Úsendfiler‚   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(   Úis_sslr©   r   Ú
has_filenor   Úfilenorb   ÚlseekÚSEEK_CURr   ÚfstatÚst_sizeÚOSErrorÚioÚUnsupportedOperationr¤   r�   rB   Ú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ó    )r~   r¤   r|   r   Úwrite_chunkrB   r‚   r   r   r   r   �  s
   ÿzResponse.closer   )r   r   r   r   rƒ   rˆ   r’   r�   r�   rž   r¤   r*   r©   r¨   r½   r   r   r   r   r   ra   È   s    
 
!ra   )r´   r    rb   Úrer&   Úgunicorn.http.messager   Úgunicorn.http.errorsr   r   r   Úgunicornr   r   r   ÚBLKSIZEÚcompiler—   r!   r   Úlogr	   Ú	RawIOBaser   r0   rD   rQ   rz   ra   r   r   r   r   Ú<module>   s&   

Z