3
v^b                 @   s   d dl Z 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 e j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 )    N)BytesIO)settings)signals)base)HttpRequest	QueryDictparse_cookie)set_script_prefix)repercent_broken_unicode)cached_propertys   /+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.@   i   c             C   s   || _ || _d| _|| _d S )N    )stream	remainingbufferbuf_size)selfr   limitr    r   =/usr/lib/python3.6/site-packages/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|}|  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 | j  }d| _ nN|t| j k rL| j d | }| j |d  | _ n | j | j|t| j   }d| _ |S )Nr   )r   r   r   )r   r   r   r   r   r   r       s    zLimitedStream.readc             C   s   xZd| j krZ|d ks"t| j |k rZ|r<| j|t| j  }n| j }|sJP |  j |7  _ qW t| j }|rv|j|}n|j }|j | _ |S )N   
)r   r   r   r   readliner   )r   r   chunksioliner   r   r   r   ,   s    

zLimitedStream.readlinei      )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|jd|jdddf | _|| _|| jd< || jd< |d j | _	| j
| yt|j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pathMETAuppermethod_set_content_type_paramsintget
ValueError	TypeErrorr   _stream_read_startedresolver_match)r   r1   script_namer2   content_lengthr   r   r   r   A   s$    




zWSGIRequest.__init__c             C   s   | j jdS )Nzwsgi.url_scheme)r1   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_wsgir1   r   	_encoding)r   Zraw_query_stringr   r   r   GET^   s    zWSGIRequest.GETc             C   s   t | ds| j  | jS )N_post)hasattr_load_post_and_filesrI   )r   r   r   r   	_get_postd   s    
zWSGIRequest._get_postc             C   s
   || _ d S )N)rI   )r   postr   r   r   	_set_posti   s    zWSGIRequest._set_postc             C   s   t | jdd}t|S )NHTTP_COOKIEr)   )get_str_from_wsgir1   r   )r   Z
raw_cookier   r   r   COOKIESl   s    zWSGIRequest.COOKIESc             C   s   t | ds| j  | jS )N_files)rJ   rK   rR   )r   r   r   r   FILESq   s    
zWSGIRequest.FILESN)r#   r$   r%   r   rC   r   rH   rL   rN   rQ   propertyrS   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|| | j  d S )N)superr   load_middleware)r   argskwargs)	__class__r   r   r   }   s    zWSGIHandler.__init__c             C   s   t t| tjj| j|d | j|}| j|}| j|_d|j	|j
f }|j dd |jj D }||| t|dd d k	r|jdr|j|j_|d |j|j}|S )N)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   request_startedsendr[   request_classget_response_handler_classstatus_codereason_phraseitemscookiesvaluesgetattrr;   closerb   
block_size)r   r1   Zstart_responserequestresponsestatusZresponse_headersr   r   r   __call__   s    



zWSGIHandler.__call__)r#   r$   r%   r'   re   r   rs   __classcell__r   r   )r[   r   rV   z   s   rV   c             C   s   t | dd}t|j S )z0Return the HTTP request's PATH_INFO as a string.r+   r(   )rF   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jd|}t| dd}|rb|dt|  n|}nt| dd}|j 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   FORCE_SCRIPT_NAMErF   _slashes_resubr   ru   )r1   Z
script_urlr2   rA   r   r   r   r/      s    
r/   c             C   s   | j ||}|j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)r1   keydefaultvaluer   r   r   rF      s    rF   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)rF   ru   )r1   r{   r|   r}   r   r   r   rP      s    rP   )reior   django.confr   Zdjango.corer   Zdjango.core.handlersr   django.httpr   r   r   django.urlsr	   django.utils.encodingr
   django.utils.functionalr   compilerx   r   r'   BaseHandlerrV   r0   r/   rF   rP   r   r   r   r   <module>   s    
1: