commit
a6f64f8ebc
20 changed files with 713 additions and 1123 deletions
@ -1 +1 @@ |
||||
__version__ = '0.2.9' |
||||
__version__ = '0.2.10' |
||||
|
@ -1,209 +0,0 @@ |
||||
import pytest |
||||
import mock |
||||
import pappyproxy |
||||
|
||||
from pappyproxy.mangle import async_mangle_request, async_mangle_response |
||||
from pappyproxy.http import Request, Response |
||||
from testutil import no_tcp, no_database, func_deleted, mock_deferred, mock_deep_save, fake_saving |
||||
|
||||
def retf(r): |
||||
return False |
||||
|
||||
@pytest.fixture |
||||
def ignore_edit(mocker): |
||||
new_edit = mock.MagicMock() |
||||
new_edit.return_value = mock_deferred(None) |
||||
mocker.patch('pappyproxy.console.edit_file', new=new_edit) |
||||
|
||||
@pytest.fixture |
||||
def ignore_delete(mocker): |
||||
new_os_remove = mock.MagicMock() |
||||
mocker.patch('os.remove', new=new_os_remove) |
||||
return new_os_remove |
||||
|
||||
@pytest.fixture(autouse=True) |
||||
def no_logging(mocker): |
||||
mocker.patch('pappyproxy.proxy.log') |
||||
|
||||
@pytest.fixture |
||||
def req(): |
||||
r = Request() |
||||
r.status_line = 'GET / HTTP/1.1' |
||||
r.host = 'www.ffffff.eeeeee' |
||||
r.raw_data = 'AAAA' |
||||
return r |
||||
|
||||
@pytest.fixture |
||||
def req_w_rsp(req): |
||||
r = Response() |
||||
r.status_line = 'HTTP/1.1 200 OK' |
||||
r.headers['Test-Header'] = 'ABC123' |
||||
r.raw_data = 'AAAA' |
||||
req.response = r |
||||
return req |
||||
|
||||
@pytest.fixture |
||||
def mock_tempfile(mocker): |
||||
new_tfile_obj = mock.MagicMock() |
||||
tfile_instance = mock.MagicMock() |
||||
new_tfile_obj.return_value.__enter__.return_value = tfile_instance |
||||
|
||||
tfile_instance.name = 'mockTemporaryFile' |
||||
mocker.patch('tempfile.NamedTemporaryFile', new=new_tfile_obj) |
||||
|
||||
new_open = mock.MagicMock() |
||||
fake_file = mock.MagicMock(spec=file) |
||||
new_open.return_value.__enter__.return_value = fake_file |
||||
mocker.patch('__builtin__.open', new_open) |
||||
|
||||
return (new_tfile_obj, tfile_instance, new_open, fake_file) |
||||
|
||||
|
||||
######################## |
||||
## Test request mangling |
||||
|
||||
@pytest.inlineCallbacks |
||||
def test_mangle_request_edit(req, mock_deep_save, mock_tempfile, |
||||
ignore_edit, ignore_delete): |
||||
tfile_obj, tfile_instance, new_open, fake_file = mock_tempfile |
||||
r = req |
||||
new_contents = ('GET / HTTP/1.1\r\n' |
||||
'Content-Length: 4\r\n\r\n' |
||||
'BBBB') |
||||
fake_file.read.return_value = new_contents |
||||
new_req = yield async_mangle_request(r) |
||||
assert not mock_deep_save.called |
||||
assert tfile_obj.called |
||||
assert tfile_instance.write.called |
||||
assert tfile_instance.write.call_args == ((r.full_request,),) |
||||
assert new_open.called |
||||
assert fake_file.read.called |
||||
|
||||
assert new_req.full_request == new_contents |
||||
|
||||
@pytest.inlineCallbacks |
||||
def test_mangle_request_edit_newlines(req, mock_deep_save, mock_tempfile, |
||||
ignore_edit, ignore_delete): |
||||
# Intercepting is off, request in scope |
||||
tfile_obj, tfile_instance, new_open, fake_file = mock_tempfile |
||||
r = req |
||||
new_contents = ('GET / HTTP/1.1\r\n' |
||||
'Test-Head: FOOBIE\n' |
||||
'Content-Length: 4\n\r\n' |
||||
'BBBB') |
||||
fake_file.read.return_value = new_contents |
||||
new_req = yield async_mangle_request(r) |
||||
|
||||
assert new_req.full_request == ('GET / HTTP/1.1\r\n' |
||||
'Test-Head: FOOBIE\r\n' |
||||
'Content-Length: 4\r\n\r\n' |
||||
'BBBB') |
||||
assert new_req.headers['Test-Head'] == 'FOOBIE' |
||||
|
||||
@pytest.inlineCallbacks |
||||
def test_mangle_request_drop(req, mock_deep_save, mock_tempfile, |
||||
ignore_edit, ignore_delete): |
||||
# Intercepting is off, request in scope |
||||
tfile_obj, tfile_instance, new_open, fake_file = mock_tempfile |
||||
r = req |
||||
new_contents = '' |
||||
fake_file.read.return_value = new_contents |
||||
new_req = yield async_mangle_request(r) |
||||
|
||||
assert new_req is None |
||||
|
||||
@pytest.inlineCallbacks |
||||
def test_mangle_request_edit_len(req, mock_deep_save, mock_tempfile, |
||||
ignore_edit, ignore_delete): |
||||
# Intercepting is off, request in scope |
||||
tfile_obj, tfile_instance, new_open, fake_file = mock_tempfile |
||||
r = req |
||||
new_contents = ('GET / HTTP/1.1\r\n' |
||||
'Test-Head: FOOBIE\n' |
||||
'Content-Length: 4\n\r\n' |
||||
'BBBBAAAA') |
||||
fake_file.read.return_value = new_contents |
||||
new_req = yield async_mangle_request(r) |
||||
|
||||
assert new_req.full_request == ('GET / HTTP/1.1\r\n' |
||||
'Test-Head: FOOBIE\r\n' |
||||
'Content-Length: 8\r\n\r\n' |
||||
'BBBBAAAA') |
||||
|
||||
|
||||
######################### |
||||
## Test response mangling |
||||
|
||||
@pytest.inlineCallbacks |
||||
def test_mangle_response_edit(req_w_rsp, mock_deep_save, mock_tempfile, |
||||
ignore_edit, ignore_delete): |
||||
# Intercepting is on, edit |
||||
tfile_obj, tfile_instance, new_open, fake_file = mock_tempfile |
||||
r = req_w_rsp |
||||
old_rsp = r.response.full_response |
||||
new_contents = ('HTTP/1.1 403 NOTOKIEDOKIE\r\n' |
||||
'Content-Length: 4\r\n' |
||||
'Other-Header: foobles\r\n\r\n' |
||||
'BBBB') |
||||
fake_file.read.return_value = new_contents |
||||
mangled_rsp = yield async_mangle_response(r) |
||||
assert not mock_deep_save.called |
||||
assert tfile_obj.called |
||||
assert tfile_instance.write.called |
||||
assert tfile_instance.write.call_args == ((old_rsp,),) |
||||
assert new_open.called |
||||
assert fake_file.read.called |
||||
|
||||
assert mangled_rsp.full_response == new_contents |
||||
|
||||
@pytest.inlineCallbacks |
||||
def test_mangle_response_newlines(req_w_rsp, mock_deep_save, mock_tempfile, |
||||
ignore_edit, ignore_delete): |
||||
# Intercepting is off, request in scope |
||||
tfile_obj, tfile_instance, new_open, fake_file = mock_tempfile |
||||
r = req_w_rsp |
||||
old_rsp = r.response.full_response |
||||
new_contents = ('HTTP/1.1 403 NOTOKIEDOKIE\n' |
||||
'Content-Length: 4\n' |
||||
'Other-Header: foobles\r\n\n' |
||||
'BBBB') |
||||
fake_file.read.return_value = new_contents |
||||
mangled_rsp = yield async_mangle_response(r) |
||||
|
||||
assert mangled_rsp.full_response == ('HTTP/1.1 403 NOTOKIEDOKIE\r\n' |
||||
'Content-Length: 4\r\n' |
||||
'Other-Header: foobles\r\n\r\n' |
||||
'BBBB') |
||||
assert mangled_rsp.headers['Other-Header'] == 'foobles' |
||||
|
||||
@pytest.inlineCallbacks |
||||
def test_mangle_response_drop(req_w_rsp, mock_deep_save, mock_tempfile, |
||||
ignore_edit, ignore_delete): |
||||
# Intercepting is off, request in scope |
||||
tfile_obj, tfile_instance, new_open, fake_file = mock_tempfile |
||||
r = req_w_rsp |
||||
old_rsp = r.response.full_response |
||||
new_contents = '' |
||||
fake_file.read.return_value = new_contents |
||||
mangled_rsp = yield async_mangle_response(r) |
||||
|
||||
assert mangled_rsp is None |
||||
|
||||
@pytest.inlineCallbacks |
||||
def test_mangle_response_new_len(req_w_rsp, mock_deep_save, mock_tempfile, |
||||
ignore_edit, ignore_delete): |
||||
# Intercepting is off, request in scope |
||||
tfile_obj, tfile_instance, new_open, fake_file = mock_tempfile |
||||
r = req_w_rsp |
||||
old_rsp = r.response.full_response |
||||
new_contents = ('HTTP/1.1 403 NOTOKIEDOKIE\n' |
||||
'Content-Length: 4\n' |
||||
'Other-Header: foobles\r\n\n' |
||||
'BBBBAAAA') |
||||
fake_file.read.return_value = new_contents |
||||
mangled_rsp = yield async_mangle_response(r) |
||||
|
||||
assert mangled_rsp.full_response == ('HTTP/1.1 403 NOTOKIEDOKIE\r\n' |
||||
'Content-Length: 8\r\n' |
||||
'Other-Header: foobles\r\n\r\n' |
||||
'BBBBAAAA') |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue