Ejemplo n.º 1
0
    def test_try_reverse_proxy_url_when_wrong_path_returns_emptystr(self):
        mock_request = mock.Mock()
        mock_request.path = '/wrong_path'

        url = reverse_proxy.try_reverse_proxy_url(mock_request)

        self.assertEqual(url, "")
Ejemplo n.º 2
0
    def test_try_reverse_proxy_url_when_wrong_path_returns_emptystr(self):
        mock_request = mock.Mock()
        mock_request.path = '/wrong_path'
        t = datetime.datetime(2019, 1, 24, 16, 0, 0)

        url = reverse_proxy.try_reverse_proxy_url(mock_request, t)

        self.assertEqual(url, "")
Ejemplo n.º 3
0
    def test_try_reverse_proxy_url_when_wrong_path_returns_emptystr(self):
        mock_request = mock.Mock()
        mock_request.path = '/wrong_path'
        t = datetime.datetime(2019, 1, 24, 16, 0, 0)

        url = reverse_proxy.try_reverse_proxy_url(mock_request, t)

        self.assertEqual(url, "")
Ejemplo n.º 4
0
    def get(self):
        """Handles an HTTP GET request.

        The URL must be in the following format:
        'http://mlab-ns.appspot.com/tool-name?query_string',
        where tool-name is one of the tools running on M-Lab.
        For more information about the URL and the supported arguments
        in the query string, see the design doc at http://goo.gl/48S22.
        """
        # Check right away whether we should proxy this request.
        url = reverse_proxy.try_reverse_proxy_url(self.request,
                                                  datetime.datetime.now())
        if url:
            # NB: if sending the proxy url is unsuccessful, then fall through to
            # regular request handling.
            success = self.send_proxy_response(url)
            if success:
                logging.info('[reverse_proxy],true,%s', url)
                return

        query = lookup_query.LookupQuery()
        query.initialize_from_http_request(self.request)

        logging.info('Policy is %s', query.policy)

        client_signature = query.calculate_client_signature()
        lookup_resolver = resolver.new_resolver(query.policy, client_signature)
        sliver_tools = lookup_resolver.answer_query(query)

        if sliver_tools is None:
            return util.send_not_found(self, query.response_format)

        if query.response_format == message.FORMAT_JSON:
            self.send_json_response(sliver_tools, query)
        elif query.response_format == message.FORMAT_HTML:
            self.send_html_response(sliver_tools, query)
        elif query.response_format == message.FORMAT_REDIRECT:
            self.send_redirect_response(sliver_tools, query)
        elif query.response_format == message.FORMAT_BT:
            self.send_bt_response(sliver_tools, query)
        elif query.response_format == message.FORMAT_MAP:
            candidates = lookup_resolver.get_candidates(query)
            self.send_map_response(sliver_tools, query, candidates)
        else:
            # TODO (claudiu) Discuss what should be the default behaviour.
            # I think json it's OK since is valid for all tools, while
            # redirect only applies to web-based tools.

            self.send_json_response(sliver_tools, query)

        # At this point, the client has received a response but the server has
        # not closed the connection.
        self.log_location(query, sliver_tools)

        # TODO (claudiu) Add a FORMAT_TYPE column in the BigQuery schema.
        self.log_request(query, sliver_tools)
Ejemplo n.º 5
0
    def test_try_reverse_proxy_url_when_probability_zero_returns_emptystr(
            self):
        ndt_zero_probability = model.ReverseProxyProbability(
            name="ndt_ssl", probability=0.0, url="https://fake.appspot.com")
        ndt_zero_probability.put()
        mock_request = mock.Mock()
        mock_request.path = '/ndt_ssl'

        url = reverse_proxy.try_reverse_proxy_url(mock_request)

        self.assertEqual(url, "")
Ejemplo n.º 6
0
    def test_try_reverse_proxy_url_when_outside_business_returns_emptystr(
            self):
        ndt_ssl_probability = model.ReverseProxyProbability(
            name="ndt_ssl", probability=1.0, url="https://fake.appspot.com")
        ndt_ssl_probability.put()
        mock_request = mock.Mock()
        mock_request.path = '/ndt_ssl'
        t = datetime.datetime(2019, 1, 25, 16, 0, 0)

        url = reverse_proxy.try_reverse_proxy_url(mock_request, t)

        self.assertEqual(url, "")
Ejemplo n.º 7
0
    def test_try_reverse_proxy_url_when_outside_business_returns_emptystr(self):
        mock_request = mock.Mock()
        mock_request.path = '/ndt_ssl'
        t = datetime.datetime(2019, 1, 25, 16, 0, 0)
        rp = model.ReverseProxyProbability(name="default",
                                           probability=1.0,
                                           url="https://fake.appspot.com")
        memcache.set('default',
                     rp,
                     time=1800,
                     namespace=constants.MEMCACHE_NAMESPACE_REVERSE_PROXY)

        url = reverse_proxy.try_reverse_proxy_url(mock_request, t)

        self.assertEqual(url, "")
