def test_set_input_header(self): request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_input_header=('Header-Name', 'header value')) actions.execute_input_actions(exchange) self.assertEqual(exchange.request.headers['Header-Name'], 'header value')
def test_does_not_match_function(self): def criterion_function(path): return False request = HTTPServerRequest(uri='/foo/bar') criteria = Criteria(custom=criterion_function) result = criteria.match(HTTPExchange(request)) self.assertFalse(result)
def test_stop_option(self): add_rule(Criteria(path='/foo'), Actions(set_input_header=('Header-Name', 'FOO')), stop=True) add_rule(Criteria(path='/foo'), Actions(set_input_header=('Header-Name', 'BAR'))) request = HTTPServerRequest(method='GET', uri='/foo') Rules.execute_input_actions(HTTPExchange(request)) self.assertEqual(request.headers['Header-Name'], 'FOO')
def test_remote_ip_does_not_match_function(self): def criterion_function(arg): return False request = HTTPServerRequest(uri='/') request.remote_ip = '10.0.0.1' criteria = Criteria(remote_ip=criterion_function) result = criteria.match(HTTPExchange(request)) self.assertFalse(result)
def test_set_status_code_with_callable(self): def callback(request): return 201 request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_status_code=callback) actions.execute_input_actions(exchange) self.assertEqual(exchange.response.status_code, 201)
def test_set_input_header_with_callable(self): def callback(request): return ('Header-Name', 'header value') request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_input_header=callback) actions.execute_input_actions(exchange) self.assertEqual(request.headers['Header-Name'], 'header value')
def test_del_query_string_arg(self): request = HTTPServerRequest(method='GET', uri='/?foo1=bar1') exchange = HTTPExchange(request) actions = Actions(del_query_string_arg="foo1") actions.execute_input_actions(exchange) args = exchange.request.query_arguments self.assertEqual(len(args), 0) actions = Actions(del_query_string_arg="foo2") actions.execute_input_actions(exchange)
def test_set_query_string_arg(self): request = HTTPServerRequest(method='GET', uri='/?foo1=bar1') exchange = HTTPExchange(request) actions = Actions(set_query_string_arg=("foo1", b"bar2")) actions.execute_input_actions(exchange) args = exchange.request.query_arguments self.assertEqual(len(args), 1) self.assertEqual(len(args["foo1"]), 1) self.assertEqual(args["foo1"][0], b"bar2")
def test_queue_with_callable(self): def callback(request): return 'test-queue' request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_redis_queue=callback) actions.execute_input_actions(exchange) self.assertEqual(exchange.redis_queue, 'test-queue')
def test_add_input_header(self): headers = HTTPHeaders() headers.add("Header-Name", "header value1") request = HTTPServerRequest(method='GET', uri='/', headers=headers) exchange = HTTPExchange(request) actions = Actions(add_input_header=("Header-Name", "header value2")) actions.execute_input_actions(exchange) values = exchange.request.headers.get_list('Header-Name') self.assertEquals(len(values), 2) self.assertEquals(values[0], "header value1") self.assertEquals(values[1], "header value2")
def test_del_input_header(self): headers = HTTPHeaders() headers.add("Header-Name", "header value1") request = HTTPServerRequest(method='GET', uri='/', headers=headers) exchange = HTTPExchange(request) actions = Actions(del_input_header="Header-Name") actions.execute_input_actions(exchange) keys = list(exchange.request.headers.keys()) self.assertEquals(len(keys), 0) actions = Actions(del_input_header="Header-Name2") actions.execute_input_actions(exchange)
def test_set_redis_queue_based_on_callable(self): def callback_false(request): return False def callback_true(request): return True add_rule(Criteria(custom=callback_false), Actions(set_redis_queue='not-this-one'), stop=1) add_rule(Criteria(custom=callback_true), Actions(set_redis_queue='yes-this-one')) request = HTTPServerRequest(method='GET', uri='/foo') exchange = HTTPExchange(request) Rules.execute_input_actions(exchange) self.assertEqual(exchange.redis_queue, 'yes-this-one')
def test_method_does_not_match(self): request = HTTPServerRequest(method='GET', uri='/') criteria = Criteria(method='POST') result = criteria.match(HTTPExchange(request)) self.assertFalse(result)
def test_method_match2(self): request = HTTPServerRequest(method='POST', uri='/') criteria = Criteria(method=['GET', 'POST']) result = criteria.match(HTTPExchange(request)) self.assertTrue(result)
def handle(self, *args, **kwargs): exchange = HTTPExchange(self.request, default_redis_host=options.redis_host, default_redis_port=options.redis_port, default_redis_queue=options.redis_queue, default_redis_uds=options.redis_uds) self.__request_id = exchange.request_id running_exchanges[self.__request_id] = exchange yield Rules.execute_input_actions(exchange) if exchange.response.status_code is not None and \ exchange.response.status_code != "null": # so we don't push the request on redis # let's call output actions for headers and body yield Rules.execute_output_actions(exchange) self.return_http_reply(exchange) elif exchange.redis_queue == "null": # so we don't push the request on redis # let's call output actions for headers and body yield Rules.execute_output_actions(exchange) self.return_http_reply(exchange, force_status=404, force_body="no redis queue set") else: redis_pool = get_redis_pool(host=exchange.redis_host, port=exchange.redis_port, uds=exchange.redis_uds) with (yield redis_pool.connected_client()) as redis: response_key = "thr:queue:response:%s" % make_unique_id() serialized_request = serialize_http_request( exchange.request, dict_to_inject={ 'response_key': response_key, 'priority': exchange.priority, 'creation_time': time.time(), 'request_id': exchange.request_id }) lpush_res = yield redis.call('LPUSH', exchange.redis_queue, serialized_request) if not isinstance(lpush_res, six.integer_types): yield Rules.execute_output_actions(exchange) self.return_http_reply(exchange, force_status=500, force_body="can't connect to bus") return before = datetime.datetime.now() while True: result = yield redis.call('BRPOP', response_key, 1) if result and not isinstance(result, tornadis.ConnectionError): self.update_exchange_from_response_message(exchange, result[1]) yield Rules.execute_output_actions(exchange) self.return_http_reply(exchange) break after = datetime.datetime.now() delta = after - before if delta.total_seconds() > options.timeout: yield Rules.execute_output_actions(exchange) self.return_http_reply(exchange, force_status=504, force_body="no reply from " "the backend") break
def test_set_redis_queue_based_on_path(self): add_rule(Criteria(path='/foo'), Actions(set_redis_queue='test-queue')) request = HTTPServerRequest(method='GET', uri='/foo') exchange = HTTPExchange(request) Rules.execute_input_actions(exchange) self.assertEqual(exchange.redis_queue, 'test-queue')
def test_set_output_body(self): request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_output_body=b"foobar") actions.execute_output_actions(exchange) self.assertEqual(exchange.response.body, b"foobar")
def test_remote_ip_does_not_match(self): request = HTTPServerRequest(uri='/') request.remote_ip = '10.0.0.1' criteria = Criteria(remote_ip=glob('10.0.1.*')) result = criteria.match(HTTPExchange(request)) self.assertFalse(result)
def test_set_host(self): request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_host="foobar:8080") actions.execute_input_actions(exchange) self.assertEqual(exchange.request.host, "foobar:8080")
def test_path_match2(self): request = HTTPServerRequest(uri='/foo/bar') criteria = Criteria(path=regexp('^/bar.*$', '^/foo.*$')) result = criteria.match(HTTPExchange(request)) self.assertTrue(result)
def test_set_status_code(self): request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_status_code=201) actions.execute_input_actions(exchange) self.assertEqual(exchange.response.status_code, 201)
def test_path_does_not_match(self): request = HTTPServerRequest(uri='/quux/bar') criteria = Criteria(path=regexp('^/foo.*$')) result = criteria.match(HTTPExchange(request)) self.assertFalse(result)
def test_set_method(self): request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_method="POST") actions.execute_input_actions(exchange) self.assertEqual(exchange.request.method, "POST")
def test_remote_ip_match2(self): request = HTTPServerRequest(uri='/') request.remote_ip = '10.0.0.1' criteria = Criteria(remote_ip=glob('192.168.0.*', '10.0.0.*')) result = criteria.match(HTTPExchange(request)) self.assertTrue(result)
def test_set_remote_ip(self): request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_remote_ip="1.2.3.4") actions.execute_input_actions(exchange) self.assertEqual(exchange.request.remote_ip, "1.2.3.4")
def test_set_path(self): request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_path="/foo") actions.execute_input_actions(exchange) self.assertEqual(exchange.request.path, "/foo")
def test_set_redis_port(self): request = HTTPServerRequest(method='GET', uri='/') exchange = HTTPExchange(request) actions = Actions(set_redis_port=1234) actions.execute_input_actions(exchange) self.assertEqual(exchange.redis_port, 1234)