o
    ýÞha  ã                   @   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   úL/var/www/html/premium_crap/venv/lib/python3.10/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��<}	 |ƒ 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ƒ 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< | j  dg ¡D ]6\}}| d¡}|dkr‡d}n|dkrŽd}n
d | ¡  	d!d"¡ }| d¡}||v r©|| d# | }|||< qw|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ú-Ú_ú,)
r!   ÚencodeÚdecodeÚ
startswithÚlenr   Ústrr   ÚupperÚreplace)	r
   r   r   Úscript_nameÚ	path_infoÚenvironÚnameÚvalueÚcorrected_namer   r   r   Úbuild_environ5   sH   


ô


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.
        r/   é   Úresponse_startNz=You cannot call start_response a second time without exc_infoú c                 S   s(   g | ]\}}|  ¡  d ¡| d ¡f‘qS )r-   )ÚlowerrD   )Ú.0rN   rO   r   r   r   Ú
<listcomp>v   s    ÿÿz5WsgiToAsgiInstance.start_response.<locals>.<listcomp>r>   zhttp.response.start)r   Ústatusr=   )	r   Úwith_tracebackÚhasattrr   ÚsplitÚintr   rU   rS   )	r
   rX   Úresponse_headersÚexc_infoÚstatus_coderB   r=   rN   rO   r   r   r   Ústart_responsef   s(   ÿþ
€ýz!WsgiToAsgiInstance.start_responsec                 C   sÀ   |   | j|¡}d}|  || j¡D ]:}| jsd| _|  | j¡ | jdur4| j| }t|ƒ|kr4|d|… }|  d|ddœ¡ |t|ƒ7 }|| jkrJ nq| jsWd| _|  | 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   )	rQ   r   r   r`   r   r#   rS   r   rG   )r
   r   rM   Ú
bytes_sentÚoutputÚbytes_allowedr   r   r   r$   †   s*   


ÿ
ÿzWsgiToAsgiInstance.run_wsgi_appr   )
r   r   r   r   r   r   rQ   r`   r   r$   r   r   r   r   r      s    
1 r   N)	Úior   Útempfiler   Úasgiref.syncr   r   r   r   r   r   r   r   Ú<module>   s
    