aboutsummaryrefslogtreecommitdiffstats
path: root/netlib/http/semantics.py
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@corte.si>2015-08-01 11:38:02 +1200
committerAldo Cortesi <aldo@corte.si>2015-08-01 11:38:02 +1200
commit199f2a44fed6b5f1c6fada6c96b981dfab5fded2 (patch)
treecec2f094e20b2bf204f0420b67ba5774a47c9f50 /netlib/http/semantics.py
parentfb482172241b6235da083f6dbf154b641772a4fc (diff)
parent7b10817670b30550dd45af48491ed8cf3cacd5e6 (diff)
downloadmitmproxy-199f2a44fed6b5f1c6fada6c96b981dfab5fded2.tar.gz
mitmproxy-199f2a44fed6b5f1c6fada6c96b981dfab5fded2.tar.bz2
mitmproxy-199f2a44fed6b5f1c6fada6c96b981dfab5fded2.zip
Merge pull request #84 from Kriechi/http2-wip
[WIP] Protocol Refactoring for HTTP/2
Diffstat (limited to 'netlib/http/semantics.py')
-rw-r--r--netlib/http/semantics.py91
1 files changed, 84 insertions, 7 deletions
diff --git a/netlib/http/semantics.py b/netlib/http/semantics.py
index 9e13edaa..54bf83d2 100644
--- a/netlib/http/semantics.py
+++ b/netlib/http/semantics.py
@@ -7,6 +7,32 @@ import urlparse
from .. import utils, odict
+CONTENT_MISSING = 0
+
+
+class ProtocolMixin(object):
+
+ def read_request(self):
+ raise NotImplemented
+
+ def read_response(self):
+ raise NotImplemented
+
+ def assemble(self, message):
+ if isinstance(message, Request):
+ return self.assemble_request(message)
+ elif isinstance(message, Response):
+ return self.assemble_response(message)
+ else:
+ raise ValueError("HTTP message not supported.")
+
+ def assemble_request(self, request):
+ raise NotImplemented
+
+ def assemble_response(self, response):
+ raise NotImplemented
+
+
class Request(object):
def __init__(
@@ -18,9 +44,15 @@ class Request(object):
port,
path,
httpversion,
- headers,
- body,
+ headers=None,
+ body=None,
+ timestamp_start=None,
+ timestamp_end=None,
):
+ if not headers:
+ headers = odict.ODictCaseless()
+ assert isinstance(headers, odict.ODictCaseless)
+
self.form_in = form_in
self.method = method
self.scheme = scheme
@@ -30,17 +62,31 @@ class Request(object):
self.httpversion = httpversion
self.headers = headers
self.body = body
+ self.timestamp_start = timestamp_start
+ self.timestamp_end = timestamp_end
+
def __eq__(self, other):
- return self.__dict__ == other.__dict__
+ try:
+ self_d = [self.__dict__[k] for k in self.__dict__ if k not in ('timestamp_start', 'timestamp_end')]
+ other_d = [other.__dict__[k] for k in other.__dict__ if k not in ('timestamp_start', 'timestamp_end')]
+ return self_d == other_d
+ except:
+ return False
def __repr__(self):
return "Request(%s - %s, %s)" % (self.method, self.host, self.path)
@property
def content(self):
+ # TODO: remove deprecated getter
return self.body
+ @content.setter
+ def content(self, content):
+ # TODO: remove deprecated setter
+ self.body = content
+
class EmptyRequest(Request):
def __init__(self):
@@ -63,28 +109,59 @@ class Response(object):
self,
httpversion,
status_code,
- msg,
- headers,
- body,
+ msg=None,
+ headers=None,
+ body=None,
sslinfo=None,
+ timestamp_start=None,
+ timestamp_end=None,
):
+ if not headers:
+ headers = odict.ODictCaseless()
+ assert isinstance(headers, odict.ODictCaseless)
+
self.httpversion = httpversion
self.status_code = status_code
self.msg = msg
self.headers = headers
self.body = body
self.sslinfo = sslinfo
+ self.timestamp_start = timestamp_start
+ self.timestamp_end = timestamp_end
+
def __eq__(self, other):
- return self.__dict__ == other.__dict__
+ try:
+ self_d = [self.__dict__[k] for k in self.__dict__ if k not in ('timestamp_start', 'timestamp_end')]
+ other_d = [other.__dict__[k] for k in other.__dict__ if k not in ('timestamp_start', 'timestamp_end')]
+ return self_d == other_d
+ except:
+ return False
def __repr__(self):
return "Response(%s - %s)" % (self.status_code, self.msg)
@property
def content(self):
+ # TODO: remove deprecated getter
return self.body
+ @content.setter
+ def content(self, content):
+ # TODO: remove deprecated setter
+ self.body = content
+
+ @property
+ def code(self):
+ # TODO: remove deprecated getter
+ return self.status_code
+
+ @code.setter
+ def code(self, code):
+ # TODO: remove deprecated setter
+ self.status_code = code
+
+
def is_valid_port(port):
if not 0 <= port <= 65535: