aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2012-07-24 12:46:14 +1200
committerAldo Cortesi <aldo@nullcube.com>2012-07-24 12:46:14 +1200
commita9e60fa3e66d9de28233aab89b426ac74d1f8ad6 (patch)
tree5cbff45257baa75a19ee420da9b7cfbe98e157ab
parentdbed251fb9e514c8d244a03eb1c84aed9ddb0988 (diff)
downloadmitmproxy-a9e60fa3e66d9de28233aab89b426ac74d1f8ad6.tar.gz
mitmproxy-a9e60fa3e66d9de28233aab89b426ac74d1f8ad6.tar.bz2
mitmproxy-a9e60fa3e66d9de28233aab89b426ac74d1f8ad6.zip
Add a Date header to server responses, unless raw is set.
-rw-r--r--libpathod/rparse.py40
-rw-r--r--test/test_rparse.py8
2 files changed, 34 insertions, 14 deletions
diff --git a/libpathod/rparse.py b/libpathod/rparse.py
index 38b38232..767cb861 100644
--- a/libpathod/rparse.py
+++ b/libpathod/rparse.py
@@ -1,6 +1,8 @@
import operator, string, random, mmap, os, time
+from email.utils import formatdate
import contrib.pyparsing as pp
from netlib import http_status, tcp
+
import utils
BLOCKSIZE = 1024
@@ -539,7 +541,7 @@ class Message:
l += len(i[2])
return l
- def serve(self, fp, check):
+ def serve(self, fp, check, is_request):
"""
fp: The file pointer to write to.
@@ -547,15 +549,30 @@ class Message:
values have been calculated). If it returns False service proceeds,
otherwise the return is treated as an error message to be sent to
the client, and service stops.
+
+ is_request: Is this a request? If False, we assume it's a response.
+ Used to decide what standard modifications to make if raw is not
+ set.
"""
started = time.time()
- if self.body and not self.raw and not utils.get_header("Content-Length", self.headers):
- self.headers.append(
- (
- LiteralGenerator("Content-Length"),
- LiteralGenerator(str(len(self.body))),
+ if not self.raw:
+ if self.body and not utils.get_header("Content-Length", self.headers):
+ self.headers.append(
+ (
+ LiteralGenerator("Content-Length"),
+ LiteralGenerator(str(len(self.body))),
+ )
)
- )
+ if is_request:
+ pass
+ else:
+ if not utils.get_header("Date", self.headers):
+ self.headers.append(
+ (
+ LiteralGenerator("Date"),
+ LiteralGenerator(formatdate(timeval=None, localtime=False, usegmt=True))
+ )
+ )
hdrs = []
for k, v in self.headers:
@@ -690,7 +707,7 @@ class CraftedRequest(Request):
i.accept(settings, self)
def serve(self, fp, check=None):
- d = Request.serve(self, fp, check)
+ d = Request.serve(self, fp, check, True)
d["spec"] = self.spec
return d
@@ -703,7 +720,7 @@ class CraftedResponse(Response):
i.accept(settings, self)
def serve(self, fp, check=None):
- d = Response.serve(self, fp, check)
+ d = Response.serve(self, fp, check, False)
d["spec"] = self.spec
return d
@@ -716,13 +733,12 @@ class PathodErrorResponse(Response):
self.body = LiteralGenerator("pathod error: " + (body or msg))
self.headers = [
(
- LiteralGenerator("Content-Type"),
- LiteralGenerator("text/plain")
+ LiteralGenerator("Content-Type"), LiteralGenerator("text/plain")
),
]
def serve(self, fp, check=None):
- d = Response.serve(self, fp, check)
+ d = Response.serve(self, fp, check, False)
d["internal"] = True
return d
diff --git a/test/test_rparse.py b/test/test_rparse.py
index 24ca3653..ef724d68 100644
--- a/test/test_rparse.py
+++ b/test/test_rparse.py
@@ -444,12 +444,16 @@ class TestResponse:
s = cStringIO.StringIO()
r = rparse.parse_response({}, "400:b'foo'")
r.serve(s)
- assert "Content-Length" in s.getvalue()
+ v = s.getvalue()
+ assert "Content-Length" in v
+ assert "Date" in v
s = cStringIO.StringIO()
r = rparse.parse_response({}, "400:b'foo':r")
r.serve(s)
- assert not "Content-Length" in s.getvalue()
+ v = s.getvalue()
+ assert not "Content-Length" in v
+ assert not "Date" in v
def test_length(self):
def testlen(x):