def gen_mangle_macro(modified_req=None, modified_rsp=None, drop_req=False, drop_rsp=False): macro = mock.MagicMock() if modified_req or drop_req: macro.async_req = True macro.do_req = True if drop_req: newreq = None else: newreq = http.Request(modified_req) macro.async_mangle_request.return_value = mock_deferred(newreq) else: macro.do_req = False if modified_rsp or drop_rsp: macro.async_rsp = True macro.do_rsp = True if drop_rsp: newrsp = None else: newrsp = http.Response(modified_rsp) macro.async_mangle_response.return_value = mock_deferred(newrsp) else: macro.do_rsp = False return macro
def test_proxy_client_factory_prepare_reqs_simple(mocker, freeze): import datetime freeze.freeze(datetime.datetime(2015, 1, 1, 3, 30, 15, 50)) req = http.Request('GET / HTTP/1.1\r\n\r\n') rsave = mocker.patch.object(pappyproxy.http.Request, 'async_deep_save', autospec=True, side_effect=mock_req_async_save) rsave.return_value = mock_deferred() mocker.patch('pappyproxy.context.in_scope').return_value = True mocker.patch( 'pappyproxy.macros.mangle_request').return_value = mock_deferred( (req, False)) cf = ProxyClientFactory(req, save_all=False, stream_response=False, return_transport=None) yield cf.prepare_request() assert req.time_start == datetime.datetime(2015, 1, 1, 3, 30, 15, 50) assert req.reqid is None assert not rsave.called assert len(rsave.mock_calls) == 0
def test_proxy_server_create_client_factory(mocker, server_protocol): mfactory = mock.MagicMock() mfactory_class = mocker.patch('pappyproxy.proxy.ProxyClientFactory') mfactory_class.return_value = mfactory mocker.patch('pappyproxy.proxy.ProxyServer._make_remote_connection') mfactory.prepare_request.return_value = mock_deferred(None) full_req = ('POST /fooo HTTP/1.1\r\n' 'Test-Header: foo\r\n' 'Content-Length: 4\r\n' '\r\n' 'ABCD') server_protocol.connection_id = 100 server_protocol.dataReceived(full_req) # Make sure we created a ClientFactory with the right arguments f_args, f_kwargs = mfactory_class.call_args assert len(f_args) == 1 # Make sure the request got to the client class req = f_args[0] assert req.full_message == full_req # Make sure the correct settings got to the proxy assert f_kwargs['stream_response'] == True assert f_kwargs['save_all'] == True # Make sure we initialized the client factory assert mfactory.prepare_request.called assert mfactory.connection_id == 100 assert server_protocol._make_remote_connection.called # should be immediately called because mock deferred
def test_submit_request_fail(mocker, http_request): mocker.patch.object(pappyproxy.http.Request, 'submit_request', new=mock_loader_fail()) mocker.patch('pappyproxy.http.Request.async_deep_save').return_value = mock_deferred() comm_data = {"action": "submit"} comm_data['full_message'] = base64.b64encode('HELLO THIS IS REQUEST\r\nWHAT IS HEADER FORMAT\r\n') v = json.loads(perform_comm(json.dumps(comm_data))) print v assert v['success'] == False assert 'message' in v
def test_proxy_client_factory_prepare_reqs_simple(mocker, freeze): import datetime freeze.freeze(datetime.datetime(2015, 1, 1, 3, 30, 15, 50)) req = http.Request('GET / HTTP/1.1\r\n\r\n') rsave = mocker.patch.object(pappyproxy.http.Request, 'async_deep_save', autospec=True, side_effect=mock_req_async_save) rsave.return_value = mock_deferred() mocker.patch('pappyproxy.context.in_scope').return_value = True mocker.patch('pappyproxy.macros.mangle_request').return_value = mock_deferred((req, False)) cf = ProxyClientFactory(req, save_all=False, stream_response=False, return_transport=None) yield cf.prepare_request() assert req.time_start == datetime.datetime(2015, 1, 1, 3, 30, 15, 50) assert req.reqid is None assert not rsave.called assert len(rsave.mock_calls) == 0
def test_submit_request_fail(mocker, http_request): mocker.patch.object(pappyproxy.http.Request, 'submit_request', new=mock_loader_fail()) mocker.patch('pappyproxy.http.Request.async_deep_save' ).return_value = mock_deferred() comm_data = {"action": "submit"} comm_data['full_message'] = base64.b64encode( 'HELLO THIS IS REQUEST\r\nWHAT IS HEADER FORMAT\r\n') v = json.loads(perform_comm(json.dumps(comm_data))) print v assert v['success'] == False assert 'message' in v
def test_proxy_server_make_ssl_connection(mocker, server_protocol): mssle_class = mocker.patch("twisted.internet.endpoints.SSL4ClientEndpoint") mssle_class.return_value = mssle = mock.MagicMock() mssle.connect.return_value = mock_deferred() server_protocol._client_factory = mock.MagicMock() # We already tested that this gets set up correctly req = http.Request("GET / HTTP/1.1\r\n\r\n", is_ssl=True) req.host = 'Foo.Bar.Brazzers' req.port = 80085 server_protocol._request_obj = req yield server_protocol._make_remote_connection(req) targs, tkwargs = mssle_class.call_args assert targs[1] == 'Foo.Bar.Brazzers' assert targs[2] == 80085 assert tkwargs == {} mssle.connect.assert_called_once_with(server_protocol._client_factory)
def test_proxy_server_make_ssl_connection(mocker, server_protocol): mssle_class = mocker.patch("twisted.internet.endpoints.SSL4ClientEndpoint") mssle_class.return_value = mssle = mock.MagicMock() mssle.connect.return_value = mock_deferred() server_protocol._client_factory = mock.MagicMock( ) # We already tested that this gets set up correctly req = http.Request("GET / HTTP/1.1\r\n\r\n", is_ssl=True) req.host = 'Foo.Bar.Brazzers' req.port = 80085 server_protocol._request_obj = req yield server_protocol._make_remote_connection(req) targs, tkwargs = mssle_class.call_args assert targs[1] == 'Foo.Bar.Brazzers' assert targs[2] == 80085 assert tkwargs == {} mssle.connect.assert_called_once_with(server_protocol._client_factory)
def test_proxy_server_no_streaming_with_int_macros(mocker): mfactory = mock.MagicMock() mfactory_class = mocker.patch('pappyproxy.proxy.ProxyClientFactory') mfactory_class.return_value = mfactory mocker.patch('pappyproxy.proxy.ProxyServer._make_remote_connection') mfactory.prepare_request.return_value = mock_deferred(None) full_req = ('POST /fooo HTTP/1.1\r\n' 'Test-Header: foo\r\n' 'Content-Length: 4\r\n' '\r\n' 'ABCD') int_macros = [{'mockmacro': mock_int_macro(modified_req='GET / HTTP/1.1\r\n\r\n')}] server_protocol = gen_server_protocol(int_macros=int_macros) server_protocol.dataReceived(full_req) f_args, f_kwargs = mfactory_class.call_args assert f_kwargs['stream_response'] == False
def test_submit_request(mocker, http_request): rsp = Response('HTTP/1.1 200 OK\r\n\r\n') mocker.patch.object(pappyproxy.http.Request, 'submit_request', new=mock_submitter(rsp)) mocker.patch('pappyproxy.http.Request.async_deep_save').return_value = mock_deferred() comm_data = {"action": "submit"} comm_data['host'] = http_request.host comm_data['port'] = http_request.port comm_data['is_ssl'] = http_request.is_ssl comm_data['full_message'] = base64.b64encode(http_request.full_message) comm_data['tags'] = ['footag'] v = perform_comm(json.dumps(comm_data)) expected_data = {} expected_data[u'request'] = json.loads(http_request.to_json()) expected_data[u'response'] = json.loads(http_request.response.to_json()) expected_data[u'success'] = True expected_data[u'request'][u'tags'] = [u'footag'] assert json.loads(v) == expected_data
def test_proxy_client_factory_prepare_reqs_360_noscope(mocker, freeze): import datetime freeze.freeze(datetime.datetime(2015, 1, 1, 3, 30, 15, 50)) req = http.Request('GET / HTTP/1.1\r\n\r\n') rsave = mocker.patch('pappyproxy.http.Request.async_deep_save') rsave.return_value = mock_deferred() mocker.patch('pappyproxy.context.in_scope').return_value = False mocker.patch('pappyproxy.macros.mangle_request', new=func_deleted) cf = ProxyClientFactory(req, save_all=True, stream_response=False, return_transport=None) yield cf.prepare_request() assert req.time_start == None assert req.reqid is None assert not rsave.called assert len(rsave.mock_calls) == 0
def test_proxy_server_no_streaming_with_int_macros(mocker): mfactory = mock.MagicMock() mfactory_class = mocker.patch('pappyproxy.proxy.ProxyClientFactory') mfactory_class.return_value = mfactory mocker.patch('pappyproxy.proxy.ProxyServer._make_remote_connection') mfactory.prepare_request.return_value = mock_deferred(None) full_req = ('POST /fooo HTTP/1.1\r\n' 'Test-Header: foo\r\n' 'Content-Length: 4\r\n' '\r\n' 'ABCD') int_macros = [{ 'mockmacro': mock_int_macro(modified_req='GET / HTTP/1.1\r\n\r\n') }] server_protocol = gen_server_protocol(int_macros=int_macros) server_protocol.dataReceived(full_req) f_args, f_kwargs = mfactory_class.call_args assert f_kwargs['stream_response'] == False
def test_submit_request(mocker, http_request): rsp = Response('HTTP/1.1 200 OK\r\n\r\n') mocker.patch.object(pappyproxy.http.Request, 'submit_request', new=mock_submitter(rsp)) mocker.patch('pappyproxy.http.Request.async_deep_save' ).return_value = mock_deferred() comm_data = {"action": "submit"} comm_data['host'] = http_request.host comm_data['port'] = http_request.port comm_data['is_ssl'] = http_request.is_ssl comm_data['full_message'] = base64.b64encode(http_request.full_message) comm_data['tags'] = ['footag'] v = perform_comm(json.dumps(comm_data)) expected_data = {} expected_data[u'request'] = json.loads(http_request.to_json()) expected_data[u'response'] = json.loads(http_request.response.to_json()) expected_data[u'success'] = True expected_data[u'request'][u'tags'] = [u'footag'] assert json.loads(v) == expected_data
def rsp_mangler_change(request): rsp = http.Response('HTTP/1.1 500 MANGLED\r\n\r\n') d = mock_deferred(rsp) return d
def req_mangler_change(request): req = http.Request('GET /mangled HTTP/1.1\r\n\r\n') d = mock_deferred(req) return d
def rsp_mangler_change(request, conn_id): req = http.Request() rsp = http.Response('HTTP/1.1 500 MANGLED\r\n\r\n') req.response = rsp d = mock_deferred(req) return d
def f(request, mangle_macros): request.response = new_rsp return mock_deferred(True)
def notouch_mangle_req(request, conn_id): orig_req = http.Request(request.full_request) orig_req.port = request.port orig_req.is_ssl = request.is_ssl d = mock_deferred(orig_req) return d
def notouch_mangle_rsp(request): d = mock_deferred(request.response) return d
def notouch_mangle_req(request): d = mock_deferred(request) return d
def notouch_mangle_rsp(response, conn_id): req = http.Request() orig_rsp = http.Response(response.full_response) req.response = orig_rsp d = mock_deferred(req) return d
def ignore_edit(mocker): new_edit = mock.MagicMock() new_edit.return_value = mock_deferred(None) mocker.patch('pappyproxy.console.edit_file', new=new_edit)
def f(_, req, *args, **kwargs): req.response = rsp req.reqid = 123 return mock_deferred(req)
def rsp_mangler_drop(request): return mock_deferred(None)
def test_mock_deferreds(): d = mock_deferred('Hello!') r = yield d assert r == 'Hello!'
def inc_day_mangle(x, y): freeze.delta(days=1) return mock_deferred((mangreq, True))
def mock_req_async_save(req): req.reqid = str(random.randint(1, 1000000)) return mock_deferred()
def mock_req_async_save(req): req.reqid = str(random.randint(1,1000000)) return mock_deferred()
def ignore_edit(mocker): new_edit = mock.MagicMock() new_edit.return_value = mock_deferred(None) new_plugin = mock.MagicMock() new_plugin.return_value = new_edit mocker.patch("pappyproxy.plugin.plugin_by_name", new=new_plugin)
def ignore_edit(mocker): new_edit = mock.MagicMock() new_edit.return_value = mock_deferred(None) new_plugin = mock.MagicMock() new_plugin.return_value = new_edit mocker.patch('pappyproxy.plugin.plugin_by_name', new=new_plugin)