o
    Õ­jÇ  ã                   @  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r…d}n
d|
 ¡  d d!¡ }|	 d¡}||v r©|| }t	|t
ƒs£J ‚|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)Ú	localhostéP   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© rH   úT/var/www/html/CropPilot/venv/lib/python3.10/site-packages/uvicorn/middleware/wsgi.pyÚbuild_environ   sN   


ô




rJ   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ÚDeprecationWarningrM   Ú
concurrentÚfuturesÚThreadPoolExecutorÚexecutor)ÚselfrM   rN   rH   rH   rI   Ú__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!   )ÚWSGIResponderrM   rW   )rX   r   rZ   r[   ÚinstancerH   rH   rI   Ú__call__\   s   €z_WSGIMiddleware.__call__N)rL   )rM   r   rN   rO   )r   r   rZ   r   r[   r   r   r\   )Ú__name__Ú
__module__Ú__qualname__rY   r`   rH   rH   rH   rI   rK   R   s    	rK   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 )(r^   rM   r   rW   ú%concurrent.futures.ThreadPoolExecutorr   r   c                 C  sJ   || _ || _|| _d | _d | _t ¡ | _tƒ | _	t 
¡ | _d| _d | _d S )NF)rM   rW   r   ÚstatusÚresponse_headersÚasyncioÚEventÚ
send_eventr   Ú
send_queueÚget_event_loopÚloopÚresponse_startedÚexc_info)rX   rM   rW   r   rH   rH   rI   rY   h   s   


zWSGIResponder.__init__rZ   r   r[   r   r   r\   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ÚBytesIOr4   ÚseekÚSEEK_ENDÚwriterJ   r   rg   rk   rl   Úrun_in_executorrW   ÚwsgiÚstart_responseÚcreate_taskÚsenderÚwait_forrj   Úappendri   Úsetrn   Úwith_traceback)
rX   rZ   r[   r   r   rp   Úbody_messagerA   rx   r{   rH   rH   rI   r`   y   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)rj   Úpopleftri   ÚwaitÚclear)rX   r[   r   rH   rH   rI   r{   “   s   €

øzWSGIResponder.senderNre   r>   rf   úIterable[tuple[str, str]]rn   ú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   )r5   )Ú.0rB   rC   rH   rH   rI   Ú
<listcomp>©   s   $ z0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)r]   re   r.   )
rn   rm   ÚsplitrO   rj   r}   rl   Úcall_soon_threadsaferi   r~   )	rX   re   rf   rn   Ústatus_code_strr2   Ústatus_coder.   Úhttp_response_start_eventrH   rH   rI   ry   ž   s   ýõzWSGIResponder.start_responserA   r	   ry   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)r]   r   rp   ro   F)rM   rj   r}   rl   r‹   ri   r~   )rX   rA   ry   ÚchunkÚresponse_bodyÚ
empty_bodyrH   rH   rI   rx   ²   s   ýýzWSGIResponder.wsgi)rM   r   rW   rd   r   r   )rZ   r   r[   r   r   r\   )r[   r   r   r\   r�   )re   r>   rf   r…   rn   r†   r   r\   )rA   r	   ry   r   r   r\   )ra   rb   rc   rY   r`   r{   ry   rx   rH   rH   rH   rI   r^   g   s    


ür^   )ÚWSGIMiddleware)r   r   r   r   r   r   r   r	   )Ú
__future__r   rg   Úconcurrent.futuresrT   rr   r9   rQ   Úcollectionsr   Útypingr   Úuvicorn._typesr   r   r   r   r	   r
   r   r   r   r   r   r   rJ   rK   r^   Úa2wsgir’   ÚModuleNotFoundErrorrH   rH   rH   rI   Ú<module>   s"    8
7^
ÿ