U
    e                     @   s   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 eeejeejf dddZG dd	 d	ZG d
d dZdS )    N)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.)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.
    	root_path utf8latin1pathNmethodZquery_stringasciizHTTP/http_version)   r   schemehttpTF)REQUEST_METHODZSCRIPT_NAMEZ	PATH_INFO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-lengthCONTENT_LENGTHzcontent-type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 r0   =/tmp/pip-unpacked-wheel-2mv5qoba/starlette/middleware/wsgi.pybuild_environ   sD    







r2   c                   @   s<   e Zd Zejdejf ddddZeee	ddddZ
dS )	WSGIMiddleware.N)appr	   c                 C   s
   || _ d S N)r4   )selfr4   r0   r0   r1   __init__H   s    zWSGIMiddleware.__init__)r   receivesendr	   c                    s0   |d dkst t| j|}|||I d H  d S )Ntyper   )AssertionErrorWSGIResponderr4   )r6   r   r8   r9   Z	responderr0   r0   r1   __call__K   s    zWSGIMiddleware.__call__)__name__
__module____qualname__typingCallableAnyr7   r   r   r   r=   r0   r0   r0   r1   r3   G   s   r3   c                   @   s   e Zd ZU eejeejf  ed< e	ejeejf  ed< ej
dejf eddddZeeddd	d
ZeddddZdeejejeef  ejddddZejeejf ej
dejf ddddZdS )r<   stream_sendstream_receive.N)r4   r   r	   c                 C   s<   || _ || _d | _d | _ttj\| _| _	d| _
d | _d S )NF)r4   r   statusresponse_headersanyioZcreate_memory_object_streammathinfrD   rE   response_startedexc_info)r6   r4   r   r0   r0   r1   r7   U   s    zWSGIResponder.__init__)r8   r9   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!   r2   r   rH   Zcreate_task_groupZ
start_soonsenderrD   Z	to_threadZrun_syncwsgistart_responserL   with_traceback)r6   r8   r9   r   rN   messager-   Z
task_groupr0   r0   r1   r=   `   s    :
zWSGIResponder.__call__)r9   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 r5   )rE   )r6   r9   rT   r0   r0   r1   rP   p   s    zWSGIResponder.sender)rF   rG   rL   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/   r0   r0   r1   
<listcomp>   s   z0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)r:   rF   r   )	rL   rK   splitintrH   from_threadrunrD   r9   )r6   rF   rG   rL   Zstatus_code_stringr   status_coder   r0   r0   r1   rR   u   s    zWSGIResponder.start_response)r-   rR   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)r:   r   rN   rM   )r:   r   )r4   rH   r\   r]   rD   r9   )r6   r-   rR   chunkr0   r0   r1   rQ      s    
 zWSGIResponder.wsgi)N)r>   r?   r@   r   rA   MutableMappingstrrC   __annotations__r   rB   r   r7   r   r   r=   rP   ListTuplerR   DictrQ   r0   r0   r0   r1   r<   Q   s    
	 r<   )r&   rI   r(   rA   warningsrH   Z	anyio.abcr   r   Zstarlette.typesr   r   r   warnDeprecationWarningbytesre   ra   rC   r2   r3   r<   r0   r0   r0   r1   <module>   s   4
