o
    FDi%(                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZ d dlmZ ddlmZmZmZmZ ddlmZmZmZ ed	ZG d
d deZedd dd eD ZG dd dZG dd dZdedefddZG dd dZ G dd dZ!dS )    N)
HTTPStatus)BytesIO)Any	CoroutineDequeIterableOptionalTypeVar)cast   )	HTTPScopeASGIAppReceiveEvent	SendEvent)EnvironStartResponseIterableChunksTc                       s&   e Zd Zd fddZdd Z  ZS )defaultdictreturnNc                    s   || _ t j|i | d S N)default_factorysuper__init__)selfr   argskwargs	__class__ D/var/www/Datamplify/venv/lib/python3.10/site-packages/a2wsgi/asgi.pyr      s   zdefaultdict.__init__c                 C   s
   |  |S r   )r   )r   keyr   r   r    __missing__      
zdefaultdict.__missing__r   N)__name__
__module____qualname__r   r"   __classcell__r   r   r   r    r      s    r   c                 C   s
   |  dS )Nz Unknown Status Coder   )statusr   r   r    <lambda>      
 r*   c                 C   s"   i | ]}|j |j  d |j qS ) )valuephrase).0r)   r   r   r    
<dictcomp>   s   " r0   c                   @   s\   e Zd ZdejddfddZdeddfddZdeddfd	d
ZdefddZ	dddZ
dS )
AsyncEventloopr   Nc                 C   s   || _ t | _d| _d S )NF)r2   collectionsdeque_AsyncEvent__waiters_AsyncEvent__nowait)r   r2   r   r   r    r      s   

zAsyncEvent.__init__messagec                 C   s$   t dd | jD ]}|| qd S )Nc                 S   s
   |    S r   )done)fr   r   r    r*   %   r+   z!AsyncEvent._set.<locals>.<lambda>)filterr5   
set_result)r   r7   futurer   r   r    _set$   s   zAsyncEvent._setc                 C   s   | j | j| d S r   )r2   call_soon_threadsafer=   r   r7   r   r   r    set(   s   zAsyncEvent.setc              	      sN   | j rd S | j }| j| z|I d H }|W | j| S | j| w r   )r6   r2   create_futurer5   appendremove)r   r<   resultr   r   r    wait+   s   

zAsyncEvent.waitc                 C   s
   d| _ d S )NT)r6   r   r   r   r    
set_nowait7   r#   zAsyncEvent.set_nowaitr$   )r%   r&   r'   asyncioAbstractEventLoopr   r   r=   r@   rE   rG   r   r   r   r    r1      s    r1   c                   @   s6   e Zd Zd
ddZdeddfddZdefdd	ZdS )	SyncEventr   Nc                 C   s   t  | _d | _d S r   )	threadingEvent_SyncEvent__write_event_SyncEvent__messagerF   r   r   r    r   <   s   

zSyncEvent.__init__r7   c                 C   s   || _ | j  d S r   )rN   rM   r@   r?   r   r   r    r@   @   s   zSyncEvent.setc                 C   s&   | j   | j   | jd }| _|S r   )rM   rE   clearrN   r?   r   r   r    rE   D   s   

