U
    g                     @  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g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_TWSGITransportztyping.Iterable[_T])bodyreturnc                 C  s,   t | } | D ]}|rt|g|   S qg S N)iter	itertoolschain)r   chunk r   :/tmp/pip-unpacked-wheel-ql4n0x43/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 )r   a  
    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   M   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_INFOQUERY_STRINGZSERVER_NAMEZSERVER_PORTZSERVER_PROTOCOLZREMOTE_ADDR-_)CONTENT_TYPE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   )r6   r   r   r   <lambda>       zFWSGITransport.handle_request.<locals>.start_response.<locals>.<lambda>r   )r9   r:   r;   Zseen_exc_infoZseen_response_headersZseen_statusr   r   start_response{   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,   rE   rawupperreplacer)   r   AssertionErrorr*   intsplitr   )r   r.   Z
wsgi_inputrL   environZ
header_keyheader_valuerB   r?   r   rF   status_coderE   r   r>   r   handle_request[   sP    
 zWSGITransport.handle_request)Tr%   r&   N)r"   r#   r$   __doc__r   r^   r   r   r   r   r   ,   s   #    )
__future__r   rH   r   rN   typingZ_modelsr   r   _typesr   baser   TYPE_CHECKINGZ	_typeshedr	   Z_typeshed.wsgir
   TypeVarr   __all__r   r   r   r   r   r   r   <module>   s   
