U
    5øi•  ã                   @   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                   @   s8   e Zd ZdZd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Úbuf_size)Úselfr   Úlimitr   © r   ú=/tmp/pip-unpacked-wheel-gcyiijx6/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)r   )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   r3   Úscript_namer4   Úcontent_lengthr   r   r   r   A   s&    
ÿ



zWSGIRequest.__init__c                 C   s   | j  d¡S )Nzwsgi.url_scheme)r3   r;   ©r   r   r   r   Ú_get_scheme[   s    zWSGIRequest._get_schemec                 C   s   t | jddƒ}t|| jd�S )NÚQUERY_STRINGr+   )Úencoding)Úget_bytes_from_wsgir3   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_filesrH   rA   r   r   r   Ú	_get_postd   s    
zWSGIRequest._get_postc                 C   s
   || _ d S ©N)rH   )r   Úpostr   r   r   Ú	_set_posti   s    zWSGIRequest._set_postc                 C   s   t | jddƒ}t|ƒS )NZHTTP_COOKIEr+   )Úget_str_from_wsgir3   r   )r   Z
raw_cookier   r   r   ÚCOOKIESl   s    zWSGIRequest.COOKIESc                 C   s   t | dƒs|  ¡  | jS )NÚ_files)rI   rJ   rQ   rA   r   r   r   ÚFILESq   s    
zWSGIRequest.FILESN)r%   r&   r'   r   rB   r   rG   rK   rN   rP   ÚpropertyrR   Ú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 rL   )Ú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senderr3   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	   r1   r   Zrequest_startedÚsendrZ   Úrequest_classZget_responseZ_handler_classÚstatus_codeZreason_phraseÚitemsÚcookiesÚvaluesÚgetattrr;   Úcloser`   Ú
block_size)r   r3   Zstart_responseÚrequestÚresponseÚstatusÚresponse_headersr   r   r   Ú__call__�   s    

þ

zWSGIHandler.__call__)r%   r&   r'   r)   rb   r   rn   Ú__classcell__r   r   rY   r   rU   z   s   rU   c                 C   s   t | ddƒ}t|ƒ ¡ S )z0Return the HTTP request's PATH_INFO as a string.r-   r*   )rE   r
   Údecode)r3   r4   r   r   r   r2   ˜   s    r2   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_NAMErE   Ú_slashes_reÚsubr   rp   )r3   Z
script_urlr4   r?   r   r   r   r1   Ÿ   s    
r1   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)r;   Úencode©r3   ÚkeyÚdefaultÚvaluer   r   r   rE   ¾   s    rE   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.
    r6   )Úerrors)rE   rp   ru   r   r   r   rO   Ë   s    rO   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   rr   r   r)   ÚBaseHandlerrU   r2   r1   rE   rO   r   r   r   r   Ú<module>   s    1: