3
g+                 @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d d	lmZ e jd
ZG dd deZG dd dejZdS )    N)sync_to_async)settings)signals)RequestAbortedRequestDataTooBig)base)FileResponseHttpRequestHttpResponseHttpResponseBadRequestHttpResponseServerError	QueryDictparse_cookie)set_script_prefix)cached_propertyzdjango.requestc                   sn   e Zd ZdZdZdd Zedd Z fddZd	d
 Z	dd Z
dd Zee	e
ZeeZedd Z  ZS )ASGIRequestzv
    Custom request subclass that decodes from an ASGI-standard request dict
    and wraps request body handling.
    <   c             C   s   || _ d| _d| _d | _| j jdd| _| jrX|d j| jrX|d t| jd  | _n
|d | _| jrd| jj	d| jj
dddf | _n
|d | _| j d j | _| j jd	d}t|tr|j }| j|| j| jd
d
d| _| j jdr&| j d d | jd< | jd | jd< | j d d | jd< | j jdrb| j d d | jd< t| j d d | jd< nd| jd< d| jd< x| j jdg D ]z\}}|jd}|dkrd}n$|dkrd}nd|j j
dd }|jd}|| jkr| j| d | }|| j|< qW | j| j || _d | _d S ) NF	root_path pathz%s/%s/   methodquery_stringT)REQUEST_METHODQUERY_STRINGZSCRIPT_NAMEZ	PATH_INFOzwsgi.multithreadzwsgi.multiprocessclientr   ZREMOTE_ADDRZREMOTE_HOSTZREMOTE_PORTserverZSERVER_NAMEZSERVER_PORTunknown0headerslatin1zcontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-_,)scopeZ_post_parse_errorZ_read_startedZresolver_matchgetscript_name
startswithlenZ	path_inforstripreplacer   upperr   
isinstancebytesdecodeMETAstrZ_set_content_type_params_stream)selfr'   	body_filer   namevalueZcorrected_name r9   W/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/core/handlers/asgi.py__init__   s\    










zASGIRequest.__init__c             C   s   t | jd S )Nr   )r   r2   )r5   r9   r9   r:   GETb   s    zASGIRequest.GETc                s   | j jdpt j S )Nscheme)r'   r(   super_get_scheme)r5   )	__class__r9   r:   r?   f   s    zASGIRequest._get_schemec             C   s   t | ds| j  | jS )N_post)hasattr_load_post_and_filesrA   )r5   r9   r9   r:   	_get_posti   s    
zASGIRequest._get_postc             C   s
   || _ d S )N)rA   )r5   postr9   r9   r:   	_set_postn   s    zASGIRequest._set_postc             C   s   t | ds| j  | jS )N_files)rB   rC   rG   )r5   r9   r9   r:   
_get_filesq   s    
zASGIRequest._get_filesc             C   s   t | jjddS )NZHTTP_COOKIEr   )r   r2   r(   )r5   r9   r9   r:   COOKIESy   s    zASGIRequest.COOKIES)__name__
__module____qualname____doc__Zbody_receive_timeoutr;   r   r<   r?   rD   rF   rH   propertyPOSTZFILESrI   __classcell__r9   r9   )r@   r:   r      s   C
r   c                   sh   e Zd ZdZeZdZ fddZdd Zdd	 Z	d
d Z
 fddZdd Zedd Zdd Z  ZS )ASGIHandlerzHandler for ASGI requests.      c                s   t  j  | jdd d S )NT)Zis_async)r>   r;   Zload_middleware)r5   )r@   r9   r:   r;      s    
zASGIHandler.__init__c                s   |d dkrt d|d  y| j|I dH }W n tk
rD   dS X t| j| ttjjdd| j	|dI dH  | j
||\}}|dkr| j||I dH  dS | j|I dH }| j	|_t|tr| j|_| j||I dH  dS )zV
        Async entrypoint - parses the request and hands off to get_response.
        typehttpz5Django can only handle ASGI/HTTP connections, not %s.NT)thread_sensitive)Zsenderr'   )
