mitmproxy/netlib/tutils.py

146 lines
3.5 KiB
Python
Raw Normal View History

2015-09-15 17:12:15 +00:00
from io import BytesIO
import tempfile
import os
2015-08-01 08:39:14 +00:00
import time
import shutil
2012-06-18 21:42:32 +00:00
from contextlib import contextmanager
2015-09-15 17:12:15 +00:00
import six
import sys
2012-06-18 21:42:32 +00:00
2015-09-05 16:15:47 +00:00
from netlib import tcp, utils, http
def treader(bytes):
"""
Construct a tcp.Read object from bytes.
"""
2015-09-15 17:12:15 +00:00
fp = BytesIO(bytes)
return tcp.Reader(fp)
2012-06-18 21:42:32 +00:00
@contextmanager
def tmpdir(*args, **kwargs):
orig_workdir = os.getcwd()
temp_workdir = tempfile.mkdtemp(*args, **kwargs)
os.chdir(temp_workdir)
yield temp_workdir
os.chdir(orig_workdir)
shutil.rmtree(temp_workdir)
2015-09-15 17:12:15 +00:00
def _check_exception(expected, actual, exc_tb):
if isinstance(expected, six.string_types):
if expected.lower() not in str(actual).lower():
six.reraise(AssertionError, AssertionError(
"Expected %s, but caught %s" % (
repr(str(expected)), actual
)
), exc_tb)
else:
if not isinstance(actual, expected):
six.reraise(AssertionError, AssertionError(
"Expected %s, but caught %s %s" % (
expected.__name__, actual.__class__.__name__, str(actual)
)
), exc_tb)
def raises(expected_exception, obj=None, *args, **kwargs):
2012-06-18 21:42:32 +00:00
"""
Assert that a callable raises a specified exception.
:exc An exception class or a string. If a class, assert that an
exception of this type is raised. If a string, assert that the string
occurs in the string representation of the exception, based on a
case-insenstivie match.
:obj A callable object.
:args Arguments to be passsed to the callable.
:kwargs Arguments to be passed to the callable.
"""
2015-09-15 17:12:15 +00:00
if obj is None:
return RaisesContext(expected_exception)
else:
try:
ret = obj(*args, **kwargs)
except Exception as actual:
_check_exception(expected_exception, actual, sys.exc_info()[2])
2012-06-18 21:42:32 +00:00
else:
2015-09-15 17:12:15 +00:00
raise AssertionError("No exception raised. Return value: {}".format(ret))
class RaisesContext(object):
def __init__(self, expected_exception):
self.expected_exception = expected_exception
def __enter__(self):
return
def __exit__(self, exc_type, exc_val, exc_tb):
if not exc_type:
raise AssertionError("No exception raised.")
else:
_check_exception(self.expected_exception, exc_val, exc_tb)
return True
2012-06-18 21:42:32 +00:00
test_data = utils.Data(__name__)
2015-08-01 08:39:14 +00:00
def treq(content="content", scheme="http", host="address", port=22):
"""
@return: libmproxy.protocol.http.HTTPRequest
"""
2015-09-05 16:15:47 +00:00
headers = http.Headers()
headers["header"] = "qvalue"
2015-08-01 08:39:14 +00:00
req = http.Request(
"relative",
"GET",
scheme,
host,
port,
"/path",
(1, 1),
headers,
content,
None,
None,
)
return req
def treq_absolute(content="content"):
"""
@return: libmproxy.protocol.http.HTTPRequest
"""
r = treq(content)
r.form_in = r.form_out = "absolute"
r.host = "address"
r.port = 22
r.scheme = "http"
return r
def tresp(content="message"):
"""
@return: libmproxy.protocol.http.HTTPResponse
"""
2015-09-05 16:15:47 +00:00
headers = http.Headers()
headers["header_response"] = "svalue"
2015-08-01 08:39:14 +00:00
resp = http.semantics.Response(
(1, 1),
200,
"OK",
headers,
content,
2015-08-05 19:32:53 +00:00
timestamp_start=time.time(),
timestamp_end=time.time(),
2015-08-01 08:39:14 +00:00
)
return resp