a
    ¥Q•h#/  ã                   @   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rŒd| 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�r¦d}n$|dk�r¶d}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  qÔq¾6 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