src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpClientImpl.java
branchhttp-client-branch
changeset 55821 fa0fc03c0853
parent 55816 70738768515a
child 55838 12a64276cc96
--- a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpClientImpl.java	Thu Nov 16 12:15:55 2017 +0000
+++ b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpClientImpl.java	Thu Nov 16 19:56:44 2017 +0000
@@ -44,6 +44,7 @@
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.NoSuchAlgorithmException;
+import java.security.PrivilegedAction;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
@@ -54,7 +55,6 @@
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
@@ -114,6 +114,7 @@
 
     private final CookieHandler cookieHandler;
     private final Redirect followRedirects;
+    private final Optional<ProxySelector> userProxySelector;
     private final ProxySelector proxySelector;
     private final Authenticator authenticator;
     private final Version version;
@@ -231,7 +232,11 @@
         cookieHandler = builder.cookieHandler;
         followRedirects = builder.followRedirects == null ?
                 Redirect.NEVER : builder.followRedirects;
-        this.proxySelector = builder.proxy;
+        this.userProxySelector = Optional.ofNullable(builder.proxy);
+        this.proxySelector = userProxySelector
+                .orElseGet(HttpClientImpl::getDefaultProxySelector);
+        debug.log(Level.DEBUG, "proxySelector is %s (user-supplied=%s)",
+                this.proxySelector, userProxySelector.isPresent());
         authenticator = builder.authenticator;
         if (builder.version == null) {
             version = HttpClient.Version.HTTP_2;
@@ -279,6 +284,11 @@
         return params;
     }
 
+    private static ProxySelector getDefaultProxySelector() {
+        PrivilegedAction<ProxySelector> action = ProxySelector::getDefault;
+        return AccessController.doPrivileged(action);
+    }
+
     // Returns the facade that was returned to the application code.
     // May be null if that facade is no longer referenced.
     final HttpClientFacade facade() {
@@ -906,7 +916,12 @@
 
     @Override
     public Optional<ProxySelector> proxy() {
-        return Optional.ofNullable(this.proxySelector);
+        return this.userProxySelector;
+    }
+
+    // Return the effective proxy that this client uses.
+    ProxySelector proxySelector() {
+        return proxySelector;
     }
 
     @Override
@@ -917,7 +932,7 @@
         // WebSocket has been created, at which point the pendingOperationCount
         // will have been incremented by the DetachedConnectionChannel
         // (see PlainHttpConnection.detachChannel())
-        return new BuilderImpl(this.facade(), uri, listener);
+        return new BuilderImpl(this.facade(), uri, listener, proxySelector);
     }
 
     @Override
@@ -936,12 +951,6 @@
         return super.toString() + ("(" + id + ")");
     }
 
-    //private final HashMap<String, Boolean> http2NotSupported = new HashMap<>();
-
-//    boolean getHttp2Allowed() {
-//        return version.equals(Version.HTTP_2);
-//    }
-
     private void initFilters() {
         addFilter(AuthenticationFilter.class);
         addFilter(RedirectFilter.class);