o
    Ci2                     @   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ddd	ejd
efddZG dd dZG dd dZz	d dlmZ W dS  e ys   eZY dS w )    N)deque)DequeIterableOptionalTuple)ASGIReceiveCallableASGIReceiveEventASGISendCallableASGISendEventEnvironExcInfoHTTPRequestEventHTTPResponseBodyEventHTTPResponseStartEvent	HTTPScopeStartResponseWSGIAppscoper   messager   bodyreturnc                 C   s`  |  dddd}| d dd}||r#|t|d }| d ||| d d	d
| d  d|  dd|tjdddd}|  d}|du rMd}|d |d< |d |d< |  d}|durh|d |d< |  dg D ]?\}}	|d}
|
dkr~d}n|
dkrd}n
d|
 d d! }|	d}||v r|| }t	|t
sJ |d" | }|||< qn|S )#zH
    Builds a scope and request message into a WSGI environ object.
    	root_path utf8latin1pathNmethodquery_stringasciizHTTP/%shttp_version)   r   schemehttpTF)REQUEST_METHODSCRIPT_NAME	PATH_INFOQUERY_STRINGSERVER_PROTOCOLzwsgi.versionzwsgi.url_schemez
wsgi.inputzwsgi.errorszwsgi.multithreadzwsgi.multiprocesszwsgi.run_onceserver)	localhostP   r   SERVER_NAMEr    SERVER_PORTclient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_name	path_infoenvironr(   r-   namevaluename_strcorrected_name	value_strcorrected_name_environ rI   o/var/www/html/fyndo/python/python_agents/rag_suite/venv/lib/python3.10/site-packages/uvicorn/middleware/wsgi.pybuild_environ   sN   







rK   c                   @   s:   e Zd ZddedefddZ						
			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DeprecationWarningrN   
concurrentfuturesThreadPoolExecutorexecutor)selfrN   rO   rI   rI   rJ   __init__S   s   z_WSGIMiddleware.__init__r   r   receiver   sendr	   r   Nc                    s6   |d dks	J t | j| j|}|||I d H  d S )Ntyper"   )WSGIResponderrN   rW   )rX   r   rZ   r[   instancerI   rI   rJ   __call__\   s   z_WSGIMiddleware.__call__)rM   )r   r   rZ   r   r[   r	   r   N)__name__
__module____qualname__r   intrY   r_   rI   rI   rI   rJ   rL   R   s    	rL   c                	   @   s   e Zd ZdedejjddfddZ					
		dddZdddZ		dde
deee
e
f  dee ddfddZdededdfddZdS )r]   rN   rW   r   r   c                 C   sJ   || _ || _|| _d | _d | _t | _t | _	t
 | _d| _d | _d S )NF)rN   rW   r   statusresponse_headersasyncioEvent
send_eventr   
send_queueget_event_looploopresponse_startedexc_info)rX   rN   rW   r   rI   rI   rJ   rY   h   s   


zWSGIResponder.__init__rZ   r   r[   r	   r   Nc           
   
      sR  | I d H }t |dd}|dd}|r=|dt j |r8| I d H }||dd |dd}|s!|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  w | jd ur| jd | jd | jd d S )Nr       	more_bodyFr   r       )ioBytesIOr5   seekSEEK_ENDwriterK   r   rf   rj   rk   run_in_executorrW   wsgistart_responsecreate_tasksenderwait_forri   appendrh   setrm   with_traceback)
rX   rZ   r[   r   r   ro   body_messagerB   rw   rz   rI   rI   rJ   r_   y   s<   





zWSGIResponder.__call__c                    sL   	 | j r| j  }|d u rd S ||I d H  n| j I d H  | j  qN)ri   popleftrh   waitclear)rX   r[   r   rI   rI   rJ   rz      s   

zWSGIResponder.senderrd   re   rm   c           	      C   sh   || _ | js2d| _|dd\}}t|}dd |D }d||d}| j| | j| jj	 d S d S )NT r    c                 S   s$   g | ]\}}| d | d fqS )r   )r6   ).0rC   rD   rI   rI   rJ   
<listcomp>   s    z0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)r\   rd   r/   )
rm   rl   splitrc   ri   r|   rk   call_soon_threadsaferh   r}   )	rX   rd   re   rm   status_code_strr3   status_coder/   http_response_start_eventrI   rI   rJ   rx      s   zWSGIResponder.start_responserB   rx   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)r\   r   ro   rn   F)rN   ri   r|   rk   r   rh   r}   )rX   rB   rx   chunkresponse_body
empty_bodyrI   rI   rJ   rw      s   zWSGIResponder.wsgi)rZ   r   r[   r	   r   N)r[   r	   r   Nr   )r`   ra   rb   r   rT   rU   rV   rY   r_   rz   r?   r   r   r   r   rx   r   r   rw   rI   rI   rI   rJ   r]   g   s6    



r]   )WSGIMiddleware)!rf   concurrent.futuresrT   rq   r:   rQ   collectionsr   typingr   r   r   r   uvicorn._typesr   r   r	   r
   r   r   r   r   r   r   r   r   rr   rK   rL   r]   a2wsgir   ModuleNotFoundErrorrI   rI   rI   rJ   <module>   s0    8
9e
