
    ^fD                     :   d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ  G d d          Z G d d          Z G d de          Z G d de          Z G d de          Z
 G d de          ZdS )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)	renderers)parse_header_parameters)
ParseError)api_settings)jsonc                       e Zd Zd ZdS )DataAndFilesc                 "    || _         || _        d S )N)datafiles)selfr   r   s      H/var/www/html/env/lib/python3.11/site-packages/rest_framework/parsers.py__init__zDataAndFiles.__init__   s    	


    N)__name__
__module____qualname__r    r   r   r   r      s#            r   r   c                       e Zd ZdZdZddZdS )
BaseParserz
    All parsers should extend `BaseParser`, specifying a `media_type`
    attribute, and overriding the `.parse()` method.
    Nc                      t          d          )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   parsezBaseParser.parse%   s     ""@AAAr   NNr   r   r   __doc__r    r"   r   r   r   r   r      s?          JB B B B B Br   r   c                   :    e Zd ZdZdZej        Zej	        Z
ddZdS )
JSONParserz&
    Parses JSON-serialized data.
    zapplication/jsonNc                 >   |pi }|                     dt          j                  }	  t          j        |          |          }| j        rt          j        nd}t          j        ||          S # t          $ r$}t          dt          |          z            d}~ww xY w)zX
        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!   r)   decoded_streamr*   excs           r   r"   zJSONParser.parse6   s     (-2!%%j(2JKK	A7V-h77??N59[JT11dN9^NKKKK 	A 	A 	A4s3xx?@@@	As   AA. .
B8BBr#   )r   r   r   r%   r    r	   JSONRendererrenderer_classr   STRICT_JSONr/   r"   r   r   r   r'   r'   .   sO          $J+N%FA A A A A Ar   r'   c                       e Zd ZdZdZddZdS )
FormParserz
    Parser for form data.
    z!application/x-www-form-urlencodedNc                     |pi }|                     dt          j                  }t          |                                |          S )zt
        Parses the incoming bytestream as a URL encoded form,
        and returns the resulting QueryDict.
        r)   )r)   )r+   r   r,   r   read)r   r   r    r!   r)   s        r   r"   zFormParser.parseK   sA    
 (-2!%%j(2JKK::::r   r#   r$   r   r   r   r:   r:   E   s9          5J; ; ; ; ; ;r   r:   c                       e Zd ZdZdZddZdS )r   zF
    Parser for multipart form data, which may include file data.
    zmultipart/form-dataNc                 z   |pi }|d         }|                     dt          j                  }|j                                        }||d<   |j        }	 t          ||||          }|                                \  }	}
t          |	|
          S # t          $ r$}t          dt          |          z            d}~ww xY w)a	  
        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.
        requestr)   CONTENT_TYPEzMultipart form parse error - %sN)r+   r   r,   METAcopyupload_handlersDjangoMultiPartParserr"   r   r   r   r3   )r   r   r    r!   r?   r)   metarC   parserr   r   r5   s               r   r"   zMultiPartParser.parse[   s     (-2 +!%%j(2JKK|  "")^!1	K*4(SSF ,,..KD%e,,,# 	K 	K 	K>SIJJJ	Ks   8B 
B:B55B:r#   r$   r   r   r   r   r   U   s?          'JK K K K K Kr   r   c                   .    e Zd ZdZdZdddZd	dZd ZdS )
FileUploadParserz&
    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           	         |pi }|d         }|                     dt          j                  }|j        }|j        }|                     |||          }|st          | j        d                   |                     d|                     dd                    }		 t          |                     d|                     dd	                              }
n# t          t          f$ r d
}
Y nw xY w|D ]7}|                    |||
d
|          }|t          i d|d         i          c S 8d |D             }t          dg|z             }t          ||          }d	gt          |          z  }t!          |          D ]=\  }}	 |                    d
||	|
|            # t$          $ r |d
|dz            }Y  nw xY w|D ]V}t!          |          D ]D\  }}t          |          }|                    |||                   }||xx         |z  cc<   | nEWt!          |          D ]6\  }}|                    ||                   }|t          i d|i          c S 7t          | j        d                   )a  
        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.
        r?   r)   rJ   HTTP_CONTENT_TYPEr@    HTTP_CONTENT_LENGTHCONTENT_LENGTHr   Nfile   c                 *    g | ]}|j         	|j         S r   )
chunk_size).0xs     r   
<listcomp>z*FileUploadParser.parse.<locals>.<listcomp>   s!    PPP11<P!,PPPr   irI   )r+   r   r,   rA   rC   get_filenamer   errorsintr2   	TypeErrorhandle_raw_inputr   minr   len	enumeratenew_filer   receive_data_chunkfile_complete)r   r   r    r!   r?   r)   rE   rC   filenamecontent_typecontent_lengthhandlerresultpossible_sizesrS   chunkscountersindexchunkchunk_lengthfile_objs                        r   r"   zFileUploadParser.parse|   s    (-2 +!%%j(2JKK|!1$$VZHH 	9T[7888 xx 3 $ < <> >	" *?*.((3CQ*G*G"I "I J JNNI& 	" 	" 	"!NNN	" ' 	= 	=G--f.2.<.2.6	8 8F
 !#B(;<<<<< " QPPPP+788
6:..3_---'88 	 	NE7  x!/; ; ; ;%   "1*519*"=  	 	E"+O"<"<  w"5zz225(5/JJ</=E ! (88 	< 	<NE7,,Xe_==H##B(:;;;;; $ [1222s$   7C C'&C';FF0/F0c                     	 |d         d         S # t           $ r Y nw xY w	 |d         j        }t          |d                   \  }}d|v r|d         S |d         S # t          t           t          f$ r Y dS w xY w)z
        Detects the uploaded file name. First searches a 'filename' url kwarg.
        Then tries to parse Content-Disposition header.
        kwargsrb   r?   HTTP_CONTENT_DISPOSITIONz	filename*N)KeyErrorrA   r
   AttributeErrorr2   )r   r   r    r!   rE   dispositionparamss          r   rW   zFileUploadParser.get_filename   s    
	!(+J77 	 	 	D		!),1D"9$?Y:Z"["[Kf$$k**j))*5 	 	 	DD	s#    
0A A A54A5r#   )r   r   r   r%   r    rX   r"   rW   r   r   r   rH   rH   r   s_          J]y F
A3 A3 A3 A3F    r   rH   )r%   r-   django.confr   django.core.files.uploadhandlerr   django.httpr   django.http.multipartparserr   r   rD   r   rest_frameworkr	   rest_framework.compatr
   rest_framework.exceptionsr   rest_framework.settingsr   rest_framework.utilsr   r   r   r'   r:   rH   r   r   r   <module>r~      s                 > > > > > > ! ! ! ! ! ! 1 1 1 1 1 1- - - - - - < < < < < < $ $ $ $ $ $ 9 9 9 9 9 9 0 0 0 0 0 0 0 0 0 0 0 0 % % % % % %       B B B B B B B B A A A A A A A A.; ; ; ; ; ; ; ; K K K K Kj K K K:_ _ _ _ _z _ _ _ _ _r   