
    Ui8                     .   d dl Z 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
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jB                  d      Z"d Z# G d de      Z$ G d dejJ                        Z&y)    N)defaultdict)aclosing)ThreadSensitiveContextsync_to_async)settings)signals)RequestAbortedRequestDataTooBig)base)FileResponseHttpRequestHttpResponseHttpResponseBadRequestHttpResponseServerError	QueryDictparse_cookie)set_script_prefix)cached_propertyzdjango.requestc                 n    t         j                  rt         j                  S | j                  dd      xs dS )zM
    Return the script prefix to use from either the scope or a setting.
    	root_path )r   FORCE_SCRIPT_NAMEget)scopes    L/var/www/opsc/venv/lib/python3.12/site-packages/django/core/handlers/asgi.pyget_script_prefixr      s/     !!)))99["%++    c                        e Zd ZdZdZd Zed        Z fdZd Z	d Z
d Z ee	e
      Z ee      Zed	        Z fd
Z xZS )ASGIRequestzv
    Custom request subclass that decodes from an ASGI-standard request dict
    and wraps request body handling.
    <   c           
         || _         d| _        d| _        d | _        |d   | _        t        |      | _        | j                  r$|d   j                  | j                        | _        n
|d   | _        | j                   d   j                         | _
        | j                   j                  dd      }t        |t              r|j                         }| j                  || j                  | j                  ddd| _        | j                   j                  d      rZ| j                   d   d	   | j                  d
<   | j                  d
   | j                  d<   | j                   d   d   | j                  d<   | j                   j                  d      rH| j                   d   d	   | j                  d<   t!        | j                   d   d         | j                  d<   nd| j                  d<   d| j                  d<   t#        t$              }| j                   j                  dg       D ]  \  }}|j                  d      }|dk(  rd}n+|dk(  rd}n#d|j                         j'                  dd      z  }|j                  d      }|dk(  r|j)                  d      }||   j+                  |        |j-                  dd       x}rdj/                  |      | j                  d<   | j                  j1                  |j3                         D ci c]  \  }}|dj/                  |       c}}       | j5                  | j                         || _        d | _        y c c}}w )NFpathmethodquery_stringr   T)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-_HTTP_COOKIEz; ,)r   _post_parse_error_read_startedresolver_matchr"   r   script_nameremoveprefix	path_infoupperr#   r   
isinstancebytesdecodeMETAstrr   listreplacerstripappendpopjoinupdateitems_set_content_type_params_stream)	selfr   	body_filer$   _headersnamevaluecorrected_namecookie_headers	            r   __init__zASGIRequest.__init__1   s   
!&""&M	,U3"6]778H8HIDN"6]DNjj*002zz~~nb9lE*'..0L"kk(++ $!%
	 ::>>(#'+zz(';A'>DIIm$'+yy'?DIIm$'+zz(';A'>DIIm$::>>(#'+zz(';A'>DIIm$'*4::h+?+B'CDIIm$'0DIIm$'*DIIm$t$::>>)R8 	3KD%;;x(D''!1'!/!*TZZ\-A-A#s-K!K LL*E.T*^$++E2	3 %LL===='+yy'?DIIm$		8>>CSTKD%$/TU%%dii0 " Us   =M
c                 2    t        | j                  d         S )Nr&   )r   rE   rQ   s    r   GETzASGIRequest.GETp   s    >233r   c                 Z    | j                   j                  d      xs t        |          S )Nscheme)r   r   super_get_schemerQ   	__class__s    r   r_   zASGIRequest._get_schemet   s#    zz~~h'@57+>+@@r   c                 R    t        | d      s| j                          | j                  S )N_post)hasattr_load_post_and_filesrc   rZ   s    r   	_get_postzASGIRequest._get_postw   s"    tW%%%'zzr   c                     || _         y N)rc   )rQ   posts     r   	_set_postzASGIRequest._set_post|   s	    
r   c                 R    t        | d      s| j                          | j                  S )N_files)rd   re   rl   rZ   s    r   
_get_fileszASGIRequest._get_files   s"    tX&%%'{{r   c                 L    t        | j                  j                  dd            S )Nr9   r   )r   rE   r   rZ   s    r   COOKIESzASGIRequest.COOKIES   s    DIIMM-<==r   c                 V    t         |           | j                  j                          y rh   )r^   closerP   r`   s    r   rq   zASGIRequest.close   s    r   )__name__
__module____qualname____doc__body_receive_timeoutrX   r   r[   r_   rf   rj   rm   propertyPOSTFILESro   rq   __classcell__ra   s   @r   r   r   '   ss     =#~ 4 4A

 Iy)DZ E> > r   r   c                   n     e Zd ZdZeZdZ fdZd Zd Z	d Z
