
    h6                     "   S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJrJ	r	  S SK
Jr  S SKJr  S SKJrJr  S SKJr  S SKJrJrJrJrJrJrJr  S S	KJr  S S
KJr  \R>                  " S5      r S r! " S S\5      r" " S S\RF                  5      r$g)    N)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                     [         R                  (       a  [         R                  $ U R                  SS5      =(       d    S$ )zE
Return the script prefix to use from either the scope or a setting.
	root_path )r   FORCE_SCRIPT_NAMEget)scopes    K/var/www/html/env/lib/python3.13/site-packages/django/core/handlers/asgi.pyget_script_prefixr      s/     !!)))99["%++    c                      ^  \ rS rSrSrSrS r\S 5       rU 4S jr	S r
S rS	 r\" \
\5      r\" \5      r\S
 5       rU 4S jrSrU =r$ )ASGIRequest&   zj
Custom request subclass that decodes from an ASGI-standard request dict
and wraps request body handling.
<   c                    Xl         SU l        SU l        S U l        US   U l        [        U5      U l        U R                  (       a$  US   R                  U R                  5      U l        O
US   U l        U R                   S   R                  5       U l
        U R                   R                  SS5      n[        U[        5      (       a  UR                  5       nU R                  UU R                  U R                  SSS.U l        U R                   R                  S5      (       aZ  U R                   S   S	   U R                  S
'   U R                  S
   U R                  S'   U R                   S   S   U R                  S'   U R                   R                  S5      (       aH  U R                   S   S	   U R                  S'   [!        U R                   S   S   5      U R                  S'   OSU R                  S'   SU R                  S'   U R                   R                  S/ 5       H  u  pEUR                  S5      nUS:X  a  SnO,US:X  a  SnO#SUR                  5       R#                  SS5      -  nUR                  S5      nX`R                  ;   a  U R                  U   S-   U-   nXPR                  U'   M     U R%                  U R                  5        X l        S U l        g )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-_,)r   _post_parse_error_read_startedresolver_matchr"   r   script_nameremoveprefix	path_infoupperr#   r   
isinstancebytesdecodeMETAstrreplace_set_content_type_params_stream)selfr   	body_filer$   namevaluecorrected_names          r   __init__ASGIRequest.__init__0   sh   
!&""&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$::>>)R8KD;;x(D''!1'!/!*TZZ\-A-A#s-K!K LL*E*		.1C7%?(-IIn% 9 	%%dii0 "r   c                 2    [        U R                  S   5      $ )Nr&   )r   rD   rI   s    r   GETASGIRequest.GETk   s    >233r   c                 d   > U R                   R                  S5      =(       d    [        TU ]  5       $ )Nscheme)r   r   super_get_schemerI   	__class__s    r   rW   ASGIRequest._get_schemeo   s#    zz~~h'@57+>+@@r   c                 \    [        U S5      (       d  U R                  5         U R                  $ )N_post)hasattr_load_post_and_filesr\   rQ   s    r   	_get_postASGIRequest._get_postr   s%    tW%%%%'zzr   c                     Xl         g N)r\   )rI   posts     r   	_set_postASGIRequest._set_postw   s    
r   c                 \    [        U S5      (       d  U R                  5         U R                  $ )N_files)r]   r^   rg   rQ   s    r   
_get_filesASGIRequest._get_filesz   s%    tX&&%%'{{r   c                 L    [        U R                  R                  SS5      5      $ )NHTTP_COOKIEr   )r   rD   r   rQ   s    r   COOKIESASGIRequest.COOKIES   s    DIIMM-<==r   c                 V   > [         TU ]  5         U R                  R                  5         g rb   )rV   closerH   rX   s    r   ro   ASGIRequest.close   s    r   )rD   r\   r:   r;   rH   r#   r"   r?   r<   r   r=   )__name__
__module____qualname____firstlineno____doc__body_receive_timeoutrN   r   rR   rW   r_   rd   rh   propertyPOSTFILESrl   ro   __static_attributes____classcell__rY   s   @r   r   r   &   ss     9#v 4 4A

 Iy)DZ E> > r   r   c                   z   ^  \ rS rSrSr\rSrU 4S jrS r	S r
S rS rS	 rS
 rU 4S jrS r\S 5       rSrU =r$ )ASGIHandler   zHandler for ASGI requests.i   c                 @   > [         TU ]  5         U R                  SS9  g )NT)is_async)rV   rN   load_middlewarerX   s    r   rN   ASGIHandler.__init__   s    d+r   c                    #    US   S:w  a  [        SUS   -  5      e[        5        ISh  vN   U R                  XU5      I Sh  vN   SSS5      ISh  vN   g N/ N N	! , ISh  vN  (       d  f       g= f7f)zF
