
    h%                        S r SSKrSSKrSSKJr  SSKJr  SSKJr  SSK	J
r
  SSK	Jr  SSK	Jr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr   " S S5      r " S S5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)z
Parsers are used to parse the content of incoming HTTP requests.

They give us a generic way of being able to handle various media types
on the request, such as form content or json encoded data.
    N)settings)StopFutureHandlers)	QueryDict)	ChunkIter)MultiPartParser)MultiPartParserError)parse_header_parameters)	renderers)
ParseError)api_settings)jsonc                       \ rS rSrS rSrg)DataAndFiles   c                     Xl         X l        g )Ndatafiles)selfr   r   s      H/var/www/html/env/lib/python3.13/site-packages/rest_framework/parsers.py__init__DataAndFiles.__init__   s    	
    r   N)__name__
__module____qualname____firstlineno__r   __static_attributes__ r   r   r   r      s    r   r   c                   &    \ rS rSrSrSrSS jrSrg)
BaseParser    zt
All parsers should extend `BaseParser`, specifying a `media_type`
attribute, and overriding the `.parse()` method.
Nc                     [        S5      e)z
Given a stream to read from, return the parsed representation.
Should return parsed data, or a `DataAndFiles` object consisting of the
parsed data and files.
z.parse() must be overridden.)NotImplementedError)r   stream
media_typeparser_contexts       r   parseBaseParser.parse'   s     ""@AAr   r   NNr   r   r   r   __doc__r&   r(   r   r   r   r   r!   r!       s     JBr   r!   c                   V    \ rS rSrSrSr\R                  r\	R                  rSS jrSrg)
JSONParser0   z
Parses JSON-serialized data.
zapplication/jsonNc                 R   U=(       d    0 nUR                  S[        R                  5      n [        R                  " U5      " U5      nU R
                  (       a  [        R                  OSn[        R                  " XVS9$ ! [         a  n[        S[        U5      -  5      eSnAff = f)zH
Parses the incoming bytestream as JSON and returns the resulting data.
encodingN)parse_constantzJSON parse error - %s)getr   DEFAULT_CHARSETcodecs	getreaderstrictr   strict_constantload
ValueErrorr   str)r   r%   r&   r'   r1   decoded_streamr2   excs           r   r(   JSONParser.parse8   s     (-2!%%j(2J2JK	A#--h7?N59[[T11dN99^KK 	A4s3x?@@	As   AB   
B&
B!!B&r   r*   )r   r   r   r   r,   r&   r
   JSONRendererrenderer_classr   STRICT_JSONr7   r(   r   r   r   r   r.   r.   0   s*     $J++N%%FAr   r.   c                   &    \ rS rSrSrSrSS jrSrg)
FormParserG   z
Parser for form data.
z!application/x-www-form-urlencodedNc                     U=(       d    0 nUR                  S[        R                  5      n[        UR	                  5       US9$ )z\
Parses the incoming bytestream as a URL encoded form,
and returns the resulting QueryDict.
r1   )r1   )r3   r   r4   r   read)r   r%   r&   r'   r1   s        r   r(   FormParser.parseM   s9    
 (-2!%%j(2J2JK::r   r   r*   r+   r   r   r   rC   rC   G   s     5J;r   rC   c                   &    \ rS rSrSrSrSS jrSrg)r   W   z>
Parser for multipart form data, which may include file data.
zmultipart/form-dataNc                 \   U=(       d    0 nUS   nUR                  S[        R                  5      nUR                  R	                  5       nX&S'   UR
                  n [        XaXu5      nUR                  5       u  p[        X5      $ ! [         a  n[        S[        U5      -  5      eSnAff = f)z
Parses the incoming bytestream as a multipart encoded form,
and returns a DataAndFiles object.

`.data` will be a `QueryDict` containing all the form parameters.
`.files` will be a `QueryDict` containing all the form files.
requestr1   CONTENT_TYPEzMultipart form parse error - %sN)r3   r   r4   METAcopyupload_handlersDjangoMultiPartParserr(   r   r   r   r;   )r   r%   r&   r'   rK   r1   metarO   parserr   r   r=   s               r   r(   MultiPartParser.parse]   s     (-2 +!%%j(2J2JK||  ")^!11	K*4SF ,,.KD,,# 	K>SIJJ	Ks   (B 
B+B&&B+r   r*   r+   r   r   r   r   r   W   s     'JKr   r   c                   6    \ rS rSrSrSrSSS.rSS jrS	 rS
r	g)FileUploadParsert   z
Parser for file upload data.
z*/*zFFileUpload parse error - none of upload handlers can handle the streamz`Missing filename. Request should include a Content-Disposition header with a filename parameter.)	unhandledno_filenameNc           	         U=(       d    0 nUS   nUR                  S[        R                  5      nUR                  nUR                  nU R                  XU5      nU(       d  [        U R                  S   5      eUR                  SUR                  SS5      5      n	 [        UR                  SUR                  SS	5      5      5      n
U H.  nUR                  UUU
S
U5      nUc  M  [        0 SUS   05      s  $    U Vs/ s H!  oR                  (       d  M  UR                  PM#     nn[        S/U-   5      n[        X5      nS	/[!        U5      -  n[#        U5       H  u  nn UR%                  S
XX5        M     U HK  n[#        U5       H9  u  nn[!        U5      nUR)                  UUU   5      nUU==   U-  ss'   Ub  M8    MI     MM     [#        U5       H-  u  nnUR+                  UU   5      nUc  M  [        0 SU05      s  $    [        U R                  S   5      e! [        [        4 a    S
n
 GNnf = fs  snf ! [&         a    US
US-    n   M  f = f)z
Treats the incoming bytestream as a raw file upload and returns
a `DataAndFiles` object.

`.data` will be None (we expect request body to be a file content).
`.files` will be a `QueryDict` containing one 'file' element.
rK   r1   rX   HTTP_CONTENT_TYPErL    HTTP_CONTENT_LENGTHCONTENT_LENGTHr   Nfile   irW   )r3   r   r4   rM   rO   get_filenamer   errorsintr:   	TypeErrorhandle_raw_inputr   
chunk_sizeminr   len	enumeratenew_filer   receive_data_chunkfile_complete)r   r%   r&   r'   rK   r1   rQ   rO   filenamecontent_typecontent_lengthhandlerresultxpossible_sizesre   chunkscountersindexchunkchunk_lengthfile_objs                         r   r(   FileUploadParser.parse~   sn    (-2 +!%%j(2J2JK||!11$$VHT[[788 xx 3 $ <>	" *?*.((3CQ*G"I JN 'G--f.2.<.2.6	8F
 !#B(;<< ' 1@P1<<,!,,P+78
6.3_--'8NE7  x!/; 9 E"+O"<w"5z225(5/J</= #=  (8NE7,,Xe_=H##B(:;; 9
 [122Q I& 	"!N	" Q & "1*519"=s0   +H!  H:H:%H?!H76H7?IIc                 j   [         R                  " [        5         US   S   sSSS5        $ ! , (       d  f       O= f[         R                  " [        [        [        5         US   R
                  n[        US   5      u  pVSU;   a  US   sSSS5        $ US   sSSS5        $ ! , (       d  f       g= f)zx
Detects the uploaded file name. First searches a 'filename' url kwarg.
Then tries to parse Content-Disposition header.
kwargsrl   NrK   HTTP_CONTENT_DISPOSITIONz	filename*)
contextlibsuppressKeyErrorAttributeErrorr:   rM   r	   )r   r%   r&   r'   rQ   dispositionparamss          r   r`   FileUploadParser.get_filename   s    
   *!(+J7 +**   :F!),11D"9$?Y:Z"[Kf$k*	 GF
 *% GFFs   -
;"*B$B$$
B2r   r*   )
r   r   r   r   r,   r&   ra   r(   r`   r   r   r   r   rU   rU   t   s'     J]yF
A3F&r   rU   )r,   r5   r}   django.confr   django.core.files.uploadhandlerr   django.httpr   django.http.multipartparserr   r   rP   r   django.utils.httpr	   rest_frameworkr
   rest_framework.exceptionsr   rest_framework.settingsr   rest_framework.utilsr   r   r!   r.   rC   rU   r   r   r   <module>r      s        > ! 1- < 5 $ 0 0 % B B A A.; ; Kj K:Z&z Z&r   