zSyncEvent.waitr$   )r%   r&   r'   r   r   r@   rE   r   r   r   r    rJ   ;   s    
rJ   environr   c                 C   s   dd |   D }| dddd}|| dddd }| dd	d	d
| dddd | d | dd|| ddd|| d t| d f|i d}| dro| dro| ddt| ddf}||d< |S )Nc                 S   s`   g | ],\}}| d r|dvs|dv r| d r|dd n| ddd|dfqS )HTTP_)HTTP_CONTENT_TYPEHTTP_CONTENT_LENGTH)CONTENT_TYPECONTENT_LENGTH   N_-zlatin-1)
startswithlowerreplaceencode)r/   r!   r-   r   r   r    
<listcomp>L   s    zbuild_scope.<locals>.<listcomp>SCRIPT_NAME latin1utf8	PATH_INFOhttpz3.0)versionspec_versionSERVER_PROTOCOLzhttp/1.0/r   REQUEST_METHODzwsgi.url_schemeQUERY_STRINGasciiSERVER_NAMESERVER_PORT)wsgi_environtypeasgihttp_versionmethodschemepathquery_string	root_pathserverheaders
extensionsREMOTE_ADDRREMOTE_PORT0client)itemsgetr\   decodesplitint)rP   rw   ru   rs   scoper|   r   r   r    build_scopeK   s,   
r   c                	   @   sT   e Zd ZdZ		ddedee deej ddfddZ	d	e
d
edee fddZdS )ASGIMiddlewarez
    Convert ASGIApp to WSGIApp.

    wait_time: After the http response ends, the maximum time to wait for the ASGI app to run.
    Napp	wait_timer2   r   c                 C   s>   || _ |d u rt }tj|jdd}|  || _|| _d S )NT)targetdaemon)	r   rH   new_event_looprK   Threadrun_foreverstartr2   r   )r   r   r   r2   loop_threadingr   r   r    r   {   s   
zASGIMiddleware.__init__rP   start_responsec                 C   s   t | j| j| j||S r   )ASGIResponderr   r2   r   )r   rP   r   r   r   r    __call__   s   zASGIMiddleware.__call__)NN)r%   r&   r'   __doc__r   r   floatrH   rI   r   r   r   r   bytesr   r   r   r   r    r   t   s(    	
r   c                	   @   s   e Zd Z	ddedejdee ddfddZde	fdd	Z
d
eddfddZdejddfddZdedejfddZdeddef defddZdededefddZdS )r   Nr   r2   r   r   c                    s\   | _ | _| _t  _  t| _t| _ fdd}|| t	
  _d _d S )Nc                      s   t   _d S r   )rH   Locksync_event_set_lockr   rF   r   r    _init_async_lock   s   z0ASGIResponder.__init__.<locals>._init_async_lockF)r   r2   r   rJ   
sync_eventr1   receive_event
send_eventr>   rK   rL   	asgi_donewsgi_should_stop)r   r   r2   r   r   r   rF   r    r      s   




zASGIResponder.__init__c                    s2   | j  I d H  | jddi | j I d H S )Nrn   receive)r   acquirer   r@   r   rE   rF   r   r   r    asgi_receive   s   zASGIResponder.asgi_receiver7   c                    s2   | j  I d H  | j| | j I d H  d S r   )r   r   r   r@   r   rE   r?   r   r   r    	asgi_send   s   zASGIResponder.asgi_sendr<   c                    s   z?z|   W n
 tjy   Y n'w  d ur0tj }| fdd W j  d S W j  d S W j  d S j  w )Nc                    s   j dt   jfdS )Na2wsgi.error)rn   	exception)r   r@   rn   __traceback__)rW   r   r   r   r    r*      s    z2ASGIResponder.asgi_done_callback.<locals>.<lambda>)	r   rH   CancelledErrorcreate_taskr   r   add_done_callbackr   r@   )r   r<   taskr   r   r    asgi_done_callback   s   z ASGIResponder.asgi_done_callbackrP   c              	      s:   | j ttd | t|| j| j}|| j	 |S )N)NNN)
r2   r   typing_castr   r   r   r   r   r   r   )r   rP   run_asgir   r   r    start_asgi_app   s   zASGIResponder.start_asgi_appcoroc                 C   s   t || j S r   )rH   run_coroutine_threadsafer2   rD   )r   r   r   r   r    execute_in_loop   s   zASGIResponder.execute_in_loopr   c                 c   s   d}|d p	t  }t|dd pd}d}d}| | |}| jdd  	 | j }	| j| j	j
 |	d }
|
d	krV|t|	d
  dd |	d D d  | jd  n|
dkrr|	ddV  d}|	dd | _| jd  ns|
dkrd| _| jd  ne|
dkr|r|	d d |	d d |dddg|	d  dV  d| _nA|
dkrtd|| }|dkr|s| jdddd d}n#	 n!||}|t|7 }||k }| jd||d ntd|
 | jr| jdd i n| j rnq)| j| j | j|j dV  d S )!Nr   z
wsgi.inputrU   Fc                   S   s   d S r   r   r   r   r   r    r*      s    z(ASGIResponder.__call__.<locals>.<lambda>Trn   zhttp.response.startr)   c                 S   s,   g | ]\}}|  d |  d fqS )r`   )stripr   )r/   namer-   r   r   r    r]      s    z*ASGIResponder.__call__.<locals>.<listcomp>rw   zhttp.response.bodybody    	more_bodyzhttp.response.disconnectr   r   r      z500 Internal Server Error)zContent-Typeztext/plain; charset=utf-8)zContent-Length28s   Server got itself in troubler   i   zhttp.request)rn   r   r   zUnknown message type: zhttp.disconnect)r   r   r~   r   r   r2   r>   r   rE   r   releaseStatusStringMappingr   r@   r   with_tracebackminr   readlenRuntimeErrorr   is_setr   cancel)r   rP   r   
read_countr   content_lengthreceive_eof	body_sent	asgi_taskr7   message_type	read_sizedatar   r   r   r    r      s   






F
zASGIResponder.__call__r   )r%   r&   r'   r   rH   rI   r   r   r   r   r   r   r   Futurer   r   Taskr   r   r   r   r   r   r   r   r   r   r    r      s.    

r   )"rH   r3   rK   rc   r   ior   typingr   r   r   r   r   r	   r
   r   asgi_typingr   r   r   r   wsgi_typingr   r   r   r   dictr   r   r1   rJ   r   r   r   r   r   r   r    <module>   s(     	)