U
    nËj}  ã                   @  s  d dl mZ d dlZddlmZmZ ddlmZ ddlm	Z	 ej
rdd 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gZd	d
œdd„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ÚASGITransportÚbool©Úreturnc                  C  s8   zdd l } |  ¡ dkrW dS W n tk
r2   Y nX dS )Nr   ÚtrioTF)ÚsniffioZcurrent_async_libraryÚImportError)r   © r   ú:/tmp/pip-unpacked-wheel-7ig9zwdf/httpx/_transports/asgi.pyÚis_running_trio   s    
r   ÚEventc                  C  s&   t ƒ rdd l} |  ¡ S dd l}| ¡ S )Nr   )r   r   r   Úasyncio)r   r   r   r   r   Ú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__8   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   7   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 )r	   aã  
    A custom AsyncTransport that handles sending requests directly to an ASGI app.

    ```python
    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é{   Ú_ASGIAppr
   Ú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   W   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>o   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 )Nr5   zhttp.disconnectTzhttp.requestr   F)r5   r   Ú	more_body)ÚwaitÚ	__anext__ÚStopAsyncIteration)r   )Úrequest_body_chunksÚrequest_completeÚresponse_completer   r   Úreceive†   s    z3ASGITransport.handle_async_request.<locals>.receivez&typing.MutableMapping[str, typing.Any]r   )Ú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 )Nr5   zhttp.response.startÚstatusr8   Tzhttp.response.bodyr   r   r=   FÚHEAD)ÚAssertionErrorÚgetÚis_setr7   ÚappendÚset)rE   r   r=   )Ú
body_partsr,   rC   Úresponse_headersÚresponse_startedÚstatus_coder   r   Úsend”   s    
z0ASGITransport.handle_async_request.<locals>.sendiô  )r8   Ústream)Ú
isinstancerR   r   rH   r7   r8   ÚrawÚurlr9   r:   r;   ÚsplitÚqueryÚhostÚportr+   r*   r   r   r(   Ú	Exceptionr)   rL   rJ   r   r   )r   r,   ZscoperD   rQ   rR   r   )rM   r,   rA   rB   rC   rN   rO   rP   r   Úhandle_async_requestc   sL    ô



z"ASGITransport.handle_async_requestN)Tr#   r$   )r    r!   r"   Ú__doc__r   r[   r   r   r   r   r	   ?   s      û)Ú
__future__r   ÚtypingZ_modelsr   r   Ú_typesr   Úbaser   ÚTYPE_CHECKINGr   r   ÚUnionr   ÚMutableMappingr'   ÚAnyZ_MessageÚCallableÚ	AwaitableZ_ReceiveZ_Sendr&   Ú__all__r   r   r   r	   r   r   r   r   Ú<module>   s*   ÿÿ