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, "")
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, "")
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, "")
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)
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, "")
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, "")
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, "")
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'))
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')
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')
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)