o
    µ„j  ã                   @   sP   d dl Z 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 )	é    N)Údefaultdict)ÚSpooledTemporaryFile)ÚAsyncToSyncÚsync_to_asyncc                   @   s"   e Zd ZdZddd„Zdd„ ZdS )	Ú
WsgiToAsgizG
    Wraps a WSGI application to make it into an ASGI application.
    éd   c                 C   s   || _ || _d S ©N)Úwsgi_applicationÚduplicate_header_limit©Úselfr	   r
   © r   úJ/var/www/html/django_cbt/venv/lib/python3.10/site-packages/asgiref/wsgi.pyÚ__init__   s   
zWsgiToAsgi.__init__c                 Ã   s"   �t | j| 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
   )r   ÚscopeÚreceiveÚsendr   r   r   Ú__call__   s   €ÿzWsgiToAsgi.__call__N©r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      s    
r   c                   @   s@   e Zd ZdZd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
    r   c                 C   s   || _ || _d| _d | _d S )NF)r	   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j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< tt	ƒ}| j
  dg ¡D ]D\}}| d¡}|dkr‹d}	n|dkr’d}	n
d | ¡  d!d"¡ }	| d¡}| jr¸t||	 ƒ| jkr¸td#|	› d$| j› �ƒ‚||	  |¡ q{| ¡ D ]\}}
d% |
¡||< qÄ|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_NAMEr2   Ú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Úvaluesr   r   r   Úbuild_environ:   sZ   


ô

ÿÿÿ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.
        r2   é   Úresponse_startNz=You cannot call start_response a second time without exc_infoú c                 S   s(   g | ]\}}|  ¡  d ¡| d ¡f‘qS )r0   )ÚlowerrG   )Ú.0rX   rY   r   r   r   Ú
<listcomp>„   s    ÿÿz5WsgiToAsgiInstance.start_response.<locals>.<listcomp>rA   úhttp.response.start©r   Ústatusr@   )	r   Úwith_tracebackÚhasattrr"   ÚsplitÚintr   r`   r^   )	r   re   Úresponse_headersÚexc_infoÚstatus_coderE   r@   rX   rY   r   r   r   Ústart_responset   s(   ÿþ
€ýz!WsgiToAsgiInstance.start_responsec              	   C   sþ   z	|   | j|¡}W n ty%   |  dddgdœ¡ |  dddœ¡ Y dS w d	}|  || j¡D ]:}| js=d
| _|  | j¡ | jdurS| j| }t	|ƒ|krS|d|… }|  d|d
dœ¡ |t	|ƒ7 }|| jkri nq/| jsvd
| _|  | 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.
        rc   i�  )s   content-types
   text/plainrd   zhttp.response.bodys'   Bad Request: Too many duplicate headers)r   r   Nr   T)r   r   r!   r   )
r\   r   r"   r&   r	   rm   r   r^   r   rJ   )r   r   rV   Ú
bytes_sentÚoutputÚbytes_allowedr   r   r   r'   ”   sH   ýÿþÿñ


ÿ
ÿzWsgiToAsgiInstance.run_wsgi_appr   r   )
r   r   r   r   r   r   r\   rm   r   r'   r   r   r   r   r      s    

: r   )
rK   Úcollectionsr   Útempfiler   Úasgiref.syncr   r   r   r   r   r   r   r   Ú<module>   s    