From 560e23af092ab566e75060346ebde739ac07f179 Mon Sep 17 00:00:00 2001 From: Brad Peabody Date: Sat, 19 Jul 2014 19:10:14 -0700 Subject: fixed handling of Transfer-Encoding header during streaming; wrote tests for streaming support --- test/test_server.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'test/test_server.py') diff --git a/test/test_server.py b/test/test_server.py index e1da3125..795a749f 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -383,6 +383,64 @@ class TestRedirectRequest(tservers.HTTPProxTest): assert r3.content == r2.content == r1.content # Make sure that we actually use the same connection in this test case +class MasterStreamRequest(tservers.TestMaster): + """ + Enables the stream flag on the flow for all requests + """ + def handle_responseheaders(self, r): + f = self.state.add_response(r) + f.stream = True + r.reply() + return f + +class TestStreamRequest(tservers.HTTPProxTest): + masterclass = MasterStreamRequest + + def test_stream_simple(self): + p = self.pathoc() + + # a request with 100k of data but without content-length + self.server.clear_log() + r1 = p.request("get:'%s/p/200:r:b@100k:d102400'"%self.server.urlbase) + assert r1.status_code == 200 + assert len(r1.content) > 100000 + assert self.server.last_log() + + def test_stream_multiple(self): + p = self.pathoc() + + # simple request with streaming turned on + self.server.clear_log() + r1 = p.request("get:'%s/p/200'"%self.server.urlbase) + assert r1.status_code == 200 + assert self.server.last_log() + + # now send back 100k of data, streamed but not chunked + self.server.clear_log() + r1 = p.request("get:'%s/p/200:b@100k'"%self.server.urlbase) + assert r1.status_code == 200 + assert self.server.last_log() + + def test_stream_chunked(self): + + connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + connection.connect(("127.0.0.1", self.proxy.port)) + fconn = connection.makefile() + spec = '200:h"Transfer-Encoding"="chunked":r:b"4\\r\\nthis\\r\\n7\\r\\nisatest\\r\\n0\\r\\n\\r\\n"' + connection.send("GET %s/p/%s HTTP/1.1\r\n"%(self.server.urlbase, spec)) + connection.send("\r\n"); + + httpversion, code, msg, headers, content = http.read_response(fconn, "GET", 100000, include_body=False) + + assert headers["Transfer-Encoding"][0] == 'chunked' + assert code == 200 + + assert http.read_next_chunk(fconn, headers, False) == "this" + assert http.read_next_chunk(fconn, headers, False) == "isatest" + assert http.read_next_chunk(fconn, headers, False) == None + + connection.close() + class MasterFakeResponse(tservers.TestMaster): def handle_request(self, m): -- cgit v1.2.3 From 7398db80db004546070139c0c7e79bba4f92b318 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Sun, 20 Jul 2014 11:17:53 +0200 Subject: simplify responseheader scripthook --- test/test_server.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'test/test_server.py') diff --git a/test/test_server.py b/test/test_server.py index 795a749f..71f00d96 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -387,10 +387,9 @@ class MasterStreamRequest(tservers.TestMaster): """ Enables the stream flag on the flow for all requests """ - def handle_responseheaders(self, r): - f = self.state.add_response(r) - f.stream = True - r.reply() + def handle_responseheaders(self, f): + f.response.stream = True + f.reply() return f class TestStreamRequest(tservers.HTTPProxTest): -- cgit v1.2.3 From 562ac9e721c33b05e8889d4932dede794a9746a8 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Mon, 21 Jul 2014 14:09:24 +0200 Subject: unify stream handling --- test/test_server.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'test/test_server.py') diff --git a/test/test_server.py b/test/test_server.py index 71f00d96..d7318849 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -427,16 +427,15 @@ class TestStreamRequest(tservers.HTTPProxTest): fconn = connection.makefile() spec = '200:h"Transfer-Encoding"="chunked":r:b"4\\r\\nthis\\r\\n7\\r\\nisatest\\r\\n0\\r\\n\\r\\n"' connection.send("GET %s/p/%s HTTP/1.1\r\n"%(self.server.urlbase, spec)) - connection.send("\r\n"); + connection.send("\r\n") - httpversion, code, msg, headers, content = http.read_response(fconn, "GET", 100000, include_body=False) + httpversion, code, msg, headers, content = http.read_response(fconn, "GET", None, include_body=False) assert headers["Transfer-Encoding"][0] == 'chunked' assert code == 200 - assert http.read_next_chunk(fconn, headers, False) == "this" - assert http.read_next_chunk(fconn, headers, False) == "isatest" - assert http.read_next_chunk(fconn, headers, False) == None + chunks = list(content for _, content, _ in http.read_http_body_chunked(fconn, headers, None, "GET", 200, False)) + assert chunks == ["this", "isatest", ""] connection.close() -- cgit v1.2.3 From 3e3dbee936bb71e813d50937118eebff4ba23617 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 31 Jul 2014 22:18:57 +0200 Subject: fix tests --- test/test_server.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'test/test_server.py') diff --git a/test/test_server.py b/test/test_server.py index d7318849..cf50f280 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -387,10 +387,9 @@ class MasterStreamRequest(tservers.TestMaster): """ Enables the stream flag on the flow for all requests """ - def handle_responseheaders(self, f): - f.response.stream = True - f.reply() - return f + def handle_responseheaders(self, r): + r.stream = True + r.reply() class TestStreamRequest(tservers.HTTPProxTest): masterclass = MasterStreamRequest -- cgit v1.2.3