aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2012-06-10 13:27:43 +1200
committerAldo Cortesi <aldo@nullcube.com>2012-06-10 13:27:43 +1200
commit6ba5f0f35bcd37dbd15e0f7f78da183a802f6193 (patch)
tree03df678908ed62493520a7bf7b0800bd19574bf2
parent52779d9db98dff042a0b2b5dca97440b520367df (diff)
downloadmitmproxy-6ba5f0f35bcd37dbd15e0f7f78da183a802f6193.tar.gz
mitmproxy-6ba5f0f35bcd37dbd15e0f7f78da183a802f6193.tar.bz2
mitmproxy-6ba5f0f35bcd37dbd15e0f7f78da183a802f6193.zip
Add HTTP version to response objects.
Another change in the serialization format.
-rw-r--r--libmproxy/flow.py6
-rw-r--r--libmproxy/proxy.py5
-rw-r--r--test/test_filt.py1
-rw-r--r--test/test_flow.py8
-rw-r--r--test/tutils.py2
5 files changed, 14 insertions, 8 deletions
diff --git a/libmproxy/flow.py b/libmproxy/flow.py
index b33707ca..ff5c3cf1 100644
--- a/libmproxy/flow.py
+++ b/libmproxy/flow.py
@@ -606,10 +606,10 @@ class Response(HTTPMsg):
timestamp: Seconds since the epoch
"""
- def __init__(self, request, code, msg, headers, content, der_cert, timestamp=None):
+ def __init__(self, request, httpversion, code, msg, headers, content, der_cert, timestamp=None):
assert isinstance(headers, ODictCaseless)
self.request = request
- self.code, self.msg = code, msg
+ self.httpversion, self.code, self.msg = httpversion, code, msg
self.headers, self.content = headers, content
self.der_cert = der_cert
self.timestamp = timestamp or utils.timestamp()
@@ -692,6 +692,7 @@ class Response(HTTPMsg):
def _get_state(self):
return dict(
+ httpversion = self.httpversion,
code = self.code,
msg = self.msg,
headers = self.headers._get_state(),
@@ -704,6 +705,7 @@ class Response(HTTPMsg):
def _from_state(klass, request, state):
return klass(
request,
+ state["httpversion"],
state["code"],
str(state["msg"]),
ODictCaseless._from_state(state["headers"]),
diff --git a/libmproxy/proxy.py b/libmproxy/proxy.py
index 3be20761..7698a61f 100644
--- a/libmproxy/proxy.py
+++ b/libmproxy/proxy.py
@@ -309,6 +309,9 @@ class ServerConnection:
if not len(parts) == 3:
raise ProxyError(502, "Invalid server response: %s."%line)
proto, code, msg = parts
+ httpversion = parse_http_protocol(proto)
+ if httpversion is None:
+ raise ProxyError(502, "Invalid HTTP version: %s."%httpversion)
try:
code = int(code)
except ValueError:
@@ -320,7 +323,7 @@ class ServerConnection:
content = ""
else:
content = read_http_body(self.rfile, self, headers, True, self.config.body_size_limit)
- return flow.Response(request, code, msg, headers, content, self.cert)
+ return flow.Response(request, httpversion, code, msg, headers, content, self.cert)
def terminate(self):
try:
diff --git a/test/test_filt.py b/test/test_filt.py
index 62c9fb51..2421c327 100644
--- a/test/test_filt.py
+++ b/test/test_filt.py
@@ -95,6 +95,7 @@ class TestMatching:
headers["header_response"] = ["svalue"]
f.response = flow.Response(
f.request,
+ (1, 1),
200,
"message",
headers,
diff --git a/test/test_flow.py b/test/test_flow.py
index fd26b095..d220381d 100644
--- a/test/test_flow.py
+++ b/test/test_flow.py
@@ -826,7 +826,7 @@ class TestResponse:
h["test"] = ["test"]
c = flow.ClientConnect(("addr", 2222))
req = flow.Request(c, (1, 1), "host", 22, "https", "GET", "/", h, "content")
- resp = flow.Response(req, 200, "msg", h.copy(), "content", None)
+ resp = flow.Response(req, (1, 1), 200, "msg", h.copy(), "content", None)
assert resp._assemble()
resp2 = resp.copy()
@@ -871,7 +871,7 @@ class TestResponse:
def test_get_cert(self):
req = tutils.treq()
resp = flow.Response(
- req, 200, "msg", flow.ODictCaseless(), "content",
+ req, (1, 1), 200, "msg", flow.ODictCaseless(), "content",
file(tutils.test_data.path("data/dercert")).read()
)
assert resp.get_cert()
@@ -884,12 +884,12 @@ class TestResponse:
h["test"] = ["test"]
c = flow.ClientConnect(("addr", 2222))
req = flow.Request(c, (1, 1), "host", 22, "https", "GET", "/", h, "content")
- resp = flow.Response(req, 200, "msg", h.copy(), "content", None)
+ resp = flow.Response(req, (1, 1), 200, "msg", h.copy(), "content", None)
state = resp._get_state()
assert flow.Response._from_state(req, state) == resp
- resp2 = flow.Response(req, 220, "foo", h.copy(), "test", None)
+ resp2 = flow.Response(req, (1, 1), 220, "foo", h.copy(), "test", None)
assert not resp == resp2
resp._load_state(resp2._get_state())
assert resp == resp2
diff --git a/test/tutils.py b/test/tutils.py
index 849b9413..2d6dad1d 100644
--- a/test/tutils.py
+++ b/test/tutils.py
@@ -20,7 +20,7 @@ def tresp(req=None):
req = treq()
headers = flow.ODictCaseless()
headers["header_response"] = ["svalue"]
- return flow.Response(req, 200, "message", headers, "content_response", None)
+ return flow.Response(req, (1, 1), 200, "message", headers, "content_response", None)
def tflow():