U
    {fr                     @  s
  d dl mZ 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rld 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dZG dd deZG dd de
ZdS )    )annotationsN   )RequestResponse)AsyncByteStream   )AsyncBaseTransport)NNNEventreturnc                  C  s0   t  dkrdd l} |  S dd l}| S d S )Ntrior   )sniffioZcurrent_async_libraryr   r	   asyncio)r   r    r   U/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/httpx/_transports/asgi.pycreate_event   s
    r   c                   @  s*   e Zd ZdddddZdddd	Zd
S )ASGIResponseStreamzlist[bytes]None)bodyr   c                 C  s
   || _ d S N)_body)selfr   r   r   r   __init__)   s    zASGIResponseStream.__init__ztyping.AsyncIterator[bytes]r
   c                 C s   d | jV  d S )N    )joinr   )r   r   r   r   	__aiter__,   s    zASGIResponseStream.__aiter__N)__name__
__module____qualname__r   r   r   r   r   r   r   (   s   r   c                   @  s8   e Zd ZdZdddddd	d
ddZddd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{   _ASGIAppboolstrztuple[str, int]r   )appraise_app_exceptions	root_pathclientr   c                 C  s   || _ || _|| _|| _d S r   )r&   r'   r(   r)   )r   r&   r'   r(   r)   r   r   r   r   Q   s    zASGITransport.__init__r   r   )requestr   c                   s`  t jtstdddidjdd jjD jjjj	jj
dd jjjjjjf| j| jd	}j d
d d g  d
t ddfdd}ddd fdd}z| |||I d H  W nB tk
r   | jr   d krdd kri Y nX  s.td k	s<td k	sJt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>i   s     z6ASGITransport.handle_async_request.<locals>.<listcomp>   ?r   )typeZasgihttp_versionmethodheadersschemepathraw_pathZquery_stringserverr)   r(   Fzdict[str, typing.Any]r
   c                    s^   r  I d H  ddiS z  I d H } W n$ tk
rP   ddddd Y S X d| ddS )Nr3   zhttp.disconnectTzhttp.requestr   F)r3   r   	more_body)wait	__anext__StopAsyncIteration)r   )request_body_chunksrequest_completeresponse_completer   r   receive   s    z3ASGITransport.handle_async_request.<locals>.receiver   )messager   c                   s   | d dkr.rt | d | dg dnT| d dkr rFt | dd}| d	d
}|rvjdkrv | |s  d S )Nr3   zhttp.response.startstatusr6   Tzhttp.response.bodyr   r   r;   FHEAD)AssertionErrorgetis_setr5   appendset)rC   r   r;   )
body_partsr*   rA   response_headersresponse_startedstatus_coder   r   send   s    
z0ASGITransport.handle_async_request.<locals>.sendi  )r6   stream)
isinstancerP   r   rF   r5   r6   rawurlr7   r8   r9   splitqueryhostportr)   r(   r   r   r&   	Exceptionr'   rJ   rH   r   r   )r   r*   scoperB   rO   rP   r   )rK   r*   r?   r@   rA   rL   rM   rN   r   handle_async_request]   sL    



z"ASGITransport.handle_async_requestN)Tr    r!   )r   r   r   __doc__r   rZ   r   r   r   r   r   0   s   #   r   )
__future__r   typingr   Z_modelsr   r   _typesr   baser   TYPE_CHECKINGr   r   Unionr	   Dictr%   AnyZ_MessageCallable	AwaitableZ_Receive	CoroutineZ_Sendr#   r   r   r   r   r   r   r   <module>   s(   