
    j6                     2   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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!  \RD                  " S5      r#S r$ " S S\5      r% " S S\RL                  5      r'g)    N)defaultdict)aclosingclosing)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    Q/var/www/html/KUNJ/venv/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 R                  R                  S5      nU R                  R                  US-   5      (       d  U R                  U:X  a  U R                  [        U5      S  U l
        O#U R                  U l
        OU R                  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'   ['        [(        5      nU R                   R                  S/ 5       H  u  pgUR!                  S5      nSU;   a  M  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US:X  a  UR                  S5      nXX   R-                  U5        M     UR/                  SS 5      =n	(       a  SR1                  U	5      U R"                  S'   U R"                  R3                  UR5                  5        VVs0 s H  u  pgUSR1                  U5      _M     snn5        U R7                  U R"                  5        X l        S U l        g s  snnf ) 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latin1_zcontent-lengthCONTENT_LENGTHzcontent-typeCONTENT_TYPEzHTTP_%s-HTTP_COOKIEz; ,)r   _post_parse_error_read_startedresolver_matchr$   r   script_namerstrip
startswithlen	path_infoupperr&   r   
isinstancebytesdecodeMETAstrr   listreplaceappendpopjoinupdateitems_set_content_type_params_stream)
selfr   	body_filerA   r'   _headersnamevaluecorrected_namecookie_headers
             r   __init__ASGIRequest.__init__1   s#   
!&""&M	,U3**11#6Kyy##K#$566$)){:R!%3{+;+=!>!%!YYDN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8KD;;x(Dd{''!1'!/!*TZZ\-A-A#s-K!K LL*E.T*$++E2! 9" %LL===='+yy'?DIIm$		8>>CSTCSKD$/CSTU%%dii0 " Us   O
c                 2    [        U R                  S   5      $ )Nr)   )r   rJ   rU   s    r   GETASGIRequest.GETv   s    >233r   c                 d   > U R                   R                  S5      =(       d    [        TU ]  5       $ )Nscheme)r   r   super_get_schemerU   	__class__s    r   re   ASGIRequest._get_schemez   s#    zz~~h'@57+>+@@r   c                 \    [        U S5      (       d  U R                  5         U R                  $ )N_post)hasattr_load_post_and_filesrj   r_   s    r   	_get_postASGIRequest._get_post}   s%    tW%%%%'zzr   c                     Xl         g N)rj   )rU   posts     r   	_set_postASGIRequest._set_post   s    
r   c                 \    [        U S5      (       d  U R                  5         U R                  $ )N_files)rk   rl   ru   r_   s    r   
_get_filesASGIRequest._get_files   s%    tX&&%%'{{r   c                 L    [        U R                  R                  SS5      5      $ )Nr<   r   )r   rJ   r   r_   s    r   COOKIESASGIRequest.COOKIES   s    DIIMM-<==r   c                 V   > [         TU ]  5         U R                  R                  5         g rp   )rd   closerT   rf   s    r   r|   ASGIRequest.close   s    r   )rJ   rj   r>   r?   rT   r&   r$   rE   r@   r   rA   )__name__
__module____qualname____firstlineno____doc__body_receive_timeoutr\   r   r`   re   rm   rr   rv   propertyPOSTFILESry   r|   __static_attributes____classcell__rg   s   @r   r    r    '   st     C#J 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)rd   r\   load_middlewarerf   s    r   r\   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)rU   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                   #     U R                  U5      I Sh  vN n[        U5         [        [	        U5      5        [
        R                  R                  U R                  US9I Sh  vN   U R                  X5      u  pVUcU  UR                  5         U R                  Xc5      I Sh  vN   [        UR                  5      " 5       I Sh  vN    SSS5        g " S S[        5      nSn  [        R                  " 5        ISh  vN n	U	R!                  U R#                  U5      5        U R%                  U5      I Sh  vN nU R                  X5      I Sh  vN   Ue GNE! [         a     gf = f GN N N Nr N; N$! , ISh  vN  (       d  f       Ob= f! / =U[        4 =b    POP  PO  P8=c     OAs f = f! [&         a.  n
[)        U
R*                  5      S:X  a  U
R*                  S   ee Sn
A
ff = fUc1  [
        R,                  R                  U R                  S9I Sh  vN    O#[        UR                  5      " 5       I Sh  vN    SSS5        g! , (       d  f       g= f7f)z;
Handles the ASGI request. Called via the __call__ method.
N)senderr   c                       \ rS rSrSrg),ASGIHandler.handle.<locals>.RequestProcessed    N)r~   r   r   r   r   r   r   r   RequestProcessedr      s    r   r   r/   r   )r   )	read_bodyr
   r   r   r   r	   request_startedasendrg   create_requestr|   send_responser   	Exceptionasyncio	TaskGroupcreate_tasklisten_for_disconnectrun_get_responseBaseExceptionGrouprD   
exceptionsrequest_finished)rU   r   r   r   rV   requesterror_responser   responsetgexception_groups              r   r   ASGIHandler.handle   s    
	"nnW55I Y/67))//t~~U/SSS&*&9&9%&K#G!((>>>#N$8$89;;;  9  H&0022bt'A'A''JK)-)>)>w)G#G"00@@@..5 6 		 T
 ?;  3#G@  322
)>: % 112a7)44Q77
 ..44DNN4KKK#HNN3555C  s?  I'E  EE  I'A I(E0)>I'E3(!I	E5
I	I'I+FE7F5E==E9>E=E;E=E   
E-*I',E--I'0I3I5I7F9E=;E==F	FF	FIFF83F;4I5F;;
G3)G..G330I#H&$#II
I	I'
I$ 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
   )rU   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_asyncrg   _handler_classrG   r   
chunk_size
block_size)rU   r   r   s      r   r   ASGIHandler.run_get_response   sK      0099"&.. h--"&//H :s   AA>Ac                   #    [         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;   aP  [        USS5      nU(       a(  [        UR                  SS	9nU" US   5      I Sh  vN   OUR                  US   5        UR                  S
S5      (       d  OM  UR                  S5        U$  N NH7f)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_SIZEr|   r
   getattrr   writer   seek)rU   r   rV   r   on_diskasync_writes         r   r   ASGIHandler.read_body   s      1199
	 #IoGv"33!$&& !)Y>"/!).#K &gfo666OOGFO4 ;;{E22) * 	q+ & 7s#   /C CA#C CAC C 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   )rU   r   rV   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)rd   handle_uncaught_exceptionr   r   r   DEBUG	traceback
format_exc)rU   r   resolverr   rg   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        H3  nUR	                  SUR                  5       R                  S5      45        M5     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.asciir7   s
   Set-Cookiezhttp.response.start)r   r   r6   Nzhttp.response.bodyT)r   r   r   r   )rR   rG   rK   encoderN   rH   cookiesvaluesOutputStringr   	streamingr   aiterchunk_bytescontent)rU   r   r   response_headersheaderrY   cr   partchunkr8   lasts               r   r   ASGIHandler.send_response*  s     %^^-MF&#&&w/%%%X.##U6]E%L$AB . !!((*A##]ANN4D4K4KG4T$UV + -"..+
 	
 	
 
  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   C7G09F%:-G0'F'(G0+G .F-2F)3F-6&G F+

G '4G0G.
G0'G0)F-+G -G .G09F<:G0 GG	GG0'G*(G0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)rD   r   )clsdatapositions      r   r   ASGIHandler.chunk_bytes`  sp      *T">> 9:NN*s4y8  &H T"s   A)A/-A/r   )r~   r   r   r   r   r    r   r   r\   r   r   r   r   r   r   r   r   classmethodr   r   r   r   s   @r   r   r      sU    $MJ,4+6ZV	<K"
4l ' 'r   r   )(r   loggingr   r   r   collectionsr   
contextlibr   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.functionalr   	getLoggerr   r   r    BaseHandlerr   r   r   r   <module>r     sy      
   # ( >    D %   * 3			+	,,l+ l^Y'$"" Y'r   