diff --git a/django/http/parsers.py b/django/http/parsers.py index 68f5b7129b..bd86c2dac7 100644 --- a/django/http/parsers.py +++ b/django/http/parsers.py @@ -8,6 +8,9 @@ from django.utils.datastructures import ImmutableList, MultiValueDict class BaseParser: media_type = None + def can_handle(self, media_type): + return media_type == self.media_type + def parse(self, request): pass diff --git a/django/http/request.py b/django/http/request.py index 6966edafb6..118cdaeab7 100644 --- a/django/http/request.py +++ b/django/http/request.py @@ -363,7 +363,7 @@ class HttpRequest: selected_parser = None for parser in parser_list: - if self.content_type == parser.media_type: + if parser.can_handle(self.content_type): selected_parser = parser break diff --git a/tests/requests_tests/test_parsers.py b/tests/requests_tests/test_parsers.py new file mode 100644 index 0000000000..5a1d5653fc --- /dev/null +++ b/tests/requests_tests/test_parsers.py @@ -0,0 +1,27 @@ +from unittest import TestCase + +from django.http.parsers import BaseParser, FormParser, MultiPartParser + + +class TestParsers(TestCase): + def test_can_handle(self): + parser = MultiPartParser() + self.assertIs(parser.can_handle("multipart/form-data"), True) + self.assertIs(parser.can_handle("application/json"), False) + + parser = FormParser() + self.assertIs(parser.can_handle("application/x-www-form-urlencoded"), True) + self.assertIs(parser.can_handle("multipart/form-data"), False) + + def test_custom_can_handle(self): + class CustomParser(BaseParser): + media_type = "text/*" + + def can_handle(self, media_type): + main_type, sub_type = media_type.split("/") + return main_type == "text" + + parser = CustomParser() + self.assertIs(parser.can_handle("application/json"), False) + self.assertTrue(parser.can_handle("text/*"), True) + self.assertTrue(parser.can_handle("text/csv"), True)