U
    &%ef                     @   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 d dlmZmZmZmZmZmZmZmZ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zd dlmZ W n e k
r   eZY nX dS )    N)deque)DequeIterableOptionalTuple)ASGIReceiveCallableASGIReceiveEventASGISendCallableASGISendEventEnvironExcInfoHTTPRequestEventHTTPResponseBodyEventHTTPResponseStartEvent	HTTPScopeStartResponseWSGIAppr   r   )scopemessagebodyreturnc                 C   s.  | 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< | dg D ]\}}|d}|dkrd}	n"|dkrd}	nd| dd  }	|d}
|	|kr ||	 }t|tst	|d! |
 }
|
||	< q|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_INFOZ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-lengthZCONTENT_LENGTHzcontent-typeZ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 r7   V/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/uvicorn/middleware/wsgi.pybuild_environ   sF    







r9   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<   r=   r7   r7   r8   __init__O   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    )r3   WSGIResponderr<   rE   )rF   r   rH   rI   instancer7   r7   r8   __call__X   s    z_WSGIMiddleware.__call__)r;   )__name__
__module____qualname__r   intrG   rM   r7   r7   r7   r8   r:   N   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 )rK   r   )r<   rE   r   c                 C   sJ   || _ || _|| _d | _d | _t | _t | _	t
 | _d| _d | _d S )NF)r<   rE   r   statusresponse_headersasyncioEvent
send_eventr   
send_queueget_event_looploopresponse_startedexc_info)rF   r<   rE   r   r7   r7   r8   rG   d   s    

zWSGIResponder.__init__r   r	   N)rH   rI   r   c           
   
      s(  | I d H }t |dd}|dd}|rv|dt j |rl| I d H }||dd |dd}q<|d t| j||}t	 | _
| j
| j| j|| j}| j
| |}	zt|d I d H  W 5 | 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BytesIOr,   seekSEEK_ENDwriter9   r   rT   rX   rY   run_in_executorrE   wsgistart_responsecreate_tasksenderrW   appendrV   setwait_forr[   with_traceback)
rF   rH   rI   r   r   r]   Zbody_messager4   re   rh   r7   r7   r8   rM   u   s6    


   
zWSGIResponder.__call__)rI   r   c                    sL   | j r,| j  }|d krd S ||I d H  q | j I d H  | j  q d S )N)rW   popleftrV   waitclear)rF   rI   r   r7   r7   r8   rh      s    
zWSGIResponder.sender)rR   rS   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*   ).0r5   r6   r7   r7   r8   
<listcomp>   s   z0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)rJ   rR   r&   )
r[   rZ   splitrQ   rW   ri   rY   call_soon_threadsaferV   rj   )	rF   rR   rS   r[   Zstatus_code_strr(   status_coder&   Zhttp_response_start_eventr7   r7   r8   rf      s    zWSGIResponder.start_response)r4   rf   r   c                 C   sf   |  ||D ],}d|dd}| j| | j| jj qdddd}| j| | j| jj d S )Nzhttp.response.bodyT)rJ   r   r]   r\   F)r<   rW   ri   rY   rt   rV   rj   )rF   r4   rf   chunkZresponse_bodyZ
empty_bodyr7   r7   r8   re      s    zWSGIResponder.wsgi)N)rN   rO   rP   r   rB   rC   rD   rG   rM   rh   r2   r   r   r   r   rf   r   r   re   r7   r7   r7   r8   rK   c   s"     rK   )WSGIMiddleware)!rT   concurrent.futuresrB   r_   r-   r?   collectionsr   typingr   r   r   r   Zuvicorn._typesr   r   r	   r
   r   r   r   r   r   r   r   r   r`   r9   r:   rK   Za2wsgirw   ModuleNotFoundErrorr7   r7   r7   r8   <module>   s$   8  5e