Commit be96ccdf authored by Laís Minchillo's avatar Laís Minchillo Committed by Chromium LUCI CQ

[aw] Add reverse_bypass option for proxy override

Add a setProxyOverride method that takes in a boolean for
reverse_bypass. This will be exposed via androidx.webkit APIs.

Add a new test in proxy_config_service_android_unittest and in
AwProxyControllerTest to test the newly added reverse_bypass
option.

Bug: 1162255
Test: run_net_unittests -f *ProxyConfigServiceAndroidTest*
Test: run_webview_instrumentation_test_apk -f *AwProxyControllerTest*
Change-Id: Icc82656809b9237d6a8defb125b57727d59777ba
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2544645
Auto-Submit: Laís Minchillo <laisminchillo@chromium.org>
Commit-Queue: Nate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#842086}
parent ef8be161
...@@ -53,7 +53,8 @@ ScopedJavaLocalRef<jstring> JNI_AwProxyController_SetProxyOverride( ...@@ -53,7 +53,8 @@ ScopedJavaLocalRef<jstring> JNI_AwProxyController_SetProxyOverride(
const base::android::JavaParamRef<jobjectArray>& jproxy_urls, const base::android::JavaParamRef<jobjectArray>& jproxy_urls,
const base::android::JavaParamRef<jobjectArray>& jbypass_rules, const base::android::JavaParamRef<jobjectArray>& jbypass_rules,
const JavaParamRef<jobject>& listener, const JavaParamRef<jobject>& listener,
const JavaParamRef<jobject>& executor) { const JavaParamRef<jobject>& executor,
const jboolean reverse_bypass) {
std::vector<std::string> url_schemes; std::vector<std::string> url_schemes;
base::android::AppendJavaStringArrayToStringVector(env, jurl_schemes, base::android::AppendJavaStringArrayToStringVector(env, jurl_schemes,
&url_schemes); &url_schemes);
...@@ -72,7 +73,7 @@ ScopedJavaLocalRef<jstring> JNI_AwProxyController_SetProxyOverride( ...@@ -72,7 +73,7 @@ ScopedJavaLocalRef<jstring> JNI_AwProxyController_SetProxyOverride(
&bypass_rules); &bypass_rules);
std::string result; std::string result;
result = AwProxyConfigMonitor::GetInstance()->SetProxyOverride( result = AwProxyConfigMonitor::GetInstance()->SetProxyOverride(
proxy_rules, bypass_rules, proxy_rules, bypass_rules, reverse_bypass,
base::BindOnce(&ProxyOverrideChanged, base::BindOnce(&ProxyOverrideChanged,
ScopedJavaGlobalRef<jobject>(env, obj), ScopedJavaGlobalRef<jobject>(env, obj),
ScopedJavaGlobalRef<jobject>(env, listener), ScopedJavaGlobalRef<jobject>(env, listener),
......
...@@ -95,9 +95,10 @@ std::string AwProxyConfigMonitor::SetProxyOverride( ...@@ -95,9 +95,10 @@ std::string AwProxyConfigMonitor::SetProxyOverride(
const std::vector<net::ProxyConfigServiceAndroid::ProxyOverrideRule>& const std::vector<net::ProxyConfigServiceAndroid::ProxyOverrideRule>&
proxy_rules, proxy_rules,
const std::vector<std::string>& bypass_rules, const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback) { base::OnceClosure callback) {
return proxy_config_service_android_->SetProxyOverride( return proxy_config_service_android_->SetProxyOverride(
proxy_rules, bypass_rules, proxy_rules, bypass_rules, reverse_bypass,
base::BindOnce(&AwProxyConfigMonitor::FlushProxyConfig, base::BindOnce(&AwProxyConfigMonitor::FlushProxyConfig,
base::Unretained(this), std::move(callback))); base::Unretained(this), std::move(callback)));
} }
......
...@@ -31,6 +31,7 @@ class AwProxyConfigMonitor : public net::ProxyConfigService::Observer { ...@@ -31,6 +31,7 @@ class AwProxyConfigMonitor : public net::ProxyConfigService::Observer {
const std::vector<net::ProxyConfigServiceAndroid::ProxyOverrideRule>& const std::vector<net::ProxyConfigServiceAndroid::ProxyOverrideRule>&
proxy_rules, proxy_rules,
const std::vector<std::string>& bypass_rules, const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback); base::OnceClosure callback);
void ClearProxyOverride(base::OnceClosure callback); void ClearProxyOverride(base::OnceClosure callback);
......
...@@ -46,8 +46,8 @@ public class AwProxyController { ...@@ -46,8 +46,8 @@ public class AwProxyController {
public AwProxyController() {} public AwProxyController() {}
public void setProxyOverride( public void setProxyOverride(String[][] proxyRules, String[] bypassRules, Runnable listener,
String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor) { Executor executor, boolean reverseBypass) {
int length = (proxyRules == null ? 0 : proxyRules.length); int length = (proxyRules == null ? 0 : proxyRules.length);
String[] urlSchemes = new String[length]; String[] urlSchemes = new String[length];
String[] proxyUrls = new String[length]; String[] proxyUrls = new String[length];
...@@ -96,8 +96,8 @@ public class AwProxyController { ...@@ -96,8 +96,8 @@ public class AwProxyController {
throw new IllegalArgumentException("Executor must not be null"); throw new IllegalArgumentException("Executor must not be null");
} }
String result = AwProxyControllerJni.get().setProxyOverride( String result = AwProxyControllerJni.get().setProxyOverride(AwProxyController.this,
AwProxyController.this, urlSchemes, proxyUrls, bypassRules, listener, executor); urlSchemes, proxyUrls, bypassRules, listener, executor, reverseBypass);
if (!result.isEmpty()) { if (!result.isEmpty()) {
throw new IllegalArgumentException(result); throw new IllegalArgumentException(result);
} }
...@@ -156,7 +156,7 @@ public class AwProxyController { ...@@ -156,7 +156,7 @@ public class AwProxyController {
@NativeMethods @NativeMethods
interface Natives { interface Natives {
String setProxyOverride(AwProxyController caller, String[] urlSchemes, String[] proxyUrls, String setProxyOverride(AwProxyController caller, String[] urlSchemes, String[] proxyUrls,
String[] bypassRules, Runnable listener, Executor executor); String[] bypassRules, Runnable listener, Executor executor, boolean reverseBypass);
void clearProxyOverride(AwProxyController caller, Runnable listener, Executor executor); void clearProxyOverride(AwProxyController caller, Runnable listener, Executor executor);
} }
} }
...@@ -81,7 +81,7 @@ public class AwProxyControllerTest { ...@@ -81,7 +81,7 @@ public class AwProxyControllerTest {
// Set proxy override and load content url // Set proxy override and load content url
// Localhost should use proxy with loopback rule // Localhost should use proxy with loopback rule
setProxyOverrideSync( setProxyOverrideSync(
new String[][] {{MATCH_ALL_SCHEMES, mProxyUrl}}, new String[] {LOOPBACK}); new String[][] {{MATCH_ALL_SCHEMES, mProxyUrl}}, new String[] {LOOPBACK}, false);
TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper = TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper =
contentsClient.getOnReceivedTitleHelper(); contentsClient.getOnReceivedTitleHelper();
int onReceivedTitleCallCount = onReceivedTitleHelper.getCallCount(); int onReceivedTitleCallCount = onReceivedTitleHelper.getCallCount();
...@@ -118,7 +118,8 @@ public class AwProxyControllerTest { ...@@ -118,7 +118,8 @@ public class AwProxyControllerTest {
// Set proxy override and load a local url // Set proxy override and load a local url
// Localhost should not use proxy settings // Localhost should not use proxy settings
setProxyOverrideSync(new String[][] {{MATCH_ALL_SCHEMES, mProxyUrl}}, new String[] {}); setProxyOverrideSync(
new String[][] {{MATCH_ALL_SCHEMES, mProxyUrl}}, new String[] {}, false);
TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper = TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper =
contentsClient.getOnReceivedTitleHelper(); contentsClient.getOnReceivedTitleHelper();
int onReceivedTitleCallCount = onReceivedTitleHelper.getCallCount(); int onReceivedTitleCallCount = onReceivedTitleHelper.getCallCount();
...@@ -130,12 +131,43 @@ public class AwProxyControllerTest { ...@@ -130,12 +131,43 @@ public class AwProxyControllerTest {
Assert.assertEquals(CONTENT, onReceivedTitleHelper.getTitle()); Assert.assertEquals(CONTENT, onReceivedTitleHelper.getTitle());
} }
@Test
@SmallTest
@Feature({"AndroidWebView"})
public void testReverseBypassRules() throws Throwable {
final TestAwContentsClient contentsClient = new TestAwContentsClient();
final AwTestContainerView testContainerView =
mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient);
final AwContents awContents = testContainerView.getAwContents();
String url = "http://www.example.com/";
String bypassUrl = "www.example.com";
mProxyServer.setResponse(
url, "<html><head><title>" + PROXY + "</title></head>Page 1</html>", null);
int proxyServerRequestCount = mProxyServer.getRequestCount(url);
// Set proxy override with reverse bypass, that is, only use proxy settings
// with URLs in the bypass list
setProxyOverrideSync(
new String[][] {{MATCH_ALL_SCHEMES, mProxyUrl}}, new String[] {bypassUrl}, true);
TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper =
contentsClient.getOnReceivedTitleHelper();
int onReceivedTitleCallCount = onReceivedTitleHelper.getCallCount();
mActivityTestRule.loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), url);
onReceivedTitleHelper.waitForCallback(onReceivedTitleCallCount);
proxyServerRequestCount++;
Assert.assertEquals(proxyServerRequestCount, mProxyServer.getRequestCount(url));
Assert.assertEquals(PROXY, onReceivedTitleHelper.getTitle());
}
@Test @Test
@SmallTest @SmallTest
@Feature({"AndroidWebView"}) @Feature({"AndroidWebView"})
public void testCallbacks() throws Throwable { public void testCallbacks() throws Throwable {
// Test setProxyOverride's callback // Test setProxyOverride's callback
setProxyOverrideSync(null, null); setProxyOverrideSync(null, null, false);
// Test clearProxyOverride's callback with a proxy override setting // Test clearProxyOverride's callback with a proxy override setting
clearProxyOverrideSync(); clearProxyOverrideSync();
// Test clearProxyOverride's callback without a proxy override setting // Test clearProxyOverride's callback without a proxy override setting
...@@ -159,7 +191,7 @@ public class AwProxyControllerTest { ...@@ -159,7 +191,7 @@ public class AwProxyControllerTest {
{MATCH_ALL_SCHEMES, "[FE80:CD00:0:CDE:1257:0:211E:729C]"}}; {MATCH_ALL_SCHEMES, "[FE80:CD00:0:CDE:1257:0:211E:729C]"}};
String[] bypassRules = { String[] bypassRules = {
"www.rule.com", "*.rule.com", "*rule.com", "www.*.com", "www.rule*"}; "www.rule.com", "*.rule.com", "*rule.com", "www.*.com", "www.rule*"};
setProxyOverrideSync(proxyRules, bypassRules); setProxyOverrideSync(proxyRules, bypassRules, false);
// If we got to this point it means our input was accepted as expected // If we got to this point it means our input was accepted as expected
} }
...@@ -181,7 +213,7 @@ public class AwProxyControllerTest { ...@@ -181,7 +213,7 @@ public class AwProxyControllerTest {
for (String proxyUrl : invalidProxyUrls) { for (String proxyUrl : invalidProxyUrls) {
try { try {
setProxyOverrideSync(new String[][] {{MATCH_ALL_SCHEMES, proxyUrl}}, null); setProxyOverrideSync(new String[][] {{MATCH_ALL_SCHEMES, proxyUrl}}, null, false);
Assert.fail("No exception for invalid proxy url: " + proxyUrl); Assert.fail("No exception for invalid proxy url: " + proxyUrl);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
// Expected // Expected
...@@ -203,7 +235,7 @@ public class AwProxyControllerTest { ...@@ -203,7 +235,7 @@ public class AwProxyControllerTest {
for (String bypassRule : invalidBypassRules) { for (String bypassRule : invalidBypassRules) {
try { try {
setProxyOverrideSync(null, new String[] {bypassRule}); setProxyOverrideSync(null, new String[] {bypassRule}, false);
Assert.fail("No exception for invalid bypass rule: " + bypassRule); Assert.fail("No exception for invalid bypass rule: " + bypassRule);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
// Expected // Expected
...@@ -211,8 +243,8 @@ public class AwProxyControllerTest { ...@@ -211,8 +243,8 @@ public class AwProxyControllerTest {
} }
} }
private void setProxyOverrideSync(String[][] proxyRules, String[] bypassRules) private void setProxyOverrideSync(
throws Exception { String[][] proxyRules, String[] bypassRules, boolean reverseBypass) throws Exception {
CallbackHelper ch = new CallbackHelper(); CallbackHelper ch = new CallbackHelper();
int callCount = ch.getCallCount(); int callCount = ch.getCallCount();
runOnUiThreadBlocking(() -> { runOnUiThreadBlocking(() -> {
...@@ -221,7 +253,7 @@ public class AwProxyControllerTest { ...@@ -221,7 +253,7 @@ public class AwProxyControllerTest {
public void run() { public void run() {
ch.notifyCalled(); ch.notifyCalled();
} }
}, new SynchronousExecutor()); }, new SynchronousExecutor(), reverseBypass);
}); });
ch.waitForCallback(callCount); ch.waitForCallback(callCount);
} }
......
...@@ -12,5 +12,7 @@ import java.util.concurrent.Executor; ...@@ -12,5 +12,7 @@ import java.util.concurrent.Executor;
public interface ProxyControllerBoundaryInterface { public interface ProxyControllerBoundaryInterface {
void setProxyOverride( void setProxyOverride(
String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor); String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor);
void setProxyOverride(String[][] proxyRules, String[] bypassRules, Runnable listener,
Executor executor, boolean reverseBypass);
void clearProxyOverride(Runnable listener, Executor executor); void clearProxyOverride(Runnable listener, Executor executor);
} }
...@@ -135,6 +135,9 @@ public class Features { ...@@ -135,6 +135,9 @@ public class Features {
// ProxyController.clearProxyOverride // ProxyController.clearProxyOverride
public static final String PROXY_OVERRIDE = "PROXY_OVERRIDE:3"; public static final String PROXY_OVERRIDE = "PROXY_OVERRIDE:3";
// ProxyController.setProxyOverride
public static final String PROXY_OVERRIDE_REVERSE_BYPASS = "PROXY_OVERRIDE_REVERSE_BYPASS";
// WebSettingsCompat.setWillSuppressErrorPage // WebSettingsCompat.setWillSuppressErrorPage
// WebSettingsCompat.getWillSuppressErrorPage // WebSettingsCompat.getWillSuppressErrorPage
public static final String SUPPRESS_ERROR_PAGE = "SUPPRESS_ERROR_PAGE"; public static final String SUPPRESS_ERROR_PAGE = "SUPPRESS_ERROR_PAGE";
......
...@@ -31,11 +31,19 @@ public class SupportLibProxyControllerAdapter implements ProxyControllerBoundary ...@@ -31,11 +31,19 @@ public class SupportLibProxyControllerAdapter implements ProxyControllerBoundary
@Override @Override
public void setProxyOverride( public void setProxyOverride(
String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor) { String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor) {
recordApiCall(ApiCall.SET_PROXY_OVERRIDE); setProxyOverride(proxyRules, bypassRules, listener, executor, false);
}
@Override
public void setProxyOverride(String[][] proxyRules, String[] bypassRules, Runnable listener,
Executor executor, boolean reverseBypass) {
recordApiCall(reverseBypass ? ApiCall.SET_PROXY_OVERRIDE
: ApiCall.SET_PROXY_OVERRIDE_REVERSE_BYPASS);
if (checkNeedsPost()) { if (checkNeedsPost()) {
RuntimeException exception = mRunQueue.runOnUiThreadBlocking(() -> { RuntimeException exception = mRunQueue.runOnUiThreadBlocking(() -> {
try { try {
mProxyController.setProxyOverride(proxyRules, bypassRules, listener, executor); mProxyController.setProxyOverride(
proxyRules, bypassRules, listener, executor, reverseBypass);
} catch (RuntimeException e) { } catch (RuntimeException e) {
return e; return e;
} }
...@@ -43,7 +51,8 @@ public class SupportLibProxyControllerAdapter implements ProxyControllerBoundary ...@@ -43,7 +51,8 @@ public class SupportLibProxyControllerAdapter implements ProxyControllerBoundary
}); });
maybeThrowUnwrappedException(exception); maybeThrowUnwrappedException(exception);
} else { } else {
mProxyController.setProxyOverride(proxyRules, bypassRules, listener, executor); mProxyController.setProxyOverride(
proxyRules, bypassRules, listener, executor, reverseBypass);
} }
} }
......
...@@ -83,6 +83,7 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary ...@@ -83,6 +83,7 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary
Features.WEB_MESSAGE_LISTENER, Features.WEB_MESSAGE_LISTENER,
Features.SET_SUPPORT_LIBRARY_VERSION + Features.DEV_SUFFIX, Features.SET_SUPPORT_LIBRARY_VERSION + Features.DEV_SUFFIX,
Features.DOCUMENT_START_SCRIPT + Features.DEV_SUFFIX, Features.DOCUMENT_START_SCRIPT + Features.DEV_SUFFIX,
Features.PROXY_OVERRIDE_REVERSE_BYPASS + Features.DEV_SUFFIX,
}; };
// These values are persisted to logs. Entries should not be renumbered and // These values are persisted to logs. Entries should not be renumbered and
...@@ -141,7 +142,8 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary ...@@ -141,7 +142,8 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary
ApiCall.WEBVIEW_RENDERER_TERMINATE, ApiCall.WEBVIEW_RENDERER_TERMINATE,
ApiCall.ADD_DOCUMENT_START_SCRIPT, ApiCall.ADD_DOCUMENT_START_SCRIPT,
ApiCall.REMOVE_DOCUMENT_START_SCRIPT, ApiCall.REMOVE_DOCUMENT_START_SCRIPT,
ApiCall.SET_SAFE_BROWSING_ALLOWLIST}) ApiCall.SET_SAFE_BROWSING_ALLOWLIST,
ApiCall.SET_PROXY_OVERRIDE_REVERSE_BYPASS})
public @interface ApiCall { public @interface ApiCall {
int ADD_WEB_MESSAGE_LISTENER = 0; int ADD_WEB_MESSAGE_LISTENER = 0;
int CLEAR_PROXY_OVERRIDE = 1; int CLEAR_PROXY_OVERRIDE = 1;
...@@ -198,7 +200,8 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary ...@@ -198,7 +200,8 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary
int ADD_DOCUMENT_START_SCRIPT = 52; int ADD_DOCUMENT_START_SCRIPT = 52;
int REMOVE_DOCUMENT_START_SCRIPT = 53; int REMOVE_DOCUMENT_START_SCRIPT = 53;
int SET_SAFE_BROWSING_ALLOWLIST = 54; int SET_SAFE_BROWSING_ALLOWLIST = 54;
int COUNT = 55; int SET_PROXY_OVERRIDE_REVERSE_BYPASS = 55;
int COUNT = 56;
} }
// clang-format on // clang-format on
......
...@@ -248,6 +248,7 @@ std::string CreateOverrideProxyConfig( ...@@ -248,6 +248,7 @@ std::string CreateOverrideProxyConfig(
const std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule>& const std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule>&
proxy_rules, proxy_rules,
const std::vector<std::string>& bypass_rules, const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
ProxyConfigWithAnnotation* config) { ProxyConfigWithAnnotation* config) {
ProxyConfig proxy_config; ProxyConfig proxy_config;
auto result = ParseOverrideRules(proxy_rules, &proxy_config.proxy_rules()); auto result = ParseOverrideRules(proxy_rules, &proxy_config.proxy_rules());
...@@ -255,6 +256,8 @@ std::string CreateOverrideProxyConfig( ...@@ -255,6 +256,8 @@ std::string CreateOverrideProxyConfig(
return result; return result;
} }
proxy_config.proxy_rules().reverse_bypass = reverse_bypass;
for (const auto& bypass_rule : bypass_rules) { for (const auto& bypass_rule : bypass_rules) {
if (!proxy_config.proxy_rules().bypass_rules.AddRuleFromString( if (!proxy_config.proxy_rules().bypass_rules.AddRuleFromString(
bypass_rule)) { bypass_rule)) {
...@@ -370,14 +373,15 @@ class ProxyConfigServiceAndroid::Delegate ...@@ -370,14 +373,15 @@ class ProxyConfigServiceAndroid::Delegate
std::string SetProxyOverride( std::string SetProxyOverride(
const std::vector<ProxyOverrideRule>& proxy_rules, const std::vector<ProxyOverrideRule>& proxy_rules,
const std::vector<std::string>& bypass_rules, const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback) { base::OnceClosure callback) {
DCHECK(InJNISequence()); DCHECK(InJNISequence());
has_proxy_override_ = true; has_proxy_override_ = true;
// Creates a new proxy config // Creates a new proxy config
ProxyConfigWithAnnotation proxy_config; ProxyConfigWithAnnotation proxy_config;
std::string result = std::string result = CreateOverrideProxyConfig(
CreateOverrideProxyConfig(proxy_rules, bypass_rules, &proxy_config); proxy_rules, bypass_rules, reverse_bypass, &proxy_config);
if (!result.empty()) { if (!result.empty()) {
return result; return result;
} }
...@@ -544,8 +548,9 @@ void ProxyConfigServiceAndroid::ProxySettingsChanged() { ...@@ -544,8 +548,9 @@ void ProxyConfigServiceAndroid::ProxySettingsChanged() {
std::string ProxyConfigServiceAndroid::SetProxyOverride( std::string ProxyConfigServiceAndroid::SetProxyOverride(
const std::vector<ProxyOverrideRule>& proxy_rules, const std::vector<ProxyOverrideRule>& proxy_rules,
const std::vector<std::string>& bypass_rules, const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback) { base::OnceClosure callback) {
return delegate_->SetProxyOverride(proxy_rules, bypass_rules, return delegate_->SetProxyOverride(proxy_rules, bypass_rules, reverse_bypass,
std::move(callback)); std::move(callback));
} }
......
...@@ -103,6 +103,7 @@ class NET_EXPORT ProxyConfigServiceAndroid : public ProxyConfigService { ...@@ -103,6 +103,7 @@ class NET_EXPORT ProxyConfigServiceAndroid : public ProxyConfigService {
std::string SetProxyOverride( std::string SetProxyOverride(
const std::vector<ProxyOverrideRule>& proxy_rules, const std::vector<ProxyOverrideRule>& proxy_rules,
const std::vector<std::string>& bypass_rules, const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback); base::OnceClosure callback);
void ClearProxyOverride(base::OnceClosure callback); void ClearProxyOverride(base::OnceClosure callback);
......
...@@ -123,17 +123,20 @@ class ProxyConfigServiceAndroidTestBase : public TestWithTaskEnvironment { ...@@ -123,17 +123,20 @@ class ProxyConfigServiceAndroidTestBase : public TestWithTaskEnvironment {
void SetProxyOverride( void SetProxyOverride(
const ProxyConfigServiceAndroid::ProxyOverrideRule& rule, const ProxyConfigServiceAndroid::ProxyOverrideRule& rule,
const std::vector<std::string>& bypass_rules, const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback) { base::OnceClosure callback) {
std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule> rules; std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule> rules;
rules.push_back(rule); rules.push_back(rule);
SetProxyOverride(rules, bypass_rules, std::move(callback)); SetProxyOverride(rules, bypass_rules, reverse_bypass, std::move(callback));
} }
void SetProxyOverride( void SetProxyOverride(
const std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule>& rules, const std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule>& rules,
const std::vector<std::string>& bypass_rules, const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback) { base::OnceClosure callback) {
service_.SetProxyOverride(rules, bypass_rules, std::move(callback)); service_.SetProxyOverride(rules, bypass_rules, reverse_bypass,
std::move(callback));
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
} }
...@@ -237,14 +240,14 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideSchemes) { ...@@ -237,14 +240,14 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideSchemes) {
TestMapping("https://example.com/", "DIRECT"); TestMapping("https://example.com/", "DIRECT");
TestMapping("ftp://example.com/", "DIRECT"); TestMapping("ftp://example.com/", "DIRECT");
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing()); base::DoNothing());
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200"); TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
TestMapping("https://example.com/", "PROXY httpoverrideproxy.com:200"); TestMapping("https://example.com/", "PROXY httpoverrideproxy.com:200");
TestMapping("ftp://example.com/", "PROXY httpoverrideproxy.com:200"); TestMapping("ftp://example.com/", "PROXY httpoverrideproxy.com:200");
// Check that webview uses the custom proxy only for https // Check that webview uses the custom proxy only for https
SetProxyOverride({"https", "httpoverrideproxy.com:200"}, bypass_rules, SetProxyOverride({"https", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing()); base::DoNothing());
TestMapping("http://example.com/", "DIRECT"); TestMapping("http://example.com/", "DIRECT");
TestMapping("https://example.com/", "PROXY httpoverrideproxy.com:200"); TestMapping("https://example.com/", "PROXY httpoverrideproxy.com:200");
...@@ -266,14 +269,14 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverridePorts) { ...@@ -266,14 +269,14 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverridePorts) {
TestMapping("ftp://example.com/", "DIRECT"); TestMapping("ftp://example.com/", "DIRECT");
// Check that webview uses port 80 for http proxies // Check that webview uses port 80 for http proxies
SetProxyOverride({"*", "httpoverrideproxy.com"}, bypass_rules, SetProxyOverride({"*", "httpoverrideproxy.com"}, bypass_rules, false,
base::DoNothing()); base::DoNothing());
TestMapping("http://example.com:444", "PROXY httpoverrideproxy.com:80"); TestMapping("http://example.com:444", "PROXY httpoverrideproxy.com:80");
TestMapping("https://example.com:2222", "PROXY httpoverrideproxy.com:80"); TestMapping("https://example.com:2222", "PROXY httpoverrideproxy.com:80");
TestMapping("ftp://example.com:15", "PROXY httpoverrideproxy.com:80"); TestMapping("ftp://example.com:15", "PROXY httpoverrideproxy.com:80");
// Check that webview uses port 443 for https proxies // Check that webview uses port 443 for https proxies
SetProxyOverride({"*", "https://httpoverrideproxy.com"}, bypass_rules, SetProxyOverride({"*", "https://httpoverrideproxy.com"}, bypass_rules, false,
base::DoNothing()); base::DoNothing());
TestMapping("http://example.com:8080", "HTTPS httpoverrideproxy.com:443"); TestMapping("http://example.com:8080", "HTTPS httpoverrideproxy.com:443");
TestMapping("https://example.com:1111", "HTTPS httpoverrideproxy.com:443"); TestMapping("https://example.com:1111", "HTTPS httpoverrideproxy.com:443");
...@@ -281,7 +284,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverridePorts) { ...@@ -281,7 +284,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverridePorts) {
// Check that webview uses custom port // Check that webview uses custom port
SetProxyOverride({"*", "https://httpoverrideproxy.com:777"}, bypass_rules, SetProxyOverride({"*", "https://httpoverrideproxy.com:777"}, bypass_rules,
base::DoNothing()); false, base::DoNothing());
TestMapping("http://example.com:8080", "HTTPS httpoverrideproxy.com:777"); TestMapping("http://example.com:8080", "HTTPS httpoverrideproxy.com:777");
TestMapping("https://example.com:1111", "HTTPS httpoverrideproxy.com:777"); TestMapping("https://example.com:1111", "HTTPS httpoverrideproxy.com:777");
TestMapping("ftp://example.com:752", "HTTPS httpoverrideproxy.com:777"); TestMapping("ftp://example.com:752", "HTTPS httpoverrideproxy.com:777");
...@@ -296,7 +299,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideMultipleRules) { ...@@ -296,7 +299,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideMultipleRules) {
std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule> rules; std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule> rules;
rules.push_back({"http", "httpoverrideproxy.com"}); rules.push_back({"http", "httpoverrideproxy.com"});
rules.push_back({"https", "https://httpoverrideproxy.com"}); rules.push_back({"https", "https://httpoverrideproxy.com"});
SetProxyOverride(rules, bypass_rules, base::DoNothing()); SetProxyOverride(rules, bypass_rules, false, base::DoNothing());
TestMapping("https://example.com/", "HTTPS httpoverrideproxy.com:443"); TestMapping("https://example.com/", "HTTPS httpoverrideproxy.com:443");
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:80"); TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:80");
...@@ -304,7 +307,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideMultipleRules) { ...@@ -304,7 +307,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideMultipleRules) {
rules.clear(); rules.clear();
rules.push_back({"http", "overrideproxy1.com"}); rules.push_back({"http", "overrideproxy1.com"});
rules.push_back({"*", "overrideproxy2.com"}); rules.push_back({"*", "overrideproxy2.com"});
SetProxyOverride(rules, bypass_rules, base::DoNothing()); SetProxyOverride(rules, bypass_rules, false, base::DoNothing());
TestMapping("https://example.com/", "PROXY overrideproxy2.com:80"); TestMapping("https://example.com/", "PROXY overrideproxy2.com:80");
TestMapping("http://example.com/", "PROXY overrideproxy1.com:80"); TestMapping("http://example.com/", "PROXY overrideproxy1.com:80");
...@@ -320,7 +323,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideListOfRules) { ...@@ -320,7 +323,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideListOfRules) {
rules.push_back({"http", "httpproxy2"}); rules.push_back({"http", "httpproxy2"});
rules.push_back({"*", "fallback2"}); rules.push_back({"*", "fallback2"});
rules.push_back({"*", "direct://"}); rules.push_back({"*", "direct://"});
SetProxyOverride(rules, bypass_rules, base::DoNothing()); SetProxyOverride(rules, bypass_rules, false, base::DoNothing());
TestMapping("http://example.com", "PROXY httpproxy1:80;PROXY httpproxy2:80"); TestMapping("http://example.com", "PROXY httpproxy1:80;PROXY httpproxy2:80");
TestMapping("https://example.com", TestMapping("https://example.com",
...@@ -335,7 +338,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideAndProxy) { ...@@ -335,7 +338,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideAndProxy) {
TestMapping("http://example.com/", "DIRECT"); TestMapping("http://example.com/", "DIRECT");
// Check that webview uses the custom proxy // Check that webview uses the custom proxy
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing()); base::DoNothing());
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200"); TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
...@@ -362,7 +365,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyAndOverride) { ...@@ -362,7 +365,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyAndOverride) {
TestMapping("http://example.com/", "PROXY httpsomeproxy.com:80"); TestMapping("http://example.com/", "PROXY httpsomeproxy.com:80");
// Check that webview uses the custom proxy // Check that webview uses the custom proxy
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing()); base::DoNothing());
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200"); TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
...@@ -378,7 +381,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideThenProxy) { ...@@ -378,7 +381,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideThenProxy) {
TestMapping("http://example.com/", "DIRECT"); TestMapping("http://example.com/", "DIRECT");
// Check that webview uses the custom proxy // Check that webview uses the custom proxy
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing()); base::DoNothing());
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200"); TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
...@@ -425,7 +428,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideBypassRules) { ...@@ -425,7 +428,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideBypassRules) {
TestMapping("http://example.com/", "DIRECT"); TestMapping("http://example.com/", "DIRECT");
// Check that webview handles the bypass rules correctly // Check that webview handles the bypass rules correctly
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing()); base::DoNothing());
TestMapping("http://excluded.com/", "DIRECT"); TestMapping("http://excluded.com/", "DIRECT");
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200"); TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
...@@ -446,12 +449,30 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideToDirect) { ...@@ -446,12 +449,30 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideToDirect) {
// Check that webview uses no proxy // Check that webview uses no proxy
TestMapping("http://example.com/", "PROXY httpsomeproxy.com:80"); TestMapping("http://example.com/", "PROXY httpsomeproxy.com:80");
SetProxyOverride({"*", "direct://"}, bypass_rules, base::DoNothing()); SetProxyOverride({"*", "direct://"}, bypass_rules, false, base::DoNothing());
TestMapping("http://example.com/", "DIRECT"); TestMapping("http://example.com/", "DIRECT");
ClearProxyOverride(base::DoNothing()); ClearProxyOverride(base::DoNothing());
} }
TEST_F(ProxyConfigServiceAndroidTest, TestReverseBypass) {
std::vector<std::string> bypass_rules;
// Check that webview uses the default proxy
TestMapping("http://example.com/", "DIRECT");
TestMapping("http://other.com/", "DIRECT");
// Use a reverse bypass list, that is, WebView will only apply the proxy
// settings to URLs in the bypass list
bypass_rules.push_back("http://example.com");
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, true,
base::DoNothing());
// Check that URLs in the bypass list use the proxy
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
TestMapping("http://other.com/", "DIRECT");
}
// !! The following test cases are automatically generated from // !! The following test cases are automatically generated from
// !! net/android/tools/proxy_test_cases.py. // !! net/android/tools/proxy_test_cases.py.
// !! Please edit that file instead of editing the test cases below and // !! Please edit that file instead of editing the test cases below and
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment