示例#1
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')
示例#2
0
    def test_coroutine_action(self):
        Rules.reset()

        @gen.coroutine
        def coroutine_action(exchange):
            yield gen.sleep(0.1)
            exchange.set_status_code(202)

        add_rule(Criteria(path='/quux'),
                 Actions(custom_input=coroutine_action,
                         set_redis_queue='test-queue'),
                 stop=1)
        response = yield self.http_client.fetch(self.get_url('/quux'))
        self.assertEqual(response.code, 202)
示例#3
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')
示例#4
0
    def test_non_matching_coroutine_rule(self):
        Rules.reset()

        @tornado.gen.coroutine
        def coroutine_rule(request):
            yield tornado.gen.maybe_future(None)
            raise tornado.gen.Return(True)

        add_rule(Criteria(request=coroutine_rule),
                 Actions(set_redis_queue='test-queue'),
                 stop=1)
        add_rule(Criteria(path='/quux'), Actions(set_redis_queue='no-match'))
        yield self.http_client.fetch(self.get_url('/quux'), raise_error=False)
        yield self.redis.connect()
        result = yield self.redis.call('BRPOP', 'test-queue', 1)
        data = json.loads(result[1].decode())
        self.assertEqual(data['path'], '/quux')
示例#5
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
示例#6
0
 def setUp(self):
     super(TestApp, self).setUp()
     self.redis = tornadis.Client()
     Rules.reset()
     self.make_response_key_predictable()
示例#7
0
 def setUp(self):
     Rules.reset()
示例#8
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')
示例#9
0
 def test_add_rule(self):
     add_rule(Criteria(), Actions())
     self.assertEqual(Rules.count(), 1)