
    Ui                     \    d dl Z 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	y)	    N)defaultdict)SpooledTemporaryFile)AsyncToSyncsync_to_asyncc                       e Zd ZdZddZd Zy)
WsgiToAsgizG
    Wraps a WSGI application to make it into an ASGI application.
    c                      || _         || _        y N)wsgi_applicationduplicate_header_limitselfr   r   s      ?/var/www/opsc/venv/lib/python3.12/site-packages/asgiref/wsgi.py__init__zWsgiToAsgi.__init__   s     0&<#    c                 p   K    t        | j                  | j                        |||       d{    y7 w)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sends       r   __call__zWsgiToAsgi.__call__   s8      U !6!68S8ST7D
 	
 	
s   ,646Nd   )__name__
__module____qualname____doc__r   r    r   r   r   r      s    =
r   r   c                   <    e Zd ZdZddZd Zd Zd	dZed        Z	y)
r   z;
    Per-socket instance of a wrapped WSGI application
    c                 <    || _         || _        d| _        d | _        y )NF)r   r   response_startedresponse_content_lengthr   s      r   r   zWsgiToAsgiInstance.__init__!   s"     0&<# %'+$r   c                   K   |d   dk7  rt        d      || _        t        d      5 }	  |        d {   }|d   dk7  rt        d      |j                  |j	                  dd	             |j	                  d
      snV|j                  d       t        |      | _        | j                  |       d {    d d d        y 7 7 # 1 sw Y   y xY ww)Ntypehttpz&WSGI wrapper received a non-HTTP scopei   )max_sizez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__'   s     =F"EFF
!51 	*T '	/6?n4$%WXX

7;;vs34{{;/  IIaL(.DN##D)))	* 	* * *	* 	*s?   'CCCB C6C7C;	CCCCCc                 "   |j                  dd      j                  d      j                  d      }|d   j                  d      j                  d      }|j                  |      r|t	        |      d }|d   |||d   j                  d	      d
|d   z  d|j                  dd      |t
        j                  dddd}d|v r |d   d   |d<   t        |d   d         |d<   n
d|d<   d|d<   |j                  d      |d   d   |d<   t        t              }| j                  j                  dg       D ]  \  }}|j                  d      }|dk(  rd}	n+|dk(  rd}	n#d |j                         j                  d!d"      z  }	|j                  d      }| j                  r6t	        ||	         | j                  k\  rt        d#|	 d$| j                         ||	   j                  |        |j!                         D ]  \  }}
d%j#                  |
      ||<    |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_NAMEr:   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valuess              r   build_environz WsgiToAsgiInstance.build_environ:   s@    iiR077?FFxP&M((077A	,!#k"2"45I#Ho&"!.188A(5+@@"$yy6::: $!%"
 u%*8_Q%7GM"%(x);%<GM"%0GM"%)GM"99X*%*8_Q%7GM" t$::>>)R8 	3KD%;;x(D''!1'!/!*TZZ\-A-A#s-K!KLL*E++01T5P5PP 2>2BBS2235  ^$++E2%	3& %NN, 	-LD&HHV,GDM	-r   Nc                    | j                   r|d   j                  |d         t        | d      r|t        d      |j	                  dd      \  }}t        |      }|D cg c]5  \  }}|j                         j                  d      |j                  d      f7 }}}d| _        |D ])  \  }}|j                         dk(  st        |      | _        + d	||d
| _	        yc c}}w )z/
        WSGI start_response callable.
        r:      response_startNz=You cannot call start_response a second time without exc_info r8   rI   http.response.startr$   statusrH   )
r!   with_tracebackhasattrr)   splitintlowerrO   r"   rg   )	r   rk   response_headersexc_infostatus_coderM   r`   ra   rH   s	            r   start_responsez!WsgiToAsgiInstance.start_responset   s    
   1+,,Xa[994)*x/?O   c1-Q+&  0
e ZZ\  )5<<+@A
 

 (,$+ 	:KD%zz|///25z,	:
 *!

s   ":C c                    	 | j                  | j                  |      }d	}| j	                  || j
                        D ]  }| j                  s"d
| _        | j                  | j                         | j                  "| j                  |z
  }t        |      |kD  r|d| }| j                  d|d
d       |t        |      z  }|| j                  k(  s n | j                  s"d
| _        | j                  | j                         | j                  ddi       y# t        $ r- | j                  dddgd       | j                  ddd       Y yw xY w)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.
        ri   i  )s   content-types
   text/plainrj   zhttp.response.bodys'   Bad Request: Too many duplicate headers)r$   r'   Nr   T)r$   r'   r(   r$   )
rd   r   r)   r-   r   rt   r!   rg   r"   rR   )r   r'   r^   
bytes_sentoutputbytes_alloweds         r   r.   zWsgiToAsgiInstance.run_wsgi_app   sX   	((T:G$ 
++GT5H5HI 	F(((,%t223++7 $ < <z Iv;.#N]3FNN-vDQ #f+%JT999#	& $$$(D!NN4../ 456Q  	NN1! @A NN0F 	s   D 3E	E	r   r
   )
r   r   r   r   r   r   rd   rt   r   r.   r   r   r   r   r      s1    ,*&8t
@ 07 07r   r   )
rS   collectionsr   tempfiler   asgiref.syncr   r   r   r   r   r   r   <module>r|      s'    
 # ) 3
 
(i7 i7r   