From 52779d9db98dff042a0b2b5dca97440b520367df Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sun, 10 Jun 2012 13:17:18 +1200 Subject: [PATCH] Refactoring of proxy.py - Correctly pass HTTP request version on to upstream servers - Adjust tests not to hang due to a pathod response with no content-length --- libmproxy/flow.py | 11 +++++------ libmproxy/proxy.py | 1 - test/test_server.py | 16 ++++++++++++---- test/tutils.py | 4 ++-- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 549942a52..b33707ca3 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -536,7 +536,6 @@ class Request(HTTPMsg): 'proxy-connection', 'keep-alive', 'connection', - 'content-length', 'transfer-encoding' ] ) @@ -551,15 +550,15 @@ class Request(HTTPMsg): headers["connection"] = ["close"] if not _proxy: return FMT % ( - self.method, - self.path, + self.method, + self.path, self.httpversion[0], self.httpversion[1], - str(headers), + str(headers), content ) else: - return FMT_PROXY % ( + return FMT_PROXY % ( self.method, self.scheme, self.host, @@ -738,7 +737,7 @@ class Response(HTTPMsg): headers = self.headers.copy() utils.del_all( headers, - ['proxy-connection', 'connection', 'keep-alive', 'transfer-encoding'] + ['proxy-connection', 'transfer-encoding'] ) content = self.content if content: diff --git a/libmproxy/proxy.py b/libmproxy/proxy.py index c7e5d972f..3be207614 100644 --- a/libmproxy/proxy.py +++ b/libmproxy/proxy.py @@ -123,7 +123,6 @@ def read_http_body(rfile, connection, headers, all, limit): content = rfile.read(limit if limit else None) connection.close = True else: - connection.close = True content = "" return content diff --git a/test/test_server.py b/test/test_server.py index e6f055cc2..d0e5d6529 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -3,9 +3,17 @@ import time import libpathod.test, requests import tutils +""" + Note that the choice of response code in these tests matters more than you + might think. libcurl treats a 304 response code differently from, say, a + 200 response code - it will correctly terminate a 304 response with no + content-length header, whereas it will block forever waiting for content + for a 200 response. +""" + class Sanity(tutils.ProxTest): def test_http(self): - assert self.pathod("205").status_code == 205 + assert self.pathod("304").status_code == 304 assert self.log() @@ -23,10 +31,10 @@ class TestReverse(Sanity): class TestProxy(tutils.ProxTest): def test_http(self): - f = self.pathod("205") - assert f.status_code == 205 + f = self.pathod("304") + assert f.status_code == 304 l = self.log() assert l[0].address assert "host" in l[1].headers - assert l[2].code == 205 + assert l[2].code == 304 diff --git a/test/tutils.py b/test/tutils.py index 7852a8b8c..849b94138 100644 --- a/test/tutils.py +++ b/test/tutils.py @@ -121,7 +121,7 @@ class ProxTest: r = hurl.get( "http://127.0.0.1:%s"%self.proxy.port + "/p/" + spec, validate_cert=False, - #debug=hurl.utils.stdout_debug + debug=hurl.utils.stdout_debug ) return r else: @@ -129,7 +129,7 @@ class ProxTest: self.urlbase + "/p/" + spec, proxy=self.proxies, validate_cert=False, - #debug=hurl.utils.stdout_debug + debug=hurl.utils.stdout_debug ) @property