d Zd Zd	 Z fd
Zd Zed        Z xZS )ASGIHandlerzHandler for ASGI requests.i   c                 F    t         |           | j                  d       y )NT)is_async)r^   rX   load_middlewarer`   s    r   rX   zASGIHandler.__init__   s    d+r   c                    K   |d   dk7  rt        d|d   z        t               4 d{    | j                  |||       d{    ddd      d{    y7 07 7 	# 1 d{  7  sw Y   yxY ww)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)rQ   r   receivesends       r   __call__zASGIHandler.__call__   s      =F"G%PV-W  *+ 	4 	4++eWd333	4 	4 	43	4 	4 	4 	4sV   (A6AA6A!AA!
A6AA6A!A6!A3'A*(A3/A6c                    K   	  j                  |       d{   }t        t        |             t        j
                  j                   j                  |       d{     j                  ||      \  }}|M|j                           j                  ||       d{     t        |j                                d{    y fd}t        j                   j                  |            t        j                   |||            g}t        j                  |t        j                          d{    |D ]?  }	|	j#                         r	 |	j%                          %|	j)                          	 |	 d{    A 	 |d   j%                         }
 t        |
j                                d{    |j                          y7 # t        $ r Y yw xY w7 x7 :7 7 # t        $ r Y t&        $ r |j                           w xY w7 # t        j*                  $ r Y w xY w7 u# t        j*                  $ r6 t        j,                  j                   j                         d{  7   Y w xY ww)zK
        Handles the ASGI request. Called via the __call__ method.
        N)senderr   c                    K   j                  |        d {   }	 j                  ||       d {    |S 7 !7 # t        j                  $ r Y |S w xY wwrh   )run_get_responsesend_responseasyncioCancelledError)requestr   responserQ   s      r   process_requestz+ASGIHandler.handle.<locals>.process_request   sa     !227;;H((4888
 O <8)) O	s:   A:A> <> A> AAAA)return_whenr,   )r   )	read_bodyr	   r   r   r   request_startedasendra   create_requestrq   r   r   r   create_tasklisten_for_disconnectwaitFIRST_COMPLETEDdoneresultAssertionErrorcancelr   request_finished)rQ   r   r   r   rR   r   error_responser   taskstaskr   s   `          r   r   zASGIHandler.handle   s(    
	"nnW55I 	+E23%%++4>>+OOO"&"5"5eY"G?OO$$^T:::5- 4 45777	   : :7 CD >?
 ll5g.E.EFFF 	Dyy{KKM JJ	&	2Qx(H 0-/111{ 6 		 	P
 ;7, 	G & % OO% --  2 %% 	H**000GGG	Hs  I4G	 GG	 AI4 G!A I4!G"!I4GA2I46G!7I4G#!I43H8H9H=I4 H( I40H&1I4G	 		GI4GI4I4I4!I4#	H,I4.HI4HH# I4"H##I4(A I1(I+)I1.I40I11I4c                 j   K    |        d{   }|d   dk(  r
t               J d|d   z         7 #w)z&Listen for disconnect from the client.Nr   http.disconnectz+Invalid ASGI message after request body: %s)r	   )rQ   r   messages      r   r   z!ASGIHandler.listen_for_disconnect   s>     	/6?// ""UCgfoUUu	 "s   31$3c                    K   | j                  |       d{   }| j                  |_        t        |t              r| j
                  |_        |S 7 8w)zGet async response.N)get_response_asyncra   _handler_classrB   r   
chunk_size
block_size)rQ   r   r   s      r   r   zASGIHandler.run_get_response   sI      0099"&.. h-"&//H :s   AA9Ac                   K   t        j                  t        j                  d      }	  |        d{   }|d   dk(  r|j	                          t               d|v rNt        |dd      }|r+t        |j                  d	      } ||d          d{    n|j                  |d          |j                  d
d      sn|j                  d       |S 7 7 Bw)z+Reads an HTTP body from an ASGI connection.zw+b)max_sizemodeNr   r   body_rolledF)thread_sensitive	more_bodyr   )tempfileSpooledTemporaryFiler   FILE_UPLOAD_MAX_MEMORY_SIZErq   r	   getattrr   writer   seek)rQ   r   rR   r   on_diskasync_writes         r   r   zASGIHandler.read_body  s      1199
	 #IoGv"33!$&& !)Y>"/!).#K &gfo666OOGFO4 ;;{E2) * 	q+ & 7s#   1CCACCACCc                     	 | j                  ||      dfS # t        $ r; t        j                  dt	        j
                         ddi       dt               fcY S t        $ r dt        dd      fcY S w xY 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   )rQ   r   rR   s      r   r   zASGIHandler.create_request  s    

	K%%eY7==! 	2NN2$c*  
 /111  	K&=cJJJ	Ks    AA3A32A3c                     	 t         |   |||      S # t        $ r4 t        t        j
                  rt        j                         ndd      cY S w xY w)z#Last-chance handler for exceptions.zInternal Server Errorz
