aboutsummaryrefslogtreecommitdiffstats
path: root/netlib
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2015-09-26 20:07:11 +0200
committerMaximilian Hils <git@maximilianhils.com>2015-09-26 20:07:11 +0200
commit466888b01a361e46fb3d4e66afa2c6a0fd168c8e (patch)
treed7e6c6180b108318d76698883ddf17ae4cb704b0 /netlib
parent49ea8fc0ebcfe4861f099200044a553f092faec7 (diff)
downloadmitmproxy-466888b01a361e46fb3d4e66afa2c6a0fd168c8e.tar.gz
mitmproxy-466888b01a361e46fb3d4e66afa2c6a0fd168c8e.tar.bz2
mitmproxy-466888b01a361e46fb3d4e66afa2c6a0fd168c8e.zip
improve request tests, coverage++
Diffstat (limited to 'netlib')
-rw-r--r--netlib/encoding.py4
-rw-r--r--netlib/http/headers.py8
-rw-r--r--netlib/http/message.py42
-rw-r--r--netlib/http/request.py28
-rw-r--r--netlib/http/response.py8
-rw-r--r--netlib/http/status_codes.py4
6 files changed, 66 insertions, 28 deletions
diff --git a/netlib/encoding.py b/netlib/encoding.py
index 4c11273b..14479e00 100644
--- a/netlib/encoding.py
+++ b/netlib/encoding.py
@@ -12,6 +12,8 @@ ENCODINGS = {"identity", "gzip", "deflate"}
def decode(e, content):
+ if not isinstance(content, bytes):
+ return None
encoding_map = {
"identity": identity,
"gzip": decode_gzip,
@@ -23,6 +25,8 @@ def decode(e, content):
def encode(e, content):
+ if not isinstance(content, bytes):
+ return None
encoding_map = {
"identity": identity,
"gzip": encode_gzip,
diff --git a/netlib/http/headers.py b/netlib/http/headers.py
index c79c3344..f64e6200 100644
--- a/netlib/http/headers.py
+++ b/netlib/http/headers.py
@@ -8,15 +8,15 @@ from __future__ import absolute_import, print_function, division
import copy
try:
from collections.abc import MutableMapping
-except ImportError: # Workaround for Python < 3.3
- from collections import MutableMapping
+except ImportError: # pragma: nocover
+ from collections import MutableMapping # Workaround for Python < 3.3
import six
from netlib.utils import always_byte_args, always_bytes
-if six.PY2:
+if six.PY2: # pragma: nocover
_native = lambda x: x
_always_bytes = lambda x: x
_always_byte_args = lambda x: x
@@ -106,7 +106,7 @@ class Headers(MutableMapping):
else:
return b""
- if six.PY2:
+ if six.PY2: # pragma: nocover
__str__ = __bytes__
@_always_byte_args
diff --git a/netlib/http/message.py b/netlib/http/message.py
index ee138746..7cb18f52 100644
--- a/netlib/http/message.py
+++ b/netlib/http/message.py
@@ -9,7 +9,7 @@ from .. import encoding, utils
CONTENT_MISSING = 0
-if six.PY2:
+if six.PY2: # pragma: nocover
_native = lambda x: x
_always_bytes = lambda x: x
else:
@@ -110,15 +110,48 @@ class Message(object):
def text(self, text):
raise NotImplementedError()
+ def decode(self):
+ """
+ Decodes body based on the current Content-Encoding header, then
+ removes the header. If there is no Content-Encoding header, no
+ action is taken.
+
+ Returns:
+ True, if decoding succeeded.
+ False, otherwise.
+ """
+ ce = self.headers.get("content-encoding")
+ data = encoding.decode(ce, self.content)
+ if data is None:
+ return False
+ self.content = data
+ self.headers.pop("content-encoding", None)
+ return True
+
+ def encode(self, e):
+ """
+ Encodes body with the encoding e, where e is "gzip", "deflate" or "identity".
+
+ Returns:
+ True, if decoding succeeded.
+ False, otherwise.
+ """
+ data = encoding.encode(e, self.content)
+ if data is None:
+ return False
+ self.content = data
+ self.headers["content-encoding"] = e
+ return True
+
# Legacy
@property
- def body(self):
+ def body(self): # pragma: nocover
warnings.warn(".body is deprecated, use .content instead.", DeprecationWarning)
return self.content
@body.setter
- def body(self, body):
+ def body(self, body): # pragma: nocover
warnings.warn(".body is deprecated, use .content instead.", DeprecationWarning)
self.content = body
@@ -146,8 +179,7 @@ class decoded(object):
def __enter__(self):
if self.ce:
- if not self.message.decode():
- self.ce = None
+ self.message.decode()
def __exit__(self, type, value, tb):
if self.ce:
diff --git a/netlib/http/request.py b/netlib/http/request.py
index f8a3b5b9..325c0080 100644
--- a/netlib/http/request.py
+++ b/netlib/http/request.py
@@ -102,7 +102,7 @@ class Request(Message):
or inferred from the proxy mode (e.g. an IP in transparent mode).
"""
- if six.PY2:
+ if six.PY2: # pragma: nocover
return self.data.host
if not self.data.host:
@@ -303,58 +303,58 @@ class Request(Message):
# Legacy
- def get_cookies(self):
+ def get_cookies(self): # pragma: nocover
warnings.warn(".get_cookies is deprecated, use .cookies instead.", DeprecationWarning)
return self.cookies
- def set_cookies(self, odict):
+ def set_cookies(self, odict): # pragma: nocover
warnings.warn(".set_cookies is deprecated, use .cookies instead.", DeprecationWarning)
self.cookies = odict
- def get_query(self):
+ def get_query(self): # pragma: nocover
warnings.warn(".get_query is deprecated, use .query instead.", DeprecationWarning)
return self.query or ODict([])
- def set_query(self, odict):
+ def set_query(self, odict): # pragma: nocover
warnings.warn(".set_query is deprecated, use .query instead.", DeprecationWarning)
self.query = odict
- def get_path_components(self):
+ def get_path_components(self): # pragma: nocover
warnings.warn(".get_path_components is deprecated, use .path_components instead.", DeprecationWarning)
return self.path_components
- def set_path_components(self, lst):
+ def set_path_components(self, lst): # pragma: nocover
warnings.warn(".set_path_components is deprecated, use .path_components instead.", DeprecationWarning)
self.path_components = lst
- def get_form_urlencoded(self):
+ def get_form_urlencoded(self): # pragma: nocover
warnings.warn(".get_form_urlencoded is deprecated, use .urlencoded_form instead.", DeprecationWarning)
return self.urlencoded_form or ODict([])
- def set_form_urlencoded(self, odict):
+ def set_form_urlencoded(self, odict): # pragma: nocover
warnings.warn(".set_form_urlencoded is deprecated, use .urlencoded_form instead.", DeprecationWarning)
self.urlencoded_form = odict
- def get_form_multipart(self):
+ def get_form_multipart(self): # pragma: nocover
warnings.warn(".get_form_multipart is deprecated, use .multipart_form instead.", DeprecationWarning)
return self.multipart_form or ODict([])
@property
- def form_in(self):
+ def form_in(self): # pragma: nocover
warnings.warn(".form_in is deprecated, use .first_line_format instead.", DeprecationWarning)
return self.first_line_format
@form_in.setter
- def form_in(self, form_in):
+ def form_in(self, form_in): # pragma: nocover
warnings.warn(".form_in is deprecated, use .first_line_format instead.", DeprecationWarning)
self.first_line_format = form_in
@property
- def form_out(self):
+ def form_out(self): # pragma: nocover
warnings.warn(".form_out is deprecated, use .first_line_format instead.", DeprecationWarning)
return self.first_line_format
@form_out.setter
- def form_out(self, form_out):
+ def form_out(self, form_out): # pragma: nocover
warnings.warn(".form_out is deprecated, use .first_line_format instead.", DeprecationWarning)
self.first_line_format = form_out \ No newline at end of file
diff --git a/netlib/http/response.py b/netlib/http/response.py
index 7d64243d..db31d2b9 100644
--- a/netlib/http/response.py
+++ b/netlib/http/response.py
@@ -106,20 +106,20 @@ class Response(Message):
# Legacy
- def get_cookies(self):
+ def get_cookies(self): # pragma: nocover
warnings.warn(".get_cookies is deprecated, use .cookies instead.", DeprecationWarning)
return self.cookies
- def set_cookies(self, odict):
+ def set_cookies(self, odict): # pragma: nocover
warnings.warn(".set_cookies is deprecated, use .cookies instead.", DeprecationWarning)
self.cookies = odict
@property
- def msg(self):
+ def msg(self): # pragma: nocover
warnings.warn(".msg is deprecated, use .reason instead.", DeprecationWarning)
return self.reason
@msg.setter
- def msg(self, reason):
+ def msg(self, reason): # pragma: nocover
warnings.warn(".msg is deprecated, use .reason instead.", DeprecationWarning)
self.reason = reason
diff --git a/netlib/http/status_codes.py b/netlib/http/status_codes.py
index dc09f465..8a4dc1f5 100644
--- a/netlib/http/status_codes.py
+++ b/netlib/http/status_codes.py
@@ -1,4 +1,4 @@
-from __future__ import (absolute_import, print_function, division)
+from __future__ import absolute_import, print_function, division
CONTINUE = 100
SWITCHING = 101
@@ -37,6 +37,7 @@ REQUEST_URI_TOO_LONG = 414
UNSUPPORTED_MEDIA_TYPE = 415
REQUESTED_RANGE_NOT_SATISFIABLE = 416
EXPECTATION_FAILED = 417
+IM_A_TEAPOT = 418
INTERNAL_SERVER_ERROR = 500
NOT_IMPLEMENTED = 501
@@ -91,6 +92,7 @@ RESPONSES = {
UNSUPPORTED_MEDIA_TYPE: "Unsupported Media Type",
REQUESTED_RANGE_NOT_SATISFIABLE: "Requested Range not satisfiable",
EXPECTATION_FAILED: "Expectation Failed",
+ IM_A_TEAPOT: "I'm a teapot",
# 500
INTERNAL_SERVER_ERROR: "Internal Server Error",