U
    nË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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ÚSendz˜starlette.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¡p˜d}|d |d< |d |d< |   d¡rÌ| d d |d< |   dg ¡D ]r\}}| d¡}|dkrød}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)Ú	localhostéP   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© r3   ú=/tmp/pip-unpacked-wheel-pzfrzqh9/starlette/middleware/wsgi.pyÚbuild_environ   sD    

ô





r5   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)r9   )Úselfr9   r3   r3   r4   Ú__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ÚWSGIResponderr9   )r;   r
   r=   r>   Z	responderr3   r3   r4   Ú__call__M   s    zWSGIMiddleware.__call__N)Ú__name__Ú
__module__Ú__qualname__r<   rB   r3   r3   r3   r4   r6   I   s   r6   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 )rA   z8ObjectSendStream[typing.MutableMapping[str, typing.Any]]Ústream_sendz;ObjectReceiveStream[typing.MutableMapping[str, typing.Any]]Ústream_receiver7   r   r8   )r9   r
   r   c                 C  s<   || _ || _d | _d | _t tj¡\| _| _	d| _
d | _d S )NF)r9   r
   ÚstatusÚresponse_headersÚanyioZcreate_memory_object_streamÚmathÚinfrF   rG   Úresponse_startedÚexc_info)r;   r9   r
   r3   r3   r4   r<   W   s    zWSGIResponder.__init__r   r   )r=   r>   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$   r5   r
   rJ   Zcreate_task_groupZ
start_soonÚsenderrF   Z	to_threadZrun_syncÚwsgiÚstart_responserN   Úwith_traceback)r;   r=   r>   r   rP   Úmessager0   Z
task_groupr3   r3   r4   rB   `   s    :
zWSGIResponder.__call__)r>   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 r:   )rG   )r;   r>   rV   r3   r3   r4   rR   p   s    zWSGIResponder.senderNÚstrzlist[tuple[str, str]]z
typing.Any)rH   rI   rN   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)Ú.0r1   r2   r3   r3   r4   Ú
<listcomp>€   s   ÿz0WSGIResponder.start_response.<locals>.<listcomp>zhttp.response.start)r?   rH   r   )	rN   rM   ÚsplitÚintrJ   Úfrom_threadÚrunrF   r>   )r;   rH   rI   rN   Zstatus_code_stringr"   Ústatus_coder   r3   r3   r4   rT   u   s    þýþzWSGIResponder.start_responser	   )r0   rT   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   rP   rO   )r?   r   )r9   rJ   r_   r`   rF   r>   )r;   r0   rT   Úchunkr3   r3   r4   rS   �   s    
þzWSGIResponder.wsgi)N)	rC   rD   rE   Ú__annotations__r<   rB   rR   rT   rS   r3   r3   r3   r4   rA   S   s   
		 ürA   )Ú
__future__r   r)   rK   r+   ÚtypingÚwarningsrJ   Z	anyio.abcr   r   Zstarlette.typesr   r   r   ÚwarnÚDeprecationWarningr5   r6   rA   r3   r3   r3   r4   Ú<module>   s   ý4
