aboutsummaryrefslogtreecommitdiffstats
path: root/netlib/http
diff options
context:
space:
mode:
Diffstat (limited to 'netlib/http')
-rw-r--r--netlib/http/headers.py7
-rw-r--r--netlib/http/message.py32
-rw-r--r--netlib/http/request.py5
-rw-r--r--netlib/http/response.py5
4 files changed, 36 insertions, 13 deletions
diff --git a/netlib/http/headers.py b/netlib/http/headers.py
index 6eb9db92..78404796 100644
--- a/netlib/http/headers.py
+++ b/netlib/http/headers.py
@@ -14,7 +14,7 @@ except ImportError: # pragma: nocover
import six
-from netlib.utils import always_byte_args, always_bytes
+from netlib.utils import always_byte_args, always_bytes, Serializable
if six.PY2: # pragma: nocover
_native = lambda x: x
@@ -27,7 +27,7 @@ else:
_always_byte_args = always_byte_args("utf-8", "surrogateescape")
-class Headers(MutableMapping):
+class Headers(MutableMapping, Serializable):
"""
Header class which allows both convenient access to individual headers as well as
direct access to the underlying raw data. Provides a full dictionary interface.
@@ -193,11 +193,10 @@ class Headers(MutableMapping):
def copy(self):
return Headers(copy.copy(self.fields))
- # Implement the StateObject protocol from mitmproxy
def get_state(self):
return tuple(tuple(field) for field in self.fields)
- def load_state(self, state):
+ def set_state(self, state):
self.fields = [list(field) for field in state]
@classmethod
diff --git a/netlib/http/message.py b/netlib/http/message.py
index 28f55fa2..e3d8ce37 100644
--- a/netlib/http/message.py
+++ b/netlib/http/message.py
@@ -4,9 +4,9 @@ import warnings
import six
+from .headers import Headers
from .. import encoding, utils
-
CONTENT_MISSING = 0
if six.PY2: # pragma: nocover
@@ -18,7 +18,7 @@ else:
_always_bytes = lambda x: utils.always_bytes(x, "utf-8", "surrogateescape")
-class MessageData(object):
+class MessageData(utils.Serializable):
def __eq__(self, other):
if isinstance(other, MessageData):
return self.__dict__ == other.__dict__
@@ -27,8 +27,24 @@ class MessageData(object):
def __ne__(self, other):
return not self.__eq__(other)
+ def set_state(self, state):
+ for k, v in state.items():
+ if k == "headers":
+ v = Headers.from_state(v)
+ setattr(self, k, v)
+
+ def get_state(self):
+ state = vars(self).copy()
+ state["headers"] = state["headers"].get_state()
+ return state
+
+ @classmethod
+ def from_state(cls, state):
+ state["headers"] = Headers.from_state(state["headers"])
+ return cls(**state)
+
-class Message(object):
+class Message(utils.Serializable):
def __init__(self, data):
self.data = data
@@ -40,6 +56,16 @@ class Message(object):
def __ne__(self, other):
return not self.__eq__(other)
+ def get_state(self):
+ return self.data.get_state()
+
+ def set_state(self, state):
+ self.data.set_state(state)
+
+ @classmethod
+ def from_state(cls, state):
+ return cls(**state)
+
@property
def headers(self):
"""
diff --git a/netlib/http/request.py b/netlib/http/request.py
index 6dabb189..0e0f88ce 100644
--- a/netlib/http/request.py
+++ b/netlib/http/request.py
@@ -16,9 +16,8 @@ from .message import Message, _native, _always_bytes, MessageData
class RequestData(MessageData):
def __init__(self, first_line_format, method, scheme, host, port, path, http_version, headers=None, content=None,
timestamp_start=None, timestamp_end=None):
- if not headers:
- headers = Headers()
- assert isinstance(headers, Headers)
+ if not isinstance(headers, Headers):
+ headers = Headers(headers)
self.first_line_format = first_line_format
self.method = method
diff --git a/netlib/http/response.py b/netlib/http/response.py
index 66e5ded6..8f4d6215 100644
--- a/netlib/http/response.py
+++ b/netlib/http/response.py
@@ -12,9 +12,8 @@ from ..odict import ODict
class ResponseData(MessageData):
def __init__(self, http_version, status_code, reason=None, headers=None, content=None,
timestamp_start=None, timestamp_end=None):
- if not headers:
- headers = Headers()
- assert isinstance(headers, Headers)
+ if not isinstance(headers, Headers):
+ headers = Headers(headers)
self.http_version = http_version
self.status_code = status_code