Async entrypoint - parses the request and hands off to get_response.
typehttpz5Django can only handle ASGI/HTTP connections, not %s.N)
ValueErrorr   handle)rI   r   receivesends       r   __call__ASGIHandler.__call__   sh      =F"G%PV-W  *++++ed333 ,++3 ,+++sV   )A;AA;A!AA!
A;AA;A!A;!A8'A*(A84A;c                   ^ #     T R                  U5      I Sh  vN n[        [        U5      5        [        R
                  R                  T R                  US9I Sh  vN   T R                  X5      u  pVUcL  UR                  5         T R                  Xc5      I Sh  vN   [        UR                  5      " 5       I Sh  vN   gU 4S jn[        R                  " T R                  U5      5      [        R                  " U" XS5      5      /n[        R                  " U[        R                   S9I Sh  vN   U HF  n	U	R#                  5       (       a   U	R%                  5         M+  U	R)                  5          U	I Sh  vN   MH      US   R%                  5       n
[        U
R                  5      " 5       I Sh  vN   UR                  5         g GN! [         a     gf = f GN GNC GN$ N! [         a     M  [&         a    UR                  5         e f = f N! [        R*                   a     M  f = f N{! [        R*                   a3    [        R,                  R                  T R                  S9I Sh  vN     Nf = f7f)z;
Handles the ASGI request. Called via the __call__ method.
N)senderr   c                    >#    TR                  U 5      I S h  vN n TR                  X!5      I S h  vN   U$  N  N! [        R                   a     U$ f = f7frb   )run_get_responsesend_responseasyncioCancelledError)requestr   responserI   s      r   process_request+ASGIHandler.handle.<locals>.process_request   s]     !227;;H((888
 O <8)) O	s:   A9A= ;= A= AAAA)return_whenr,   )r   )	read_bodyr   r   r   r   request_startedasendrY   create_requestro   r   r   r   create_tasklisten_for_disconnectwaitFIRST_COMPLETEDdoneresultAssertionErrorcancelr   request_finished)rI   r   r   r   rJ   r   error_responser   taskstaskr   s   `          r   r   ASGIHandler.handle   s    
	"nnW55I 	+E23%%++4>>+OOO"&"5"5e"G?OO$$^::: 4 45777	   : :7 CD >?
 ll5g.E.EFFFDyy{{KKM JJ &	2Qx(H  /111{ 6 		 	P
 ;7, 	G & % OO% --  2 %% 	H**000GGG	Hs  I;G G	G ?I;G>I;G!I;>G"?A2I;1G%2I;G'!I;4H9H:H>I;H1 I;3H/4I;	G 
GI;GI;I;"I;%I;'
H1I;4HI;HH,(I;+H,,I;1>I8/I20I85I;7I88I;c                 l   #    U" 5       I Sh  vN nUS   S:X  a
  [        5       e SUS   -  5       e N$7f)z&Listen for disconnect from the client.Nr   http.disconnectz+Invalid ASGI message after request body: %s)r   )rI   r   messages      r   r   !ASGIHandler.listen_for_disconnect   s=     	/6?// ""UCgfoUUu	 "s   42%4c                    #    U R                  U5      I Sh  vN nU R                  Ul        [        U[        5      (       a  U R
                  Ul        U$  N=7f)zGet async response.N)get_response_asyncrY   _handler_classrA   r   
chunk_size
block_size)rI   r   r   s      r   r   ASGIHandler.run_get_response   sK      0099"&.. h--"&//H :s   AA>Ac                 H  #    [         R                  " [        R                  SS9n U" 5       I Sh  vN nUS   S:X  a  UR	                  5         [        5       eSU;   a  UR                  US   5        UR                  SS5      (       d  OMf  UR                  S	5        U$  Nn7f)
z+Reads an HTTP body from an ASGI connection.zw+b)max_sizemodeNr   r   body	more_bodyFr   )	tempfileSpooledTemporaryFiler   FILE_UPLOAD_MAX_MEMORY_SIZEro   r   writer   seek)rI   r   rJ   r   s       r   r   ASGIHandler.read_body   s      1199
	 #IoGv"33!$&& 0;;{E22  	q &s   /B"B A/B"c                      U R                  X5      S4$ ! [         a9    [        R                  S[        R
                  " 5       SS0S9  S[        5       4s $ [         a    S[        SSS94s $ f = f)	zq
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   )rI   r   rJ   s      r   r   ASGIHandler.create_request  s    

	K%%e7==! 	2NN2$c*  
 /111  	K&=cJJJ	Ks    A A/A/.A/c                    >  [         TU ]  XU5      $ ! [         a7    [        [        R
                  (       a  [        R                  " 5       OSSS9s $ f = f)z#Last-chance handler for exceptions.zInternal Server Errorz
text/plain)content_type)rV   handle_uncaught_exception	Exceptionr   r   DEBUG	traceback
format_exc)rI   r   resolverr   rY   s       r   r   %ASGIHandler.handle_uncaught_exception"  sN    	74WQQ 	**2..	$$&>U) 	s    >AAc           	        #    / nUR                  5        Hv  u  pE[        U[        5      (       a  UR                  S5      n[        U[        5      (       a  UR                  S5      nUR	                  [        U5      [        U5      45        Mx     UR                  R                  5        H@  nUR	                  SUR                  SS9R                  S5      R                  5       45        MB     U" SUR                  US.5      I Sh  vN   UR                  (       aX  [        [        U5      5       ISh  vN nU  Sh  vN nU R                  U5       H  u  pU" S	U	S
S.5      I Sh  vN   M     M9  U R                  UR                  5       H  u  pU" S	U	U(       + S.5      I Sh  vN   M      g N N Nv NN
 SSS5      ISh  vN    O! , ISh  vN  (       d  f       O= fU" SS	05      I Sh  vN    g NR7f)z)Encode and send a response out over ASGI.asciir4   s
   Set-Cookier   )headerzhttp.response.start)r   r   r3   Nzhttp.response.bodyT)r   r   r   r   )itemsrA   rE   encodeappendrB   cookiesvaluesoutputstripr   	streamingr   aiterchunk_bytescontent)rI   r   r   response_headersr   rL   cr   partchunkr8   lasts               r   r   ASGIHandler.send_response.  s     %^^-MF&#&&w/%%%X.##U6]E%L$AB . !!((*A## 3 : :7 C I I KL +
 -"..+
 	
 	
 
  h00G") 
$$($4$4T$:"(<(- .2   %;  $//0@0@A 4 %)-X    B=	
 1
 #* 100000  45666
s   DG=F2-G=4F45G=8G;F:?F6 F:&G)F8
*
G44G=(G;)
G=4G=6F:8G:G;G=G	G=G$GG$ G=4G75G=c              #      #    SnU(       d  US4v   gU[        U5      :  aL  XX R                  -    X R                  -   [        U5      :  4v   X R                  -  nU[        U5      :  a  MK  gg7f)zg
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   ASGIHandler.chunk_bytese  sp      *T">> 9:NN*s4y8  &H T"s   A)A/-A/ )rq   rr   rs   rt   ru   r   r   r   rN   r   r   r   r   r   r   r   r   classmethodr   rz   r{   r|   s   @r   r~   r~      sV    $MJ,4CJV	*K"
5n ' 'r   r~   )%r   loggingr   r   r   
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   r   <module>r      sv      
    >    D %   * 3			+	,,b+ bJi'$"" i'r   