U
    mfn                     @   s   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d d	lmZ ed
ZG dd dZG dd de	ZG dd dejZdd Zdd Zdd Zdd ZdS )    )BytesIO)settings)signals)base)HttpRequest	QueryDictparse_cookie)set_script_prefix)repercent_broken_unicode)cached_property)_lazy_re_compiles   /+c                   @   s6   e Zd ZdZdd ZdddZdddZdd	d
ZdS )LimitedStreamzBWrap another stream to disallow reading it past a number of bytes.c                 C   s   || _ || _d| _d S N    )stream	remainingbuffer)selfr   limit r   =/tmp/pip-unpacked-wheel-siwebuq3/django/core/handlers/wsgi.py__init__   s    zLimitedStream.__init__Nc                 C   sF   |d ks|| j kr| j }|dkr$dS | j|}|  j t|8  _ |S )Nr   r   )r   r   readlenr   sizeresultr   r   r   _read_limited   s    zLimitedStream._read_limitedc                 C   sp   |d kr| j |   }d| _ nN|t| j k rL| j d | }| j |d  | _ n | j | |t| j   }d| _ |S r   )r   r   r   r   r   r   r   r       s    zLimitedStream.readc                 C   s   d| j krX|d ks t| j |k rX|r:| |t| j  }n|  }|sHqX|  j |7  _ q t| j }|rr||}n| }| | _ |S )N   
)r   r   r   r   readliner   )r   r   chunksioliner   r   r   r   ,   s     

zLimitedStream.readline)N)N)N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r      s
   
	
r   c                   @   sZ   e Zd Zdd Zdd Zedd Zdd Zd	d
 Zedd Z	e
dd Ze
eeZdS )WSGIRequestc              	   C   s   t |}t|pd}|| _|| _d|d|dddf | _|| _|| jd< || jd< |d  | _	| 
| zt|d}W n ttfk
r   d	}Y nX t| jd
 || _d| _d | _d S )N/z%s/%s    	PATH_INFOSCRIPT_NAMEREQUEST_METHODCONTENT_LENGTHr   z
wsgi.inputF)get_script_nameget_path_infoenviron	path_inforstripreplacepathZMETAuppermethodZ_set_content_type_paramsintget
ValueError	TypeErrorr   _streamZ_read_startedZresolver_match)r   r1   script_namer2   content_lengthr   r   r   r   @   s"    



zWSGIRequest.__init__c                 C   s   | j dS )Nzwsgi.url_scheme)r1   r9   r   r   r   r   _get_schemeY   s    zWSGIRequest._get_schemec                 C   s   t | jdd}t|| jdS )NQUERY_STRINGr)   )encoding)get_bytes_from_wsgir1   r   	_encoding)r   Zraw_query_stringr   r   r   GET\   s    zWSGIRequest.GETc                 C   s   t | ds|   | jS )N_post)hasattr_load_post_and_filesrF   r?   r   r   r   	_get_postb   s    
zWSGIRequest._get_postc                 C   s
   || _ d S N)rF   )r   postr   r   r   	_set_postg   s    zWSGIRequest._set_postc                 C   s   t | jdd}t|S )NZHTTP_COOKIEr)   )get_str_from_wsgir1   r   )r   Z
raw_cookier   r   r   COOKIESj   s    zWSGIRequest.COOKIESc                 C   s   t | ds|   | jS )N_files)rG   rH   rO   r?   r   r   r   FILESo   s    
zWSGIRequest.FILESN)r#   r$   r%   r   r@   r   rE   rI   rL   rN   propertyrP   POSTr   r   r   r   r'   ?   s   


r'   c                       s(   e Zd ZeZ fddZdd Z  ZS )WSGIHandlerc                    s   t  j|| |   d S rJ   )superr   Zload_middleware)r   argskwargs	__class__r   r   r   {   s    zWSGIHandler.__init__c                 C   s   t t| tjj| j|d | |}| |}| j|_d|j	|j
f }| dd |j D }||| t|dd d k	r|dr|j|j_|d |j|j}|S )N)Zsenderr1   z%d %sc                 s   s   | ]}d |j ddfV  qdS )z
Set-Cookier)   )headerN)output).0cr   r   r   	<genexpr>   s     z'WSGIHandler.__call__.<locals>.<genexpr>file_to_streamzwsgi.file_wrapper)r	   r/   r   Zrequest_startedsendrX   request_classZget_responseZ_handler_classstatus_codeZreason_phraseitemscookiesvaluesgetattrr9   closer^   
block_size)r   r1   Zstart_responserequestresponsestatusresponse_headersr   r   r   __call__   s&    



 zWSGIHandler.__call__)r#   r$   r%   r'   r`   r   rl   __classcell__r   r   rW   r   rS   x   s   rS   c                 C   s   t | dd}t| S )z0Return the HTTP request's PATH_INFO as a string.r+   r(   )rC   r
   decode)r1   r2   r   r   r   r0      s    r0   c                 C   s|   t jdk	rt jS t| ddp&t| dd}|rhd|kr@td|}t| dd}|rb|dt|  n|}nt| dd}| S )	aE  
    Return the equivalent of the HTTP request's SCRIPT_NAME environment
    variable. If Apache mod_rewrite is used, return what would have been
    the script name prior to any rewriting (so it's the script name as seen
    from the client's perspective), unless the FORCE_SCRIPT_NAME setting is
    set (to anything).
    NZ
SCRIPT_URLr)   ZREDIRECT_URLs   //   /r+   r,   )r   ZFORCE_SCRIPT_NAMErC   _slashes_resubr   rn   )r1   Z
script_urlr2   r=   r   r   r   r/      s    
  r/   c                 C   s   |  ||}|dS )zh
    Get a value from the WSGI environ dictionary as bytes.

    key and default should be strings.
    z
iso-8859-1)r9   encoder1   keydefaultvaluer   r   r   rC      s    rC   c                 C   s   t | ||}|jddS )zj
    Get a value from the WSGI environ dictionary as str.

    key and default should be str objects.
    r4   )errors)rC   rn   rs   r   r   r   rM      s    rM   N)ior   Zdjango.confr   Zdjango.corer   Zdjango.core.handlersr   Zdjango.httpr   r   r   Zdjango.urlsr	   Zdjango.utils.encodingr
   Zdjango.utils.functionalr   Zdjango.utils.regex_helperr   rp   r   r'   BaseHandlerrS   r0   r/   rC   rM   r   r   r   r   <module>   s    09"!