a
    Qh#/                     @   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
 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 d d
lmZ e dZG dd deZ G dd dej!Z"dS )    N)ThreadSensitiveContextsync_to_async)settings)signals)RequestAbortedRequestDataTooBig)base)FileResponseHttpRequestHttpResponseHttpResponseBadRequestHttpResponseServerError	QueryDictparse_cookie)set_script_prefix)aclosing)cached_propertyzdjango.requestc                       sz   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 f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 dd| _| jrX|d | jrX|d t| jd  | _n
|d | _| jrd| j	d| j
dddf | _n
|d | _| j d  | _| j d	d}t|tr| }| j|| j| jd
d
d| _| j dr&| j d d | jd< | jd | jd< | j d d | jd< | j drb| j d d | jd< t| j d d | jd< nd| jd< d| jd< | j dg D ]z\}}|d}|dkrd}n$|dkrd}nd| 
dd }|d}|| jv r| j| d | }|| j|< q| | j || _d | _d S ) NF	root_path pathz%s/%s/   methodquery_stringT)REQUEST_METHODQUERY_STRINGSCRIPT_NAME	PATH_INFOzwsgi.multithreadzwsgi.multiprocessclientr   REMOTE_ADDRREMOTE_HOSTZREMOTE_PORTserverSERVER_NAMESERVER_PORTunknown0headerslatin1zcontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-_,)scopeZ_post_parse_error_read_startedresolver_matchgetscript_name
startswithlen	path_inforstripreplacer   upperr   
isinstancebytesdecodeMETAstr_set_content_type_params_stream)selfr/   	body_filer   namevalueZcorrected_name rE   R/var/www/sistema_ama/venv/lib/python3.9/site-packages/django/core/handlers/asgi.py__init__&   s`    




	





zASGIRequest.__init__c                 C   s   t | jd S )Nr   )r   r=   rA   rE   rE   rF   GETi   s    zASGIRequest.GETc                    s   | j dpt  S )Nscheme)r/   r2   super_get_schemerH   	__class__rE   rF   rL   m   s    zASGIRequest._get_schemec                 C   s   t | ds|   | jS )N_post)hasattr_load_post_and_filesrO   rH   rE   rE   rF   	_get_postp   s    
zASGIRequest._get_postc                 C   s
   || _ d S N)rO   )rA   postrE   rE   rF   	_set_postu   s    zASGIRequest._set_postc                 C   s   t | ds|   | jS )N_files)rP   rQ   rV   rH   rE   rE   rF   
_get_filesx   s    
zASGIRequest._get_filesc                 C   s   t | jddS )NHTTP_COOKIEr   )r   r=   r2   rH   rE   rE   rF   COOKIES   s    zASGIRequest.COOKIESc                    s   t    | j  d S rS   )rK   closer@   rH   rM   rE   rF   rZ      s    
zASGIRequest.close)__name__
__module____qualname____doc__Zbody_receive_timeoutrG   r   rI   rL   rR   rU   rW   propertyPOSTFILESrY   rZ   __classcell__rE   rE   rM   rF   r      s   C


r   c                       sp   e Zd ZdZeZdZ fddZ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.i   c                    s   t    | jdd d S )NT)is_async)rK   rG   load_middlewarerH   rM   rE   rF   rG      s    
zASGIHandler.__init__c              	      sn   |d dkrt d|d  t 4 I dH * | |||I dH  W d  I dH  qj1 I dH s`0    Y  dS )zV
        Async entrypoint - parses the request and hands off to get_response.
        typehttpz5Django can only handle ASGI/HTTP connections, not %s.N)
ValueErrorr   handle)rA   r/   receivesendrE   rE   rF   __call__   s    
zASGIHandler.__call__c                    s   z|  |I dH }W n ty(   Y dS 0 t| | ttjjdd| j|dI dH  | 	||\}}|du r|
  | ||I dH  dS | |I dH }| j|_t|tr| j|_| ||I dH  dS )zK
        Handles the ASGI request. Called via the __call__ method.
        NTthread_sensitive)senderr/   )	read_bodyr   r   get_script_prefixr   r   request_startedrk   rN   create_requestrZ   send_responseget_response_async_handler_classr:   r	   
chunk_size
block_size)rA   r/   rj   rk   rB   requestZerror_responseresponserE   rE   rF   ri      s$    
zASGIHandler.handlec                    sj   t jtjdd}| I dH }|d dkr6|  t d|v rL||d  |ddsq\q|d	 |S )
z+Reads an HTTP body from an ASGI connection.zw+b)max_sizemodeNrf   zhttp.disconnectbody	more_bodyFr   )	tempfileSpooledTemporaryFiler   FILE_UPLOAD_MAX_MEMORY_SIZErZ   r   writer2   seek)rA   rj   rB   messagerE   rE   rF   rp      s    
zASGIHandler.read_bodyc                 C   sl   z|  ||dfW S  tyF   tjdt ddid dt f Y S  tyf   dtdddf Y S 0 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sysr   r   r   r   )rA   r/   rB   rE   rE   rF   rs      s    zASGIHandler.create_requestc                    sD   zt  |||W S  ty>   ttjr0t nddd Y S 0 dS )z#Last-chance handler for exceptions.zInternal Server Errorz
text/plain)content_typeN)rK   handle_uncaught_exception	Exceptionr   r   DEBUG	traceback
format_exc)rA   ry   resolverr   rM   rE   rF   r      s    z%ASGIHandler.handle_uncaught_exceptionc              	      s  g }|  D ]F\}}t|tr(|d}t|tr<|d}|t|t|f q|j D ]$}|d|jddd	 f q^|d|j
|dI dH  |jr:t| 4 I dH V}|2 z63 dH W }| |D ]\}	}
|d	|	d
dI dH  qq6 W d  I dH  q&1 I dH s0    Y  |dd	iI dH  n0| |jD ]"\}	}|d	|	| dI dH  qFt|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)rf   r   r(   Nzhttp.response.bodyT)rf   r}   r~   rf   rm   )itemsr:   r>   encodeappendr;   cookiesvaluesoutputstripr   	streamingr   	__aiter__chunk_bytescontentr   rZ   )rA   rz   rk   response_headersr   rD   cr   partchunkr-   lastrE   rE   rF   rt      sH    




>
zASGIHandler.send_responsec                 c   sX   d}|s|dfV  dS |t |k rT|||| j  || j t |kfV  || j7 }qdS )z
        Chunks some data up so it can be sent in reasonable size messages.
        Yields (chunk, last_chunk) tuples.
        r   TN)r5   rw   )clsdatapositionrE   rE   rF   r   *  s    
zASGIHandler.chunk_bytesc                 C   s   t jrt jS |ddpdS )zU
        Return the script prefix to use from either the scope or a setting.
        r   r   )r   FORCE_SCRIPT_NAMEr2   )rA   r/   rE   rE   rF   rq   ;  s    zASGIHandler.get_script_prefix)r[   r\   r]   r^   r   r   rw   rG   rl   ri   rp   rs   r   rt   classmethodr   rq   rb   rE   rE   rM   rF   rc      s   8
rc   )#loggingr   r   r   asgiref.syncr   r   django.confr   Zdjango.corer   django.core.exceptionsr   r   Zdjango.core.handlersr   django.httpr	   r
   r   r   r   r   r   django.urlsr   Zdjango.utils.asyncior   django.utils.functionalr   	getLoggerr   r   BaseHandlerrc   rE   rE   rE   rF   <module>   s   $	
m