
    _fa                     b    d dl mZ d dlmZ d dlmZmZ  G d d          Z G d d          ZdS )	    )BytesIO)SpooledTemporaryFile)AsyncToSyncsync_to_asyncc                       e Zd ZdZd Zd ZdS )
WsgiToAsgizG
    Wraps a WSGI application to make it into an ASGI application.
    c                     || _         d S N)wsgi_applicationselfr   s     >/var/www/html/env/lib/python3.11/site-packages/asgiref/wsgi.py__init__zWsgiToAsgi.__init__   s     0    c                 T   K    t          | j                  |||           d{V  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sends       r   __call__zWsgiToAsgi.__call__   s@       8 !677wMMMMMMMMMMMr   N)__name__
__module____qualname____doc__r   r    r   r   r   r      sA         1 1 1N N N N Nr   r   c                   B    e Zd ZdZd Zd Zd ZddZed             Z	dS )	r   z;
    Per-socket instance of a wrapped WSGI application
    c                 0    || _         d| _        d | _        d S )NF)r   response_startedresponse_content_lengthr   s     r   r   zWsgiToAsgiInstance.__init__   s      0 %'+$$$r   c                    K   |d         dk    rt          d          || _        t          d          5 }	  |             d {V }|d         dk    rt          d          |                    |                    d	d
                     |                    d          snk|                    d           t          |          | _        |                     |           d {V  d d d            d S # 1 swxY w Y   d S )Ntypehttpz&WSGI wrapper received a non-HTTP scopei   )max_sizeTzhttp.requestz0WSGI wrapper received a non-HTTP-request messagebodyr   	more_bodyr   )	
ValueErrorr   r   writegetseekr   	sync_sendrun_wsgi_app)r   r   r   r   r$   messages         r   r   zWsgiToAsgiInstance.__call__"   sY     =F""EFFF
!5111 	*T '		//////6?n44$%WXXX

7;;vs33444{{;//  IIaLLL(..DN##D)))))))))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   B1C33C7:C7c                    |                     dd                              d                              d          }|d                             d                              d          }|                    |          r|t	          |          d         }|d         |||d                             d	          d
|d         z  d|                     dd          |t                      dddd}d|v r0|d         d         |d<   t          |d         d                   |d<   n
d|d<   d|d<   |                     d          |d         d         |d<   | j                             dg           D ]\  }}|                    d          }|dk    rd}n4|dk    rd}n+d |                                	                    d!d"          z  }|                    d          }||v r||         d#z   |z   }|||<   |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_NAMEr7   SERVER_PORT	localhost80clientREMOTE_ADDRheaderscontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-_,)
r(   encodedecode
startswithlenr   strr   upperreplace)	r   r   r$   script_name	path_infoenvironnamevaluecorrected_names	            r   build_environz WsgiToAsgiInstance.build_environ5   s    iiR0077??FFxPP&M((0077AA	,, 	6!#k"2"2"4"45I#Ho&"!.188AA(5+@@"$yy6::"99 $!%"
 
 u%*8_Q%7GM"%(x);%<%<GM""%0GM"%)GM"99X*%*8_Q%7GM"  :>>)R88 	, 	,KD%;;x((D'''!1''!/!*TZZ\\-A-A#s-K-K!KLL**E((/#5=&+GN##r   Nc                    | j         r!|d                             |d                   t          | d          r|t          d          |                    dd          \  }}t          |          }d |D             }d| _        |D ]1\  }}|                                dk    rt          |          | _        2d	||d
| _        dS )z/
        WSGI start_response callable.
        r7      response_startNz=You cannot call start_response a second time without exc_info c                     g | ]A\  }}|                                                     d           |                    d           fBS )r5   )lowerrL   ).0rV   rW   s      r   
<listcomp>z5WsgiToAsgiInstance.start_response.<locals>.<listcomp>v   sS     
 
 
e ZZ\\  ))5<<+@+@A
 
 
r   rF   zhttp.response.start)r!   statusrE   )	r   with_tracebackhasattrr&   splitintr   r_   r\   )	r   rb   response_headersexc_infostatus_coderJ   rE   rV   rW   s	            r   start_responsez!WsgiToAsgiInstance.start_responsef   s    
   	:1+,,Xa[9994)** 	x/?O    c1--Q+&&
 
/
 
 

 (,$+ 	: 	:KD%zz||////25zz, *!
 
r   c                    |                      | j        |          }d}|                     || j                  D ]}| j        s!d| _        |                     | j                   | j        '| j        |z
  }t          |          |k    r
|d|         }|                     d|dd           |t          |          z  }|| j        k    r n| j        s!d| _        |                     | 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!   )	rY   r   r   rj   r   r*   r\   r   rO   )r   r$   rU   
bytes_sentoutputbytes_alloweds         r   r+   zWsgiToAsgiInstance.run_wsgi_app   s4    $$TZ66
++GT5HII 	 	F( 4(,%t2333+7 $ <z Iv;;..#N]N3FNN-vDQQ   #f++%JT999 : $ 	0$(D!NN4./// 4566666r   r
   )
r   r   r   r   r   r   rY   rj   r   r+   r   r   r   r   r      s|         , , ,
* * *&/ / /b
 
 
 
@ 7 7 ]7 7 7r   r   N)	ior   tempfiler   asgiref.syncr   r   r   r   r   r   r   <module>rr      s          ) ) ) ) ) ) 3 3 3 3 3 3 3 3N N N N N N N N"N7 N7 N7 N7 N7 N7 N7 N7 N7 N7r   