예제 #1
0
 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')
예제 #2
0
    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)
예제 #3
0
 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')
예제 #4
0
    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)
예제 #5
0
    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)
예제 #6
0
    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')
예제 #7
0
 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)
예제 #8
0
 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")
예제 #9
0
    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')
예제 #10
0
 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")
예제 #11
0
 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)
예제 #12
0
    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')
예제 #13
0
 def test_method_does_not_match(self):
     request = HTTPServerRequest(method='GET', uri='/')
     criteria = Criteria(method='POST')
     result = criteria.match(HTTPExchange(request))
     self.assertFalse(result)
예제 #14
0
 def test_method_match2(self):
     request = HTTPServerRequest(method='POST', uri='/')
     criteria = Criteria(method=['GET', 'POST'])
     result = criteria.match(HTTPExchange(request))
     self.assertTrue(result)
예제 #15
0
파일: app.py 프로젝트: jorviizheng/thr
    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
예제 #16
0
 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')
예제 #17
0
 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")
예제 #18
0
 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)
예제 #19
0
 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")
예제 #20
0
 def test_path_match2(self):
     request = HTTPServerRequest(uri='/foo/bar')
     criteria = Criteria(path=regexp('^/bar.*$', '^/foo.*$'))
     result = criteria.match(HTTPExchange(request))
     self.assertTrue(result)
예제 #21
0
 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)
예제 #22
0
 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)
예제 #23
0
 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")
예제 #24
0
 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)
예제 #25
0
 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")
예제 #26
0
 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")
예제 #27
0
 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)