U
    a                     @   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
   {/home/adriano.carvalho/ftp/files/BrinquedotecaVirtual/brinquedotecavirtual/venv/lib/python3.8/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_lengthr   r
   r
   r   r      s    zWsgiToAsgiInstance.__init__c              	      s   |d dkrt d|| _tddj}| I d H }|d dkrFt d||dd	 |d
s&qfq&|d t|| _| |I d H  W 5 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 | dddd|d dd|d dd	|d
  d| 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< | j dg D ]n\}}|d}|dkrd}n"|dkrd}nd| d d! }|d}||kr,|| d" | }|||< q|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serverr   ZSERVER_NAMEr-   ZSERVER_PORT	localhost80clientZREMOTE_ADDRheaderscontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-_,)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 |d t| dr2|dkr2td|dd\}}t|}dd |D }d| _|D ]\}}| d	krbt|| _qbd
||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 | ] \}}|  d |d fqS )r+   )lowerr<   ).0rB   rC   r
   r
   r   
<listcomp>r   s   z5WsgiToAsgiInstance.start_response.<locals>.<listcomp>r6   zhttp.response.start)r   statusr5   )	r   with_tracebackhasattrr   splitintr   rH   rF   )	r	   rK   response_headersexc_infostatus_coder:   r5   rB   rC   r
   r
   r   start_responseb   s&    z!WsgiToAsgiInstance.start_responsec                 C   s   |  | j|}d}| || jD ]t}| js<d| _| | j | jdk	rh| j| }t||krh|d| }| d|dd |t|7 }|| jkr  qq | jsd| _| | 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   )	rD   r   r   rS   r   r"   rF   r   len)r	   r   rA   Z
bytes_sentoutputZbytes_allowedr
   r
   r   r#      s(    



zWsgiToAsgiInstance.run_wsgi_app)N)
r   r   r   r   r   r   rD   rS   r   r#   r
   r
   r
   r   r      s   -
 r   N)	ior   tempfiler   Zasgiref.syncr   r   r   r   r
   r
   r
   r   <module>   s   