Source code for falcon.media.handlers

import mimeparse

from six.moves import UserDict

from falcon import errors
from falcon.media import JSONHandler


[docs]class Handlers(UserDict): """A dictionary like object that manages internet media type handlers.""" def __init__(self, initial=None): handlers = initial or { 'application/json': JSONHandler(), 'application/json; charset=UTF-8': JSONHandler(), } # NOTE(jmvrbanac): Directly calling UserDict as it's not inheritable. # Also, this results in self.update(...) being called. UserDict.__init__(self, handlers) def _resolve_media_type(self, media_type, all_media_types): resolved = None try: # NOTE(jmvrbanac): Mimeparse will return an empty string if it can # parse the media type, but cannot find a suitable type. resolved = mimeparse.best_match( all_media_types, media_type ) except ValueError: pass return resolved def find_by_media_type(self, media_type, default): # PERF(jmvrbanac): Check via a quick methods first for performance if media_type == '*/*' or not media_type: return self.data[default] try: return self.data[media_type] except KeyError: pass # PERF(jmvrbanac): Fallback to the slower method resolved = self._resolve_media_type(media_type, self.data.keys()) if not resolved: raise errors.HTTPUnsupportedMediaType( '{0} is an unsupported media type.'.format(media_type) ) return self.data[resolved]