Ë
    ôrªiG6  ã                   ó.  — 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/html/venv/lib/python3.12/site-packages/django/core/handlers/asgi.pyÚget_script_prefixr      s/   € ô ×!Ò!Ü×)Ñ)Ð)Ø�9‰9�[ "Ó%Ò+¨Ð+ó    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 ]n  \  }}|j                  d«      }|dk(  rd}n+|dk(  rd}n#d|j                  «       j'                  dd«      z  }|j                  d«      }||   j)                  |«       Œp | j                  j+                  |j-                  «       D ��ci c]  \  }}|dj/                  |«      “Œ c}}«       | j1                  | 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Ú-Ú_Ú,)r   Ú_post_parse_errorÚ_read_startedÚresolver_matchr"   r   Úscript_nameÚremoveprefixÚ	path_infoÚupperr#   r   Ú
isinstanceÚbytesÚdecodeÚMETAÚstrr   ÚlistÚreplaceÚappendÚupdateÚitemsÚjoinÚ_set_content_type_paramsÚ_stream)Úselfr   Ú	body_filer$   Ú_headersÚnameÚvalueÚcorrected_names           r   Ú__init__zASGIRequest.__init__1   s•  € ØˆŒ
Ø!&ˆÔØ"ˆÔØ"ˆÔØ˜&‘MˆŒ	Ü,¨UÓ3ˆÔØ×Òà" 6™]×7Ñ7¸×8HÑ8HÓIˆD�Nà" 6™]ˆDŒNà—j‘j Ñ*×0Ñ0Ó2ˆŒà—z‘z—~‘~ n°bÓ9ˆÜ�l¤EÔ*Ø'×.Ñ.Ó0ˆLà"Ÿk™kØ(Ø×+Ñ+ØŸ™à $Ø!%ñ
ˆŒ	ð �:‰:�>‰>˜(Ô#Ø'+§z¡z°(Ñ';¸AÑ'>ˆD�I‰I�mÑ$Ø'+§y¡y°Ñ'?ˆD�I‰I�mÑ$Ø'+§z¡z°(Ñ';¸AÑ'>ˆD�I‰I�mÑ$Ø�:‰:�>‰>˜(Ô#Ø'+§z¡z°(Ñ';¸AÑ'>ˆD�I‰I�mÑ$Ü'*¨4¯:©:°hÑ+?ÀÑ+BÓ'CˆD�I‰I�mÒ$à'0ˆD�I‰I�mÑ$Ø'*ˆD�I‰I�mÑ$äœtÓ$ˆØŸ:™:Ÿ>™>¨)°RÖ8‰KˆD�%Ø—;‘;˜xÓ(ˆDØÐ'Ò'Ø!1‘Ø˜Ò'Ø!/‘à!*¨T¯Z©Z«\×-AÑ-AÀ#ÀsÓ-KÑ!K�ð —L‘L Ó*ˆEØ�^Ñ$×+Ñ+¨EÕ2ð 9ð 	�	‰	×ÑÀ8Ç>Á>ÔCSÔTÑCS±K°D¸%˜$ §¡¨£Ñ/ÐCSÒTÔUà×%Ñ% d§i¡iÔ0à ˆŒà"ˆÕùó Us   Ê5L
c                 ó2   — t        | j                  d   «      S )Nr&   )r   rD   ©rN   s    r   ÚGETzASGIRequest.GETl   s   € ä˜Ÿ™ >Ñ2Ó3Ð3r   c                 óZ   •— | j                   j                  d«      xs t        ‰| �  «       S )NÚscheme)r   r   ÚsuperÚ_get_scheme©rN   Ú	__class__s    €r   r[   zASGIRequest._get_schemep   s#   ø€ Ø�z‰z�~‰~˜hÓ'Ò@¬5©7Ñ+>Ó+@Ð@r   c                 óR   — t        | d«      s| j                  «        | j                  S )NÚ_post)ÚhasattrÚ_load_post_and_filesr_   rV   s    r   Ú	_get_postzASGIRequest._get_posts   s"   € Ü�t˜WÔ%Ø×%Ñ%Ô'Ø�z‰zÐr   c                 ó   — || _         y ©N)r_   )rN   Úposts     r   Ú	_set_postzASGIRequest._set_postx   s	   € Øˆ�
r   c                 óR   — t        | d«      s| j                  «        | j                  S )NÚ_files)r`   ra   rh   rV   s    r   Ú
_get_fileszASGIRequest._get_files{   s"   € Ü�t˜XÔ&Ø×%Ñ%Ô'Ø�{‰{Ðr   c                 óL   — t        | j                  j                  dd«      «      S )NÚHTTP_COOKIEr   )r   rD   r   rV   s    r   ÚCOOKIESzASGIRequest.COOKIESƒ   s   € ä˜DŸI™IŸM™M¨-¸Ó<Ó=Ð=r   c                 óV   •— t         ‰| �  «        | j                  j                  «        y rd   )rZ   ÚcloserM   r\   s    €r   rn   zASGIRequest.close‡   s   ø€ Ü‰‰ŒØ�‰×ÑÕr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úbody_receive_timeoutrT   r   rW   r[   rb   rf   ri   ÚpropertyÚPOSTÚFILESrl   rn   Ú__classcell__©r]   s   @r   r   r   '   ss   ø„ ñð Ðò9#ðv ñ4ó ð4ôAòò
òñ
 �I˜yÓ)€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)rZ   rT   Úload_middlewarer\   s    €r   rT   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)rN   r   ÚreceiveÚsends       r   Ú__call__zASGIHandler.__call__—   sn   è ø€ ð �‰=˜FÒ"ÜØGÈ%ÐPVÉ-ÑWóð ô *×+Õ+Ø—+‘+˜e W¨dÓ3×3Ð3÷ ,×+Ñ+øØ3øð ,ø×+×+Ñ+üsV   ‚(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rd   )Úrun_get_responseÚsend_responseÚasyncioÚCancelledError)Úrequestr„   ÚresponserN   s      €r   Úprocess_requestz+ASGIHandler.handle.<locals>.process_request¹   sa   øè ø€ Ø!×2Ñ2°7Ó;×;ˆ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Úasendr]   Úcreate_requestrn   rŠ   r   r‹   Úcreate_taskÚlisten_for_disconnectÚwaitÚFIRST_COMPLETEDÚdoneÚresultÚAssertionErrorÚcancelrŒ   Úrequest_finished)rN   r   rƒ   r„   rO   r�   Úerror_responser�   ÚtasksÚtaskrŽ   s   `          r   r‚   zASGIHandler.handle¥   s#  øè ø€ ð
	Ø"Ÿn™n¨WÓ5×5ˆIô 	Ô+¨EÓ2Ô3Ü×%Ñ%×+Ñ+°4·>±>ÈÐ+ÓO×OÐOà"&×"5Ñ"5°e¸YÓ"GÑˆ�Øˆ?Ø�O‰OÔØ×$Ñ$ ^°TÓ:×:Ð:Ø5”- × 4Ñ 4Ó5Ó7×7Ð7Øô	ô  ×Ñ × :Ñ :¸7Ó CÓDÜ×Ñ¡°¸Ó >Ó?ð
