o
    h]                     @   s   d dl Z d dlZddlmZmZ ddlmZ ddlmZ e j	r0d dl
Z
d dlZe je
jejf Ze jee jf Ze jg e je f Ze je jee jf ge jd f Ze je jee jf eege jd f Zdd
dZG dd deZG dd deZdS )    N   )RequestResponse)AsyncByteStream   )AsyncBaseTransport)NNNreturnEventc                  C   s,   t  dkrdd l} |  S dd l}| S )Ntrior   )sniffiocurrent_async_libraryr
   r	   asyncio)r
   r    r   L/var/www/html/ai/venv/lib/python3.10/site-packages/httpx/_transports/asgi.pycreate_event   s
   r   c                   @   s8   e Zd Zdeje ddfddZdeje fddZdS )ASGIResponseStreambodyr   Nc                 C   s
   || _ d S N)_body)selfr   r   r   r   __init__'   s   
zASGIResponseStream.__init__c                 C  s   d | jV  d S )N    )joinr   )r   r   r   r   	__aiter__*   s   zASGIResponseStream.__aiter__)	__name__
__module____qualname__typingListbytesr   AsyncIteratorr   r   r   r   r   r   &   s    r   c                   @   sR   e Zd ZdZ			ddedededejee	f d	d
f
ddZ
ded	efddZd
S )ASGITransporta  
    A custom AsyncTransport that handles sending requests directly to an ASGI app.
    The simplest way to use this functionality is to use the `app` argument.

    ```
    client = httpx.AsyncClient(app=app)
    ```

    Alternatively, you can setup the transport instance explicitly.
    This allows you to include any additional configuration arguments specific
    to the ASGITransport class:

    ```
    transport = httpx.ASGITransport(
        app=app,
        root_path="/submount",
        client=("1.2.3.4", 123)
    )
    client = httpx.AsyncClient(transport=transport)
    ```

    Arguments:

    * `app` - The ASGI application.
    * `raise_app_exceptions` - Boolean indicating if exceptions in the application
       should be raised. Default to `True`. Can be set to `False` for use cases
       such as testing the content of a client 500 response.
    * `root_path` - The root path on which the ASGI application should be mounted.
    * `client` - A two-tuple indicating the client IP and port of incoming requests.
    ```
    T z	127.0.0.1{   appraise_app_exceptions	root_pathclientr   Nc                 C   s   || _ || _|| _|| _d S r   )r%   r&   r'   r(   )r   r%   r&   r'   r(   r   r   r   r   O   s   
zASGITransport.__init__requestc                    sd  t jts	J dddidjdd jjD jjjjjj	jj
jjjjf| j| jd}j dd d g  dt d	tjttjf ffd
d}dtjttjf d	d f fdd}z| |||I d H  W n ty   | jr   d u rdd u ri Y nw  sJ d usJ d usJ t }t|dS )Nhttpversionz3.0z1.1c                 S   s   g | ]
\}}|  |fqS r   )lower).0kvr   r   r   
<listcomp>g   s    z6ASGITransport.handle_async_request.<locals>.<listcomp>)typeasgihttp_versionmethodheadersschemepathraw_pathquery_stringserverr(   r'   Fr   c                     s^   r  I d H  ddiS z	  I d H } W n ty(   ddddd Y S w d| ddS )Nr1   zhttp.disconnectTzhttp.requestr   F)r1   r   	more_body)wait	__anext__StopAsyncIteration)r   )request_body_chunksrequest_completeresponse_completer   r   receive~   s   z3ASGITransport.handle_async_request.<locals>.receivemessagec                    s   | d dkrrJ | d |  dg dd S | d dkrE r%J |  dd}|  d	d
}|r=jdkr= | |sG  d S d S d S )Nr1   zhttp.response.startstatusr5   Tzhttp.response.bodyr   r   r;   FHEAD)getis_setr4   appendset)rC   r   r;   )
body_partsr)   rA   response_headersresponse_startedstatus_coder   r   send   s    
z0ASGITransport.handle_async_request.<locals>.sendi  )r5   stream)
isinstancerO   r   r4   r5   rawurlr6   r7   r8   queryhostportr(   r'   r   r   r   DictstrAnyr%   	Exceptionr&   rI   rG   r   r   )r   r)   scoperB   rN   rO   r   )rJ   r)   r?   r@   rA   rK   rL   rM   r   handle_async_request[   sR   
",
z"ASGITransport.handle_async_request)Tr"   r#   )r   r   r   __doc___ASGIAppboolrW   r   Tupleintr   r   r   r[   r   r   r   r   r!   .   s*    #
r!   )r   r	   )r   r   _modelsr   r   _typesr   baser   TYPE_CHECKINGr   r
   Unionr	   rV   rW   rX   _MessageCallable	Awaitable_Receive	Coroutine_Sendr]   r   r   r!   r   r   r   r   <module>   s(    
