Ë
    ûûàg%  ã                   ó  — d Z ddl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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)Úsettings)ÚStopFutureHandlers)Ú	QueryDict)Ú	ChunkIter)ÚMultiPartParser)ÚMultiPartParserError)Úparse_header_parameters)Ú	renderers)Ú
ParseError)Úapi_settings)Újsonc                   ó   — e Zd Zd„ Zy)ÚDataAndFilesc                 ó    — || _         || _        y )N)ÚdataÚfiles)Úselfr   r   s      úT/var/www/skyplay_api_hub/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   Úparsez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.parse8   sŽ   € ð (Ò-¨2ˆØ!×%Ñ% j´(×2JÑ2JÓKˆð	AØ7œV×-Ñ-¨hÓ7¸Ó?ˆNØ59·[²[œT×1Ò1ÀdˆNÜ—9‘9˜^¸NÔKÐKøÜò 	AÜÐ4´s¸3³xÑ?Ó@Ð@ûð	Aús   ¨AA8 Á8	BÂBÂBr#   )r   r   r   r%   r    r
   ÚJSONRendererÚrenderer_classr   ÚSTRICT_JSONr/   r"   r   r   r   r'   r'   0   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.parseM   s9   € ð
 (Ò-¨2ˆØ!×%Ñ% j´(×2JÑ2JÓKˆÜ˜Ÿ™›°Ô:Ð:r   r#   r$   r   r   r   r:   r:   G   s   „ ñð 5€Jô;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   r3   )r   r   r    r!   r?   r)   ÚmetarC   Úparserr   r   r5   s               r   r"   zMultiPartParser.parse]   s°   € ð (Ò-¨2ˆØ  Ñ+ˆØ!×%Ñ% j´(×2JÑ2JÓKˆØ�|‰|× Ñ Ó"ˆØ)ˆˆ^ÑØ!×1Ñ1ˆð	KÜ*¨4°¸È(ÓSˆFØ Ÿ,™,›.‰KˆD�%Ü  eÓ,Ð,øÜ#ò 	KÜÐ>ÄÀSÃÑIÓJÐJûð	Kús   Á,B Â	B*ÂB%Â%B*r#   r$   r   r   r   r   r   W   s   „ ñð '€JôKr   r   c                   ó,   — e Zd ZdZdZdddœZd	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)   rJ   ÚHTTP_CONTENT_TYPEr@   Ú ÚHTTP_CONTENT_LENGTHÚCONTENT_LENGTHr   NÚfileé   iüÿÿrI   )r+   r   r,   rA   rC   Úget_filenamer   ÚerrorsÚintr2   Ú	TypeErrorÚhandle_raw_inputr   Ú
chunk_sizeÚ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ÚxÚpossible_sizesrW   ÚchunksÚcountersÚindexÚchunkÚchunk_lengthÚfile_objs                         r   r"   zFileUploadParser.parse~   sŽ  € ð (Ò-¨2ˆØ  Ñ+ˆØ!×%Ñ% j´(×2JÑ2JÓKˆØ�|‰|ˆØ!×1Ñ1ˆØ×$Ñ$ V¨Z¸ÓHˆáÜ˜TŸ[™[¨Ñ7Ó8Ð8ð —x‘xÐ 3Ø $§¡¨¸Ó <ó>ˆð	"Ü  §¡Ð*?Ø*.¯(©(Ð3CÀQÓ*Gó"Ió JˆNð 'ò 	=ˆGØ×-Ñ-¨fØ.2Ø.<Ø.2Ø.6ó	8ˆFð
 Ñ!Ü# B¨°¸±Ð(;Ó<Ò<ð	=ð 1@ÖP¨1À1Ç<Ã<˜!Ÿ,›,ÐPˆÐPÜ˜+˜¨Ñ7Ó8ˆ
Ü˜6 :Ó.ˆØ�3œ˜_Ó-Ñ-ˆä'¨Ó8ò 	‰NˆE�7ðØ× Ñ   x°Ø!/°õ;ð	ð ò 	ˆEÜ"+¨OÓ"<ò ‘��wÜ" 5›z�Ø×2Ñ2°5¸(À5¹/ÓJ�Ø˜“ <Ñ/“Ø‘=Ùñð	ô (¨Ó8ò 	<‰NˆE�7Ø×,Ñ,¨X°e©_Ó=ˆHØÑ#Ü# B¨°Ð(:Ó;Ò;ð	<ô
 ˜Ÿ™ [Ñ1Ó2Ð2øôQ œIÐ&ò 	"Ø!‹Nð	"üò Qøô &ò Ø"1°*°5¸1±9Ð"=�Úðús0   Â+H Ã4HÄHÅH"ÈHÈHÈ"H7È6H7c                 óP  — t        j                  t        «      5  |d   d   cddd«       S # 1 sw Y   nxY wt        j                  t        t        t        «      5  |d   j
                  }t        |d   «      \  }}d|v r|d   cddd«       S |d   cddd«       S # 1 sw Y   yxY w)z�
        Detects the uploaded file name. First searches a 'filename' url kwarg.
        Then tries to parse Content-Disposition header.
        Úkwargsr^   Nr?   ÚHTTP_CONTENT_DISPOSITIONz	filename*)Ú
contextlibÚsuppressÚKeyErrorÚAttributeErrorr2   rA   r	   )r   r   r    r!   rE   ÚdispositionÚparamss          r   rR   zFileUploadParser.get_filenameÁ   s¦   € ô
 × Ñ ¤Ó*ñ 	8Ø! (Ñ+¨JÑ7÷	8÷ 	8ò 	8úô × Ñ ¤´¼:ÓFñ 	&Ø! )Ñ,×1Ñ1ˆDÜ"9¸$Ð?YÑ:ZÓ"[ÑˆK˜Ø˜fÑ$Ø˜kÑ*÷		&ñ 	&ð
 ˜*Ñ%÷	&÷ 	&ò 	&ús   š,¬5Á)BÂBÂB%r#   )r   r   r   r%   r    rS   r"   rR   r   r   r   rH   rH   t   s'   „ ñð €Jà]Øyñ€Fó
A3óF&r   rH   )r%   r-   rn   Údjango.confr   Údjango.core.files.uploadhandlerr   Údjango.httpr   Údjango.http.multipartparserr   r   rD   r   Údjango.utils.httpr	   Úrest_frameworkr
   Úrest_framework.exceptionsr   Úrest_framework.settingsr   Úrest_framework.utilsr   r   r   r'   r:   rH   r   r   r   ú<module>r}      s�   ðñó Û å  Ý >Ý !Ý 1õ-å <Ý 5å $Ý 0Ý 0Ý %÷ñ ÷Bñ Bô A�ô Aô.;�ô ;ô K�jô Kô:Z&�zõ Z&r   