From 7d121fd79d7ce80152ed0bd9f83bf2a0cbf40586 Mon Sep 17 00:00:00 2001 From: kgriffs Date: Thu, 4 Apr 2013 01:43:12 -0400 Subject: [PATCH] feat(Request): Add method to detect whether the client accepts XML. --- falcon/__init__.py | 2 +- falcon/api.py | 2 +- falcon/request.py | 16 +++++++++++++--- tests/test_req_vars.py | 21 +++++++++++++++++++-- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/falcon/__init__.py b/falcon/__init__.py index dd02480..e44eb6e 100644 --- a/falcon/__init__.py +++ b/falcon/__init__.py @@ -37,7 +37,7 @@ from falcon.api import API, DEFAULT_MEDIA_TYPE # NOQA from falcon.status_codes import * # NOQA from falcon.exceptions import * # NOQA from falcon.http_error import HTTPError # NOQA -from falcon.util import dt_to_http, to_query_str # NOQA +from falcon.util import dt_to_http, http_date_to_dt, to_query_str # NOQA from falcon.hooks import before, after # NOQA from falcon.request import Request # NOQA from falcon.response import Response # NOQA diff --git a/falcon/api.py b/falcon/api.py index bf7fbab..00f8295 100644 --- a/falcon/api.py +++ b/falcon/api.py @@ -87,7 +87,7 @@ class API(object): if ex.headers is not None: resp.set_headers(ex.headers) - if req.client_accepts_json(): + if req.client_accepts_json: resp.body = ex.json() except TypeError as ex: diff --git a/falcon/request.py b/falcon/request.py index 6674233..f41cc7e 100644 --- a/falcon/request.py +++ b/falcon/request.py @@ -20,8 +20,9 @@ from datetime import datetime import six -from falcon import request_helpers as helpers from falcon.exceptions import * +from falcon import util +from falcon import request_helpers as helpers DEFAULT_ERROR_LOG_FORMAT = ('{0:%Y-%m-%d %H:%M:%S} [FALCON] [ERROR]' ' {1} {2}?{3} => {4}\n') @@ -119,13 +120,22 @@ class Request(object): self._wsgierrors.write(log_line) + @property def client_accepts_json(self): - """Return True if the Accept header indicates JSON support""" + """Return True if the Accept header indicates JSON support.""" - accept = self.get_header('Accept') + accept = self._get_header_by_wsgi_name('ACCEPT') return ((accept is not None) and (('application/json' in accept) or ('*/*' in accept))) + @property + def client_accepts_xml(self): + """Return True if the Accept header indicates XML support.""" + + accept = self._get_header_by_wsgi_name('ACCEPT') + return ((accept is not None) and + (('application/xml' in accept) or ('*/*' in accept))) + @property def accept(self): """Value of the Accept header, or None if not found.""" diff --git a/tests/test_req_vars.py b/tests/test_req_vars.py index d8c4cfd..ac832cb 100644 --- a/tests/test_req_vars.py +++ b/tests/test_req_vars.py @@ -74,6 +74,23 @@ class TestReqVars(testing.TestBase): self.assertEqual(req_noapp.relative_uri, self.relative_uri) + def test_accept_xml(self): + headers = {'Accept': 'application/xml'} + req = Request(testing.create_environ(headers=headers)) + self.assertTrue(req.client_accepts_xml) + + headers = {'Accept': '*/*'} + req = Request(testing.create_environ(headers=headers)) + self.assertTrue(req.client_accepts_xml) + + headers = {'Accept': 'application/json'} + req = Request(testing.create_environ(headers=headers)) + self.assertFalse(req.client_accepts_xml) + + headers = {'Accept': 'application/xm'} + req = Request(testing.create_environ(headers=headers)) + self.assertFalse(req.client_accepts_xml) + def test_range(self): headers = {'Range': '10-'} req = Request(testing.create_environ(headers=headers)) @@ -89,11 +106,11 @@ class TestReqVars(testing.TestBase): headers = {'Range': ''} req = Request(testing.create_environ(headers=headers)) - self.assertEqual(req.range, None) + self.assertIs(req.range, None) headers = {'Range': None} req = Request(testing.create_environ(headers=headers)) - self.assertEqual(req.range, None) + self.assertIs(req.range, None) def test_range_invalid(self): headers = {'Range': '10240'}