Ejemplo n.º 8
0
    def test_try_reverse_proxy_url_returns_url_with_latlon(self):
        ndt_ssl_probability = model.ReverseProxyProbability(
            name="ndt_ssl", probability=1.0, url="https://fake.appspot.com")
        ndt_ssl_probability.put()
        mock_request = mock.Mock()
        mock_request.path = '/ndt_ssl'
        mock_request.path_qs = '/ndt_ssl?format=geo_options'
        mock_request.latitude = 40.7
        mock_request.longitude = 74.0

        actual_url = reverse_proxy.try_reverse_proxy_url(mock_request)

        self.assertEqual(actual_url, (
            'https://fake.appspot.com/ndt_ssl?format=geo_options&lat=40.700000'
            '&lon=74.000000'))
Ejemplo n.º 9
0
    def test_try_reverse_proxy_url_returns_url_with_only_latlon(self):
        ndt_ssl_probability = model.ReverseProxyProbability(
            name="ndt_ssl", probability=1.0, url="https://fake.appspot.com")
        ndt_ssl_probability.put()
        mock_request = mock.Mock()
        mock_request.path = '/ndt_ssl'
        mock_request.path_qs = '/ndt_ssl'
        mock_request.latitude = 40.7
        mock_request.longitude = 74.0
        t = datetime.datetime(2019, 1, 24, 16, 0, 0)

        actual_url = reverse_proxy.try_reverse_proxy_url(mock_request, t)

        self.assertEqual(
            actual_url,
            'https://fake.appspot.com/ndt_ssl?lat=40.700000&lon=74.000000')
Ejemplo n.º 10
0
    def test_try_reverse_proxy_url_returns_url(self):
        mock_request = mock.Mock()
        mock_request.path = '/ndt_ssl'
        mock_request.path_qs = '/ndt_ssl?format=geo_options'
        t = datetime.datetime(2019, 1, 24, 16, 0, 0)
        rp = model.ReverseProxyProbability(name="default",
                                           probability=1.0,
                                           url="https://fake.appspot.com")
        memcache.set('default',
                     rp,
                     time=1800,
                     namespace=constants.MEMCACHE_NAMESPACE_REVERSE_PROXY)

        actual_url = reverse_proxy.try_reverse_proxy_url(mock_request, t)

        self.assertEqual(actual_url,
                         'https://fake.appspot.com/ndt_ssl?format=geo_options')
Ejemplo n.º 11
0
    def get(self):
        """Handles an HTTP GET request.

        The URL must be in the following format:
        'http://mlab-ns.appspot.com/tool-name?query_string',
        where tool-name is one of the tools running on M-Lab.
        For more information about the URL and the supported arguments
        in the query string, see the design doc at http://goo.gl/48S22.
        """
        query = lookup_query.LookupQuery()
        query.initialize_from_http_request(self.request)

        # Check right away whether we should proxy this request.
        url = reverse_proxy.try_reverse_proxy_url(query,
                                                  datetime.datetime.now())
        if url:
            # NB: if sending the proxy url is unsuccessful, then fall through to
            # regular request handling.
            success = self.send_proxy_response(url)
            if success:
                logging.info('[reverse_proxy],true,%s', url)
                return

        logging.info('Policy is %s', query.policy)

        client_signature = query.calculate_client_signature()
        lookup_resolver = resolver.new_resolver(query.policy, client_signature)
        sliver_tools = lookup_resolver.answer_query(query)

        if sliver_tools is None:
            # NOTE: at this point, we know that either the query is invalid
            # (e.g. bad tool_id) or that a valid query has no capacity.
            if model.is_valid_tool(query.tool_id):
                # A.K.A. "no capacity".
                return util.send_no_content(self)
            else:
                # Invalid tool, so report "404 Not Found".
                return util.send_not_found(self, query.response_format)

        if query.response_format == message.FORMAT_JSON:
            self.send_json_response(sliver_tools, query)
        elif query.response_format == message.FORMAT_HTML:
            self.send_html_response(sliver_tools, query)
        elif query.response_format == message.FORMAT_REDIRECT:
            self.send_redirect_response(sliver_tools, query)
        elif query.response_format == message.FORMAT_BT:
            self.send_bt_response(sliver_tools, query)
        elif query.response_format == message.FORMAT_MAP:
            candidates = lookup_resolver.get_candidates(query)
            self.send_map_response(sliver_tools, query, candidates)
        else:
            # TODO (claudiu) Discuss what should be the default behaviour.
            # I think json it's OK since is valid for all tools, while
            # redirect only applies to web-based tools.

            self.send_json_response(sliver_tools, query)

        # At this point, the client has received a response but the server has
        # not closed the connection.
        self.log_location(query, sliver_tools)

        # TODO (claudiu) Add a FORMAT_TYPE column in the BigQuery schema.
        self.log_request(query, sliver_tools)