Co-authored-by: Eve832 <eve.meelan@grafana.com>
Co-authored-by: Francisco Montes de Oca <nevermind89x@gmail.com>
Co-authored-by: Ildar Iskhakov <ildar.iskhakov@grafana.com>
Co-authored-by: Innokentii Konstantinov <innokenty.konstantinov@grafana.com>
Co-authored-by: Julia <ferril.darkdiver@gmail.com>
Co-authored-by: maskin25 <kengurek@gmail.com>
Co-authored-by: Matias Bordese <mbordese@gmail.com>
Co-authored-by: Matvey Kukuy <motakuk@gmail.com>
Co-authored-by: Michael Derynck <michael.derynck@grafana.com>
Co-authored-by: Richard Hartmann <richih@richih.org>
Co-authored-by: Robby Milo <robbymilo@fastmail.com>
Co-authored-by: Timur Olzhabayev <timur.olzhabayev@grafana.com>
Co-authored-by: Vadim Stepanov <vadimkerr@gmail.com>
Co-authored-by: Yulia Shanyrova <yulia.shanyrova@grafana.com>
48 lines
1.8 KiB
Python
48 lines
1.8 KiB
Python
from django.conf import settings
|
|
from rest_framework import parsers, renderers
|
|
|
|
|
|
def check_content_length(parser_context):
|
|
"""Enforce DATA_UPLOAD_MAX_MEMORY_SIZE for json rest framework API requests."""
|
|
if parser_context and settings.DATA_UPLOAD_MAX_MEMORY_SIZE and "request" in parser_context:
|
|
try:
|
|
content_length = int(parser_context["request"].META.get("CONTENT_LENGTH", 0))
|
|
except (ValueError, TypeError):
|
|
content_length = 0
|
|
|
|
if content_length and content_length > settings.DATA_UPLOAD_MAX_MEMORY_SIZE or content_length < 0:
|
|
raise parsers.ParseError("RequestDataTooBig")
|
|
|
|
|
|
class JSONParser(parsers.JSONParser):
|
|
"""
|
|
Parse JSON-serialized data.
|
|
Enforce django setting for DATA_UPLOAD_MAX_MEMORY_SIZE.
|
|
"""
|
|
|
|
media_type = "application/json"
|
|
renderer_class = renderers.JSONRenderer
|
|
|
|
def parse(self, stream, media_type=None, parser_context=None):
|
|
"""Parse incoming bytestream as JSON and returns the resulting data."""
|
|
# see https://github.com/encode/django-rest-framework/issues/4760
|
|
check_content_length(parser_context)
|
|
return super(JSONParser, self).parse(stream, media_type, parser_context)
|
|
|
|
|
|
class FormParser(parsers.FormParser):
|
|
"""
|
|
Parse form data.
|
|
Enforce django setting for DATA_UPLOAD_MAX_MEMORY_SIZE.
|
|
"""
|
|
|
|
media_type = "application/x-www-form-urlencoded"
|
|
|
|
def parse(self, stream, media_type=None, parser_context=None):
|
|
"""
|
|
Parses the incoming bytestream as a URL encoded form,
|
|
and returns the resulting QueryDict.
|
|
"""
|
|
# see https://github.com/encode/django-rest-framework/issues/4760
|
|
check_content_length(parser_context)
|
|
return super(FormParser, self).parse(stream, media_type, parser_context)
|