o
    h                     @   s   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r3d dlmZ d dlmZ ed	Zd
eje deje fddZG dd deZG dd de
ZdS )    N   )RequestResponse)SyncByteStream   )BaseTransport)
OptExcInfo)WSGIApplication_Tbodyreturnc                 C   s,   t | } | D ]}|rt|g|   S qg S N)iter	itertoolschain)r   chunk r   L/var/www/html/ai/venv/lib/python3.10/site-packages/httpx/_transports/wsgi.py_skip_leading_empty_chunks   s   r   c                   @   sB   e Zd Zdeje ddfddZdeje fddZd
dd	Z	dS )WSGIByteStreamresultr   Nc                 C   s   t |dd | _t|| _d S )Nclose)getattr_closer   _result)selfr   r   r   r   __init__   s   zWSGIByteStream.__init__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 ur|    d S d S r   )r   )r   r   r   r   r   "   s   
zWSGIByteStream.close)r   N)
__name__
__module____qualname__typingIterablebytesr   Iteratorr   r   r   r   r   r   r      s    r   c                   @   sV   e Zd ZdZ				dddded	ed
edejej ddfddZ	de
def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.1Nappr	   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   H   s
   
zWSGITransport.__init__requestc                    s  |   t|j}|jjpddd|jj }d|jj|| jp!tj	ddd|j
| j|jj|jjd|jjt|d| jd	}|jjD ]\}}|d d
d}|dvrXd| }|d||< qAd d d  	 ddtdtjtjttf  dtjd dtjtgtjf f fdd}| ||}	t|	}
d usJ d usJ  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_METHODSCRIPT_NAME	PATH_INFOQUERY_STRINGSERVER_NAMESERVER_PORTSERVER_PROTOCOLREMOTE_ADDR-_)CONTENT_TYPECONTENT_LENGTHHTTP_statusresponse_headersexc_infor   r   c                    s   | || dd S )Nc                 S   s   d S r   r   )r<   r   r   r   <lambda>   s    zFWSGITransport.handle_request.<locals>.start_response.<locals>.<lambda>r   )r@   rA   rB   seen_exc_infoseen_response_headersseen_statusr   r   start_responsev   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streamr   )#readioBytesIOcontenturlportschemer-   sysstderrmethodr+   pathquerydecodehoststrr,   rN   rawupperreplacer"   ListTupleOptionalCallabler$   Anyr)   r   r*   intsplitr   )r   r.   
wsgi_inputrU   environ
header_keyheader_valuerK   rH   r   rO   status_coderN   r   rD   r   handle_requestV   s`   
zWSGITransport.handle_request)Tr'   r(   N)r   r    r!   __doc__boolr^   r"   rd   TextIOr   r   r   rn   r   r   r   r   r&   '   s(    #

r&   )rQ   r   rW   r"   _modelsr   r   _typesr   baser   TYPE_CHECKING	_typeshedr   _typeshed.wsgir	   TypeVarr
   r#   r   r   r&   r   r   r   r   <module>   s    
