bdarnell: We should definitely permit the `Allow` header for 204 responses, but the name `_clear_headers_for_304` is no longer literally accurate so I don't know if this is the change we want to make.

The primary purpose of this method is to clear the `Content-` headers from responses with no body, especially the `Content-Type` header that is added by `set_default_headers`. It's called for 1xx, 204, and 304 responses. I think we still want to do at least this much.

The RFCs have changed significantly since this function was written. It cites the definition of [entity headers](http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html#sec7.1) from RFC 2616 §7.1, which appears to have been replaced by a much shorter list of [representation metadata headers](https://tools.ietf.org/html/rfc7231#section-3.1) in RFC 7231 §3.1 (`Allow` is no longer on the list). [RFC 2616 §10.3.5](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5) said that 304 responses MUST NOT contain other entity headers, while [RFC 7232 §4.1](https://tools.ietf.org/html/rfc7232#section-4.1) makes it a SHOULD NOT (and `Last-Modified` is given as an example of a header that's sometimes useful). 

So this is what I'd do: rename `_clear_headers_for_304` to `_clear_representation_headers`, change it to only clear `Content-Type`, `Content-Language`, and `Content-Encoding`, and keep calling it for all 1xx responses, 204, and 304. Make sense?
andersk: Sure. Updated as such.
bdarnell: Looks good, now the test `test_static_304_if_modified_since` just needs to be fixed up.
diff --git a/tornado/web.py b/tornado/web.py
index adbf591e..9412ab44 100644
--- a/tornado/web.py
+++ b/tornado/web.py
@@ -1138,7 +1138,7 @@ class RequestHandler(object):
                 assert not self._write_buffer, (
                     "Cannot send body with %s" % self._status_code
                 )
-                self._clear_headers_for_304()
+                self._clear_representation_headers()
             elif "Content-Length" not in self._headers:
                 content_length = sum(len(part) for part in self._write_buffer)
                 self.set_header("Content-Length", content_length)
@@ -1803,21 +1803,13 @@ class RequestHandler(object):
     def _ui_method(self, method: Callable[..., str]) -> Callable[..., str]:
         return lambda *args, **kwargs: method(self, *args, **kwargs)
 
-    def _clear_headers_for_304(self) -> None:
-        # 304 responses should not contain entity headers (defined in
-        # http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html#sec7.1)
+    def _clear_representation_headers(self) -> None:
+        # 304 responses should not contain representation metadata
+        # headers (defined in
+        # https://tools.ietf.org/html/rfc7231#section-3.1)
         # not explicitly allowed by
-        # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5
-        headers = [
-            "Allow",
-            "Content-Encoding",
-            "Content-Language",
-            "Content-Length",
-            "Content-MD5",
-            "Content-Range",
-            "Content-Type",
-            "Last-Modified",
-        ]
+        # https://tools.ietf.org/html/rfc7232#section-4.1
+        headers = ["Content-Encoding", "Content-Language", "Content-Type"]
         for h in headers:
             self.clear_header(h)
 

Incorrectly removes ‘Allow’ header from HTTP 204 response
In this application, Tornado (6.0.3) filters the `Allow` header out of the 204 response to an `OPTIONS` request, while the misspelled `Alloww` header is passed through. [RFC 7231 §7.4.1](https://tools.ietf.org/html/rfc7231#section-7.4.1) is clear that an `Allow` header MAY be sent on any response, and [§4.3.7](https://tools.ietf.org/html/rfc7231#section-4.3.7) says that it SHOULD be sent if applicable in response to an `OPTIONS` request, so Tornado should not filter it out.

```python
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

    def options(self):
        self.set_header("Allow", "GET, OPTIONS")
        self.set_header("Alloww", "GET, OPTIONS")
        self.set_status(204)
        self.finish()

if __name__ == "__main__":
    app = tornado.web.Application([(r"/", MainHandler)])
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
```

```console
$ curl -i -X OPTIONS http://localhost:8888
HTTP/1.1 204 No Content
Server: TornadoServer/6.0.3
Date: Mon, 12 Aug 2019 01:49:10 GMT
Alloww: GET, OPTIONS
```

diff --git a/tornado/test/httpclient_test.py b/tornado/test/httpclient_test.py
index d1cc1467..11a4ee02 100644
--- a/tornado/test/httpclient_test.py
+++ b/tornado/test/httpclient_test.py
@@ -109,7 +109,7 @@ class ContentLength304Handler(RequestHandler):
         self.set_status(304)
         self.set_header("Content-Length", 42)
 
-    def _clear_headers_for_304(self):
+    def _clear_representation_headers(self):
         # Tornado strips content-length from 304 responses, but here we
         # want to simulate servers that include the headers anyway.
         pass
diff --git a/tornado/test/web_test.py b/tornado/test/web_test.py
index 5908710a..4a06c12d 100644
--- a/tornado/test/web_test.py
+++ b/tornado/test/web_test.py
@@ -1175,7 +1175,6 @@ class StaticFileTest(WebTestCase):
         )
         self.assertEqual(response2.code, 304)
         self.assertTrue("Content-Length" not in response2.headers)
-        self.assertTrue("Last-Modified" not in response2.headers)
 
     def test_static_304_if_none_match(self):
         response1 = self.get_and_head("/static/robots.txt")

pip install -e .
parse_log_pytest
pytest
pycurl twisted pycares pytest
apt-get update apt-get install -y gcc
3.8
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==25.3.0
Automat==24.8.1
cffi==1.17.1
constantly==23.10.4
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
hyperlink==21.0.0
idna==3.10
incremental==24.7.2
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1720101850331/work
pluggy @ file:///tmp/build/80754af9/pluggy_1648042571233/work
pycares==4.4.0
pycparser==2.22
pycurl==7.45.6
pytest @ file:///croot/pytest_1717793244625/work
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
-e git+https://github.com/tornadoweb/tornado.git@ff985fe509513325462441e017f1ec31dda737c1#egg=tornado
Twisted==24.11.0
typing_extensions==4.13.0
zope.interface==7.2

name: tornado
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
  - exceptiongroup=1.2.0=py38h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - 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=3.0.16=h5eee18b_0
  - packaging=24.1=py38h06a4308_0
  - pip=24.2=py38h06a4308_0
  - pluggy=1.0.0=py38h06a4308_1
  - pytest=7.4.4=py38h06a4308_0
  - python=3.8.20=he870216_0
  - readline=8.2=h5eee18b_0
  - setuptools=75.1.0=py38h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py38h06a4308_0
  - wheel=0.44.0=py38h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==25.3.0
      - automat==24.8.1
      - cffi==1.17.1
      - constantly==23.10.4
      - hyperlink==21.0.0
      - idna==3.10
      - incremental==24.7.2
      - pycares==4.4.0
      - pycparser==2.22
      - pycurl==7.45.6
      - twisted==24.11.0
      - typing-extensions==4.13.0
      - zope-interface==7.2
prefix: /opt/conda/envs/tornado

tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_304_with_content_length
tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_all_methods tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_basic_auth tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_basic_auth_explicit_mode tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_basic_auth_unicode tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_bind_source_ip tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_body_encoding tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_body_sanity_checks tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_chunked tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_chunked_close tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_configure_defaults tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_credentials_in_url tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_error_after_cancel tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_follow_redirect tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_future_http_error tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_future_http_error_no_raise tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_future_interface tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_gzip tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_header_callback tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_header_types tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_hello_world tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_method_after_redirect tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_multi_line_headers tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_non_ascii_header tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_patch_receives_payload tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_post tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_put_307 tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_redirect_put_with_body tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_redirect_put_without_body tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_redirect_without_location tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_response_times tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_reuse_request_from_response tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_streaming_callback tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_types tornado/test/httpclient_test.py::HTTPClientCommonTestCase::test_unsupported_auth_mode tornado/test/httpclient_test.py::RequestProxyTest::test_bad_attribute tornado/test/httpclient_test.py::RequestProxyTest::test_both_set tornado/test/httpclient_test.py::RequestProxyTest::test_default_set tornado/test/httpclient_test.py::RequestProxyTest::test_defaults_none tornado/test/httpclient_test.py::RequestProxyTest::test_neither_set tornado/test/httpclient_test.py::RequestProxyTest::test_request_set tornado/test/httpclient_test.py::HTTPResponseTestCase::test_str tornado/test/httpclient_test.py::SyncHTTPClientTest::test_sync_client tornado/test/httpclient_test.py::SyncHTTPClientTest::test_sync_client_error tornado/test/httpclient_test.py::SyncHTTPClientSubprocessTest::test_destructor_log tornado/test/httpclient_test.py::HTTPRequestTestCase::test_body tornado/test/httpclient_test.py::HTTPRequestTestCase::test_body_setter tornado/test/httpclient_test.py::HTTPRequestTestCase::test_headers tornado/test/httpclient_test.py::HTTPRequestTestCase::test_headers_setter tornado/test/httpclient_test.py::HTTPRequestTestCase::test_if_modified_since tornado/test/httpclient_test.py::HTTPRequestTestCase::test_null_headers_setter tornado/test/httpclient_test.py::HTTPErrorTestCase::test_copy tornado/test/httpclient_test.py::HTTPErrorTestCase::test_error_with_response tornado/test/httpclient_test.py::HTTPErrorTestCase::test_plain_error tornado/test/web_test.py::SecureCookieV1Test::test_arbitrary_bytes tornado/test/web_test.py::SecureCookieV1Test::test_cookie_tampering_future_timestamp tornado/test/web_test.py::SecureCookieV1Test::test_round_trip tornado/test/web_test.py::SecureCookieV2Test::test_key_version_increment_version tornado/test/web_test.py::SecureCookieV2Test::test_key_version_invalidate_version tornado/test/web_test.py::SecureCookieV2Test::test_key_version_roundtrip tornado/test/web_test.py::SecureCookieV2Test::test_key_version_roundtrip_differing_version tornado/test/web_test.py::SecureCookieV2Test::test_round_trip tornado/test/web_test.py::FinalReturnTest::test_finish_method_return_future tornado/test/web_test.py::FinalReturnTest::test_render_method_return_future tornado/test/web_test.py::CookieTest::test_cookie_special_char tornado/test/web_test.py::CookieTest::test_get_cookie tornado/test/web_test.py::CookieTest::test_set_cookie tornado/test/web_test.py::CookieTest::test_set_cookie_domain tornado/test/web_test.py::CookieTest::test_set_cookie_expires_days tornado/test/web_test.py::CookieTest::test_set_cookie_false_flags tornado/test/web_test.py::CookieTest::test_set_cookie_max_age tornado/test/web_test.py::CookieTest::test_set_cookie_overwrite tornado/test/web_test.py::AuthRedirectTest::test_absolute_auth_redirect tornado/test/web_test.py::AuthRedirectTest::test_relative_auth_redirect tornado/test/web_test.py::ConnectionCloseTest::test_connection_close tornado/test/web_test.py::RequestEncodingTest::test_error tornado/test/web_test.py::RequestEncodingTest::test_group_encoding tornado/test/web_test.py::RequestEncodingTest::test_group_question_mark tornado/test/web_test.py::RequestEncodingTest::test_slashes tornado/test/web_test.py::WSGISafeWebTest::test_decode_argument tornado/test/web_test.py::WSGISafeWebTest::test_decode_argument_invalid_unicode tornado/test/web_test.py::WSGISafeWebTest::test_decode_argument_plus tornado/test/web_test.py::WSGISafeWebTest::test_get_argument tornado/test/web_test.py::WSGISafeWebTest::test_get_body_arguments tornado/test/web_test.py::WSGISafeWebTest::test_get_query_arguments tornado/test/web_test.py::WSGISafeWebTest::test_header_injection tornado/test/web_test.py::WSGISafeWebTest::test_multi_header tornado/test/web_test.py::WSGISafeWebTest::test_no_gzip tornado/test/web_test.py::WSGISafeWebTest::test_optional_path tornado/test/web_test.py::WSGISafeWebTest::test_redirect tornado/test/web_test.py::WSGISafeWebTest::test_reverse_url tornado/test/web_test.py::WSGISafeWebTest::test_types tornado/test/web_test.py::WSGISafeWebTest::test_uimodule_resources tornado/test/web_test.py::WSGISafeWebTest::test_uimodule_unescaped tornado/test/web_test.py::WSGISafeWebTest::test_web_redirect tornado/test/web_test.py::WSGISafeWebTest::test_web_redirect_double_slash tornado/test/web_test.py::NonWSGIWebTests::test_empty_flush tornado/test/web_test.py::ErrorResponseTest::test_default tornado/test/web_test.py::ErrorResponseTest::test_failed_write_error tornado/test/web_test.py::ErrorResponseTest::test_write_error tornado/test/web_test.py::StaticFileTest::test_absolute_static_url tornado/test/web_test.py::StaticFileTest::test_absolute_version_exclusion tornado/test/web_test.py::StaticFileTest::test_include_host_override tornado/test/web_test.py::StaticFileTest::test_path_traversal_protection tornado/test/web_test.py::StaticFileTest::test_relative_version_exclusion tornado/test/web_test.py::StaticFileTest::test_root_static_path tornado/test/web_test.py::StaticFileTest::test_static_304_etag_modified_bug tornado/test/web_test.py::StaticFileTest::test_static_304_if_modified_since tornado/test/web_test.py::StaticFileTest::test_static_304_if_none_match tornado/test/web_test.py::StaticFileTest::test_static_404 tornado/test/web_test.py::StaticFileTest::test_static_compressed_files tornado/test/web_test.py::StaticFileTest::test_static_etag tornado/test/web_test.py::StaticFileTest::test_static_files tornado/test/web_test.py::StaticFileTest::test_static_head tornado/test/web_test.py::StaticFileTest::test_static_head_range tornado/test/web_test.py::StaticFileTest::test_static_if_modified_since_pre_epoch tornado/test/web_test.py::StaticFileTest::test_static_if_modified_since_time_zone tornado/test/web_test.py::StaticFileTest::test_static_invalid_range tornado/test/web_test.py::StaticFileTest::test_static_range_if_none_match tornado/test/web_test.py::StaticFileTest::test_static_unsatisfiable_range_end_less_than_start tornado/test/web_test.py::StaticFileTest::test_static_unsatisfiable_range_invalid_start tornado/test/web_test.py::StaticFileTest::test_static_unsatisfiable_range_zero_suffix tornado/test/web_test.py::StaticFileTest::test_static_url tornado/test/web_test.py::StaticFileTest::test_static_with_range tornado/test/web_test.py::StaticFileTest::test_static_with_range_end_edge tornado/test/web_test.py::StaticFileTest::test_static_with_range_full_file tornado/test/web_test.py::StaticFileTest::test_static_with_range_full_past_end tornado/test/web_test.py::StaticFileTest::test_static_with_range_neg_end tornado/test/web_test.py::StaticFileTest::test_static_with_range_neg_past_start tornado/test/web_test.py::StaticFileTest::test_static_with_range_partial_past_end tornado/test/web_test.py::StaticDefaultFilenameTest::test_static_default_filename tornado/test/web_test.py::StaticDefaultFilenameTest::test_static_default_redirect tornado/test/web_test.py::StaticFileWithPathTest::test_serve tornado/test/web_test.py::CustomStaticFileTest::test_serve tornado/test/web_test.py::CustomStaticFileTest::test_static_url tornado/test/web_test.py::HostMatchingTest::test_host_matching tornado/test/web_test.py::DefaultHostMatchingTest::test_default_host_matching tornado/test/web_test.py::NamedURLSpecGroupsTest::test_named_urlspec_groups tornado/test/web_test.py::ClearHeaderTest::test_clear_header tornado/test/web_test.py::Header204Test::test_204_headers tornado/test/web_test.py::Header304Test::test_304_headers tornado/test/web_test.py::StatusReasonTest::test_status tornado/test/web_test.py::DateHeaderTest::test_date_header tornado/test/web_test.py::RaiseWithReasonTest::test_httperror_str tornado/test/web_test.py::RaiseWithReasonTest::test_httperror_str_from_httputil tornado/test/web_test.py::RaiseWithReasonTest::test_raise_with_reason tornado/test/web_test.py::ErrorHandlerXSRFTest::test_404_xsrf tornado/test/web_test.py::ErrorHandlerXSRFTest::test_error_xsrf tornado/test/web_test.py::GzipTestCase::test_gzip tornado/test/web_test.py::GzipTestCase::test_gzip_not_requested tornado/test/web_test.py::GzipTestCase::test_gzip_static tornado/test/web_test.py::GzipTestCase::test_vary_already_present tornado/test/web_test.py::GzipTestCase::test_vary_already_present_multiple tornado/test/web_test.py::PathArgsInPrepareTest::test_kw tornado/test/web_test.py::PathArgsInPrepareTest::test_pos tornado/test/web_test.py::ClearAllCookiesTest::test_clear_all_cookies tornado/test/web_test.py::ExceptionHandlerTest::test_http_error tornado/test/web_test.py::ExceptionHandlerTest::test_known_error tornado/test/web_test.py::ExceptionHandlerTest::test_unknown_error tornado/test/web_test.py::BuggyLoggingTest::test_buggy_log_exception tornado/test/web_test.py::UIMethodUIModuleTest::test_ui_method tornado/test/web_test.py::GetArgumentErrorTest::test_catch_error tornado/test/web_test.py::SetLazyPropertiesTest::test_set_properties tornado/test/web_test.py::GetCurrentUserTest::test_get_current_user_from_ui_module_is_lazy tornado/test/web_test.py::GetCurrentUserTest::test_get_current_user_from_ui_module_works tornado/test/web_test.py::GetCurrentUserTest::test_get_current_user_works tornado/test/web_test.py::UnimplementedHTTPMethodsTest::test_unimplemented_standard_methods tornado/test/web_test.py::UnimplementedNonStandardMethodsTest::test_unimplemented_other tornado/test/web_test.py::UnimplementedNonStandardMethodsTest::test_unimplemented_patch tornado/test/web_test.py::AllHTTPMethodsTest::test_standard_methods tornado/test/web_test.py::PatchMethodTest::test_other tornado/test/web_test.py::PatchMethodTest::test_patch tornado/test/web_test.py::FinishInPrepareTest::test_finish_in_prepare tornado/test/web_test.py::Default404Test::test_404 tornado/test/web_test.py::Custom404Test::test_404 tornado/test/web_test.py::DefaultHandlerArgumentsTest::test_403 tornado/test/web_test.py::HandlerByNameTest::test_handler_by_name tornado/test/web_test.py::StreamingRequestBodyTest::test_close_during_upload tornado/test/web_test.py::StreamingRequestBodyTest::test_early_return tornado/test/web_test.py::StreamingRequestBodyTest::test_early_return_with_data tornado/test/web_test.py::StreamingRequestBodyTest::test_streaming_body tornado/test/web_test.py::DecoratedStreamingRequestFlowControlTest::test_flow_control_chunked_body tornado/test/web_test.py::DecoratedStreamingRequestFlowControlTest::test_flow_control_compressed_body tornado/test/web_test.py::DecoratedStreamingRequestFlowControlTest::test_flow_control_fixed_body tornado/test/web_test.py::NativeStreamingRequestFlowControlTest::test_flow_control_chunked_body tornado/test/web_test.py::NativeStreamingRequestFlowControlTest::test_flow_control_compressed_body tornado/test/web_test.py::NativeStreamingRequestFlowControlTest::test_flow_control_fixed_body tornado/test/web_test.py::IncorrectContentLengthTest::test_content_length_too_high tornado/test/web_test.py::IncorrectContentLengthTest::test_content_length_too_low tornado/test/web_test.py::ClientCloseTest::test_client_close tornado/test/web_test.py::SignedValueTest::test_expired tornado/test/web_test.py::SignedValueTest::test_key_version_retrieval tornado/test/web_test.py::SignedValueTest::test_key_versioning_invalid_key tornado/test/web_test.py::SignedValueTest::test_key_versioning_read_write_default_key tornado/test/web_test.py::SignedValueTest::test_key_versioning_read_write_non_default_key tornado/test/web_test.py::SignedValueTest::test_known_values tornado/test/web_test.py::SignedValueTest::test_name_swap tornado/test/web_test.py::SignedValueTest::test_non_ascii tornado/test/web_test.py::SignedValueTest::test_payload_tampering tornado/test/web_test.py::SignedValueTest::test_signature_tampering tornado/test/web_test.py::XSRFTest::test_cross_user tornado/test/web_test.py::XSRFTest::test_distinct_tokens tornado/test/web_test.py::XSRFTest::test_refresh_token tornado/test/web_test.py::XSRFTest::test_versioning tornado/test/web_test.py::XSRFTest::test_xsrf_fail_argument_invalid_format tornado/test/web_test.py::XSRFTest::test_xsrf_fail_body_no_cookie tornado/test/web_test.py::XSRFTest::test_xsrf_fail_cookie_invalid_format tornado/test/web_test.py::XSRFTest::test_xsrf_fail_cookie_no_body tornado/test/web_test.py::XSRFTest::test_xsrf_fail_no_token tornado/test/web_test.py::XSRFTest::test_xsrf_success_header tornado/test/web_test.py::XSRFTest::test_xsrf_success_non_hex_token tornado/test/web_test.py::XSRFTest::test_xsrf_success_post_body tornado/test/web_test.py::XSRFTest::test_xsrf_success_query_string tornado/test/web_test.py::XSRFTest::test_xsrf_success_short_token tornado/test/web_test.py::XSRFCookieKwargsTest::test_xsrf_httponly tornado/test/web_test.py::FinishExceptionTest::test_finish_exception tornado/test/web_test.py::DecoratorTest::test_addslash tornado/test/web_test.py::DecoratorTest::test_removeslash tornado/test/web_test.py::CacheTest::test_multiple_strong_etag_match tornado/test/web_test.py::CacheTest::test_multiple_strong_etag_not_match tornado/test/web_test.py::CacheTest::test_multiple_weak_etag_match tornado/test/web_test.py::CacheTest::test_multiple_weak_etag_not_match tornado/test/web_test.py::CacheTest::test_strong_etag_match tornado/test/web_test.py::CacheTest::test_strong_etag_not_match tornado/test/web_test.py::CacheTest::test_weak_etag_match tornado/test/web_test.py::CacheTest::test_weak_etag_not_match tornado/test/web_test.py::CacheTest::test_wildcard_etag tornado/test/web_test.py::RequestSummaryTest::test_missing_remote_ip tornado/test/web_test.py::HTTPErrorTest::test_copy tornado/test/web_test.py::ApplicationTest::test_listen tornado/test/web_test.py::URLSpecReverseTest::test_non_reversible tornado/test/web_test.py::URLSpecReverseTest::test_reverse tornado/test/web_test.py::URLSpecReverseTest::test_reverse_arguments tornado/test/web_test.py::RedirectHandlerTest::test_basic_redirect tornado/test/web_test.py::RedirectHandlerTest::test_redirect_pattern tornado/test/web_test.py::RedirectHandlerTest::test_redirect_with_appending_argument tornado/test/web_test.py::RedirectHandlerTest::test_redirect_with_argument
tornado/web.py
tornado/web.py