text/plain)content_type)r^   handle_uncaught_exception	Exceptionr   r   DEBUG	traceback
format_exc)rQ   r   resolverr   ra   s       r   r   z%ASGIHandler.handle_uncaught_exception0  sP    	74WhQQ 	**2..	$$&>U) 	s    :AAc           	        K   g }|j                         D ]l  \  }}t        |t              r|j                  d      }t        |t              r|j                  d      }|j	                  t        |      t        |      f       n |j                  j                         D ]2  }|j	                  d|j                         j                  d      f       4  |d|j                  |d       d{    |j                  rVt        t        |            4 d{   }|2 3 d{   }| j                  |      D ]  \  }	}
 |d|	dd	       d{     7| j                  |j                        D ]  \  }	} |d|	| d	       d{     y7 7 x7 o7 F6 ddd      d{  7   n# 1 d{  7  sw Y   nxY w |d
di       d{  7   y7 Kw)z)Encode and send a response out over ASGI.asciir4   s
   Set-Cookiezhttp.response.start)r   r   r3   Nzhttp.response.bodyT)r   r   r   r   )rN   rB   rF   encoderJ   rC   cookiesvaluesOutputStringr   	streamingr   aiterchunk_bytescontent)rQ   r   r   response_headersheaderrU   cr   partchunkr8   lasts               r   r   zASGIHandler.send_response<  s     %^^- 	CMFE&#&w/%%X.##U6]E%L$AB	C !!((* 	WA##]ANN4D4K4KG4T$UV	W -"..+
 	
 	
 
  h0  G")  $$($4$4T$: 
q"(<(- .2	 	 	
   $//0@0@A t 4 %)-X  ?	
	 #*      45666
s   C*G,F-(GFGF'F F!F$'F'F
F'1GGGGFF'F'G F#!G'F9-F0.F95G	G
Gc              #      K   d}|s|df y|t        |      k  rN|||| j                  z    || j                  z   t        |      k\  f || j                  z  }|t        |      k  rMyyw)z
        Chunks some data up so it can be sent in reasonable size messages.
        Yields (chunk, last_chunk) tuples.
        r   TN)lenr   )clsdatapositions      r   r   zASGIHandler.chunk_bytesr  sy      *T"X3>> 9:CNN*s4y8  &H T"s   A&A+)A+)rr   rs   rt   ru   r   r   r   rX   r   r   r   r   r   r   r   r   classmethodr   rz   r{   s   @r   r}   r}      sV    $MJ,4CJV	<K"
4l ' 'r   r}   )'r   loggingr   r   r   collectionsr   
contextlibr   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.functionalr   	getLoggerr   r   r   BaseHandlerr}    r   r   <module>r      s{      
   #  >    D %   * 3			+	,,f+ fRq'$"" q'r   