3
g                 @   sH   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 )	    )BytesIO)SpooledTemporaryFile)AsyncToSyncsync_to_asyncc               @   s    e Zd ZdZdd Zdd ZdS )
WsgiToAsgizG
    Wraps a WSGI application to make it into an ASGI application.
    c             C   s
   || _ d S )N)wsgi_application)selfr    r	   J/var/www/tester-filtro-web/env/lib/python3.6/site-packages/asgiref/wsgi.py__init__   s    zWsgiToAsgi.__init__c                s   t | 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   scopereceivesendr	   r	   r
   __call__   s    zWsgiToAsgi.__call__N)__name__
__module____qualname____doc__r   r   r	   r	   r	   r
   r      s   r   c               @   s>   e Zd ZdZ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
    c             C   s   || _ d| _d | _d S )NF)r   response_startedresponse_content_length)r   r   r	   r	   r
   r      s    zWsgiToAsgiInstance.__init__c                s   |d dkrt d|| _tddn}xB| I d H }|d dkrHt d|j|jdd	 |jd
s(P q(W |jd t|| _| j|I d H  W d Q R X d S )Ntypehttpz&WSGI wrapper received a non-HTTP scopei   )max_sizez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 |j ddjdjd|d jdjd|d jdd	|d
  d"|j dd|t dddd}d|kr|d d |d< t|d d |d< nd|d< d|d< d|kr|d d |d< x| jj dg D ]n\}}|jd}|dkrd}n"|dkrd}nd|j jdd  }|jd}||kr.|| d! | }|||< qW |S )#zM
        Builds a scope and request body into a WSGI environ object.
        method	root_path utf8latin1pathZquery_stringasciizHTTP/%shttp_version   r   schemer   TF)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serverZSERVER_NAMEZSERVER_PORT	localhost80clientZREMOTE_ADDRheaderszcontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-_,)r,   r   )r   encodedecoder   strr   upperreplace)r   r   r   environnamevalueZcorrected_namer	   r	   r
   build_environ5   s>    




z WsgiToAsgiInstance.build_environNc       	      C   s   | j r|d j|d t| dr2|dkr2td|jdd\}}t|}dd |D }d| _x&|D ]\}}|j d	krdt|| _qdW d
||d| _dS )z/
        WSGI start_response callable.
        r,      response_startNz=You cannot call start_response a second time without exc_info c             S   s(   g | ] \}}|j  jd |jd fqS )r*   )lowerr:   ).0r@   rA   r	   r	   r
   
<listcomp>s   s   z5WsgiToAsgiInstance.start_response.<locals>.<listcomp>zcontent-lengthzhttp.response.start)r   statusr4   )	r   with_tracebackhasattrr   splitintr   rF   rD   )	r   rI   response_headersexc_infostatus_coder8   r4   r@   rA   r	   r	   r
   start_responseb   s     z!WsgiToAsgiInstance.start_responsec             C   s   | j | j|}d}x| j|| jD ]r}| js>d| _| j| j | jdk	rj| j| }t||krj|d| }| jd|dd |t|7 }|| jkr"P q"W | jsd| _| j| j | 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.
        r   TNzhttp.response.body)r   r   r   r   )	rB   r   r   rQ   r   r!   rD   r   len)r   r   r?   Z
bytes_sentoutputZbytes_allowedr	   r	   r
   r"      s&    


zWsgiToAsgiInstance.run_wsgi_app)N)
r   r   r   r   r   r   rB   rQ   r   r"   r	   r	   r	   r
   r      s   -
 r   N)	ior   tempfiler   Zasgiref.syncr   r   r   r   r	   r	   r	   r
   <module>   s   