o
    FDi$                     @   s   d dl Z 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mZmZ ddlmZmZmZmZmZ G dd dZe dZZd	d
 Zde	dedefddZG dd dZG dd dZdS )    N)ThreadPoolExecutor   )	HTTPScopeScopeReceiveSend	SendEvent)EnvironStartResponseExceptionInfoWSGIAppWriteCallablec                   @   s   e Zd ZdejdeddfddZedefddZ	de
fd	d
Zddede
fddZddede
fddZddedeje
 fddZdeje
ddf fddZdS )BodyloopreceivereturnNc                 C   s   t  | _|| _|| _d| _d S )NT)	bytearraybufferr   r   	_has_more)selfr   r    r   D/var/www/Datamplify/venv/lib/python3.10/site-packages/a2wsgi/wsgi.py__init__   s   
zBody.__init__c                 C   s   | j s| jrdS dS )NTF)r   r   r   r   r   r   has_more   s   zBody.has_morec                 C   s@   | j sdS tj|  | jd}| }|dd| _ |ddS )N    r   	more_bodyFbody)r   asynciorun_coroutine_threadsafer   r   resultget)r   futuremessager   r   r   _receive_more_data   s   zBody._receive_more_datasizec                 C   s   |dks|t | jkr"| j|   | jsn|dks|t | jks|dkr2t| j}| j  |S t| jd | }| jd |= |S )Nr&   )lenr   extendr%   r   bytesclear)r   r'   r!   r   r   r   read"   s   

z	Body.readlimitc                 C   s   	 | j dd|dkr|nd }|dkr(t| j d |d  }| j d |d = |S |dkr=t| j d | }| j d |= |S | jsAn	| j |   qt| j }| j   |S )NT   
r   r&   r   )r   findr*   r   r)   r%   r+   )r   r-   lf_indexr!   r   r   r   readline/   s"   

zBody.readlinehintc                    sh    j sg S |dkr) d}|d}|d dkr"|t|d  dd |D S  fddt|D S )Nr&   r.   
   r   c                 S   s   g | ]}|d  qS )r.   r   ).0liner   r   r   
<listcomp>J       z"Body.readlines.<locals>.<listcomp>c                    s   g | ]}   qS r   )r1   )r4   _r   r   r   r6   K   r7   )r   r,   splitpopr(   range)r   r2   raw_databytelistr   r   r   	readlinesB   s   

zBody.readlinesc                 c   s     | j r|  V  | j sd S d S N)r   r1   r   r   r   r   __iter__M   s   
zBody.__iter__)r&   )__name__
__module____qualname__r   AbstractEventLoopr   r   propertyboolr   r*   r%   intr,   r1   typingListr>   	Generatorr@   r   r   r   r   r      s    r   surrogateescapec                 C   s   |  ttdS )zCConvert an environment variable to a WSGI "bytes-as-unicode" stringz
iso-8859-1)encodeENCESCdecode)ur   r   r   unicode_to_wsgiU   s   rQ   scoper   r   c                 C   sz  |  dddd}| d dd}||r#|t|d }tj dd}|r0t|}| | d ||| d	 d
d| d  d|  dd|tj	dddd}|  dpWd\}}||d< t
|pbd|d< |  d}|dur}|\}	}
|	|d< t
|
|d< |  dg D ]7\}}|d}|dkrd}n|dkrd}nd |  d!d"}|d}||v r|| d# | }|||< q|S )$zE
    Builds a scope and request body into a WSGI environ object.
    	root_path utf8latin1pathNSCRIPT_NAMEmethodquery_stringasciizHTTP/http_version)r   r   schemehttpTF)z
asgi.scopeREQUEST_METHODrX   	PATH_INFOQUERY_STRINGSERVER_PROTOCOLzwsgi.versionzwsgi.url_schemez
wsgi.inputzwsgi.errorszwsgi.multithreadzwsgi.multiprocesszwsgi.run_onceserver)	localhostP   SERVER_NAMEr   SERVER_PORTclientREMOTE_ADDRREMOTE_PORTheaderszcontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEHTTP_-r8   ,)r"   rL   rO   
startswithr(   osenvironrQ   sysstdoutstrupperreplace)rR   r   script_name	path_infoscript_name_environ_varrs   server_addrserver_portrh   addrportnamevaluecorrected_namer   r   r   build_environZ   sR   





