Skip to content

Commit

Permalink
empty mediatype and subtype processing
Browse files Browse the repository at this point in the history
  • Loading branch information
Ivan Larin authored and fladi committed Sep 27, 2016
1 parent 652b0a0 commit 3c102ba
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 5 deletions.
10 changes: 10 additions & 0 deletions src/django_accept_header/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class ParsingError(Exception):
pass


class MediaTypeValueError(ParsingError):
pass


class SubtypeValueError(ParsingError):
pass
18 changes: 16 additions & 2 deletions src/django_accept_header/header.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@

from collections import OrderedDict as kv

from . import exceptions


class MediaType(object):

def __init__(self, media_type, q=None, params=None):
(self._mediatype, self._subtype) = media_type.split('/')
self.mediatype, _, self.subtype = media_type.partition('/')
self._quality = q or 1.0
self._params = params or {}

Expand All @@ -32,7 +34,7 @@ def __repr__(self):

def __str__(self):
if len(self.params) > 0:
p = '; '.join(['{key}={value}'.format(key=k, value=v) for k, v in self.params.items()])
p = '; '.join('{key}={value}'.format(key=k, value=v) for k, v in self.params.items())
return '%s; q=%s; %s' % (self.mimetype, self.q, p)
else:
return '%s; q=%s' % (self.mimetype, self.q)
Expand Down Expand Up @@ -75,10 +77,22 @@ def mimetype(self):
def mediatype(self):
return self._mediatype

@mediatype.setter
def mediatype(self, value):
if not value:
raise exceptions.MediaTypeValueError(value)
self._mediatype = value

@property
def subtype(self):
return self._subtype

@subtype.setter
def subtype(self, value):
if not value:
raise exceptions.SubtypeValueError(value)
self._subtype = value

@property
def quality(self):
return self._quality
Expand Down
11 changes: 8 additions & 3 deletions src/django_accept_header/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,18 @@

from __future__ import absolute_import

from django import http

from .exceptions import ParsingError
from .header import parse


class AcceptMiddleware(object):

def process_request(self, request):
acc = parse(request.META.get('HTTP_ACCEPT'))
try:
acc = parse(request.META.get('HTTP_ACCEPT'))
except ParsingError:
return http.HttpResponseBadRequest()
setattr(request, 'accepted_types', acc)
request.accepts = lambda mt: any([ma.matches(mt) for ma in acc])
return None
request.accepts = lambda mt: any(ma.matches(mt) for ma in acc)
13 changes: 13 additions & 0 deletions tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import unittest

from django_accept_header.header import parse, MediaType
from django_accept_header.exceptions import MediaTypeValueError, SubtypeValueError


class ParserTestCase(unittest.TestCase):
Expand Down Expand Up @@ -241,6 +242,18 @@ def test_subtypes(self):
'*'
)

def test_invalid_media_types(self):
with self.assertRaises(MediaTypeValueError):
MediaType('/json')
with self.assertRaises(MediaTypeValueError):
MediaType('/')

def test_invalid_subtypes(self):
with self.assertRaises(SubtypeValueError):
MediaType('application/')
with self.assertRaises(SubtypeValueError):
MediaType('application')

def test_all_subtypes(self):
self.assertFalse(MediaType('application/json').all_subtypes)
self.assertTrue(MediaType('application/*').all_subtypes)
Expand Down

0 comments on commit 3c102ba

Please sign in to comment.