a
    h                     @  s   d dl m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 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dd	d
ddZG dd dZG dd dZzd dlmZ W n ey   eZY n0 dS )    )annotationsN)deque)Iterable)ASGIReceiveCallableASGIReceiveEventASGISendCallableASGISendEventEnvironExcInfoHTTPRequestEventHTTPResponseBodyEventHTTPResponseStartEvent	HTTPScopeStartResponseWSGIAppr   r   z
io.BytesIOr	   )scopemessagebodyreturnc                 C  sf  |  dddd}| d dd}||rF|t|d }| d ||| d d	d
| d  d|  dd|tjdddd}|  d}|du rd}|d |d< |d |d< |  d}|dur|d |d< |  dg D ]\}}	|d}
|
dkrd}n$|
dkrd}nd|
 d d! }|	d}||v rX|| }t	|t
sLJ |d" | }|||< q|S )#zH
    Builds a scope and request message into a WSGI environ object.
    	root_path utf8latin1pathNmethodZ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server)	localhostP   r   ZSERVER_NAMEr   ZSERVER_PORTclientZREMOTE_ADDRheaderszcontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-_,)getencodedecode
startswithlensysstdoutupperreplace
isinstancestr)r   r   r   script_nameZ	path_infoenvironr"   r%   namevalueZname_strZcorrected_nameZ	value_strZcorrected_name_environ r;   S/var/www/html/assistant/venv/lib/python3.9/site-packages/uvicorn/middleware/wsgi.pybuild_environ   sN    









r=   c                   @  s2   e Zd ZddddddZddd	d
dddZdS )_WSGIMiddleware
   r   int)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DeprecationWarningrA   
concurrentZfuturesZThreadPoolExecutorexecutor)selfrA   rB   r;   r;   r<   __init__S   s    z_WSGIMiddleware.__init__r   r   r   None)r   receivesendr   c                   s4   |d dksJ t | j| j|}|||I d H  d S )Ntyper   )WSGIResponderrA   rH   )rI   r   rL   rM   instancer;   r;   r<   __call__[   s    z_WSGIMiddleware.__call__N)r?   )__name__
__module____qualname__rJ   rQ   r;   r;   r;   r<   r>   R   s   r>   c                   @  sh   e Zd ZddddddZddd	d
ddZdd	dddZddddd	dddZddd	dddZdS )rO   r   z%concurrent.futures.ThreadPoolExecutorr   )rA   rH   r   c                 C  sJ   || _ || _|| _d | _d | _t | _t | _	t
 | _d| _d | _d S )NF)rA   rH   r   statusresponse_headersasyncioEvent
send_eventr   
send_queueget_event_looploopresponse_startedexc_info)rI   rA   rH   r   r;   r;   r<   rJ   g   s    

zWSGIResponder.__init__r   r   rK   )rL   rM   r   c           
   
     sP  | 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 | jd  | j  t|	d I d H  n*| jd  | j  t|	d I d H  0 | jd urL| jd | jd | jd d S )Nr       	more_bodyFr   r      )ioBytesIOr,   seekSEEK_ENDwriter=   r   rW   r[   r\   Zrun_in_executorrH   wsgistart_responseZcreate_tasksenderwait_forrZ   appendrY   setr^   with_traceback)
rI   rL   rM   r   r   r`   Zbody_messager8   rg   ri   r;   r;   r<   rQ   x   s2    




zWSGIResponder.__call__)rM   r   c                   sL   | j r,| j  }|d u rd S ||I d H  q | j I d H  | j  q d S )N)rZ   popleftrY   waitclear)rI   rM   r   r;   r;   r<   ri      s    
zWSGIResponder.senderNr6   zIterable[tuple[str, str]]zExcInfo | None)rU   rV   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>   r_   z0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)rN   rU   r&   )
r^   r]   splitr@   rZ   rk   r\   call_soon_threadsaferY   rl   )	rI   rU   rV   r^   Zstatus_code_strr*   status_coder&   Zhttp_response_start_eventr;   r;   r<   rh      s    zWSGIResponder.start_responser	   r   )r8   rh   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)rN   r   r`   r_   F)rA   rZ   rk   r\   ru   rY   rl   )rI   r8   rh   chunkZresponse_bodyZ
empty_bodyr;   r;   r<   rg      s    zWSGIResponder.wsgi)N)rR   rS   rT   rJ   rQ   ri   rh   rg   r;   r;   r;   r<   rO   f   s    rO   )WSGIMiddleware)
__future__r   rW   concurrent.futuresrG   rb   r1   rD   collectionsr   collections.abcr   Zuvicorn._typesr   r   r   r   r	   r
   r   r   r   r   r   r   r=   r>   rO   Za2wsgirx   ModuleNotFoundErrorr;   r;   r;   r<   <module>   s   87^