r   c                	   @   sH   e Zd ZdZ	ddedededdfdd	Zd
edede	ddfddZ
dS )WSGIMiddlewarez%
    Convert WSGIApp to ASGIApp.
    r3   appworkerssend_queue_sizer   Nc                 C   s   || _ || _td|d| _d S )NWSGI)thread_name_prefixmax_workers)r   r   r   executor)r   r   r   r   r   r   r   r      s
   zWSGIMiddleware.__init__rR   r   sendc                    s   |d dkrt | j| j| j}||||I d H S |d dkr+|dddI d H  d S |d dkra| I d H }|d dks?J |dd	iI d H  | I d H }|d d
ksVJ |ddiI d H  d S d S )Ntyper^   	websocketzwebsocket.closei  )r   codelifespanzlifespan.startupzlifespan.startup.completezlifespan.shutdownzlifespan.shutdown.complete)WSGIResponderr   r   r   )r   rR   r   r   	responderr$   r   r   r   __call__   s    zWSGIMiddleware.__call__)r3   r3   )rA   rB   rC   __doc__r   rG   r   r   r   r   r   r   r   r   r   r      s    
	r   c                	   @   s   e Zd ZdedededdfddZded	ed
e	ddfddZ
deje ddfddZd
e	ddfddZ	ddedejejeef  deje defddZdededdfddZdS )r   r   r   r   r   Nc                 C   s2   || _ || _t | _t|| _d| _d | _d S )NF)	r   r   r   get_event_loopr   Queue
send_queueresponse_startedexc_info)r   r   r   r   r   r   r   r      s   

zWSGIResponder.__init__rR   r   r   c           	         s   t | j|}t||}d }zV| j| |}t }t|j	| j
}| j| j||| jI d H  | jd I d H  |I d H  | jd urT| jd | jd | jd W |ra| sc|  d S d S d S |rp| sq|  w w w )Nr   r      )r   r   r   create_tasksendercontextvarscopy_context	functoolspartialrunwsgirun_in_executorr   start_responser   putr   with_tracebackdonecancel)	r   rR   r   r   r   rs   r   contextfuncr   r   r   r      s.   





zWSGIResponder.__call__r$   c                 C   s$   t j| j|| jd}|  d S )Nr   )r   r    r   r   r   r!   )r   r$   r#   r   r   r   r      s   zWSGIResponder.sendc                    s:   	 | j  I d H }|d u rd S ||I d H  | j   qr?   )r   r"   	task_done)r   r   r$   r   r   r   r      s   
zWSGIResponder.senderstatusresponse_headersr   c                    sV   | _  js%d _|dd\}}t|}dd |D } d||d  fdd	S )
NT r   c                 S   s0   g | ]\}}|  d  |  d fqS )rV   )striprL   lower)r4   r   r   r   r   r   r6      s    z0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)r   r   rk   c                    s     d| ddS )Nhttp.response.bodyTr   r   r   )r   )chunkr   r   r   <lambda>   s    
z.WSGIResponder.start_response.<locals>.<lambda>)r   r   r9   rG   r   )r   r   r   r   status_code_stringr8   status_coderk   r   r   r   r      s   zWSGIResponder.start_responsers   r   c                 C   sf   |  ||}z"|D ]}| d|dd q	| ddd W t|ddd   d S t|ddd   w )	Nr   Tr   r   )r   r   closec                   S   s   d S r?   r   r   r   r   r   r   	  s    z$WSGIResponder.wsgi.<locals>.<lambda>)r   r   getattr)r   rs   r   iterabler   r   r   r   r      s   
*zWSGIResponder.wsgir?   )rA   rB   rC   r   r   rG   r   r   r   r   r   rH   Optionalr   r   r   rv   rI   Tupler   r   r   r	   r
   r   r   r   r   r   r      s0    


r   )r   r   r   rr   rt   rH   concurrent.futuresr   asgi_typingr   r   r   r   r   wsgi_typingr	   r
   r   r   r   r   getfilesystemencodingrM   rN   rQ   r   r   r   r   r   r   r   <module>   s    E:!