ValueError	read_bodyr   r   get_script_prefixr   r   Zrequest_startedsendr@   create_requestsend_responseZget_response_asyncZ_handler_classr/   r   
chunk_size
block_size)r5   r'   receiverZ   r6   requestZerror_responseresponser9   r9   r:   __call__   s&     
zASGIHandler.__call__c                sf   t jtjdd}xF| I dH }|d dkr0t d|krF|j|d  |jddsP qW |jd	 |S )
z*Reads a HTTP body from an ASGI connection.zw+b)max_sizemodeNrT   zhttp.disconnectbody	more_bodyFr   )tempfileSpooledTemporaryFiler   ZFILE_UPLOAD_MAX_MEMORY_SIZEr   writer(   seek)r5   r_   r6   messager9   r9   r:   rX      s    
zASGIHandler.read_bodyc             C   sf   y| j ||dfS  tk
rB   tjdtj ddid dt fS  tk
r`   dtdddfS X dS )	z
        Create the Request object and returns either (request, None) or
        (None, response) if there is an error response.
        Nz Bad Request (UnicodeDecodeError)status_codei  )exc_infoextraz413 Payload too largei  )status)	request_classUnicodeDecodeErrorloggerwarningsysrm   r   r   r
   )r5   r'   r6   r9   r9   r:   r[      s    
zASGIHandler.create_requestc                s@   yt  j|||S  tk
r:   ttjr0tj ndddS X dS )z#Last-chance handler for exceptions.zInternal Server Errorz
text/plain)content_typeN)r>   handle_uncaught_exception	Exceptionr   r   DEBUG	traceback
format_exc)r5   r`   resolverrm   )r@   r9   r:   rv      s    z%ASGIHandler.handle_uncaught_exceptionc                sH  g }xR|j  D ]F\}}t|tr*|jd}t|tr>|jd}|jt|t|f qW x2|jj D ]$}|jd|jddjdj	 f qdW |d|j
|dI dH  |jrx:|D ]2}x,| j|D ]\}}	|d	|d
dI dH  qW qW |dd	iI dH  n4x2| j|jD ]"\}}
|d	||
 dI dH  qW t|jd
d I dH  dS )z)Encode and send a response out over ASGI.asciir!   s
   Set-Cookier   )headerzhttp.response.start)rT   ro   r    Nzhttp.response.bodyT)rT   re   rf   rT   )rV   )itemsr/   r3   encodeappendr0   cookiesvaluesoutputstriprl   Z	streamingchunk_bytescontentr   close)r5   ra   rZ   response_headersr}   r8   cpartchunkr%   lastr9   r9   r:   r\      s8    



 
zASGIHandler.send_responsec             c   s\   d}|s|dfV  dS x@|t |k rV|||| j  || j t |kfV  || j7 }qW dS )z
        Chunks some data up so it can be sent in reasonable size messages.
        Yields (chunk, last_chunk) tuples.
        r   TN)r+   r]   )clsdatapositionr9   r9   r:   r     s    
zASGIHandler.chunk_bytesc             C   s   t jrt jS |jddpdS )zU
        Return the script prefix to use from either the scope or a setting.
        r   r   )r   ZFORCE_SCRIPT_NAMEr(   )r5   r'   r9   r9   r:   rY     s    zASGIHandler.get_script_prefixi   )rJ   rK   rL   rM   r   rp   r]   r;   rb   rX   r[   rv   r\   classmethodr   rY   rP   r9   r9   )r@   r:   rQ   ~   s   "/rQ   ) loggingrt   rg   ry   Zasgiref.syncr   Zdjango.confr   Zdjango.corer   Zdjango.core.exceptionsr   r   Zdjango.core.handlersr   Zdjango.httpr   r	   r
   r   r   r   r   Zdjango.urlsr   Zdjango.utils.functionalr   	getLoggerrr   r   BaseHandlerrQ   r9   r9   r9   r:   <module>   s   $
h