o
    hf                     @   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d| d	  d
| dd|tjdddd}| d}|du r2d}|d |d< |d |d< | d}|durM|d |d< | dg D ]?\}}|d}|dkrcd}	n|dkrjd}	n
d| dd  }	|d}
|	|v r||	 }t|tsJ |d! |
 }
|
||	< qS|S )"zH
    Builds a scope and request message into a WSGI environ object.
    method pathutf8latin1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serverN)	localhostP   r   SERVER_NAMEr   SERVER_PORTclientREMOTE_ADDRheaderszcontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-_,)	encodedecodegetsysstdoutupperreplace
isinstancestr)r   r   r   environr'   r,   namevaluename_strcorrected_name	value_strcorrected_name_environ rD   M/var/www/html/ai/venv/lib/python3.10/site-packages/uvicorn/middleware/wsgi.pybuild_environ   sF   






rF   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DeprecationWarningrI   
concurrentfuturesThreadPoolExecutorexecutor)selfrI   rJ   rD   rD   rE   __init__O   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!   )WSGIResponderrI   rR   )rS   r   rU   rV   instancerD   rD   rE   __call__X   s   z_WSGIMiddleware.__call__)rH   )r   r   rU   r   rV   r	   r   N)__name__
__module____qualname__r   intrT   rZ   rD   rD   rD   rE   rG   N   s    	rG   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 )rX   rI   rR   r   r   c                 C   sJ   || _ || _|| _d | _d | _t | _t | _	t
 | _d| _d | _d S )NF)rI   rR   r   statusresponse_headersasyncioEvent
send_eventr   
send_queueget_event_looploopresponse_startedexc_info)rS   rI   rR   r   rD   rD   rE   rT   d   s   


zWSGIResponder.__init__rU   r   rV   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BytesIOr6   seekSEEK_ENDwriterF   r   ra   re   rf   run_in_executorrR   wsgistart_responsecreate_tasksenderwait_forrd   appendrc   setrh   with_traceback)
rS   rU   rV   r   r   rj   body_messager=   rr   ru   rD   rD   rE   rZ   u   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)rd   popleftrc   waitclear)rS   rV   r   rD   rD   rE   ru      s   

zWSGIResponder.senderr_   r`   rh   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   )r4   ).0r>   r?   rD   rD   rE   
<listcomp>   s    z0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)rW   r_   r.   )
rh   rg   splitr^   rd   rw   rf   call_soon_threadsaferc   rx   )	rS   r_   r`   rh   status_code_strr2   status_coder.   http_response_start_eventrD   rD   rE   rs      s   zWSGIResponder.start_responser=   rs   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)rW   r   rj   ri   F)rI   rd   rw   rf   r   rc   rx   )rS   r=   rs   chunkresponse_body
empty_bodyrD   rD   rE   rr      s   zWSGIResponder.wsgi)rU   r   rV   r	   r   N)rV   r	   r   Nr{   )r[   r\   r]   r   rO   rP   rQ   rT   rZ   ru   r<   r   r   r   r   rs   r   r   rr   rD   rD   rD   rE   rX   c   s6    



rX   )WSGIMiddleware)!ra   concurrent.futuresrO   rl   r7   rL   collectionsr   typingr   r   r   r   uvicorn._typesr   r   r	   r
   r   r   r   r   r   r   r   r   rm   rF   rG   rX   a2wsgir   ModuleNotFoundErrorrD   rD   rD   rE   <module>   s0    8
5e
