o
    Di                     @   sP   d dl Z d dlmZ d dlmZ d dlmZmZ G dd dZG dd dZ	dS )	    N)defaultdict)SpooledTemporaryFile)AsyncToSyncsync_to_asyncc                   @   s"   e Zd ZdZdddZdd ZdS )	
WsgiToAsgizG
    Wraps a WSGI application to make it into an ASGI application.
    d   c                 C   s   || _ || _d S N)wsgi_applicationduplicate_header_limitselfr	   r
    r   U/var/www/html/smartRegister/backend/venv/lib/python3.10/site-packages/asgiref/wsgi.py__init__   s   
zWsgiToAsgi.__init__c                    s"   t | j| j|||I dH  dS )z
        ASGI application instantiation point.
        We return a new WsgiToAsgiInstance here with the WSGI app
        and the scope, ready to respond when it is __call__ed.
        N)WsgiToAsgiInstancer	   r
   )r   scopereceivesendr   r   r   __call__   s   zWsgiToAsgi.__call__Nr   )__name__
__module____qualname____doc__r   r   r   r   r   r   r      s    
r   c                   @   s@   e Zd ZdZdddZdd Zdd Zdd
dZedd Z	d	S )r   z;
    Per-socket instance of a wrapped WSGI application
    r   c                 C   s   || _ || _d| _d | _d S )NF)r	   r
   response_startedresponse_content_lengthr   r   r   r   r   !   s   
zWsgiToAsgiInstance.__init__c                    s   |d dkrt d|| _tdd<}	 | I d H }|d dkr%t d||d	d
 |ds4nq|d t|| _| |I d H  W d    d S 1 sRw   Y  d S )Ntypehttpz&WSGI wrapper received a non-HTTP scopei   )max_sizeTzhttp.requestz0WSGI wrapper received a non-HTTP-request messagebody    	more_bodyr   )	
ValueErrorr   r   writegetseekr   	sync_sendrun_wsgi_app)r   r   r   r   r   messager   r   r   r   '   s"   


"zWsgiToAsgiInstance.__call__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|v rY|d d |d< t|d d |d< nd|d< d|d< | ddurp|d d |d< tt	}| j
 dg D ]D\}}|d}|dkrd}	n|dkrd}	n
d | d!d" }	|d}| jrt||	 | jkrtd#|	 d$| j ||	 | q{| D ]\}}
d%|
||< q|S )&zM
        Builds a scope and request body into a WSGI environ object.
        	root_path utf8latin1pathNmethodquery_stringasciizHTTP/%shttp_version)   r   schemer   TF)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serverr   SERVER_NAMEr2   SERVER_PORT	localhost80clientREMOTE_ADDRheaderscontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-_zToo many duplicate headers: z exceeds limit of,)r$   encodedecode
startswithlensysstderrstrr   listr   upperreplacer
   r"   appenditemsjoin)r   r   r   script_name	path_infoenviron_headersnamevaluecorrected_namevaluesr   r   r   build_environ:   sZ   




z WsgiToAsgiInstance.build_environNc           	      C   s   | j r|d |d t| dr|du rtd|dd\}}t|}dd |D }d| _|D ]\}}| d	kr@t|| _q1d
||d| _dS )z/
        WSGI start_response callable.
        r2      response_startNz=You cannot call start_response a second time without exc_info c                 S   s(   g | ]\}}|  d |d fqS )r0   )lowerrG   ).0rX   rY   r   r   r   
<listcomp>   s    z5WsgiToAsgiInstance.start_response.<locals>.<listcomp>rA   http.response.startr   statusr@   )	r   with_tracebackhasattrr"   splitintr   r`   r^   )	r   re   response_headersexc_infostatus_coderE   r@   rX   rY   r   r   r   start_responset   s(   
z!WsgiToAsgiInstance.start_responsec              	   C   s   z	|  | j|}W n ty%   | dddgd | ddd Y dS w d	}| || jD ]:}| js=d
| _| | j | jdurS| j| }t	||krS|d| }| d|d
d |t	|7 }|| jkri nq/| jsvd
| _| | j | ddi dS )z
        Called in a subthread to run the WSGI app. We encapsulate like
        this so that the start_response callable is called in the same thread.
        rc   i  )s   content-types
   text/plainrd   zhttp.response.bodys'   Bad Request: Too many duplicate headers)r   r   Nr   T)r   r   r!   r   )
r\   r   r"   r&   r	   rm   r   r^   r   rJ   )r   r   rV   
bytes_sentoutputbytes_allowedr   r   r   r'      sH   



zWsgiToAsgiInstance.run_wsgi_appr   r   )
r   r   r   r   r   r   r\   rm   r   r'   r   r   r   r   r      s    

: r   )
rK   collectionsr   tempfiler   asgiref.syncr   r   r   r   r   r   r   r   <module>   s    