U
    {f                     @  s   d dl mZ d dlZd dl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rrd dlmZ d d	lmZ ed
ZdddddZG dd de
ZG dd deZdS )    )annotationsN   )RequestResponse)SyncByteStream   )BaseTransport)
OptExcInfo)WSGIApplication_Tztyping.Iterable[_T])bodyreturnc                 C  s,   t | } | D ]}|rt|g|   S qg S N)iter	itertoolschain)r   chunk r   U/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/httpx/_transports/wsgi.py_skip_leading_empty_chunks   s
    r   c                   @  s8   e Zd ZdddddZdddd	Zddd
dZdS )WSGIByteStreamztyping.Iterable[bytes]None)resultr   c                 C  s   t |dd | _t|| _d S )Nclose)getattr_closer   _result)selfr   r   r   r   __init__   s    zWSGIByteStream.__init__ztyping.Iterator[bytes])r   c                 c  s   | j D ]
}|V  qd S r   )r   )r   partr   r   r   __iter__    s    
zWSGIByteStream.__iter__c                 C  s   | j d k	r|    d S r   )r   )r   r   r   r   r   $   s    
zWSGIByteStream.closeN)__name__
__module____qualname__r   r    r   r   r   r   r   r      s   r   c                   @  s:   e Zd ZdZdddddd	d
dddZdddddZdS )WSGITransporta  
    A custom transport that handles sending requests directly to an WSGI app.
    The simplest way to use this functionality is to use the `app` argument.

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

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

    ```
    transport = httpx.WSGITransport(
        app=app,
        script_name="/submount",
        remote_addr="1.2.3.4"
    )
    client = httpx.Client(transport=transport)
    ```

    Arguments:

    * `app` - The WSGI 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.
    * `script_name` - The root path on which the WSGI application should be mounted.
    * `remote_addr` - A string indicating the client IP of incoming requests.
    ```
    T 	127.0.0.1Nr
   boolstrztyping.TextIO | Noner   )appraise_app_exceptionsscript_nameremote_addrwsgi_errorsr   c                 C  s"   || _ || _|| _|| _|| _d S r   )r)   r*   r+   r,   r-   )r   r)   r*   r+   r,   r-   r   r   r   r   J   s
    zWSGITransport.__init__r   r   )requestr   c                   sf  |   t|j}|jjp,ddd|jj }d|jj|| jpBtj	ddd|j
| j|jj|jjd|jjt|d| jd	}|jjD ]<\}}|d d
d}|dkrd| }|d||< qd d d  dddddd fdd}| ||}	t|	}
d k	std k	st r: d r:| jr: d t d }dd D }t|||
dS )NP   i  )httphttps)r   r   TFasciizHTTP/1.1)zwsgi.versionzwsgi.url_schemez
wsgi.inputzwsgi.errorszwsgi.multithreadzwsgi.multiprocesszwsgi.run_onceREQUEST_METHODZSCRIPT_NAMEZ	PATH_INFOZQUERY_STRINGZSERVER_NAMEZSERVER_PORTZSERVER_PROTOCOLZREMOTE_ADDR-_)ZCONTENT_TYPEZCONTENT_LENGTHZHTTP_r(   zlist[tuple[str, str]]zOptExcInfo | Nonez$typing.Callable[[bytes], typing.Any])statusresponse_headersexc_infor   c                   s   | || dd S )Nc                 S  s   d S r   r   )r5   r   r   r   <lambda>       zFWSGITransport.handle_request.<locals>.start_response.<locals>.<lambda>r   )r6   r7   r8   Zseen_exc_infoZseen_response_headersZseen_statusr   r   start_responsex   s    z4WSGITransport.handle_request.<locals>.start_responser   r   c                 S  s$   g | ]\}}| d | d fqS )r2   )encode).0keyvaluer   r   r   
<listcomp>   s   z0WSGITransport.handle_request.<locals>.<listcomp>)headersstream)N)readioBytesIOcontenturlportschemer-   sysstderrmethodr+   pathquerydecodehostr(   r,   rB   rawupperreplacer)   r   AssertionErrorr*   intsplitr   )r   r.   Z
wsgi_inputrI   environZ
header_keyheader_valuer?   r<   r   rC   status_coderB   r   r;   r   handle_requestX   sP    
 zWSGITransport.handle_request)Tr%   r&   N)r!   r"   r#   __doc__r   r[   r   r   r   r   r$   )   s   #    r$   )
__future__r   rE   r   rK   typingZ_modelsr   r   _typesr   baser   TYPE_CHECKINGZ	_typeshedr	   Z_typeshed.wsgir
   TypeVarr   r   r   r$   r   r   r   r   <module>   s   
