Source code for falcon.media.urlencoded

from urllib.parse import urlencode

from falcon import errors
from falcon.media.base import BaseHandler
from falcon.util.uri import parse_query_string


[docs]class URLEncodedFormHandler(BaseHandler): """ URL-encoded form data handler. This handler parses ``application/x-www-form-urlencoded`` HTML forms to a ``dict`` in a similar way that URL query parameters are parsed. An empty body will be parsed as an empty dict. When deserializing, this handler will raise :class:`falcon.MediaMalformedError` if the request payload cannot be parsed as ASCII or if any of the URL-encoded strings in the payload are not valid UTF-8. Keyword Arguments: keep_blank (bool): Whether to keep empty-string values from the form when deserializing. csv (bool): Whether to split comma-separated form values into list when deserializing. """ def __init__(self, keep_blank=True, csv=False): self.keep_blank = keep_blank self.csv = csv def serialize(self, media, content_type): # NOTE(vytas): Setting doseq to True to mirror the parse_query_string # behaviour. return urlencode(media, doseq=True) def _deserialize(self, body): try: # NOTE(kgriffs): According to http://goo.gl/6rlcux the # body should be US-ASCII. Enforcing this also helps # catch malicious input. body = body.decode('ascii') return parse_query_string( body, keep_blank=self.keep_blank, csv=self.csv ) except Exception as err: raise errors.MediaMalformedError('URL-encoded') from err def deserialize(self, stream, content_type, content_length): return self._deserialize(stream.read()) async def deserialize_async(self, stream, content_type, content_length): return self._deserialize(await stream.read())