aboutsummaryrefslogtreecommitdiffstats
path: root/netlib
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2016-08-23 00:17:06 -0700
committerMaximilian Hils <git@maximilianhils.com>2016-08-23 00:17:06 -0700
commitf27028f58e50492c8c8e15e47278bf444d692246 (patch)
tree59a76a43a8e3348f04ce09136c1ed703dde34a3f /netlib
parent798ce96bd0d22b642f8508c5d9a8e131bedb4896 (diff)
downloadmitmproxy-f27028f58e50492c8c8e15e47278bf444d692246.tar.gz
mitmproxy-f27028f58e50492c8c8e15e47278bf444d692246.tar.bz2
mitmproxy-f27028f58e50492c8c8e15e47278bf444d692246.zip
introduce Response.make for simple response creation
Diffstat (limited to 'netlib')
-rw-r--r--netlib/http/response.py54
1 files changed, 49 insertions, 5 deletions
diff --git a/netlib/http/response.py b/netlib/http/response.py
index 85f54940..7866c142 100644
--- a/netlib/http/response.py
+++ b/netlib/http/response.py
@@ -1,14 +1,19 @@
from __future__ import absolute_import, print_function, division
-from email.utils import parsedate_tz, formatdate, mktime_tz
-import time
import six
-
+import time
+from email.utils import parsedate_tz, formatdate, mktime_tz
+from netlib import human
+from netlib import multidict
from netlib.http import cookies
from netlib.http import headers as nheaders
from netlib.http import message
-from netlib import multidict
-from netlib import human
+from netlib.http import status_codes
+from typing import AnyStr # noqa
+from typing import Dict # noqa
+from typing import Iterable # noqa
+from typing import Tuple # noqa
+from typing import Union # noqa
class ResponseData(message.MessageData):
@@ -54,6 +59,45 @@ class Response(message.Message):
details=details
)
+ @classmethod
+ def make(
+ cls,
+ status_code=200, # type: int
+ content=b"", # type: AnyStr
+ headers=() # type: Union[Dict[AnyStr, AnyStr], Iterable[Tuple[bytes, bytes]]]
+ ):
+ """
+ Simplified API for creating response objects.
+ """
+ resp = cls(
+ b"HTTP/1.1",
+ status_code,
+ status_codes.RESPONSES.get(status_code, "").encode(),
+ (),
+ None
+ )
+ # Assign this manually to update the content-length header.
+ if isinstance(content, bytes):
+ resp.content = content
+ elif isinstance(content, str):
+ resp.text = content
+ else:
+ raise TypeError("Expected content to be str or bytes, but is {}.".format(
+ type(content).__name__
+ ))
+
+ # Headers can be list or dict, we differentiate here.
+ if isinstance(headers, dict):
+ resp.headers = nheaders.Headers(**headers)
+ elif isinstance(headers, Iterable):
+ resp.headers = nheaders.Headers(headers)
+ else:
+ raise TypeError("Expected headers to be an iterable or dict, but is {}.".format(
+ type(headers).__name__
+ ))
+
+ return resp
+
@property
def status_code(self):
"""