From 6e0a0ca5a281317408d5b3bd2444d68829a88f2d Mon Sep 17 00:00:00 2001 From: Willem de Groot Date: Tue, 25 Aug 2015 13:34:52 +0200 Subject: [PATCH] Add multi-line header test --- tornado/test/httpclient_test.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tornado/test/httpclient_test.py b/tornado/test/httpclient_test.py index ecc63e4a4..e4325a3c0 100644 --- a/tornado/test/httpclient_test.py +++ b/tornado/test/httpclient_test.py @@ -371,6 +371,30 @@ Transfer-Encoding: chunked "response=%r, value=%r, container=%r" % (resp.body, value, container)) + def test_multi_line_headers(self): + # Multi-line http headers are rare but rfc-allowed + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 + sock, port = bind_unused_port() + with closing(sock): + def write_response(stream, request_data): + stream.write(b"""\ +HTTP/1.1 200 OK +X-XSS-Protection: 1; +\tmode=block + +""".replace(b"\n", b"\r\n"), callback=stream.close) + + def accept_callback(conn, address): + stream = IOStream(conn, io_loop=self.io_loop) + stream.read_until(b"\r\n\r\n", + functools.partial(write_response, stream)) + netutil.add_accept_handler(sock, accept_callback, self.io_loop) + self.http_client.fetch("http://127.0.0.1:%d/" % port, self.stop) + resp = self.wait() + resp.rethrow() + self.assertEqual(resp.headers['X-XSS-Protection'], b"1; mode=block") + self.io_loop.remove_handler(sock.fileno()) + def test_304_with_content_length(self): # According to the spec 304 responses SHOULD NOT include # Content-Length or other entity headers, but some servers do it -- 2.47.2