o
    g#/                     @   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r,|d | jr,|d t| jd  | _n|d | _| jrFd| j	d| j
dddf | _n|d | _| j d  | _| j d	d}t|trc| }| 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r| j d d | jd< t| j d d | jd< n
d| jd< d| jd< | j dg D ]9\}}|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_HOSTREMOTE_PORTserverSERVER_NAMESERVER_PORTunknown0headerslatin1zcontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-_,)scope_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)selfr0   	body_filer   namevaluecorrected_name rH   V/var/www/rescue_company/venv/lib/python3.10/site-packages/django/core/handlers/asgi.py__init__&   s`   




	





zASGIRequest.__init__c                 C   s   t | jd S )Nr   )r   r?   rC   rH   rH   rI   GETi   s   zASGIRequest.GETc                    s   | j dp
t  S )Nscheme)r0   r4   super_get_schemerK   	__class__rH   rI   rO   m   s   zASGIRequest._get_schemec                 C      t | ds	|   | jS )N_post)hasattr_load_post_and_filesrS   rK   rH   rH   rI   	_get_postp      
zASGIRequest._get_postc                 C   s
   || _ d S N)rS   )rC   postrH   rH   rI   	_set_postu   s   
zASGIRequest._set_postc                 C   rR   )N_files)rT   rU   r[   rK   rH   rH   rI   
_get_filesx   rW   zASGIRequest._get_filesc                 C   s   t | jddS )NHTTP_COOKIEr   )r   r?   r4   rK   rH   rH   rI   COOKIES   s   zASGIRequest.COOKIESc                    s   t    | j  d S rX   )rN   closerB   rK   rP   rH   rI   r_      s   
zASGIRequest.close)__name__
__module____qualname____doc__body_receive_timeoutrJ   r   rL   rO   rV   rZ   r\   propertyPOSTFILESr^   r_   __classcell__rH   rH   rP   rI   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)rN   rJ   load_middlewarerK   rP   rH   rI   rJ      s   
zASGIHandler.__init__c              	      sr   |d dkrt d|d  t 4 I dH  | |||I dH  W d  I dH  dS 1 I dH s2w   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)rC   r0   receivesendrH   rH   rI   __call__   s   
.zASGIHandler.__call__c                    s   z
|  |I dH }W n
 ty   Y dS w t| | ttjjdd| j|dI dH  | 	||\}}|du rH|
  | ||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)senderr0   )	read_bodyr   r   get_script_prefixr   r   request_startedrq   rQ   create_requestr_   send_responseget_response_async_handler_classr<   r	   
chunk_size
block_size)rC   r0   rp   rq   rD   requesterror_responseresponserH   rH   rI   ro      s(   
zASGIHandler.handlec                    sn   t jtjdd}	 | I dH }|d dkr|  t d|v r(||d  |dd	s/nq
|d
 |S )z+Reads an HTTP body from an ASGI connection.zw+b)max_sizemodeTNrl   zhttp.disconnectbody	more_bodyFr   )	tempfileSpooledTemporaryFiler   FILE_UPLOAD_MAX_MEMORY_SIZEr_   r   writer4   seek)rC   rp   rD   messagerH   rH   rI   rv      s    
zASGIHandler.read_bodyc                 C   sh   z	|  ||dfW S  ty#   tjdt ddid dt f Y S  ty3   dtdddf Y S w )	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   )rC   r0   rD   rH   rH   rI   ry      s   zASGIHandler.create_requestc                    s@   z	t  |||W S  ty   ttjrt nddd Y S w )z#Last-chance handler for exceptions.zInternal Server Errorz
text/plain)content_type)rN   handle_uncaught_exception	Exceptionr   r   DEBUG	traceback
format_exc)rC   r   resolverr   rP   rH   rI   r      s   
z%ASGIHandler.handle_uncaught_exceptionc              	      s~  g }|  D ]#\}}t|tr|d}t|tr|d}|t|t|f q|j D ]}|d|jddd	 f q0|d|j
|dI dH  |jrt| 4 I dH *}|2 z3 dH W }| |D ]\}	}
|d	|	d
dI dH  qjq_6 W d  I dH  n1 I dH sw   Y  |dd	iI dH  n| |jD ]\}	}|d	|	| dI dH  qt|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)rl   r   r)   Nzhttp.response.bodyT)rl   r   r   rl   rs   )itemsr<   r@   encodeappendr=   cookiesvaluesoutputstripr   	streamingr   	__aiter__chunk_bytescontentr   r_   )rC   r   rq   response_headersr   rF   cr   partchunkr.   lastrH   rH   rI   rz      sP   




(zASGIHandler.send_responsec                 c   sh    d}|s|dfV  dS |t |k r2|||| j  || j t |kfV  || j7 }|t |k sdS dS )z
        Chunks some data up so it can be sent in reasonable size messages.
        Yields (chunk, last_chunk) tuples.
        r   TN)r7   r}   )clsdatapositionrH   rH   rI   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_NAMEr4   )rC   r0   rH   rH   rI   rw   ;  s   zASGIHandler.get_script_prefix)r`   ra   rb   rc   r   r   r}   rJ   rr   ro   rv   ry   r   rz   classmethodr   rw   rh   rH   rH   rP   rI   ri      s    8
ri   )#loggingr   r   r   asgiref.syncr   r   django.confr   django.corer   django.core.exceptionsr   r   django.core.handlersr   django.httpr	   r
   r   r   r   r   r   django.urlsr   django.utils.asyncior   django.utils.functionalr   	getLoggerr   r   BaseHandlerri   rH   rH   rH   rI   <module>   s     $	
m