o
    ÎŸŽi  ã                   @   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   úVC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\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¡s4q5q| 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ÚmethodZ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_NAMEr1   ZSERVER_PORTÚ	localhostÚ80ÚclientZ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_nameZ	path_infoÚenvironÚ_headersÚnameÚvalueZcorrected_nameÚvaluesr   r   r   Úbuild_environ:   s\   


ô

ÿþÿÿ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.
        r1   é   Úresponse_startNz=You cannot call start_response a second time without exc_infoú c                 S   s(   g | ]\}}|  ¡  d ¡| d ¡f‘qS )r/   )Úlowerr@   )Ú.0rP   rQ   r   r   r   Ú
<listcomp>„   s    ÿÿz5WsgiToAsgiInstance.start_response.<locals>.<listcomp>r:   úhttp.response.start©r   Ústatusr9   )	r   Úwith_tracebackÚhasattrr"   ÚsplitÚintr   rW   rU   )	r   r\   Úresponse_headersÚexc_infoÚstatus_coder>   r9   rP   rQ   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 qjq/| 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.
        rZ   i�  )s   content-types
   text/plainr[   zhttp.response.bodys'   Bad Request: Too many duplicate headers)r   r   Nr   T)r   r   r!   r   )
rS   r   r"   r&   r	   rd   r   rU   r   rC   )r   r   rN   Z
bytes_sentÚoutputZbytes_allowedr   r   r   r'   ”   sH   ýÿþÿñ


ÿ
ÿzWsgiToAsgiInstance.run_wsgi_appr   r   )
r   r   r   r   r   r   rS   rd   r   r'   r   r   r   r   r      s    

: r   )
rD   Úcollectionsr   Útempfiler   Zasgiref.syncr   r   r   r   r   r   r   r   Ú<module>   s    