o
    [h                     @   sz   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mZm	Z	m
Z
 de	dedefddZG d	d
 d
ZG dd dZdS )    N)run_in_threadpool)MessageReceiveScopeSendscopebodyreturnc                 C   s*  | d |  dddd| d dd| d dd	| d
  d|  ddt|tjdddd}|  dp;d}|d |d< |d |d< |  drU| d d |d< |  dg D ]7\}}|d}|dkrkd}n|dkrrd}nd|  dd }|d}||v r|| d! | }|||< q[|S )"zE
    Builds a scope and request body into a WSGI environ object.
    method	root_path utf8latin1pathZquery_stringasciizHTTP/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_-_,)	getencodedecodeioBytesIOsysstdoutupperreplace)r   r   environr   namevalueZcorrected_name r*   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/starlette/middleware/wsgi.pybuild_environ
   s<   




r,   c                   @   s@   e Zd ZddejdeddfddZded	ed
e	ddfddZ
dS )WSGIMiddleware
   appworkersr	   Nc                 C   s
   || _ d S N)r/   )selfr/   r0   r*   r*   r+   __init__9   s   
zWSGIMiddleware.__init__r   receivesendc                    s2   |d dks	J t | j|}|||I d H  d S )Ntyper   )WSGIResponderr/   )r2   r   r4   r5   Z	responderr*   r*   r+   __call__<   s   zWSGIMiddleware.__call__)r.   )__name__
__module____qualname__typingCallableintr3   r   r   r   r8   r*   r*   r*   r+   r-   8   s    r-   c                	   @   s   e Zd ZdejdeddfddZdededdfd	d
Z	deddfddZ
	ddedejejeef  dejddfddZdedejddfddZdS )r7   r/   r   r	   Nc                 C   sB   || _ || _d | _d | _t | _g | _t | _	d| _
d | _d S )NF)r/   r   statusresponse_headersasyncioEvent
send_event
send_queueZget_event_looploopresponse_startedexc_info)r2   r/   r   r*   r*   r+   r3   C   s   


zWSGIResponder.__init__r4   r5   c                    s   d}d}|r| I d H }|| dd7 }| dd}|st| j|}d }zM| j| |}t| j|| jI d H  | j	
d  | j  t|d I d H  | jd urb| jd | jd | jd W |ro| sq|  d S d S d S |r~| s|  w w w )	N    Tr   	more_bodyFr   r      )r   r,   r   rE   Zcreate_tasksenderr   wsgistart_responserD   appendrC   setrA   wait_forrG   with_tracebackdonecancel)r2   r4   r5   r   rI   messager'   rK   r*   r*   r+   r8   N   s4   



zWSGIResponder.__call__c                    sN   	 | j r| j d}|d u rd S ||I d H  n| j I d H  | j  q)NTr   )rD   poprC   waitclear)r2   r5   rT   r*   r*   r+   rK   e   s   
zWSGIResponder.senderr?   r@   rG   c                 C   sd   || _ | js0d| _|dd\}}t|}dd |D }| jd||d | j| jj	 d S 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   )
rG   rF   splitr>   rD   rN   rE   call_soon_threadsaferC   rO   )r2   r?   r@   rG   Zstatus_code_stringr   status_coder   r*   r*   r+   rM   p   s    zWSGIResponder.start_responser'   rM   c                 C   s\   |  ||D ]}| jd|dd | j| jj q| jddd | j| jj d S )Nzhttp.response.bodyT)r6   r   rI   rH   )r6   r   )r/   rD   rN   rE   r^   rC   rO   )r2   r'   rM   chunkr*   r*   r+   rL      s   
zWSGIResponder.wsgir1   )r9   r:   r;   r<   r=   r   r3   r   r   r8   rK   strListTupleAnyrM   dictrL   r*   r*   r*   r+   r7   B   s    
r7   )rA   r!   r#   r<   Zstarlette.concurrencyr   Zstarlette.typesr   r   r   r   bytesre   r,   r-   r7   r*   r*   r*   r+   <module>   s    .
