oncall-engine/engine/engine/parsers.py
Michael Derynck 6b40f95033 World, meet OnCall!
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>
2022-06-03 08:09:47 -06:00

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)