o
    ߥi                     @   s   d dl Z d dlmZ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 ddlmZ ddlmZmZ G d	d
 d
eeeef Zdee dee fddZG dd deZdeeeegef gef deegef fddZdS )    N)AnyCallable	GeneratorIterableIteratorMutableMappingTuple   )Headers)EnvironStartResponseWSGIApp   )Request)ResponseStreamingResponsec                   @   sL   e Zd ZdededdfddZdeddfddZdd
edee	 fddZ
dS )NextRequestnamevaluereturnNc                 C   s   || j |< d S N_environ)selfr   r    r   I/home/ubuntu/.local/lib/python3.10/site-packages/baize/wsgi/middleware.py__setitem__   s   zNextRequest.__setitem__c                 C   s   | j |= d S r   r   )r   r   r   r   r   __delitem__   s   zNextRequest.__delitem__   
chunk_sizec                 C   s   t d)Nz'Cannot read request body in middleware.)RuntimeError)r   r   r   r   r   stream   s   zNextRequest.stream)r   )__name__
__module____qualname__strr   r   r   intr   bytesr!   r   r   r   r   r   
   s    r   iterabler   c                    s         fdd}| S )Nc                   3   s     V  E d H  d S r   r   r   first_chunkr(   r   r   	generator   s   zensure_next.<locals>.generator)__iter____next__)r(   r+   r   r)   r   ensure_next   s   r.   c                   @   sB   e Zd ZdZdeeddf fddZedede	dd fdd	Z
dS )
NextResponsez3
    This is a response object for middleware.
    r   Nc                 c   s    | j E d H  d S r   )r(   )r   r   r   r   render_stream$   s   zNextResponse.render_streamapprequestc                    sP   dt   	ddtdttttf  ddf fdd}t|||}t| S )	zc
        This is a helper method to convert a WSGI application into a NextResponse object.
           Nstatusresponse_headersr   c                    s   t | dd t| d S )N r   )r&   splitr
   )r4   r5   exc_infoheadersstatus_coder   r   start_response/   s   z-NextResponse.from_app.<locals>.start_responser   )r
   r%   r   r   r.   r/   )clsr1   r2   r<   bodyr   r9   r   from_app'   s   zNextResponse.from_app)r"   r#   r$   __doc__r   r'   r0   classmethodr   r   r?   r   r   r   r   r/      s
    r/   handlerc                    s$   t  dtdtf fdd}|S )a  
    This can turn a callable object into a middleware for WSGI application.

    ```python
    @middleware
    def m(request: NextRequest, next_call: Callable[[NextRequest], NextResponse]) -> Response:
        ...
        response = next_call(request)
        ...
        return response

    @m
    @request_response
    def v(request: Request) -> Response:
        ...

    # OR

    @m
    def wsgi(environ: Environ, start_response: StartResponse) -> Iterable[bytes]:
        ...
    ```
    r1   r   c                    s.   t  dtdtdtt f fdd}|S )z0
        This is the actual middleware.
        environr<   r   c                 3   s@    t | |}dt dtf fdd}||}|| |E d H  d S )Nr2   r   c                    s   t  | }|S r   )r/   r?   )r2   next_responser1   r   r   	next_call`   s   z6middleware.<locals>.d.<locals>.wsgi.<locals>.next_call)r   r/   )rC   r<   r2   rF   response)r1   rB   r   r   wsgi\   s
   

z#middleware.<locals>.d.<locals>.wsgi)	functoolswrapsr   r   r   r'   )r1   rH   rB   rE   r   dV   s   "
zmiddleware.<locals>.d)rI   rJ   r   )rB   rL   r   rK   r   
middleware;   s   rM   )rI   typingr   r   r   r   r   r   r   datastructuresr
   r   r   r   requestsr   	responsesr   r   r%   r   r'   r.   r/   rM   r   r   r   r   <module>   s    $
