codecov[bot]: # [Codecov](https://codecov.io/gh/falconry/falcon/pull/1151?src=pr&el=h1) Report
> Merging [#1151](https://codecov.io/gh/falconry/falcon/pull/1151?src=pr&el=desc) into [master](https://codecov.io/gh/falconry/falcon/commit/0c6b6deb8692b06c677893f97c89cc3870595853?src=pr&el=desc) will **not change** coverage.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/falconry/falcon/pull/1151/graphs/tree.svg?width=650&token=zOtkfNQ3h6&height=150&src=pr)](https://codecov.io/gh/falconry/falcon/pull/1151?src=pr&el=tree)

```diff
@@          Coverage Diff           @@
##           master   #1151   +/-   ##
======================================
  Coverage     100%    100%           
======================================
  Files          36      36           
  Lines        2378    2378           
  Branches      347     347           
======================================
  Hits         2378    2378
```


| [Impacted Files](https://codecov.io/gh/falconry/falcon/pull/1151?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [falcon/hooks.py](https://codecov.io/gh/falconry/falcon/pull/1151/diff?src=pr&el=tree#diff-ZmFsY29uL2hvb2tzLnB5) | `100% <100%> (ø)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/falconry/falcon/pull/1151?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/falconry/falcon/pull/1151?src=pr&el=footer). Last update [0c6b6de...8bb3244](https://codecov.io/gh/falconry/falcon/pull/1151?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

diff --git a/docs/api/hooks.rst b/docs/api/hooks.rst
index 16284c6..c8dbbd6 100644
--- a/docs/api/hooks.rst
+++ b/docs/api/hooks.rst
@@ -33,12 +33,43 @@ decorate the resource class:
 
     @falcon.before(extract_project_id)
     class Message(object):
-        def on_post(self, req, resp):
+        def on_post(self, req, resp, project_id):
             pass
 
-        def on_get(self, req, resp):
+        def on_get(self, req, resp, project_id):
             pass
 
+Note also that you can pass additional arguments to your hook function
+as needed:
+
+.. code:: python
+
+    def validate_image_type(req, resp, resource, params, allowed_types):
+        if req.content_type not in allowed_types:
+            msg = 'Image type not allowed.'
+            raise falcon.HTTPBadRequest('Bad request', msg)
+
+    @falcon.before(validate_image_type, ['image/png'])
+    def on_post(self, req, resp):
+        pass
+
+Falcon supports using any callable as a hook. This allows for using a class
+instead of a function:
+
+.. code:: python
+
+    class Authorize(object):
+        def __init__(self, roles):
+            self._roles = roles
+
+        def __call__(self, req, resp, resource, params):
+            pass
+
+    @falcon.before(Authorize(['admin']))
+    def on_post(self, req, resp):
+        pass
+
+
 Falcon :ref:`middleware components <middleware>` can also be used to insert
 logic before and after requests. However, unlike hooks,
 :ref:`middleware components <middleware>` are triggered **globally** for all
diff --git a/falcon/hooks.py b/falcon/hooks.py
index e302b9a..d983759 100644
--- a/falcon/hooks.py
+++ b/falcon/hooks.py
@@ -22,7 +22,7 @@ from falcon import COMBINED_METHODS
 from falcon.util.misc import get_argnames
 
 
-def before(action):
+def before(action, *args, **kwargs):
     """Decorator to execute the given action function *before* the responder.
 
     Args:
@@ -45,6 +45,12 @@ def before(action):
 
                         params['answer'] = 42
 
+        *args: Any additional arguments will be passed to *action* in the
+            order given, immediately following the *req*, *resp*, *resource*,
+            and *params* arguments.
+
+        **kwargs: Any additional keyword arguments will be passed through to
+            *action*.
     """
 
     def _before(responder_or_resource):
@@ -68,7 +74,7 @@ def before(action):
                         # variable that is shared between iterations of the
                         # for loop, above.
                         def let(responder=responder):
-                            do_before_all = _wrap_with_before(action, responder)
+                            do_before_all = _wrap_with_before(responder, action, args, kwargs)
 
                             setattr(resource, responder_name, do_before_all)
 
@@ -78,14 +84,14 @@ def before(action):
 
         else:
             responder = responder_or_resource
-            do_before_one = _wrap_with_before(action, responder)
+            do_before_one = _wrap_with_before(responder, action, args, kwargs)
 
             return do_before_one
 
     return _before
 
 
-def after(action):
+def after(action, *args, **kwargs):
     """Decorator to execute the given action function *after* the responder.
 
     Args:
@@ -94,6 +100,12 @@ def after(action):
             reference to the resource class instance associated with the
             request
 
+        *args: Any additional arguments will be passed to *action* in the
+            order given, immediately following the *req*, *resp*, *resource*,
+            and *params* arguments.
+
+        **kwargs: Any additional keyword arguments will be passed through to
+            *action*.
     """
 
     def _after(responder_or_resource):
@@ -113,7 +125,7 @@ def after(action):
                     if callable(responder):
 
                         def let(responder=responder):
-                            do_after_all = _wrap_with_after(action, responder)
+                            do_after_all = _wrap_with_after(responder, action, args, kwargs)
 
                             setattr(resource, responder_name, do_after_all)
 
@@ -123,7 +135,7 @@ def after(action):
 
         else:
             responder = responder_or_resource
-            do_after_one = _wrap_with_after(action, responder)
+            do_after_one = _wrap_with_after(responder, action, args, kwargs)
 
             return do_after_one
 
@@ -135,13 +147,15 @@ def after(action):
 # -----------------------------------------------------------------------------
 
 
-def _wrap_with_after(action, responder):
+def _wrap_with_after(responder, action, action_args, action_kwargs):
     """Execute the given action function after a responder method.
 
     Args:
+        responder: The responder method to wrap.
         action: A function with a signature similar to a resource responder
             method, taking the form ``func(req, resp, resource)``.
-        responder: The responder method to wrap.
+        action_args: Additiona positional agruments to pass to *action*.
+        action_kwargs: Additional keyword arguments to pass to *action*.
     """
 
     # NOTE(swistakm): create shim before checking what will be actually
@@ -153,8 +167,8 @@ def _wrap_with_after(action, responder):
         # classes in Python vesions prior to 3.4.
         #
         # @wraps(action)
-        def shim(req, resp, resource):
-            action(req, resp)
+        def shim(req, resp, resource, *args, **kwargs):
+            action(req, resp, *args, **kwargs)
 
     responder_argnames = get_argnames(responder)
     extra_argnames = responder_argnames[2:]  # Skip req, resp
@@ -165,18 +179,20 @@ def _wrap_with_after(action, responder):
             _merge_responder_args(args, kwargs, extra_argnames)
 
         responder(self, req, resp, **kwargs)
-        shim(req, resp, self)
+        shim(req, resp, self, *action_args, **action_kwargs)
 
     return do_after
 
 
-def _wrap_with_before(action, responder):
+def _wrap_with_before(responder, action, action_args, action_kwargs):
     """Execute the given action function before a responder method.
 
     Args:
+        responder: The responder method to wrap.
         action: A function with a similar signature to a resource responder
             method, taking the form ``func(req, resp, resource, params)``.
-        responder: The responder method to wrap
+        action_args: Additiona positional agruments to pass to *action*.
+        action_kwargs: Additional keyword arguments to pass to *action*.
     """
 
     # NOTE(swistakm): create shim before checking what will be actually
@@ -188,10 +204,10 @@ def _wrap_with_before(action, responder):
         # classes in Python versions prior to 3.4.
         #
         # @wraps(action)
-        def shim(req, resp, resource, kwargs):
+        def shim(req, resp, resource, params, *args, **kwargs):
             # NOTE(kgriffs): Don't have to pass "self" even if has_self,
             # since method is assumed to be bound.
-            action(req, resp, kwargs)
+            action(req, resp, params, *args, **kwargs)
 
     responder_argnames = get_argnames(responder)
     extra_argnames = responder_argnames[2:]  # Skip req, resp
@@ -201,7 +217,7 @@ def _wrap_with_before(action, responder):
         if args:
             _merge_responder_args(args, kwargs, extra_argnames)
 
-        shim(req, resp, self, kwargs)
+        shim(req, resp, self, kwargs, *action_args, **action_kwargs)
         responder(self, req, resp, **kwargs)
 
     return do_before

Support passing args to hooks
See also: https://stackoverflow.com/questions/27028029/how-to-pass-arguments-to-falcon-before-hook
diff --git a/tests/test_after_hooks.py b/tests/test_after_hooks.py
index 8675604..b8cf3d2 100644
--- a/tests/test_after_hooks.py
+++ b/tests/test_after_hooks.py
@@ -48,8 +48,10 @@ def serialize_body(req, resp):
         resp.body = 'Nothing to see here. Move along.'
 
 
-def fluffiness(req, resp):
+def fluffiness(req, resp, animal=''):
     resp.body = 'fluffy'
+    if animal:
+        resp.set_header('X-Animal', animal)
 
 
 def resource_aware_fluffiness(req, resp, resource):
@@ -63,14 +65,14 @@ class ResourceAwareFluffiness(object):
         fluffiness(req, resp)
 
 
-def cuteness(req, resp):
-    if resp.body == 'fluffy':
-        resp.body += ' and cute'
+def cuteness(req, resp, check, postfix=' and cute'):
+    if resp.body == check:
+        resp.body += postfix
 
 
 def resource_aware_cuteness(req, resp, resource):
     assert resource
-    cuteness(req, resp)
+    cuteness(req, resp, 'fluffy')
 
 
 class Smartness(object):
@@ -95,8 +97,8 @@ cuteness_in_the_head = functools.partial(things_in_the_head,
                                          'X-Cuteness', 'cute')
 
 
-def fluffiness_in_the_head(req, resp):
-    resp.set_header('X-Fluffiness', 'fluffy')
+def fluffiness_in_the_head(req, resp, value='fluffy'):
+    resp.set_header('X-Fluffiness', value)
 
 
 # --------------------------------------------------------------------
@@ -123,8 +125,8 @@ class WrappedRespondersResource(object):
         pass
 
 
-@falcon.after(cuteness)
-@falcon.after(fluffiness)
+@falcon.after(cuteness, 'fluffy', postfix=' and innocent')
+@falcon.after(fluffiness, 'kitten')
 class WrappedClassResource(object):
 
     # Test that the decorator skips non-callables
@@ -153,7 +155,7 @@ class WrappedClassResourceChild(WrappedClassResource):
 
 class ClassResourceWithURIFields(object):
 
-    @falcon.after(fluffiness_in_the_head)
+    @falcon.after(fluffiness_in_the_head, 'fluffy')
     def on_get(self, req, resp, field1, field2):
         self.fields = (field1, field2)
 
@@ -255,12 +257,14 @@ def test_wrapped_resource(client, resource):
     client.app.add_route('/wrapped', resource)
     result = client.simulate_get('/wrapped')
     assert result.status_code == 200
-    assert result.text == 'fluffy and cute'
+    assert result.text == 'fluffy and innocent'
+    assert result.headers['X-Animal'] == 'kitten'
 
     result = client.simulate_head('/wrapped')
     assert result.status_code == 200
     assert result.headers['X-Fluffiness'] == 'fluffy'
     assert result.headers['X-Cuteness'] == 'cute'
+    assert result.headers['X-Animal'] == 'kitten'
 
     result = client.simulate_post('/wrapped')
     assert result.status_code == 405
@@ -272,6 +276,7 @@ def test_wrapped_resource(client, resource):
     result = client.simulate_options('/wrapped')
     assert result.status_code == 200
     assert not result.text
+    assert 'X-Animal' not in result.headers
 
 
 def test_wrapped_resource_with_hooks_aware_of_resource(client, wrapped_resource_aware):
diff --git a/tests/test_before_hooks.py b/tests/test_before_hooks.py
index 1d58df3..01bebb1 100644
--- a/tests/test_before_hooks.py
+++ b/tests/test_before_hooks.py
@@ -17,28 +17,29 @@ def validate(req, resp, params):
                                 'formatted correctly.')
 
 
-def validate_param(req, resp, params):
-    limit = req.get_param_as_int('limit')
-    if limit and int(limit) > 100:
-        raise falcon.HTTPBadRequest('Out of range', 'limit must be <= 100')
+def validate_param(req, resp, params, param_name, maxval=100):
+    limit = req.get_param_as_int(param_name)
+    if limit and int(limit) > maxval:
+        msg = '{0} must be <= {1}'.format(param_name, maxval)
+        raise falcon.HTTPBadRequest('Out of Range', msg)
 
 
-def resource_aware_validate_param(req, resp, resource, params):
+def resource_aware_validate_param(req, resp, resource, params, param_name, maxval=100):
     assert resource
-    validate_param(req, resp, params)
+    validate_param(req, resp, params, param_name, maxval)
 
 
 class ResourceAwareValidateParam(object):
     def __call__(self, req, resp, resource, params):
         assert resource
-        validate_param(req, resp, params)
+        validate_param(req, resp, params, 'limit')
 
 
-def validate_field(req, resp, params):
+def validate_field(req, resp, params, field_name='test'):
     try:
-        params['id'] = int(params['id'])
+        params[field_name] = int(params[field_name])
     except ValueError:
-        raise falcon.HTTPBadRequest('Invalid ID', 'ID was not valid.')
+        raise falcon.HTTPBadRequest()
 
 
 def parse_body(req, resp, params):
@@ -92,7 +93,7 @@ frogs_in_the_head = functools.partial(
 
 class WrappedRespondersResource(object):
 
-    @falcon.before(validate_param)
+    @falcon.before(validate_param, 'limit', 100)
     @falcon.before(parse_body)
     def on_get(self, req, resp, doc):
         self.req = req
@@ -107,6 +108,10 @@ class WrappedRespondersResource(object):
 
 class WrappedRespondersResourceChild(WrappedRespondersResource):
 
+    @falcon.before(validate_param, 'x', maxval=1000)
+    def on_get(self, req, resp):
+        pass
+
     def on_put(self, req, resp):
         # Test passing no extra args
         super(WrappedRespondersResourceChild, self).on_put(req, resp)
@@ -120,11 +125,11 @@ class WrappedClassResource(object):
     # Test non-callable should be skipped by decorator
     on_patch = {}
 
-    @falcon.before(validate_param)
+    @falcon.before(validate_param, 'limit')
     def on_get(self, req, resp, bunnies):
         self._capture(req, resp, bunnies)
 
-    @falcon.before(validate_param)
+    @falcon.before(validate_param, 'limit')
     def on_head(self, req, resp, bunnies):
         self._capture(req, resp, bunnies)
 
@@ -150,11 +155,11 @@ class WrappedClassResource(object):
 class ClassResourceWithAwareHooks(object):
     hook_as_class = ResourceAwareValidateParam()
 
-    @falcon.before(resource_aware_validate_param)
+    @falcon.before(resource_aware_validate_param, 'limit', 10)
     def on_get(self, req, resp, bunnies):
         self._capture(req, resp, bunnies)
 
-    @falcon.before(resource_aware_validate_param)
+    @falcon.before(resource_aware_validate_param, 'limit')
     def on_head(self, req, resp, bunnies):
         self._capture(req, resp, bunnies)
 
@@ -174,7 +179,7 @@ class ClassResourceWithAwareHooks(object):
 
 class TestFieldResource(object):
 
-    @falcon.before(validate_field)
+    @falcon.before(validate_field, field_name='id')
     def on_get(self, req, resp, id):
         self.id = id
 
@@ -266,6 +271,12 @@ def test_input_validator_inherited(client):
     result = client.simulate_put('/')
     assert result.status_code == 400
 
+    result = client.simulate_get('/', query_string='x=1000')
+    assert result.status_code == 200
+
+    result = client.simulate_get('/', query_string='x=1001')
+    assert result.status_code == 400
+
 
 def test_param_validator(client):
     result = client.simulate_get('/', query_string='limit=10', body='{}')
@@ -335,6 +346,6 @@ def test_wrapped_resource_with_hooks_aware_of_resource(client, wrapped_aware_res
         assert result.status_code == 200
         assert wrapped_aware_resource.bunnies == 'fuzzy'
 
-    result = client.simulate_get('/wrapped_aware', query_string='limit=101')
+    result = client.simulate_get('/wrapped_aware', query_string='limit=11')
     assert result.status_code == 400
     assert wrapped_aware_resource.bunnies == 'fuzzy'

pip install -e .
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-randomly pytest-xdist pytest-mock pytest-asyncio
apt-get update apt-get install -y gcc
3.6
requirements/tests
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
charset-normalizer==2.0.12
coverage==6.2
execnet==1.9.0
-e git+https://github.com/falconry/falcon.git@0c6b6deb8692b06c677893f97c89cc3870595853#egg=falcon
fixtures==4.0.1
idna==3.10
importlib-metadata==4.8.3
iniconfig==1.1.1
jsonschema==3.2.0
msgpack-python==0.5.6
packaging==21.3
pbr==6.1.1
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pyrsistent==0.18.0
pytest==7.0.1
pytest-asyncio==0.16.0
pytest-cov==4.0.0
pytest-mock==3.6.1
pytest-randomly==3.10.3
pytest-xdist==3.0.2
python-mimeparse==1.6.0
PyYAML==3.11
requests==2.27.1
six==1.17.0
testtools==2.6.0
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.26.20
zipp==3.6.0

name: falcon
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - charset-normalizer==2.0.12
      - coverage==6.2
      - execnet==1.9.0
      - fixtures==4.0.1
      - idna==3.10
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - jsonschema==3.2.0
      - msgpack-python==0.5.6
      - packaging==21.3
      - pbr==6.1.1
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pyrsistent==0.18.0
      - pytest==7.0.1
      - pytest-asyncio==0.16.0
      - pytest-cov==4.0.0
      - pytest-mock==3.6.1
      - pytest-randomly==3.10.3
      - pytest-xdist==3.0.2
      - python-mimeparse==1.6.0
      - pyyaml==3.11
      - requests==2.27.1
      - six==1.17.0
      - testtools==2.6.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - zipp==3.6.0
prefix: /opt/conda/envs/falcon

tests/test_after_hooks.py::test_resource_with_uri_fields[resource1] tests/test_after_hooks.py::test_output_validator tests/test_after_hooks.py::test_serializer tests/test_after_hooks.py::test_wrapped_resource_with_hooks_aware_of_resource tests/test_after_hooks.py::test_hook_as_callable_class tests/test_after_hooks.py::test_resource_with_uri_fields[resource0] tests/test_after_hooks.py::test_wrapped_resource[resource1] tests/test_after_hooks.py::test_wrapped_resource[resource0] tests/test_boundedstream.py::test_not_writeable tests/test_response_media.py::test_msgpack[application/msgpack] tests/test_response_media.py::test_use_cached_media tests/test_response_media.py::test_unknown_media_type tests/test_response_media.py::test_json[*/*] tests/test_response_media.py::test_default_media_type[] tests/test_response_media.py::test_json[application/json; tests/test_response_media.py::test_msgpack[application/msgpack; tests/test_response_media.py::test_msgpack[application/x-msgpack] tests/test_before_hooks.py::test_input_validator tests/test_before_hooks.py::test_parser tests/test_before_hooks.py::test_multiple_resource_hooks[resource1] tests/test_before_hooks.py::test_field_validator[resource1] tests/test_before_hooks.py::test_input_validator_inherited tests/test_before_hooks.py::test_field_validator[resource2] tests/test_before_hooks.py::test_multiple_resource_hooks[resource0] tests/test_before_hooks.py::test_wrapped_resource_with_hooks_aware_of_resource tests/test_before_hooks.py::test_wrapped_resource tests/test_before_hooks.py::test_param_validator tests/test_before_hooks.py::test_field_validator[resource0] tests/test_custom_router.py::test_custom_router_takes_req_positional_argument tests/test_custom_router.py::test_custom_router_add_route_should_be_used tests/test_custom_router.py::test_custom_router_find_should_be_used tests/test_custom_router.py::test_custom_router_takes_req_keyword_argument tests/test_custom_router.py::test_can_pass_additional_params_to_add_route tests/test_default_router.py::test_user_regression_special_chars[/thing-2/something+{field}|{q}/notes-/thing-2/something+else|z/notes-expected_params16] tests/test_default_router.py::test_invalid_field_name[/this\tand\tthat/this\nand\nthat/{thing tests/test_default_router.py::test_options_converters_invalid_name[with-hyphen] tests/test_default_router.py::test_invalid_field_name[/{\nthing}/world] tests/test_default_router.py::test_not_found[/cvt/teams/NaN] tests/test_default_router.py::test_converters_malformed_specification[/foo/{bar:unknown}/baz] tests/test_default_router.py::test_not_found[/teams/42/members/undefined] tests/test_default_router.py::test_match_entire_path[/items/{x}|{y}|-/items/1080|768] tests/test_default_router.py::test_converters_with_invalid_options[/foo/{bar:int(-1)}/baz] tests/test_default_router.py::test_not_found[/teams/default/members/undefined] tests/test_default_router.py::test_invalid_field_name[/repos/{org}/{repo}/compare/{th\ting}] tests/test_default_router.py::test_user_regression_special_chars[/serviceRoot/People({field})-/serviceRoot/People('hobbes')-expected_params2] tests/test_default_router.py::test_not_found[/repos/racker/falcon/compare/johndoe:master...janedoe:dev/bogus] tests/test_default_router.py::test_variable tests/test_default_router.py::test_literal_vs_variable[/gists/first/pdf-21] tests/test_default_router.py::test_converters_with_invalid_options[/foo/{bar:int(num_digits=-1)}/baz] tests/test_default_router.py::test_literal_vs_variable[/teams/default-19] tests/test_default_router.py::test_single_character_field_name tests/test_default_router.py::test_invalid_field_name[/{thing}/wo tests/test_default_router.py::test_conflict[/teams/{id:int}/settings] tests/test_default_router.py::test_literal_vs_variable[/gists/first-20] tests/test_default_router.py::test_converters_malformed_specification[/foo/{bar:}] tests/test_default_router.py::test_converters[/cvt/repos/org/repo/compare/gunmachan:1234...kumamon:5678/part-expected_params4] tests/test_default_router.py::test_literal_vs_variable[/teams/1234-6] tests/test_default_router.py::test_invalid_field_name[/{th\x0bing}/world] tests/test_default_router.py::test_complex[-5] tests/test_default_router.py::test_override tests/test_default_router.py::test_options_converters_invalid_name[ tests/test_default_router.py::test_converters[/cvt/teams/1234/members-expected_params1] tests/test_default_router.py::test_user_regression_special_chars[/thing-2/something+{field}+-/thing-2/something+42+-expected_params14] tests/test_default_router.py::test_invalid_field_name[/{-kgriffs}] tests/test_default_router.py::test_invalid_field_name[/{ tests/test_default_router.py::test_invalid_field_name[/this tests/test_default_router.py::test_user_regression_special_chars[/serviceRoot/People[{field}]-/serviceRoot/People['calvin']-expected_params1] tests/test_default_router.py::test_not_found[/emojis/signs/0/small] tests/test_default_router.py::test_complex[/full-10] tests/test_default_router.py::test_match_entire_path[/items/{x}*{y}foo-/items/1080*768foobar] tests/test_default_router.py::test_user_regression_special_chars[/items/{x}^^{y}-/items/1080^^768-expected_params12] tests/test_default_router.py::test_non_conflict[/repos/{complex}.{vs}.{simple}] tests/test_default_router.py::test_invalid_field_name[/{524hello}/world] tests/test_default_router.py::test_dead_segment[/teams] tests/test_default_router.py::test_match_entire_path[/items/thing-/items/t] tests/test_default_router.py::test_dead_segment[/gists/42] tests/test_default_router.py::test_converters_with_invalid_options[/foo/{bar:int(num_digits=0)}] tests/test_default_router.py::test_root_path tests/test_default_router.py::test_literal_vs_variable[/gists/first/raw-18] tests/test_default_router.py::test_non_conflict[/repos/{org}/{repo}/compare/{simple_vs_complex}] tests/test_default_router.py::test_invalid_field_name[/hello/{1world}] tests/test_default_router.py::test_complex[/part-15] tests/test_default_router.py::test_invalid_field_name[/repos/{complex}.{-v}.{thing}/etc] tests/test_default_router.py::test_not_found[/teams/42/undefined] tests/test_default_router.py::test_literal_vs_variable[/cvt/teams/default/members/1234-10-32] tests/test_default_router.py::test_user_regression_special_chars[/^{field}-/^42-expected_params6] tests/test_default_router.py::test_user_regression_versioned_url tests/test_default_router.py::test_not_found[/teams/42/undefined/segments] tests/test_default_router.py::test_not_found[/teams/default/undefined/segments] tests/test_default_router.py::test_converters[/cvt/teams/default/members/700-5-expected_params2] tests/test_default_router.py::test_dead_segment[/gists] tests/test_default_router.py::test_user_regression_recipes tests/test_default_router.py::test_options_converters_invalid_name[42istheanswer] tests/test_default_router.py::test_invalid_field_name[/{thing\t}/world] tests/test_default_router.py::test_malformed_pattern[/repos/racker/falcon/compare/foo] tests/test_default_router.py::test_literal_vs_variable[/teams/1234/members-7] tests/test_default_router.py::test_literal_vs_variable[/emojis/signs/78/small(png)-25] tests/test_default_router.py::test_not_found[/emojis/signs/0/undefined/segments] tests/test_default_router.py::test_duplicate_field_names[/{field}/something/something/{field}/something] tests/test_default_router.py::test_options_converters_set tests/test_default_router.py::test_options_converters_update[spam] tests/test_default_router.py::test_user_regression_special_chars[/items/{x}|{y}-/items/1080|768-expected_params10] tests/test_default_router.py::test_not_str[uri_template2] tests/test_default_router.py::test_not_found[/teams/default/members/thing/undefined] tests/test_default_router.py::test_literal_vs_variable[/emojis/signs/78-13] tests/test_default_router.py::test_invalid_field_name[/repos/{simple-thing}/etc] tests/test_default_router.py::test_dead_segment[/emojis/signs] tests/test_default_router.py::test_invalid_field_name[/{*kgriffs}] tests/test_default_router.py::test_converters[/cvt/repos/org/repo/compare/xkcd:353-expected_params3] tests/test_default_router.py::test_user_regression_special_chars[/items/{x},{y}-/items/1080,768-expected_params11] tests/test_default_router.py::test_not_found[/emojis/signs] tests/test_default_router.py::test_not_found[/emojis/signs/0/undefined] tests/test_default_router.py::test_not_found[/teams/default/undefined] tests/test_default_router.py::test_not_found[/emojis/signs/20/undefined] tests/test_default_router.py::test_not_found[/emojis/signs/20/small] tests/test_default_router.py::test_user_regression_special_chars[/serviceRoot/People({field})-/serviceRoot/People('hob)bes')-expected_params3] tests/test_default_router.py::test_conflict[/teams/{conflict}] tests/test_default_router.py::test_complex_alt[/full-17-/repos/{org}/{repo}/compare/{usr0}:{branch0}/full] tests/test_default_router.py::test_not_found[/teams] tests/test_default_router.py::test_invalid_field_name[/{thing} tests/test_default_router.py::test_user_regression_special_chars[/items/{x}?{y}-/items/1080?768-expected_params9] tests/test_default_router.py::test_not_found[/cvt/teams/default/members/NaN] tests/test_default_router.py::test_user_regression_special_chars[/thing-2/something*{field}/notes-/thing-2/something*42/notes-expected_params15] tests/test_default_router.py::test_malformed_pattern[/repos/racker/falcon/compare/foo/full] tests/test_default_router.py::test_invalid_field_name[/{9v}] tests/test_default_router.py::test_multivar tests/test_default_router.py::test_not_found[/emojis/signs/42/undefined] tests/test_default_router.py::test_invalid_field_name[/repos/{org}/{repo}/compare/{}] tests/test_default_router.py::test_print_src tests/test_default_router.py::test_invalid_field_name[/repos/{or tests/test_default_router.py::test_duplicate_field_names[/{field}{field}] tests/test_default_router.py::test_not_found[/this/does/not/exist] tests/test_default_router.py::test_not_found[/emojis/signs/78/undefined] tests/test_default_router.py::test_user_regression_special_chars[/serviceRoot/People|{field}-/serviceRoot/People|susie-expected_params0] tests/test_default_router.py::test_conflict[/repos/{org}/{repo}/compare/{complex}:{vs}...{complex2}:{conflict}] tests/test_default_router.py::test_not_found[/cvt/teams/default/members] tests/test_default_router.py::test_literal_vs_variable[/cvt/teams/default-31] tests/test_default_router.py::test_options_converters_invalid_name[has tests/test_default_router.py::test_subsegment_not_found tests/test_default_router.py::test_user_regression_special_chars[serviceRoot/$metadata#Airports('{field}')/Name-serviceRoot/$metadata#Airports('KSFO')/Name-expected_params17] tests/test_default_router.py::test_invalid_field_name[/repos/{complex}.{v}.{@thing}/etc] tests/test_default_router.py::test_user_regression_special_chars[/items/{x}*{y}*-/items/1080*768*-expected_params13] tests/test_default_router.py::test_invalid_field_name[/repos/{complex}.{9v}.{thing}/etc] tests/test_default_router.py::test_converters_with_invalid_options[/foo/{bar:int(0)}] tests/test_default_router.py::test_user_regression_special_chars[/+{field}-/+42-expected_params7] tests/test_default_router.py::test_literal tests/test_default_router.py::test_literal_vs_variable[/emojis/signs/78/small.png-24] tests/test_default_router.py::test_invalid_field_name[/{@kgriffs}] tests/test_default_router.py::test_duplicate_field_names[/{field}/{another}/{field}] tests/test_default_router.py::test_options_converters_invalid_name[funky$character] tests/test_default_router.py::test_converters[/cvt/teams/007-expected_params0] tests/test_default_router.py::test_literal_vs_variable[/teams/default/members-7] tests/test_default_router.py::test_conflict[/emojis/signs/{id_too}] tests/test_default_router.py::test_non_conflict[/repos/{org}/{repo}/compare/{complex}:{vs}...{complex2}/full] tests/test_default_router.py::test_literal_segment tests/test_default_router.py::test_not_found[/user/bogus] tests/test_default_router.py::test_options_converters_invalid_name_on_update tests/test_default_router.py::test_options_converters_invalid_name[whitespace tests/test_default_router.py::test_match_entire_path[/items/{x}*768*-/items/1080*768***] tests/test_default_router.py::test_invalid_field_name[/{}] tests/test_default_router.py::test_user_regression_special_chars[/foo/{first}_{second}/bar-/foo/abc_def_ghijk/bar-expected_params8] tests/test_default_router.py::test_user_regression_special_chars[/serviceRoot/People('{field}')-/serviceRoot/People('rosalyn')-expected_params5] tests/test_default_router.py::test_invalid_field_name[/repos/{complex}.{}.{thing}] tests/test_default_router.py::test_not_str[uri_template0] tests/test_default_router.py::test_complex_alt[-16-/repos/{org}/{repo}/compare/{usr0}:{branch0}] tests/test_default_router.py::test_options_converters_update[spam_2] tests/test_default_router.py::test_user_regression_special_chars[/serviceRoot/People({field})(z)-/serviceRoot/People(hobbes)(z)-expected_params4] tests/test_default_router.py::test_literal_vs_variable[/emojis/signs/78/small_png-26] tests/test_default_router.py::test_literal_vs_variable[/gists/1776/pdf-21] tests/test_default_router.py::test_not_found[/teams/default/members/thing/undefined/segments] tests/test_default_router.py::test_not_str[uri_template1] tests/test_default_router.py::test_duplicate_field_names[/{field}...{field}] tests/test_default_router.py::test_converters[/cvt/repos/xkcd/353/compare/susan:0001/full-expected_params5] tests/test_httperror.py::TestHTTPError::test_429_no_retry_after tests/test_httperror.py::TestHTTPError::test_invalid_param tests/test_httperror.py::TestHTTPError::test_no_description_xml tests/test_httperror.py::TestHTTPError::test_epic_fail_xml[text/xml] tests/test_httperror.py::TestHTTPError::test_410_with_body tests/test_httperror.py::TestHTTPError::test_405_without_body_with_extra_headers_double_check tests/test_httperror.py::TestHTTPError::test_416 tests/test_httperror.py::TestHTTPError::test_unicode_json tests/test_httperror.py::TestHTTPError::test_temporary_413_integer_retry_after tests/test_httperror.py::TestHTTPError::test_413 tests/test_httperror.py::TestHTTPError::test_411 tests/test_httperror.py::TestHTTPError::test_414_with_custom_kwargs tests/test_httperror.py::TestHTTPError::test_custom_old_error_serializer tests/test_httperror.py::TestHTTPError::test_epic_fail_xml[application/vnd.company.system.project.resource+xml;v=1.1] tests/test_httperror.py::TestHTTPError::test_414_with_title tests/test_httperror.py::TestHTTPError::test_custom_new_error_serializer tests/test_httperror.py::TestHTTPError::test_client_does_not_accept_json_or_xml tests/test_httperror.py::TestHTTPError::test_misc tests/test_httperror.py::TestHTTPError::test_414 tests/test_httperror.py::TestHTTPError::test_custom_old_error_serializer_no_body tests/test_httperror.py::TestHTTPError::test_404_without_body tests/test_httperror.py::TestHTTPError::test_401 tests/test_httperror.py::TestHTTPError::test_epic_fail_xml[application/atom+xml] tests/test_httperror.py::TestHTTPError::test_epic_fail_xml[application/xml] tests/test_httperror.py::TestHTTPError::test_405_without_body_with_extra_headers tests/test_httperror.py::TestHTTPError::test_client_does_not_accept_anything tests/test_httperror.py::TestHTTPError::test_429_datetime tests/test_httperror.py::TestHTTPError::test_forbidden[application/vnd.company.system.project.resource+json;v=1.1] tests/test_httperror.py::TestHTTPError::test_invalid_header tests/test_httperror.py::TestHTTPError::test_429 tests/test_httperror.py::TestHTTPError::test_epic_fail_json tests/test_httperror.py::TestHTTPError::test_title_default_message_if_none tests/test_httperror.py::TestHTTPError::test_forbidden[application/json-patch+json] tests/test_httperror.py::TestHTTPError::test_temporary_413_datetime_retry_after tests/test_httperror.py::TestHTTPError::test_missing_header tests/test_httperror.py::TestHTTPError::test_missing_param tests/test_httperror.py::TestHTTPError::test_forbidden[application/json] tests/test_httperror.py::TestHTTPError::test_404_with_body tests/test_httperror.py::TestHTTPError::test_base_class tests/test_httperror.py::TestHTTPError::test_414_with_description tests/test_httperror.py::TestHTTPError::test_unicode_xml tests/test_httperror.py::TestHTTPError::test_no_description_json tests/test_httperror.py::TestHTTPError::test_405_without_body tests/test_httperror.py::TestHTTPError::test_503_integer_retry_after tests/test_httperror.py::TestHTTPError::test_503_datetime_retry_after tests/test_httperror.py::TestHTTPError::test_405_with_body tests/test_httperror.py::TestHTTPError::test_410_without_body tests/test_request_attrs.py::TestRequestAttributes::test_netloc_default_port[HTTP/1.0] tests/test_request_attrs.py::TestRequestAttributes::test_scheme_https[HTTP/1.0] tests/test_request_attrs.py::TestRequestAttributes::test_scheme_http[HTTP/1.1-True] tests/test_request_attrs.py::TestRequestAttributes::test_date_missing[if_unmodified_since] tests/test_request_attrs.py::TestRequestAttributes::test_nonlatin_path[/test/%C3%A4%C3%B6%C3%BC%C3%9F%E2%82%AC] tests/test_request_attrs.py::TestRequestAttributes::test_range_unit tests/test_request_attrs.py::TestRequestAttributes::test_client_accepts_props tests/test_request_attrs.py::TestRequestAttributes::test_netloc_default_port[HTTP/1.1] tests/test_request_attrs.py::TestRequestAttributes::test_range tests/test_request_attrs.py::TestRequestAttributes::test_app_blank tests/test_request_attrs.py::TestRequestAttributes::test_attribute_headers tests/test_request_attrs.py::TestRequestAttributes::test_uri_http_1_0 tests/test_request_attrs.py::TestRequestAttributes::test_missing_qs tests/test_request_attrs.py::TestRequestAttributes::test_date_invalid[If-Modified-Since-if_modified_since] tests/test_request_attrs.py::TestRequestAttributes::test_client_accepts tests/test_request_attrs.py::TestRequestAttributes::test_bogus_content_length_neg tests/test_request_attrs.py::TestRequestAttributes::test_range_invalid tests/test_request_attrs.py::TestRequestAttributes::test_missing_attribute_header tests/test_request_attrs.py::TestRequestAttributes::test_date_invalid[Date-date] tests/test_request_attrs.py::TestRequestAttributes::test_empty_path tests/test_request_attrs.py::TestRequestAttributes::test_date_missing[if_modified_since] tests/test_request_attrs.py::TestRequestAttributes::test_date_missing[date] tests/test_request_attrs.py::TestRequestAttributes::test_scheme_https[HTTP/1.1] tests/test_request_attrs.py::TestRequestAttributes::test_uri_https tests/test_request_attrs.py::TestRequestAttributes::test_subdomain tests/test_request_attrs.py::TestRequestAttributes::test_date_invalid[If-Unmodified-Since-if_unmodified_since] tests/test_request_attrs.py::TestRequestAttributes::test_app_missing tests/test_request_attrs.py::TestRequestAttributes::test_method tests/test_request_attrs.py::TestRequestAttributes::test_date[If-Unmodified-Since-if_unmodified_since] tests/test_request_attrs.py::TestRequestAttributes::test_netloc_nondefault_port[HTTP/1.0] tests/test_request_attrs.py::TestRequestAttributes::test_empty tests/test_request_attrs.py::TestRequestAttributes::test_reconstruct_url tests/test_request_attrs.py::TestRequestAttributes::test_client_accepts_bogus tests/test_request_attrs.py::TestRequestAttributes::test_port_explicit[HTTP/1.0] tests/test_request_attrs.py::TestRequestAttributes::test_content_length tests/test_request_attrs.py::TestRequestAttributes::test_netloc_from_env[HTTP/1.1] tests/test_request_attrs.py::TestRequestAttributes::test_content_type_method tests/test_request_attrs.py::TestRequestAttributes::test_bogus_content_length_nan tests/test_request_attrs.py::TestRequestAttributes::test_netloc_from_env[HTTP/1.0] tests/test_request_attrs.py::TestRequestAttributes::test_host tests/test_request_attrs.py::TestRequestAttributes::test_date[If-Modified-Since-if_modified_since] tests/test_request_attrs.py::TestRequestAttributes::test_content_length_method tests/test_request_attrs.py::TestRequestAttributes::test_scheme_http[HTTP/1.0-False] tests/test_request_attrs.py::TestRequestAttributes::test_relative_uri tests/test_request_attrs.py::TestRequestAttributes::test_port_explicit[HTTP/1.1] tests/test_request_attrs.py::TestRequestAttributes::test_scheme_http[HTTP/1.0-True] tests/test_request_attrs.py::TestRequestAttributes::test_scheme_http[HTTP/1.1-False] tests/test_request_attrs.py::TestRequestAttributes::test_nonlatin_path[/test/%E5%BB%B6%E5%AE%89] tests/test_request_attrs.py::TestRequestAttributes::test_app_present tests/test_request_attrs.py::TestRequestAttributes::test_nonlatin_path[/hello_\u043f\u0440\u0438\u0432\u0435\u0442] tests/test_request_attrs.py::TestRequestAttributes::test_uri tests/test_request_attrs.py::TestRequestAttributes::test_netloc_nondefault_port[HTTP/1.1] tests/test_request_attrs.py::TestRequestAttributes::test_client_prefers tests/test_request_attrs.py::TestRequestAttributes::test_date[Date-date] tests/test_utils.py::TestFalconTesting::test_decode_empty_result tests/test_utils.py::TestFalconTesting::test_httpnow_alias_for_backwards_compat tests/test_utils.py::TestFalconTesting::test_path_escape_chars_in_create_environ tests/test_utils.py::TestFalconTesting::test_none_header_value_in_create_environ tests/test_utils.py::TestFalconTesting::test_no_prefix_allowed_for_query_strings_in_create_environ tests/test_utils.py::test_simulate_free_functions[simulate_put] tests/test_utils.py::test_simulate_request_protocol[http-HEAD] tests/test_utils.py::test_simulate_request_protocol[https-OPTIONS] tests/test_utils.py::test_simulate_request_protocol[https-CONNECT] tests/test_utils.py::test_simulate_request_protocol[http-POST] tests/test_utils.py::test_simulate_request_protocol[http-PATCH] tests/test_utils.py::test_simulate_free_functions[simulate_post] tests/test_utils.py::test_simulate_request_protocol[http-OPTIONS] tests/test_utils.py::test_simulate_request_protocol[https-TRACE] tests/test_utils.py::test_simulate_request_protocol[https-POST] tests/test_utils.py::test_simulate_request_protocol[http-TRACE] tests/test_utils.py::test_simulate_request_protocol[http-DELETE] tests/test_utils.py::test_simulate_request_protocol[https-DELETE] tests/test_utils.py::test_simulate_free_functions[simulate_get] tests/test_utils.py::test_simulate_request_protocol[https-PUT] tests/test_utils.py::test_simulate_request_protocol[https-GET] tests/test_utils.py::test_simulate_free_functions[simulate_patch] tests/test_utils.py::test_simulate_free_functions[simulate_head] tests/test_utils.py::test_simulate_request_protocol[http-PUT] tests/test_utils.py::test_simulate_request_protocol[https-HEAD] tests/test_utils.py::test_simulate_request_protocol[http-GET] tests/test_utils.py::test_simulate_free_functions[simulate_delete] tests/test_utils.py::test_simulate_free_functions[simulate_options] tests/test_utils.py::test_simulate_request_protocol[http-CONNECT] tests/test_utils.py::test_simulate_request_protocol[https-PATCH] tests/test_utils.py::TestFalconTestCase::test_status tests/test_utils.py::TestFalconTestCase::test_cached_text_in_result tests/test_utils.py::TestFalconTestCase::test_query_string tests/test_utils.py::TestFalconTestCase::test_path_must_start_with_slash tests/test_utils.py::TestFalconTestCase::test_wsgi_iterable_not_closeable tests/test_utils.py::TestFalconTestCase::test_query_string_in_path tests/test_utils.py::TestFalconTestCase::test_simple_resource_body_json_xor tests/test_utils.py::TestFalconTestCase::test_query_string_no_question tests/test_utils.py::TestFalconUtils::test_uri_encode_value tests/test_utils.py::TestFalconUtils::test_pack_query_params_one tests/test_utils.py::TestFalconUtils::test_parse_query_string tests/test_utils.py::TestFalconUtils::test_uri_encode tests/test_utils.py::TestFalconUtils::test_pack_query_params_none tests/test_utils.py::TestFalconUtils::test_uri_encode_double tests/test_utils.py::TestFalconUtils::test_dt_to_http tests/test_utils.py::TestFalconUtils::test_parse_host tests/test_utils.py::TestFalconUtils::test_prop_uri_encode_models_stdlib_quote tests/test_utils.py::TestFalconUtils::test_deprecated_decorator tests/test_utils.py::TestFalconUtils::test_get_http_status tests/test_utils.py::TestFalconUtils::test_http_now tests/test_utils.py::TestFalconUtils::test_uri_decode tests/test_utils.py::TestFalconUtils::test_pack_query_params_several tests/test_utils.py::TestFalconUtils::test_prop_uri_encode_value_models_stdlib_quote_safe_tilde tests/test_utils.py::TestFalconUtils::test_http_date_to_dt tests/test_utils.py::TestFalconUtils::test_prop_uri_decode_models_stdlib_unquote_plus tests/test_utils.py::TestNoApiClass::test_something tests/test_utils.py::TestSetupApi::test_something tests/test_utils.py::TestCaseFancyAPI::test_something tests/test_response_body.py::TestResponseBody::test_append_body tests/test_response_body.py::TestResponseBody::test_response_repr tests/test_uri_templates_legacy.py::TestUriTemplates::test_template_may_not_contain_double_slash[a/b//] tests/test_uri_templates_legacy.py::TestUriTemplates::test_two_fields[] tests/test_uri_templates_legacy.py::TestUriTemplates::test_two_fields[/] tests/test_uri_templates_legacy.py::TestUriTemplates::test_three_fields tests/test_uri_templates_legacy.py::TestUriTemplates::test_template_may_not_contain_double_slash[a//] tests/test_uri_templates_legacy.py::TestUriTemplates::test_string_type_required[API] tests/test_uri_templates_legacy.py::TestUriTemplates::test_root tests/test_uri_templates_legacy.py::TestUriTemplates::test_template_must_start_with_slash[this/that] tests/test_uri_templates_legacy.py::TestUriTemplates::test_template_may_not_contain_double_slash[a//b] tests/test_uri_templates_legacy.py::TestUriTemplates::test_one_field tests/test_uri_templates_legacy.py::TestUriTemplates::test_template_may_not_contain_double_slash[//] tests/test_uri_templates_legacy.py::TestUriTemplates::test_template_must_start_with_slash[this] tests/test_uri_templates_legacy.py::TestUriTemplates::test_string_type_required[42] tests/test_uri_templates_legacy.py::TestUriTemplates::test_malformed_field tests/test_uri_templates_legacy.py::TestUriTemplates::test_template_may_not_contain_double_slash[a/b//c] tests/test_uri_templates_legacy.py::TestUriTemplates::test_one_field_with_digits tests/test_uri_templates_legacy.py::TestUriTemplates::test_no_fields[/hello/world] tests/test_uri_templates_legacy.py::TestUriTemplates::test_template_may_not_contain_double_slash[//b] tests/test_uri_templates_legacy.py::TestUriTemplates::test_no_fields[/hello] tests/test_uri_templates_legacy.py::TestUriTemplates::test_no_fields[/hi/there/how/are/you] tests/test_uri_templates_legacy.py::TestUriTemplates::test_one_field_with_prefixed_digits tests/test_error_handlers.py::TestErrorHandler::test_uncaught_error_else tests/test_error_handlers.py::TestErrorHandler::test_error_order_subclass_masked tests/test_error_handlers.py::TestErrorHandler::test_subclass_error tests/test_error_handlers.py::TestErrorHandler::test_uncaught_error tests/test_error_handlers.py::TestErrorHandler::test_error_order_subclass tests/test_error_handlers.py::TestErrorHandler::test_handle_not_defined tests/test_error_handlers.py::TestErrorHandler::test_caught_error tests/test_error_handlers.py::TestErrorHandler::test_converted_error tests/test_error_handlers.py::TestErrorHandler::test_error_order_duplicate tests/test_deps.py::test_deps_mimeparse_correct_package tests/test_error.py::test_with_default_title_and_desc[HTTPLengthRequired-411 tests/test_error.py::test_with_title_and_desc[HTTPInternalServerError] tests/test_error.py::test_with_title_and_desc[HTTPPreconditionRequired] tests/test_error.py::test_with_default_title_and_desc[HTTPBadRequest-400 tests/test_error.py::test_with_default_title_and_desc[HTTPLoopDetected-508 tests/test_error.py::test_with_title_and_desc[HTTPUriTooLong] tests/test_error.py::test_with_default_title_and_desc[HTTPInternalServerError-500 tests/test_error.py::test_with_title_and_desc[HTTPBadGateway] tests/test_error.py::test_with_default_title_and_desc[HTTPUriTooLong-414 tests/test_error.py::test_with_default_title_and_desc[HTTPInsufficientStorage-507 tests/test_error.py::test_with_title_and_desc[HTTPVersionNotSupported] tests/test_error.py::test_with_title_and_desc[HTTPLengthRequired] tests/test_error.py::test_with_retry_after[HTTPTooManyRequests] tests/test_error.py::test_http_not_acceptable_with_title_and_desc_and_challenges tests/test_error.py::test_with_default_title_and_desc[HTTPTooManyRequests-429 tests/test_error.py::test_with_default_title_and_desc[HTTPRequestHeaderFieldsTooLarge-431 tests/test_error.py::test_with_default_title_and_desc[HTTPNetworkAuthenticationRequired-511 tests/test_error.py::test_with_title_and_desc[HTTPFailedDependency] tests/test_error.py::test_with_title_and_desc[HTTPBadRequest] tests/test_error.py::test_http_unsupported_media_type_with_title_and_desc_and_challenges tests/test_error.py::test_with_title_and_desc[HTTPInsufficientStorage] tests/test_error.py::test_with_title_and_desc[HTTPGatewayTimeout] tests/test_error.py::test_with_default_title_and_desc[HTTPPreconditionRequired-428 tests/test_error.py::test_with_title_and_desc[HTTPNetworkAuthenticationRequired] tests/test_error.py::test_with_default_title_and_desc[HTTPRequestEntityTooLarge-413 tests/test_error.py::test_with_title_and_desc[HTTPUnavailableForLegalReasons] tests/test_error.py::test_with_title_and_desc[HTTPNotImplemented] tests/test_error.py::test_with_default_title_and_desc[HTTPVersionNotSupported-505 tests/test_error.py::test_with_default_title_and_desc[HTTPGatewayTimeout-504 tests/test_error.py::test_with_retry_after[HTTPServiceUnavailable] tests/test_error.py::test_with_default_title_and_desc[HTTPLocked-423 tests/test_error.py::test_with_default_title_and_desc[HTTPFailedDependency-424 tests/test_error.py::test_with_title_and_desc[HTTPUnprocessableEntity] tests/test_error.py::test_with_title_and_desc[HTTPConflict] tests/test_error.py::test_with_default_title_and_desc[HTTPNotImplemented-501 tests/test_error.py::test_with_retry_after[HTTPRequestEntityTooLarge] tests/test_error.py::test_http_unauthorized_with_title_and_desc_and_challenges tests/test_error.py::test_http_not_acceptable_no_title_and_desc_and_challenges tests/test_error.py::test_with_default_title_and_desc[HTTPForbidden-403 tests/test_error.py::test_with_title_and_desc[HTTPLoopDetected] tests/test_error.py::test_with_title_and_desc[HTTPForbidden] tests/test_error.py::test_http_error_repr tests/test_error.py::test_with_default_title_and_desc[HTTPBadGateway-502 tests/test_error.py::test_with_title_and_desc[HTTPPreconditionFailed] tests/test_error.py::test_with_default_title_and_desc[HTTPServiceUnavailable-503 tests/test_error.py::test_with_default_title_and_desc[HTTPUnprocessableEntity-422 tests/test_error.py::test_with_default_title_and_desc[HTTPPreconditionFailed-412 tests/test_error.py::test_with_default_title_and_desc[HTTPUnavailableForLegalReasons-451 tests/test_error.py::test_with_title_and_desc[HTTPServiceUnavailable] tests/test_error.py::test_http_unsupported_media_type_no_title_and_desc_and_challenges tests/test_error.py::test_with_default_title_and_desc[HTTPConflict-409 tests/test_error.py::test_with_title_and_desc[HTTPLocked] tests/test_error.py::test_with_title_and_desc[HTTPRequestHeaderFieldsTooLarge] tests/test_error.py::test_http_unauthorized_no_title_and_desc_and_challenges tests/test_sinks.py::TestDefaultRouting::test_route_precedence tests/test_sinks.py::TestDefaultRouting::test_named_groups tests/test_sinks.py::TestDefaultRouting::test_route_precedence_with_both_id tests/test_sinks.py::TestDefaultRouting::test_single_simple_pattern tests/test_sinks.py::TestDefaultRouting::test_multiple_patterns tests/test_sinks.py::TestDefaultRouting::test_single_compiled_pattern tests/test_sinks.py::TestDefaultRouting::test_single_default_pattern tests/test_sinks.py::TestDefaultRouting::test_with_route tests/test_sinks.py::TestDefaultRouting::test_route_precedence_with_id tests/test_slots.py::TestSlots::test_slots_request tests/test_slots.py::TestSlots::test_slots_response tests/test_response_context.py::TestRequestContext::test_custom_response_context_failure tests/test_response_context.py::TestRequestContext::test_custom_response_context_factory tests/test_response_context.py::TestRequestContext::test_custom_response_context tests/test_response_context.py::TestRequestContext::test_default_response_context tests/test_hello.py::TestHelloWorld::test_body[/body-resource0-<lambda>] tests/test_hello.py::TestHelloWorld::test_no_body_on_head tests/test_hello.py::TestHelloWorld::test_filelike_closing[NonClosingBytesIO-False] tests/test_hello.py::TestHelloWorld::test_filelike_closing[ClosingBytesIO-True] tests/test_hello.py::TestHelloWorld::test_body[/data-resource2-<lambda>] tests/test_hello.py::TestHelloWorld::test_stream_chunked tests/test_hello.py::TestHelloWorld::test_no_route tests/test_hello.py::TestHelloWorld::test_filelike_using_helper tests/test_hello.py::TestHelloWorld::test_status_not_set tests/test_hello.py::TestHelloWorld::test_body[/bytes-resource1-<lambda>] tests/test_hello.py::TestHelloWorld::test_root_route tests/test_hello.py::TestHelloWorld::test_stream_known_len tests/test_hello.py::TestHelloWorld::test_filelike tests/test_hello.py::TestHelloWorld::test_env_headers_list_of_tuples tests/test_request_forwarded.py::test_no_forwarded_headers tests/test_request_forwarded.py::test_x_forwarded_proto tests/test_request_forwarded.py::test_forwarded_missing_first_hop_host tests/test_request_forwarded.py::test_forwarded_host tests/test_request_forwarded.py::test_x_forwarded_host tests/test_request_forwarded.py::test_forwarded_multiple_params tests/test_options.py::TestRequestOptions::test_options_toggle[auto_parse_form_urlencoded] tests/test_options.py::TestRequestOptions::test_option_defaults tests/test_options.py::TestRequestOptions::test_options_toggle[auto_parse_qs_csv] tests/test_options.py::TestRequestOptions::test_incorrect_options tests/test_options.py::TestRequestOptions::test_options_toggle[keep_blank_qs_values] tests/test_options.py::TestRequestOptions::test_options_toggle[strip_url_path_trailing_slash] tests/test_validators.py::test_jsonschema_validation_success tests/test_validators.py::test_jsonschema_validation_failure tests/test_cookies.py::test_cookie_header_is_missing tests/test_cookies.py::test_non_ascii_value[Unicode_\xc3\x83\xc2\xa6\xc3\x83\xc2\xb8] tests/test_cookies.py::test_cookie_timezone tests/test_cookies.py::test_cookie_max_age_float_and_string[foofloat] tests/test_cookies.py::test_non_ascii_value[42] tests/test_cookies.py::test_cookies_setable tests/test_cookies.py::test_response_unset_cookie tests/test_cookies.py::test_response_complex_case tests/test_cookies.py::test_cookie_max_age_float_and_string[foostring] tests/test_cookies.py::test_non_ascii_value[Unicode_\xc3\xa6\xc3\xb8] tests/test_cookies.py::test_non_ascii_name[Unicode_\xc3\x83\xc2\xa6\xc3\x83\xc2\xb8] tests/test_cookies.py::test_non_ascii_name[Unicode_\xc3\xa6\xc3\xb8] tests/test_cookies.py::test_invalid_cookies_are_ignored tests/test_cookies.py::test_cookie_expires_aware tests/test_cookies.py::test_cookie_expires_naive tests/test_cookies.py::test_request_cookie_parsing tests/test_cookies.py::test_unicode_inside_ascii_range tests/test_cookies.py::test_response_disable_secure_globally tests/test_cookies.py::test_non_ascii_name[42] tests/test_cookies.py::test_response_base_case tests/test_request_media.py::test_use_cached_media tests/test_request_media.py::test_msgpack[application/x-msgpack] tests/test_request_media.py::test_json[application/json] tests/test_request_media.py::test_msgpack[application/msgpack] tests/test_request_media.py::test_invalid_json tests/test_request_media.py::test_unknown_media_type[nope/json] tests/test_request_media.py::test_json[None] tests/test_request_media.py::test_json[application/json; tests/test_request_media.py::test_invalid_msgpack tests/test_request_media.py::test_msgpack[application/msgpack; tests/test_request_media.py::test_invalid_stream_fails_gracefully tests/test_request_media.py::test_json[*/*] tests/test_request_context.py::TestRequestContext::test_default_request_context tests/test_request_context.py::TestRequestContext::test_custom_request_context tests/test_request_context.py::TestRequestContext::test_custom_request_context_request_access tests/test_request_context.py::TestRequestContext::test_custom_request_context_failure tests/test_httpstatus.py::TestHTTPStatus::test_raise_status_in_responder tests/test_httpstatus.py::TestHTTPStatus::test_raise_status_in_before_hook tests/test_httpstatus.py::TestHTTPStatus::test_raise_status_runs_after_hooks tests/test_httpstatus.py::TestHTTPStatus::test_raise_status_empty_body tests/test_httpstatus.py::TestHTTPStatus::test_raise_status_survives_after_hooks tests/test_httpstatus.py::TestHTTPStatusWithMiddleware::test_raise_status_in_process_request tests/test_httpstatus.py::TestHTTPStatusWithMiddleware::test_raise_status_runs_process_response tests/test_httpstatus.py::TestHTTPStatusWithMiddleware::test_raise_status_in_process_resource tests/test_media_handlers.py::test_base_handler_contract tests/test_cmd_print_api.py::test_traverse_with_verbose tests/test_cmd_print_api.py::test_traverse tests/test_query_params.py::TestQueryParams::test_get_dict_valid[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_none[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_int_neg[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_option_auto_parse_qs_csv_simple_true[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_multiple_form_keys_as_list[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_date_invalid[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_option_auto_parse_qs_csv_complex_false[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_percent_encoded[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_multiple_keys_as_bool[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_required[get_param-simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_datetime_missing_param[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_multiple_keys_as_int[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_dict_missing_param[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_list_type[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_required[get_param_as_list-simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_int[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_none[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_date_valid[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_list_transformer[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_datetime_missing_param[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_dict_store[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_multiple_form_keys[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_list_type_blank[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_datetime_valid_with_format[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_required[get_param_as_bool-simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_date_valid[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_required[get_param-simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_datetime_valid_with_format[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_datetime_valid[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_allowed_names[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_dict_valid[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_required[get_param_as_bool-simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_required[get_param_as_int-simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_int[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_date_valid_with_format[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_required[get_param_as_list-simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_boolean[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_simple[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_date_store[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_bad_percentage[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_datetime_valid[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_bad_percentage[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_allowed_names[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_date_store[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_multiple_form_keys[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_required[get_param_as_int-simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_option_auto_parse_qs_csv_simple_false[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_date_invalid[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_dict_invalid[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_option_auto_parse_qs_csv_simple_true[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_multiple_keys_as_bool[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_dict_invalid[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_option_auto_parse_qs_csv_simple_false[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_multiple_keys_as_int[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_blank[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_multiple_form_keys_as_list[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_date_missing_param[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_date_missing_param[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_datetime_invalid[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_param_property[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_boolean_blank[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_date_valid_with_format[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_simple[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_get_datetime_store[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_option_auto_parse_qs_csv_complex_false[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_datetime_store[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_percent_encoded[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_int_neg[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_datetime_invalid[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_dict_store[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_list_transformer[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_boolean_blank[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_list_type_blank[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_blank[simulate_request_get_query_params] tests/test_query_params.py::TestQueryParams::test_get_dict_missing_param[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_boolean[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_list_type[simulate_request_post_query_params] tests/test_query_params.py::TestQueryParams::test_param_property[simulate_request_post_query_params] tests/test_query_params.py::TestPostQueryParams::test_http_methods_body_expected[POST] tests/test_query_params.py::TestPostQueryParams::test_http_methods_body_expected[DELETE] tests/test_query_params.py::TestPostQueryParams::test_http_methods_body_expected[PUT] tests/test_query_params.py::TestPostQueryParams::test_empty_body_no_content_length tests/test_query_params.py::TestPostQueryParams::test_explicitly_disable_auto_parse tests/test_query_params.py::TestPostQueryParams::test_http_methods_body_not_expected[HEAD] tests/test_query_params.py::TestPostQueryParams::test_non_ascii tests/test_query_params.py::TestPostQueryParams::test_empty_body tests/test_query_params.py::TestPostQueryParams::test_http_methods_body_not_expected[GET] tests/test_query_params.py::TestPostQueryParams::test_http_methods_body_expected[OPTIONS] tests/test_query_params.py::TestPostQueryParams::test_http_methods_body_expected[PATCH] tests/test_query_params.py::TestPostQueryParamsDefaultBehavior::test_dont_auto_parse_by_default tests/test_wsgi_interface.py::TestWSGIInterface::test_srmock tests/test_wsgi_interface.py::TestWSGIInterface::test_pep3333 tests/test_request_access_route.py::test_remote_addr_missing tests/test_request_access_route.py::test_remote_addr tests/test_request_access_route.py::test_x_forwarded_for tests/test_request_access_route.py::test_x_real_ip tests/test_request_access_route.py::test_rfc_forwarded tests/test_request_access_route.py::test_malformed_rfc_forwarded tests/test_request_access_route.py::test_remote_addr_only tests/test_request_body.py::TestRequestBody::test_request_repr tests/test_request_body.py::TestRequestBody::test_body_stream_wrapper tests/test_request_body.py::TestRequestBody::test_bounded_stream_property_empty_body tests/test_request_body.py::TestRequestBody::test_tiny_body_overflow tests/test_request_body.py::TestRequestBody::test_tiny_body tests/test_request_body.py::TestRequestBody::test_read_body tests/test_request_body.py::TestRequestBody::test_empty_body tests/test_uri_converters.py::test_int_converter_malformed[\x0c123] tests/test_uri_converters.py::test_int_converter[12-2-13-12-None] tests/test_uri_converters.py::test_int_converter_malformed[] tests/test_uri_converters.py::test_datetime_converter[2017-07-03T14:30:01-%Y-%m-%dT%H:%M:%SZ-None] tests/test_uri_converters.py::test_uuid_converter[4edba55524ac41f48c1a3bbf09a76b0b-expected2] tests/test_uri_converters.py::test_datetime_converter_default_format tests/test_uri_converters.py::test_int_converter[12-2-12-12-12] tests/test_uri_converters.py::test_datetime_converter[07 tests/test_uri_converters.py::test_uuid_converter[4edba555-24ac-41f4-8c1a-3bbf09a76b0g-None] tests/test_uri_converters.py::test_datetime_converter[07-03-17-%m-%d-%y-expected0] tests/test_uri_converters.py::test_int_converter[2-1-2-2-2] tests/test_uri_converters.py::test_int_converter_malformed[123 tests/test_uri_converters.py::test_int_converter[1-1-1-None-1] tests/test_uri_converters.py::test_int_converter_malformed[\n123] tests/test_uri_converters.py::test_int_converter[123-None-None-None-123] tests/test_uri_converters.py::test_int_converter_malformed[\x0b123] tests/test_uri_converters.py::test_int_converter_malformed[123\t] tests/test_uri_converters.py::test_uuid_converter[4edba555-24ac-41f4-8c1a-3bbf09a76b0-None] tests/test_uri_converters.py::test_uuid_converter[4edba55524ac-41f4-8c1a-3bbf09a76b0b-expected1] tests/test_uri_converters.py::test_int_converter_malformed[123\n] tests/test_uri_converters.py::test_int_converter_malformed[ tests/test_uri_converters.py::test_uuid_converter[urn:uuid:4edba555-24ac-41f4-8c1a-3bbf09a76b0b-expected3] tests/test_uri_converters.py::test_int_converter_invalid_config[-10] tests/test_uri_converters.py::test_datetime_converter[2017_19-%Y_%H-expected4] tests/test_uri_converters.py::test_int_converter[1-1-1-2-1] tests/test_uri_converters.py::test_int_converter[0-None-None-None-0] tests/test_uri_converters.py::test_uuid_converter[4edba555_24ac_41f4_8c1a_3bbf09a76b0b-None] tests/test_uri_converters.py::test_int_converter[12-1-None-None-None1] tests/test_uri_converters.py::test_uuid_converter[urn:uuid:4edba55524ac41f48c1a3bbf09a76b0b-expected4] tests/test_uri_converters.py::test_int_converter_malformed[\t123] tests/test_uri_converters.py::test_datetime_converter[2017-07-03T14:30:01Z-%Y-%m-%dT%H:%M:%SZ-expected2] tests/test_uri_converters.py::test_int_converter[12-2-1-12-12] tests/test_uri_converters.py::test_datetime_converter[2017-07-03T14:30:01-%Y-%m-%dT%H:%M:%S-expected3] tests/test_uri_converters.py::test_int_converter_malformed[123\x0c] tests/test_uri_converters.py::test_uuid_converter[4edba555-24ac-41f4-8c1a-3bbf09a76b0b-expected0] tests/test_uri_converters.py::test_uuid_converter[ tests/test_uri_converters.py::test_int_converter[12-2-13-13-None] tests/test_uri_converters.py::test_datetime_converter[07-03-17 tests/test_uri_converters.py::test_int_converter_invalid_config[0] tests/test_uri_converters.py::test_int_converter[12-2-None-None-121] tests/test_uri_converters.py::test_int_converter[2-1-1-2-2] tests/test_uri_converters.py::test_int_converter[001-None-None-None-1] tests/test_uri_converters.py::test_int_converter_malformed[123\x0b] tests/test_uri_converters.py::test_int_converter[1-1-1-1-1] tests/test_uri_converters.py::test_int_converter_malformed[0x0F] tests/test_uri_converters.py::test_int_converter[1-1-None-None-1] tests/test_uri_converters.py::test_int_converter[1-1-2-None-None] tests/test_uri_converters.py::test_int_converter[12-2-None-None-120] tests/test_uri_converters.py::test_int_converter_malformed[something] tests/test_uri_converters.py::test_int_converter_invalid_config[-1] tests/test_uri_converters.py::test_datetime_converter[ tests/test_uri_converters.py::test_int_converter[3-1-1-2-None] tests/test_uri_converters.py::test_int_converter[12-1-1-12-None] tests/test_uri_converters.py::test_int_converter_malformed[123\r] tests/test_uri_converters.py::test_int_converter[1-1-2-1-None] tests/test_uri_converters.py::test_int_converter[01-None-None-None-1] tests/test_uri_converters.py::test_int_converter[00-None-None-None-0] tests/test_uri_converters.py::test_int_converter_malformed[\r123] tests/test_uri_converters.py::test_uuid_converter[4edba555-24ac-41f4-8c1a-3bbf09a76b0b tests/test_uri_converters.py::test_uuid_converter[4-None] tests/test_uri_converters.py::test_int_converter[12-1-None-None-None0] tests/test_wsgiref_inputwrapper_with_size.py::TestWsgiRefInputWrapper::test_resources_can_read_request_stream_during_tests tests/test_redirects.py::TestRedirects::test_redirect[PUT-303 tests/test_redirects.py::TestRedirects::test_redirect[POST-302 tests/test_redirects.py::TestRedirects::test_redirect[GET-301 tests/test_redirects.py::TestRedirects::test_redirect[DELETE-307 tests/test_redirects.py::TestRedirects::test_redirect[HEAD-308 tests/test_wsgi_errors.py::TestWSGIError::test_responder_logged_bytestring tests/test_uri_templates.py::test_uuid_converter[/widgets/{widget_id:uuid}/orders-/widgets/dcb0b536015a48509caf6d06c7e6c6e/orders-None] tests/test_uri_templates.py::test_int_converter[/{id:int}] tests/test_uri_templates.py::test_relative_path[] tests/test_uri_templates.py::test_uuid_converter_complex_segment tests/test_uri_templates.py::test_converter_custom[/{food:spam(")")}:{food_too:spam("()")}-/bacon:eggs-expected1] tests/test_uri_templates.py::test_datetime_converter[/{start_year:int}-to-{timestamp:dt("%Y-%m")}-/1961-to-1969-07-21-None] tests/test_uri_templates.py::test_same_level_complex_var[False] tests/test_uri_templates.py::test_single[widget_id] tests/test_uri_templates.py::test_single[id] tests/test_uri_templates.py::test_uuid_converter[/versions/diff/{left:uuid}...{right:uuid()}-/versions/diff/dcb0b536-015a-4850-9caf-6d06c7e6c6eb...626a3038-ac0d-4a11-9921-857d9b81e6d6-expected3] tests/test_uri_templates.py::test_converter_custom[/({food:spam()}){food_too:spam("()")}-/(bacon)eggs-expected2] tests/test_uri_templates.py::test_int_converter[/{id:int(min=123)}] tests/test_uri_templates.py::test_no_vars tests/test_uri_templates.py::test_int_converter_rejections[/{id:int(num_digits=3, tests/test_uri_templates.py::test_multiple tests/test_uri_templates.py::test_datetime_converter[/{start_year:int}-to-{timestamp:dt("%Y-%m-%d")}-/1961-to-1969-07-21-dt_expected1] tests/test_uri_templates.py::test_int_converter_rejections[/{id:int(2)}] tests/test_uri_templates.py::test_single[id123] tests/test_uri_templates.py::test_special_chars tests/test_uri_templates.py::test_datetime_converter[/{start_year:int}-to-{timestamp:dt}-/1961-to-1969-07-21T02:56:00Z-dt_expected0] tests/test_uri_templates.py::test_uuid_converter[/versions/diff/{left:uuid()}...{right:uuid()}-/versions/diff/dcb0b536-015a-4850-9caf-6d06c7e6c6eb...626a3038-ac0d-4a11-9921-857d9b81e6d6-expected2] tests/test_uri_templates.py::test_uuid_converter[/widgets/{widget_id:uuid}-/widgets/dcb0b536-015a-4850-9caf-6d06c7e6c6eb-expected0] tests/test_uri_templates.py::test_uuid_converter[/widgets/{widget_id:uuid}/orders-/widgets/dcb0b536015a48509caf6d06c7e6c6eb/orders-expected1] tests/test_uri_templates.py::test_int_converter[/{id:int(min=123, tests/test_uri_templates.py::test_empty_path_component[/in//side] tests/test_uri_templates.py::test_int_converter_rejections[/{id:int(min=124)}] tests/test_uri_templates.py::test_relative_path[no] tests/test_uri_templates.py::test_empty_path_component[/end//] tests/test_uri_templates.py::test_single_trailing_slash tests/test_uri_templates.py::test_relative_path[no/leading_slash] tests/test_uri_templates.py::test_uuid_converter[/versions/diff/{left:uuid()}...{right:uuid}-/versions/diff/dcb0b536-015a-4850-9caf-6d06c7e6c6eb...626a3038-ac0d-4a11-9921-857d9b81e6d6-expected4] tests/test_uri_templates.py::test_root_path tests/test_uri_templates.py::test_same_level_complex_var[True] tests/test_uri_templates.py::test_datetime_converter[/{start_year:int}/{timestamp:dt("%Y-%m-%d tests/test_uri_templates.py::test_empty_path_component[//begin] tests/test_uri_templates.py::test_converter_custom[/{food:spam}-/something-expected0] tests/test_uri_templates.py::test_int_converter[/{id:int(3)}] tests/test_uri_templates.py::test_empty_path_component[//] tests/test_response.py::test_response_set_content_type_set tests/test_response.py::test_response_set_content_type_not_set tests/test_headers.py::TestHeaders::test_add_link_single tests/test_headers.py::TestHeaders::test_add_link_with_anchor tests/test_headers.py::TestHeaders::test_content_type_no_body tests/test_headers.py::TestHeaders::test_response_set_and_get_header tests/test_headers.py::TestHeaders::test_add_link_with_title tests/test_headers.py::TestHeaders::test_no_content_type[204 tests/test_headers.py::TestHeaders::test_headers_as_list tests/test_headers.py::TestHeaders::test_vary_header[vary2-accept-encoding, tests/test_headers.py::TestHeaders::test_add_link_with_hreflang_multi tests/test_headers.py::TestHeaders::test_default_value tests/test_headers.py::TestHeaders::test_add_link_with_type_hint tests/test_headers.py::TestHeaders::test_no_content_length[304 tests/test_headers.py::TestHeaders::test_vary_header[vary1-accept-encoding, tests/test_headers.py::TestHeaders::test_content_length_options tests/test_headers.py::TestHeaders::test_custom_content_type tests/test_headers.py::TestHeaders::test_response_header_helpers_on_get tests/test_headers.py::TestHeaders::test_override_default_media_type[text/plain; tests/test_headers.py::TestHeaders::test_no_content_length[204 tests/test_headers.py::TestHeaders::test_add_link_multiple tests/test_headers.py::TestHeaders::test_override_default_media_type[text/plain-Hello tests/test_headers.py::TestHeaders::test_passthrough_request_headers tests/test_headers.py::TestHeaders::test_override_default_media_type_missing_encoding tests/test_headers.py::TestHeaders::test_default_media_type tests/test_headers.py::TestHeaders::test_vary_star tests/test_headers.py::TestHeaders::test_unicode_headers_convertable tests/test_headers.py::TestHeaders::test_unicode_location_headers tests/test_headers.py::TestHeaders::test_add_link_with_hreflang tests/test_headers.py::TestHeaders::test_add_link_with_title_star tests/test_headers.py::TestHeaders::test_required_header tests/test_headers.py::TestHeaders::test_add_link_complex tests/test_headers.py::TestHeaders::test_content_header_missing tests/test_headers.py::TestHeaders::test_no_content_type[304 tests/test_headers.py::TestHeaders::test_vary_header[vary0-accept-encoding] tests/test_headers.py::TestHeaders::test_content_length tests/test_headers.py::TestHeaders::test_response_append_header tests/test_http_method_routing.py::TestHttpMethodRouting::test_default_on_options tests/test_http_method_routing.py::TestHttpMethodRouting::test_methods_not_allowed_simple tests/test_http_method_routing.py::TestHttpMethodRouting::test_bogus_method tests/test_http_method_routing.py::TestHttpMethodRouting::test_report tests/test_http_method_routing.py::TestHttpMethodRouting::test_post_not_allowed tests/test_http_method_routing.py::TestHttpMethodRouting::test_on_options tests/test_http_method_routing.py::TestHttpMethodRouting::test_method_not_allowed_with_param tests/test_http_method_routing.py::TestHttpMethodRouting::test_put tests/test_http_method_routing.py::TestHttpMethodRouting::test_get tests/test_http_method_routing.py::TestHttpMethodRouting::test_misc tests/test_http_method_routing.py::TestHttpMethodRouting::test_methods_not_allowed_complex tests/test_middleware.py::TestResourceMiddleware::test_can_access_resource_params tests/test_middleware.py::TestErrorHandling::test_error_composed_before_resp_middleware_called tests/test_middleware.py::TestErrorHandling::test_http_status_raised_from_error_handler tests/test_middleware.py::TestRequestTimeMiddleware::test_skip_process_resource tests/test_middleware.py::TestRequestTimeMiddleware::test_log_get_request tests/test_middleware.py::TestRequestTimeMiddleware::test_response_middleware_raises_exception tests/test_middleware.py::TestRequestTimeMiddleware::test_add_invalid_middleware tests/test_middleware.py::TestTransactionIdMiddleware::test_generate_trans_id_with_request tests/test_middleware.py::TestRemoveBasePathMiddleware::test_base_path_is_removed_before_routing tests/test_middleware.py::TestSeveralMiddlewares::test_generate_trans_id_and_time_with_request tests/test_middleware.py::TestSeveralMiddlewares::test_order_mw_executed_when_exception_in_req tests/test_middleware.py::TestSeveralMiddlewares::test_middleware_execution_order tests/test_middleware.py::TestSeveralMiddlewares::test_multiple_reponse_mw_throw_exception tests/test_middleware.py::TestSeveralMiddlewares::test_inner_mw_throw_exception tests/test_middleware.py::TestSeveralMiddlewares::test_order_independent_mw_executed_when_exception_in_req tests/test_middleware.py::TestSeveralMiddlewares::test_order_mw_executed_when_exception_in_resp tests/test_middleware.py::TestSeveralMiddlewares::test_order_independent_mw_executed_when_exception_in_rsrc tests/test_middleware.py::TestSeveralMiddlewares::test_inner_mw_with_ex_handler_throw_exception tests/test_middleware.py::TestSeveralMiddlewares::test_order_mw_executed_when_exception_in_rsrc tests/test_middleware.py::TestSeveralMiddlewares::test_outer_mw_with_ex_handler_throw_exception tests/test_middleware.py::TestSeveralMiddlewares::test_order_independent_mw_executed_when_exception_in_resp tests/test_middleware.py::TestSeveralMiddlewares::test_legacy_middleware_called_with_correct_args tests/test_middleware.py::TestSeveralMiddlewares::test_independent_middleware_execution_order tests/test_wsgi.py::TestWSGIServer::test_get tests/test_wsgi.py::TestWSGIServer::test_post_read_bounded_stream tests/test_wsgi.py::TestWSGIServer::test_head_405 tests/test_wsgi.py::TestWSGIServer::test_post tests/test_wsgi.py::TestWSGIServer::test_post_invalid_content_length tests/test_wsgi.py::TestWSGIServer::test_post_read_bounded_stream_no_body tests/test_wsgi.py::TestWSGIServer::test_put
tests/test_response_media.py::test_default_media_type[media_type1]
docs/api/hooks.rst falcon/hooks.py
docs/api/hooks.rst falcon/hooks.py