U
    Rh
                     @  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Zd dlm	Z	m
Z
 d dlmZmZmZ ede dddd	d
dZG dd dZG dd dZdS )    )annotationsN)ObjectReceiveStreamObjectSendStream)ReceiveScopeSendzstarlette.middleware.wsgi is deprecated and will be removed in a future release. Please refer to https://github.com/abersheeran/a2wsgi as a replacement.r   bytesdict[str, typing.Any])scopebodyreturnc           	      C  sP  |  dddd}| d dd}||rF|t|d }| d ||| d d	d
| d  d|  ddt|tjdddd}|  dpd}|d |d< |d |d< |  dr| d d |d< |  dg D ]r\}}|d}|dkrd}n&|dkrd}nd| 	 
d d!}|d}||krB|| d" | }|||< q|S )#zE
    Builds a scope and request body into a WSGI environ object.
    Z	root_path utf8latin1pathNmethodZquery_stringasciizHTTP/Zhttp_version)   r   ZschemehttpTF)Z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)Z	localhostP   r   ZSERVER_NAMEr   ZSERVER_PORTZclientZREMOTE_ADDRheaderszcontent-lengthZCONTENT_LENGTHzcontent-typeZCONTENT_TYPEZHTTP_-_,)getencodedecode
startswithlenioBytesIOsysstdoutupperreplace)	r
   r   script_nameZ	path_infoenvironr   namevalueZcorrected_name r*   ?./venv/lib/python3.8/site-packages/starlette/middleware/wsgi.pybuild_environ   sD    







r,   c                   @  s0   e Zd ZdddddZddddd	d
dZdS )WSGIMiddleware typing.Callable[..., typing.Any]None)appr   c                 C  s
   || _ d S N)r0   )selfr0   r*   r*   r+   __init__J   s    zWSGIMiddleware.__init__r   r   r   )r
   receivesendr   c                   s0   |d dkst t| j|}|||I d H  d S )Ntyper   )AssertionErrorWSGIResponderr0   )r2   r
   r4   r5   Z	responderr*   r*   r+   __call__M   s    zWSGIMiddleware.__call__N)__name__
__module____qualname__r3   r9   r*   r*   r*   r+   r-   I   s   r-   c                   @  sz   e Zd ZU ded< ded< 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 )r8   z8ObjectSendStream[typing.MutableMapping[str, typing.Any]]stream_sendz;ObjectReceiveStream[typing.MutableMapping[str, typing.Any]]stream_receiver.   r   r/   )r0   r
   r   c                 C  s<   || _ || _d | _d | _ttj\| _| _	d| _
d | _d S )NF)r0   r
   statusresponse_headersanyioZcreate_memory_object_streammathinfr=   r>   response_startedexc_info)r2   r0   r
   r*   r*   r+   r3   W   s    zWSGIResponder.__init__r   r   )r4   r5   r   c                   s   d}d}|r6| I d H }|| dd7 }| dd}qt| j|}t 4 I d H N}|| j| | j4 I d H   tj	| j
|| jI d H  W 5 Q I d H R X W 5 Q I d H R X | jd k	r| jd | jd | jd d S )	N    Tr   	more_bodyFr   r      )r   r,   r
   rA   Zcreate_task_groupZ
start_soonsenderr=   Z	to_threadZrun_syncwsgistart_responserE   with_traceback)r2   r4   r5   r   rG   messager'   Z
task_groupr*   r*   r+   r9   `   s    :
zWSGIResponder.__call__)r5   r   c              
     sH   | j 4 I d H * | j 2 z3 d H W }||I d H  q6 W 5 Q I d H R X d S r1   )r>   )r2   r5   rM   r*   r*   r+   rI   p   s    zWSGIResponder.senderNstrzlist[tuple[str, str]]z
typing.Any)r?   r@   rE   r   c                 C  sV   || _ | jsRd| _|dd\}}t|}dd |D }tj| jjd||d d S )NT r   c                 S  s0   g | ](\}}|  d  |  d fqS )r   )stripr   lower).0r(   r)   r*   r*   r+   
<listcomp>   s   z0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)r6   r?   r   )	rE   rD   splitintrA   from_threadrunr=   r5   )r2   r?   r@   rE   Zstatus_code_stringr   Zstatus_coder   r*   r*   r+   rK   u   s    zWSGIResponder.start_responser	   )r'   rK   r   c                 C  sH   |  ||D ]}tj| jjd|dd qtj| jjddd d S )Nzhttp.response.bodyT)r6   r   rG   rF   )r6   r   )r0   rA   rV   rW   r=   r5   )r2   r'   rK   chunkr*   r*   r+   rJ      s    
zWSGIResponder.wsgi)N)	r:   r;   r<   __annotations__r3   r9   rI   rK   rJ   r*   r*   r*   r+   r8   S   s   
		 r8   )Z
__future__r   r    rB   r"   typingwarningsrA   Z	anyio.abcr   r   Zstarlette.typesr   r   r   warnDeprecationWarningr,   r-   r8   r*   r*   r*   r+   <module>   s   4
