B
    Ce                 @   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mZmZ e	r|d dlmZmZmZmZmZmZmZmZ d dlmZmZmZmZ ddejedd	d
ZG dd dZG dd dZyd dl m!Z! W n e"k
r   eZ!Y nX dS )    N)deque)TYPE_CHECKINGDequeIterableOptionalTuple)ASGIReceiveCallableASGIReceiveEventASGISendCallableASGISendEventHTTPRequestEventHTTPResponseBodyEventHTTPResponseStartEvent	HTTPScope)EnvironExcInfoStartResponseWSGIAppr   r	   )scopemessagebodyreturnc             C   s2  | d d| d  dd| d dd| d	  d
| dd|tjdddd}| d}|dkrdd}|d |d< |d |d< | d}|dk	r|d |d< x| dg D ]\}}|d}|dkrd}	n"|dkrd}	nd| dd  }	|d}
|	|kr"||	 }t|tst	|d! |
 }
|
||	< qW |S )"zH
    Builds a scope and request message into a WSGI environ object.
    method pathutf8latin1Zquery_stringasciizHTTP/%shttp_version)   r   schemehttpTF)REQUEST_METHODZSCRIPT_NAMEZ	PATH_INFOQUERY_STRINGZSERVER_PROTOCOLzwsgi.versionzwsgi.url_schemez
wsgi.inputzwsgi.errorszwsgi.multithreadzwsgi.multiprocesszwsgi.run_onceserverN)	localhostP   r   ZSERVER_NAMEr   ZSERVER_PORTclientZREMOTE_ADDRheaderszcontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-_,)
encodedecodegetsysstdoutupperreplace
isinstancestrAssertionError)r   r   r   environr$   r'   namevalueZname_strZcorrected_nameZ	value_strZcorrected_name_environ r;   k/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/uvicorn/middleware/wsgi.pybuild_environ   sD    






r=   c               @   s2   e Zd ZdeedddZddddd	d
dZdS )_WSGIMiddleware
   )appworkersc             C   s&   t dt || _tjj|d| _d S )NzgUvicorn's native WSGI implementation is deprecated, you should switch to a2wsgi (`pip install a2wsgi`).)max_workers)warningswarnDeprecationWarningr@   
concurrentfuturesThreadPoolExecutorexecutor)selfr@   rA   r;   r;   r<   __init__N   s
    z_WSGIMiddleware.__init__r   r   r
   N)r   receivesendr   c                s4   |d dkst t| j| j|}|||I d H  d S )Ntyper!   )r7   WSGIResponderr@   rI   )rJ   r   rL   rM   instancer;   r;   r<   __call__W   s    z_WSGIMiddleware.__call__)r?   )__name__
__module____qualname__r   intrK   rQ   r;   r;   r;   r<   r>   M   s
   r>   c               @   s|   e Zd ZeejjddddZddddd	d
ZdddddZ	de
eee
e
f  ee ddddZeeddddZdS )rO   r   )r@   rI   r   c             C   sJ   || _ || _|| _d | _d | _t | _t | _	t
 | _d| _d | _d S )NF)r@   rI   r   statusresponse_headersasyncioEvent
send_eventr   
send_queueget_event_looploopresponse_startedexc_info)rJ   r@   rI   r   r;   r;   r<   rK   c   s    

zWSGIResponder.__init__r   r
   N)rL   rM   r   c       
   
      s,  | I d H }t |dd}|dd}|rz|dt j x2|rn| I d H }||dd |dd}q>W |d t| j||}t	 | _
| j
| j| j|| j}| j
| |}	zt|d I d H  W d | jd  | j  t|	d I d H  X | jd k	r(| jd | jd | jd d S )Nr       	more_bodyFr   r      )ioBytesIOr0   seekSEEK_ENDwriter=   r   rX   r\   r]   run_in_executorrI   wsgistart_responsecreate_tasksenderwait_forr[   appendrZ   setr_   with_traceback)
rJ   rL   rM   r   r   ra   Zbody_messager8   ri   rl   r;   r;   r<   rQ   t   s,    


zWSGIResponder.__call__)rM   r   c                sP   xJ| j r.| j  }|d krd S ||I d H  q| j I d H  | j  qW d S )N)r[   popleftrZ   waitclear)rJ   rM   r   r;   r;   r<   rl      s    
zWSGIResponder.sender)rV   rW   r_   r   c       	      C   sd   || _ | js`d| _|dd\}}t|}dd |D }d||d}| j| | j| jj	 d S )NT r   c             S   s$   g | ]\}}| d | d fqS )r   )r.   ).0r9   r:   r;   r;   r<   
<listcomp>   s   z0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)rN   rV   r(   )
r_   r^   splitrU   r[   rn   r]   call_soon_threadsaferZ   ro   )	rJ   rV   rW   r_   Zstatus_code_strr,   status_coder(   Zhttp_response_start_eventr;   r;   r<   rj      s    zWSGIResponder.start_response)r8   rj   r   c             C   sj   x<|  ||D ],}d|dd}| j| | j| jj qW dddd}| j| | j| jj d S )Nzhttp.response.bodyT)rN   r   ra   r`   F)r@   r[   rn   r]   rx   rZ   ro   )rJ   r8   rj   chunkZresponse_bodyZ
empty_bodyr;   r;   r<   ri      s    zWSGIResponder.wsgi)N)rR   rS   rT   r   rF   rG   rH   rK   rQ   rl   r6   r   r   r   r   rj   r   r   ri   r;   r;   r;   r<   rO   b   s   rO   )WSGIMiddleware)#rX   concurrent.futuresrF   rc   r1   rC   collectionsr   typingr   r   r   r   r   Zasgiref.typingr   r	   r
   r   r   r   r   r   Zuvicorn._typesr   r   r   r   rd   r=   r>   rO   Za2wsgir{   ModuleNotFoundErrorr;   r;   r;   r<   <module>   s"   (3e