ˆô �l‰l˜5¬g×.EÑ.EÔF×FÐFãˆDØ�y‰yŒ{ðØ—K‘K•Mð —‘”ðØ—J‘Jð ð&	2Ø˜Q‘x—‘Ó(ˆHð 0”- §¡Ó/Ó1×1Ð1à�‰Õð{ 6úÜò 	Ùð	úð 	Pùð
 ;ùØ7ùð, 	Gùô &ò áÜ%ò Ø—O‘OÔ%Øðúð ùÜ×-Ñ-ò áðúð 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	   )rN   rƒ   Úmessages      r   r–   z!ASGIHandler.listen_for_disconnectê   s>   è ø€ á›	—/ˆØ�6‰?Ð/Ò/Ü Ó"Ð"àUÐCÀgÈfÁoÑUÓUˆuð	 "ús   ‚3�1Ž$3c              ƒ   ó¨   K  — | j                  |«      ƒ d{  –—† }| j                  |_        t        |t        «      r| j
                  |_        |S 7 Œ8­w)zGet async response.N)Úget_response_asyncr]   Ú_handler_classrA   r   Ú
chunk_sizeÚ
block_size)rN   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 r|j                  |d   «       |j                  dd«      snŒ]|j                  d	«       |S 7 Œe­w)
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_SIZErn   r	   Úwriter   Úseek)rN   rƒ   rO   r£   s       r   r‘   zASGIHandler.read_bodyý   s˜   è ø€ ô ×1Ñ1Ü×9Ñ9Àô
ˆ	ð Ù#›I—oˆGØ�v‰Ð"3Ò3Ø—‘Ô!ä$Ó&Ð&à˜Ñ Ø—‘ ¨¡Ô0à—;‘;˜{¨EÔ2Øð ð 	�‰�qÔØÐð &ús   ‚1B³B´A&B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   )rN   r   rO   s      r   r”   zASGIHandler.create_request  s‚   € ð

	KØ×%Ñ% e¨YÓ7¸Ð=Ð=øÜ!ò 	2Ü�N‰NØ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)rZ   Úhandle_uncaught_exceptionÚ	Exceptionr   r   ÚDEBUGÚ	tracebackÚ
