
    h                      $   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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y)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)parse)settings)StopFutureHandlers)	QueryDict)	ChunkIter)MultiPartParser)MultiPartParserErrorparse_header)	force_str)	renderers)
ParseError)api_settings)jsonc                       e Zd Zd Zy)DataAndFilesc                      || _         || _        y )N)datafiles)selfr   r   s      Y/var/www/html/ranktracker/api/venv/lib/python3.12/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y)
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   r   zBaseParser.parse&   s     ""@AAr   NNr   r   r   __doc__r"   r   r   r   r   r   r      s     JBr   r   c                   L    e Zd ZdZdZej                  Zej                  Z
ddZy)
JSONParserz&
    Parses JSON-serialized data.
    zapplication/jsonNc                 @   |xs i }|j                  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.parse7   s     (-2!%%j(2J2JK	A7V--h7?N59[[T11dN99^NKK 	A4s3x?@@	As   AA8 8	BBBr$   )r   r   r   r&   r"   r   JSONRendererrenderer_classr   STRICT_JSONr0   r   r   r   r   r(   r(   /   s*     $J++N%%FAr   r(   c                       e Zd ZdZdZddZy)
FormParserz
    Parser for form data.
    z!application/x-www-form-urlencodedNc                     |xs i }|j                  dt        j                        }t        |j	                         |      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.parseL   s9    
 (-2!%%j(2J2JK::r   r$   r%   r   r   r   r;   r;   F   s     5J;r   r;   c                       e Zd ZdZdZddZy)r   zF
    Parser for multipart form data, which may include file data.
    zmultipart/form-dataNc                 Z   |xs i }|d   }|j                  dt        j                        }|j                  j	                         }||d<   |j
                  }	 t        ||||      }|j                         \  }	}
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   r4   )r   r!   r"   r#   r@   r*   metarD   parserr   r   r6   s               r   r   zMultiPartParser.parse\   s     (-2 +!%%j(2J2JK||  ")^!11	K*4(SF ,,.KD%e,,# 	K>SIJJ	Ks   ,B 	B*B%%B*r$   r%   r   r   r   r   r   V   s     'JKr   r   c                   2    e Zd ZdZdZdddZd
dZd Zd	 Zy)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           	      t   |xs i }|d   }|j                  dt        j                        }|j                  }|j                  }| j                  |||      }|st        | j                  d         |j                  d|j                  dd            }		 t        |j                  d|j                  dd	                  }
|D ],  }|j                  |||
d
|      }|t        i d|d   i      c S  |D cg c]  }|j                  s|j                   }}t        dg|z         }t        ||      }d	gt!        |      z  }t#        |      D ]  \  }}	 |j%                  d
||	|
|        |D ]F  }t#        |      D ]6  \  }}t!        |      }|j)                  |||         }||xx   |z  cc<   |6 F H t#        |      D ]+  \  }}|j+                  ||         }|t        i d|i      c S  t        | j                  d         # t        t        f$ r d
}
Y Zw xY wc c}w # t&        $ r |d
|dz    }Y  w xY w)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*   rK   HTTP_CONTENT_TYPErA    HTTP_CONTENT_LENGTHCONTENT_LENGTHr   Nfile   irJ   )r,   r   r-   rB   rD   get_filenamer   errorsintr3   	TypeErrorhandle_raw_inputr   
chunk_sizeminr   len	enumeratenew_filer   receive_data_chunkfile_complete)r   r!   r"   r#   r@   r*   rF   rD   filenamecontent_typecontent_lengthhandlerresultxpossible_sizesrX   chunkscountersindexchunkchunk_lengthfile_objs                         r   r   zFileUploadParser.parse}   s    (-2 +!%%j(2J2JK||!11$$VZHT[[788 xx 3 $ <>	" *?*.((3CQ*G"I JN ' 	=G--f.2.<.2.6	8F
 !#B(;<<	= 1@P11<<!,,PP+78
6:.3_--'8 	NE7  x!/;	  	E"+O"< w"5z225(5/J</=	 (8 	<NE7,,Xe_=H##B(:;;	<
 [122Q I& 	"!N	" Q & "1*519"=s0   +H 4HHH"HH"H76H7c                    	 |d   d   S # t         $ r Y nw xY w	 |d   j                  }t        |d   j                               }|d   }d|v r| j	                  |      S t        |d         S # t        t         t        f$ r Y yw xY w)z
        Detects the uploaded file name. First searches a 'filename' url kwarg.
        Then tries to parse Content-Disposition header.
        kwargsr_   r@   HTTP_CONTENT_DISPOSITIONrR   	filename*N)KeyErrorrB   r
   encodeget_encoded_filenamer   AttributeErrorr3   )r   r!   r"   r#   rF   dispositionfilename_parms          r   rS   zFileUploadParser.get_filename   s    
	!(+J77 			!),11D&t,F'G'N'N'PQK'NMm+00??]:677*5 		s$   
 	AA- A- -BBc                     t        |d         }	 |j                  dd      \  }}}t        j                  |      }|S # t        t
        f$ r t        |d         }Y |S w xY w)zw
        Handle encoded filenames per RFC6266. See also:
        https://tools.ietf.org/html/rfc2231#section-4
        ro   '   r_   )r   splitr   unquoter3   LookupError)r   ru   encoded_filenamecharsetlangr_   s         r   rr   z%FileUploadParser.get_encoded_filename   sq    
 %];%?@	<&6&<&<T1&E#GT8}}X.H  K( 	< z!:;H	<s   += AAr$   )	r   r   r   r&   r"   rT   r   rS   rr   r   r   r   rI   rI   s   s,     J]yF
A3F(r   rI   )r&   r.   urllibr   django.confr   django.core.files.uploadhandlerr   django.httpr   django.http.multipartparserr   r   rE   r	   r
   django.utils.encodingr   rest_frameworkr   rest_framework.exceptionsr   rest_framework.settingsr   rest_framework.utilsr   r   r   r(   r;   rI   r   r   r   <module>r      s        > ! 1- J + $ 0 0 % B B A A.; ; Kj K:lz lr   