painterjd: This looks good. 

It would be nice to see a test for this, however. 
codecov-io: ## [Current coverage][cc-pull] is **100%**
> Merging [#801][cc-pull] into [master][cc-base-branch] will not change coverage

```diff
@@             master       #801   diff @@
==========================================
  Files            29         29          
  Lines          1777       1778     +1   
  Methods           0          0          
  Messages          0          0          
  Branches        299        299          
==========================================
+ Hits           1777       1778     +1   
  Misses            0          0          
  Partials          0          0          
```

> Powered by [Codecov](https://codecov.io?src=pr). Last updated by [53b198c...1b84eeb][cc-compare]
[cc-base-branch]: https://codecov.io/gh/falconry/falcon/branch/master?src=pr
[cc-compare]: https://codecov.io/gh/falconry/falcon/compare/53b198c6d83cb04f051424e9cc33b593c52e65d7...1b84eeb8f3d8941113801958b76939d9bc726841
[cc-pull]: https://codecov.io/gh/falconry/falcon/pull/801?src=pr
yashmehrotra: @painterjd Hi, I have added the test for this. Please Review.
Thanks.
diff --git a/falcon/responders.py b/falcon/responders.py
index b5f6186..34da807 100644
--- a/falcon/responders.py
+++ b/falcon/responders.py
@@ -58,5 +58,6 @@ def create_default_options(allowed_methods):
     def on_options(req, resp, **kwargs):
         resp.status = HTTP_204
         resp.set_header('Allow', allowed)
+        resp.set_header('Content-Length', '0')
 
     return on_options
diff --git a/falcon/response.py b/falcon/response.py
index f3e2c9b..452432d 100644
--- a/falcon/response.py
+++ b/falcon/response.py
@@ -481,7 +481,12 @@ class Response(object):
 
     content_location = header_property(
         'Content-Location',
-        'Sets the Content-Location header.',
+        """Sets the Content-Location header.
+
+        This value will be URI encoded per RFC 3986. If the value that is
+        being set is already URI encoded it should be decoded first or the
+        header should be set manually using the set_header method.
+        """,
         uri_encode)
 
     content_range = header_property(
@@ -523,7 +528,12 @@ class Response(object):
 
     location = header_property(
         'Location',
-        'Sets the Location header.',
+        """Sets the Location header.
+
+        This value will be URI encoded per RFC 3986. If the value that is
+        being set is already URI encoded it should be decoded first or the
+        header should be set manually using the set_header method.
+        """,
         uri_encode)
 
     retry_after = header_property(
diff --git a/falcon/util/misc.py b/falcon/util/misc.py
index c01c05c..5b02f05 100644
--- a/falcon/util/misc.py
+++ b/falcon/util/misc.py
@@ -19,6 +19,8 @@ import warnings
 
 import six
 
+from falcon import status_codes
+
 __all__ = (
     'deprecated',
     'http_now',
@@ -26,6 +28,7 @@ __all__ = (
     'http_date_to_dt',
     'to_query_str',
     'get_bound_method',
+    'get_http_status'
 )
 
 
@@ -210,3 +213,36 @@ def get_bound_method(obj, method_name):
             raise AttributeError(msg)
 
     return method
+
+
+def get_http_status(status_code, default_reason='Unknown'):
+    """Gets both the http status code and description from just a code
+
+    Args:
+        status_code: integer or string that can be converted to an integer
+        default_reason: default text to be appended to the status_code
+            if the lookup does not find a result
+
+    Returns:
+        str: status code e.g. "404 Not Found"
+
+    Raises:
+        ValueError: the value entered could not be converted to an integer
+
+    """
+    # sanitize inputs
+    try:
+        code = float(status_code)  # float can validate values like "401.1"
+        code = int(code)  # converting to int removes the decimal places
+        if code < 100:
+            raise ValueError
+    except ValueError:
+        raise ValueError('get_http_status failed: "%s" is not a '
+                         'valid status code', status_code)
+
+    # lookup the status code
+    try:
+        return getattr(status_codes, 'HTTP_' + str(code))
+    except AttributeError:
+        # not found
+        return str(code) + ' ' + default_reason
diff --git a/tox.ini b/tox.ini
index 13a7b9d..7538965 100644
--- a/tox.ini
+++ b/tox.ini
@@ -27,7 +27,7 @@ commands = {toxinidir}/tools/clean.sh {toxinidir}/falcon
 whitelist_externals = bash
                       mv
 commands = {toxinidir}/tools/clean.sh {toxinidir}/falcon
-           nosetests --with-coverage
+           nosetests --with-coverage []
            bash -c "if [ ! -d .coverage_data ]; then mkdir .coverage_data; fi"
            mv {toxinidir}/.coverage {toxinidir}/.coverage_data/.coverage.{envname}
 

Default OPTIONS responder does not set Content-Length to "0"
Per RFC 7231:

> A server MUST generate a Content-Length field with a value of "0" if no payload body is to be sent in the response.

diff --git a/tests/test_headers.py b/tests/test_headers.py
index 8880992..838755d 100644
--- a/tests/test_headers.py
+++ b/tests/test_headers.py
@@ -534,6 +534,12 @@ class TestHeaders(testing.TestCase):
 
         self._check_link_header(resource, expected_value)
 
+    def test_content_length_options(self):
+        result = self.simulate_options()
+
+        content_length = '0'
+        self.assertEqual(result.headers['Content-Length'], content_length)
+
     # ----------------------------------------------------------------------
     # Helpers
     # ----------------------------------------------------------------------
diff --git a/tests/test_utils.py b/tests/test_utils.py
index fef8bec..957a959 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -297,6 +297,21 @@ class TestFalconUtils(testtools.TestCase):
         self.assertEqual(uri.parse_host('falcon.example.com:42'),
                          ('falcon.example.com', 42))
 
+    def test_get_http_status(self):
+        self.assertEqual(falcon.get_http_status(404), falcon.HTTP_404)
+        self.assertEqual(falcon.get_http_status(404.3), falcon.HTTP_404)
+        self.assertEqual(falcon.get_http_status('404.3'), falcon.HTTP_404)
+        self.assertEqual(falcon.get_http_status(404.9), falcon.HTTP_404)
+        self.assertEqual(falcon.get_http_status('404'), falcon.HTTP_404)
+        self.assertEqual(falcon.get_http_status(123), '123 Unknown')
+        self.assertRaises(ValueError, falcon.get_http_status, 'not_a_number')
+        self.assertRaises(ValueError, falcon.get_http_status, 0)
+        self.assertRaises(ValueError, falcon.get_http_status, 99)
+        self.assertRaises(ValueError, falcon.get_http_status, -404.3)
+        self.assertRaises(ValueError, falcon.get_http_status, '-404')
+        self.assertRaises(ValueError, falcon.get_http_status, '-404.3')
+        self.assertEqual(falcon.get_http_status(123, 'Go Away'), '123 Go Away')
+
 
 class TestFalconTesting(testing.TestBase):
     """Catch some uncommon branches not covered elsewhere."""

pip install -e .
parse_log_pytest
requirements.txt
nose ddt testtools pytest
apt-get update apt-get install -y gcc
3.5
tools/test-requires
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
ddt==1.7.2
-e git+https://github.com/falconry/falcon.git@10d1b7e770045b95ff5cb0cc3b4adfcc583049e2#egg=falcon
fixtures==4.0.1
idna==3.10
importlib-metadata==4.8.3
iniconfig==1.1.1
nose==1.3.7
packaging==21.3
pbr==6.1.1
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
python-mimeparse==1.6.0
PyYAML==6.0.1
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
      - ddt==1.7.2
      - fixtures==4.0.1
      - idna==3.10
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - nose==1.3.7
      - packaging==21.3
      - pbr==6.1.1
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - python-mimeparse==1.6.0
      - pyyaml==6.0.1
      - 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_headers.py::TestHeaders::test_content_length_options tests/test_utils.py::TestFalconUtils::test_get_http_status
tests/test_utils.py::TestFalconUtils::test_deprecated_decorator
tests/test_headers.py::TestHeaders::test_add_link_complex tests/test_headers.py::TestHeaders::test_add_link_multiple 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_add_link_with_hreflang tests/test_headers.py::TestHeaders::test_add_link_with_hreflang_multi tests/test_headers.py::TestHeaders::test_add_link_with_title tests/test_headers.py::TestHeaders::test_add_link_with_title_star tests/test_headers.py::TestHeaders::test_add_link_with_type_hint tests/test_headers.py::TestHeaders::test_content_header_missing tests/test_headers.py::TestHeaders::test_content_length tests/test_headers.py::TestHeaders::test_content_type_no_body tests/test_headers.py::TestHeaders::test_custom_content_type tests/test_headers.py::TestHeaders::test_default_media_type tests/test_headers.py::TestHeaders::test_default_value tests/test_headers.py::TestHeaders::test_headers_as_list tests/test_headers.py::TestHeaders::test_no_content_length_1_204_No_Content tests/test_headers.py::TestHeaders::test_no_content_length_2_304_Not_Modified tests/test_headers.py::TestHeaders::test_no_content_type_1_204_No_Content tests/test_headers.py::TestHeaders::test_no_content_type_2_304_Not_Modified tests/test_headers.py::TestHeaders::test_override_default_media_type_1___text_plain__charset_UTF_8____Hello_Unicode_____ tests/test_headers.py::TestHeaders::test_override_default_media_type_2___text_plain____Hello_ISO_8859_1___ tests/test_headers.py::TestHeaders::test_override_default_media_type_missing_encoding tests/test_headers.py::TestHeaders::test_passthrough_request_headers tests/test_headers.py::TestHeaders::test_required_header tests/test_headers.py::TestHeaders::test_response_append_header tests/test_headers.py::TestHeaders::test_response_header_helpers_on_get tests/test_headers.py::TestHeaders::test_response_set_and_get_header tests/test_headers.py::TestHeaders::test_unicode_headers tests/test_headers.py::TestHeaders::test_unicode_location_headers tests/test_headers.py::TestHeaders::test_vary_header_1____accept_encoding_____accept_encoding__ tests/test_headers.py::TestHeaders::test_vary_header_2____accept_encoding____x_auth_token_____accept_encoding__x_auth_token__ tests/test_headers.py::TestHeaders::test_vary_header_3____accept_encoding____x_auth_token_____accept_encoding__x_auth_token__ tests/test_headers.py::TestHeaders::test_vary_star tests/test_utils.py::TestFalconUtils::test_dt_to_http tests/test_utils.py::TestFalconUtils::test_http_date_to_dt tests/test_utils.py::TestFalconUtils::test_http_now tests/test_utils.py::TestFalconUtils::test_pack_query_params_none tests/test_utils.py::TestFalconUtils::test_pack_query_params_one tests/test_utils.py::TestFalconUtils::test_pack_query_params_several tests/test_utils.py::TestFalconUtils::test_parse_host tests/test_utils.py::TestFalconUtils::test_parse_query_string tests/test_utils.py::TestFalconUtils::test_prop_uri_decode_models_stdlib_unquote_plus tests/test_utils.py::TestFalconUtils::test_prop_uri_encode_models_stdlib_quote tests/test_utils.py::TestFalconUtils::test_prop_uri_encode_value_models_stdlib_quote_safe_tilde tests/test_utils.py::TestFalconUtils::test_uri_decode tests/test_utils.py::TestFalconUtils::test_uri_encode tests/test_utils.py::TestFalconUtils::test_uri_encode_value 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_none_header_value_in_create_environ tests/test_utils.py::TestFalconTesting::test_path_escape_chars_in_create_environ tests/test_utils.py::TestFalconTestCase::test_cached_text_in_result tests/test_utils.py::TestFalconTestCase::test_path_must_start_with_slash tests/test_utils.py::TestFalconTestCase::test_query_string tests/test_utils.py::TestFalconTestCase::test_query_string_in_path tests/test_utils.py::TestFalconTestCase::test_query_string_no_question tests/test_utils.py::TestFalconTestCase::test_simple_resource_body_json_xor tests/test_utils.py::TestFalconTestCase::test_status tests/test_utils.py::TestFalconTestCase::test_wsgi_iterable_not_closeable tests/test_utils.py::FancyTestCase::test_something
falcon/responders.py falcon/response.py tox.ini falcon/util/misc.py
falcon/responders.py falcon/response.py tox.ini falcon/util/misc.py