format_exc)rN   r�   Úresolverrµ   r]   s       €r   r¿   z%ASGIHandler.handle_uncaught_exception#  sP   ø€ ð	Ü‘7Ñ4°W¸hÈÓ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 ]B  }|j	                  d|j                  d¬«      j                  d«      j                  «       f«       ŒD  |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-Cookier   )Úheaderzhttp.response.start)r   r·   r3   Nzhttp.response.bodyT)r   r¬   r­   r   )rJ   rA   rE   ÚencoderH   rB   ÚcookiesÚvaluesÚoutputÚstripr´   Ú	streamingr   ÚaiterÚchunk_bytesÚcontent)rN   rŽ   r„   Úresponse_headersrÇ   rR   ÚcrÐ   ÚpartÚchunkr8   Úlasts               r   rŠ   zASGIHandler.send_response/  s×  è ø€ ð ÐØ%Ÿ^™^Ö-‰MˆF�EÜ˜&¤#Ô&ØŸ™ wÓ/�Ü˜%¤Ô%ØŸ™ XÓ.�Ø×#Ñ#¤U¨6£]´E¸%³LÐ$AÕBð .ð ×!Ñ!×(Ñ(Ö*ˆAØ×#Ñ#Ø §¡° Ó 3× :Ñ :¸7Ó C× IÑ IÓ KÐLõð +ñ
 à-Ø"×.Ñ.Ø+ñó
÷ 	
ð 	
ð ×Òô
  ¤ h£×0Ô0°GÙ")÷ 
˜$Ø$(×$4Ñ$4°TÖ$:™˜˜qÙ"à(<Ø(-ð .2ñó÷ ñ ñ %;ð  $×/Ñ/°×0@Ñ0@ÖA‘��tÙà 4Ø %Ø)- Xñó÷ ñ ñ  Bð=	
øð 1øð
øðøð #*÷ 1×0×0×0Ó0úñ ˜Ð 4Ð5Ó6×6Ò6ð
ús¨   ‚C:G"Ã<FÃ=(G"Ä%FÄ&G"Ä)F7Ä,F$Ä0F Ä1F$Ä4'F7ÅF"
ÅF7Å#1G"ÆG ÆG"ÆG"Æ F$Æ"F7Æ$F7Æ%G"Æ0F3Æ1G"Æ7G	Æ=G Æ>G	Ç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_bytesf  sy   è ø€ ð ˆÙØ˜�*ÒØØœ˜T›Ò"à�X ¨3¯>©>Ñ 9Ð:Ø˜CŸN™NÑ*¬s°4«yÑ8ðò ð ˜Ÿ™Ñ&ˆHð œ˜T›Õ"ùs   ‚A&A+Á)A+)ro   rp   rq   rr   r   r¸   r§   rT   r…   r‚   r–   r‰   r‘   r”   r¿   rŠ   ÚclassmethodrÏ   rw   rx   s   @r   rz   rz   Œ   sV   ø„ Ù$à€Mà€Jô,ò4òCòJVò	òò*Kô"
ò5ðn ñ'ó ô'r   rz   )'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   ÚBaseHandlerrz   © r   r   Ú<module>rê      s{   ðÛ Û Û 
Û Û Ý #Ý ç >å  Ý ß DÝ %÷÷ ñ õ *Ý 3à	ˆ×	Ñ	Ð+Ó	,€ò,ôb�+ô bôJi'�$×"Ñ"õ i'r   