o
    e]                     @   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   )sniffioZcurrent_async_libraryr
   r	   asyncio)r
   r    r   FD:\Projects\ConvertPro\env\Lib\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>)typeZasgihttp_versionmethodheadersschemepathraw_pathZ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 )Nr0   zhttp.disconnectTzhttp.requestr   F)r0   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 )Nr0   zhttp.response.startstatusr3   Tzhttp.response.bodyr   r   r8   FHEAD)getis_setr2   appendset)r@   r   r8   )
body_partsr(   r>   response_headersresponse_startedstatus_coder   r   send   s    
z0ASGITransport.handle_async_request.<locals>.sendi  )r3   stream)
isinstancerL   r   r2   r3   rawurlr4   r5   r6   queryhostportr'   r&   r   r   r   DictstrAnyr$   	Exceptionr%   rF   rD   r   r   )r   r(   scoper?   rK   rL   r   )rG   r(   r<   r=   r>   rH   rI   rJ   r   handle_async_request[   sR   
",
z"ASGITransport.handle_async_request)Tr!   r"   )r   r   r   __doc___ASGIAppboolrT   r   Tupleintr   r   r   rX   r   r   r   r   r    .   s*    #
r    )r   r	   )r   r   Z_modelsr   r   _typesr   baser   TYPE_CHECKINGr   r
   Unionr	   rS   rT   rU   Z_MessageCallable	AwaitableZ_Receive	CoroutineZ_SendrZ   r   r   r    r   r   r   r   <module>   s(    
