o
    i                     @  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ZG dd dZG dd dZz	d dlmZ W dS  eyj   eZY dS w )    )annotationsN)deque)Iterable)ASGIReceiveCallableASGIReceiveEventASGISendCallableASGISendEventEnvironExcInfoHTTPRequestEventHTTPResponseBodyEventHTTPResponseStartEvent	HTTPScopeStartResponseWSGIAppscoper   messager   body
io.BytesIOreturnr	   c                 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methodZ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server)	localhostP   r   ZSERVER_NAMEr   ZSERVER_PORTclientZREMOTE_ADDRheaderszcontent-lengthZCONTENT_LENGTHzcontent-typeZ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 r9   N/home/app/Keep/.python/lib/python3.10/site-packages/uvicorn/middleware/wsgi.pybuild_environ   sN   







r;   c                   @  s"   e Zd ZddddZdddZdS )_WSGIMiddleware
   appr   workersintc                 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?   r9   r9   r:   __init__S   s   z_WSGIMiddleware.__init__r   r   receiver   sendr   r   Nonec                   s6   |d dks	J t | j| j|}|||I d H  d S )Ntyper    )WSGIResponderr>   rH   )rI   r   rK   rL   instancer9   r9   r:   __call__[   s   z_WSGIMiddleware.__call__N)r=   )r>   r   r?   r@   )r   r   rK   r   rL   r   r   rM   )__name__
__module____qualname__rJ   rQ   r9   r9   r9   r:   r<   R   s    r<   c                   @  sB   e Zd Zd"ddZd#ddZd$ddZ	d%d&ddZd'd d!ZdS )(rO   r>   r   rH   %concurrent.futures.ThreadPoolExecutorr   r   c                 C  sJ   || _ || _|| _d | _d | _t | _t | _	t
 | _d| _d | _d S )NF)r>   rH   r   statusresponse_headersasyncioEvent
send_eventr   
send_queueget_event_looploopresponse_startedexc_info)rI   r>   rH   r   r9   r9   r:   rJ   g   s   


zWSGIResponder.__init__rK   r   rL   r   r   rM   c           
   
     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BytesIOr*   seekSEEK_ENDwriter;   r   rX   r\   r]   run_in_executorrH   wsgistart_responsecreate_tasksenderwait_forr[   appendrZ   setr_   with_traceback)
rI   rK   rL   r   r   ra   Zbody_messager6   ri   rl   r9   r9   r:   rQ   x   s8   





zWSGIResponder.__call__c                   sL   	 | j r| j  }|d u rd S ||I d H  n| j I d H  | j  qN)r[   popleftrZ   waitclear)rI   rL   r   r9   r9   r:   rl      s   

zWSGIResponder.senderNrV   r4   rW   Iterable[tuple[str, str]]r_   ExcInfo | Nonec           	      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   )r+   ).0r7   r8   r9   r9   r:   
<listcomp>   s   $ z0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)rN   rV   r&   )
r_   r^   splitr@   r[   rn   r]   call_soon_threadsaferZ   ro   )	rI   rV   rW   r_   Zstatus_code_strr(   status_coder&   Zhttp_response_start_eventr9   r9   r:   rj      s   zWSGIResponder.start_responser6   r	   rj   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   ra   r`   F)r>   r[   rn   r]   r{   rZ   ro   )rI   r6   rj   chunkZresponse_bodyZ
empty_bodyr9   r9   r:   ri      s   zWSGIResponder.wsgi)r>   r   rH   rU   r   r   )rK   r   rL   r   r   rM   )rL   r   r   rM   rq   )rV   r4   rW   ru   r_   rv   r   rM   )r6   r	   rj   r   r   rM   )rR   rS   rT   rJ   rQ   rl   rj   ri   r9   r9   r9   r:   rO   f   s    


rO   )WSGIMiddleware)r   r   r   r   r   r   r   r	   )
__future__r   rX   concurrent.futuresrE   rc   r/   rB   collectionsr   collections.abcr   Zuvicorn._typesr   r   r   r   r	   r
   r   r   r   r   r   r   r;   r<   rO   Za2wsgir~   ModuleNotFoundErrorr9   r9   r9   r:   <module>   s"    8
7^
