8161016: Strange behavior of URLConnection with proxy
authorrpatil
Thu, 01 Sep 2016 10:35:38 +0530
changeset 40737 9b5eee5d7a26
parent 40736 be5be785b735
child 40738 86952e676976
8161016: Strange behavior of URLConnection with proxy Reviewed-by: shade, chegar
jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
jdk/test/java/net/HttpURLConnection/HttpURLConWithProxy.java
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Fri Sep 02 14:46:27 2016 +0530
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Thu Sep 01 10:35:38 2016 +0530
@@ -1074,7 +1074,7 @@
              * 1) if (instProxy != null)
              *        connect to instProxy; raise exception if failed
              * 2) else use system default ProxySelector
-             * 3) is 2) fails, make direct connection
+             * 3) else make a direct connection if ProxySelector is not present
              */
 
             if (instProxy == null) { // no instance Proxy is set
@@ -1117,10 +1117,7 @@
                             if (p != Proxy.NO_PROXY) {
                                 sel.connectFailed(uri, p.address(), ioex);
                                 if (!it.hasNext()) {
-                                    // fallback to direct connection
-                                    http = getNewHttpClient(url, null, connectTimeout, false);
-                                    http.setReadTimeout(readTimeout);
-                                    break;
+                                    throw ioex;
                                 }
                             } else {
                                 throw ioex;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/HttpURLConnection/HttpURLConWithProxy.java	Thu Sep 01 10:35:38 2016 +0530
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+ /*
+ * @test
+ * @bug 8161016
+ * @summary When proxy is set HttpURLConnection should not use DIRECT connection.
+ * @run main/othervm HttpURLConWithProxy
+ */
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.ProxySelector;
+import java.net.ServerSocket;
+import java.net.SocketAddress;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.List;
+
+public class HttpURLConWithProxy {
+
+    public static void main(String... arg) {
+        // Remove the default nonProxyHosts to use localhost for testing
+        System.setProperty("http.nonProxyHosts", "");
+
+        System.setProperty("http.proxyHost", "1.1.1.1");
+        System.setProperty("http.proxyPort", "1111");
+
+        ServerSocket ss;
+        URL url;
+        URLConnection con;
+
+        // Test1: using Proxy set by System Property:
+        try {
+            ss = new ServerSocket(0);
+            url = new URL("http://localhost:" + ss.getLocalPort());
+            con = url.openConnection();
+            con.setConnectTimeout(10 * 1000);
+            con.connect();
+            throw new RuntimeException("Shouldn't use DIRECT connection "
+                    + "when proxy is invalid/down");
+        } catch (IOException ie) {
+            System.out.println("Test1 Passed with: " + ie.getMessage());
+        }
+
+        // Test2: using custom ProxySelector implementation
+        MyProxySelector myProxySel = new MyProxySelector();
+        ProxySelector.setDefault(myProxySel);
+        try {
+            ss = new ServerSocket(0);
+            url = new URL("http://localhost:" + ss.getLocalPort());
+            con = url.openConnection();
+            con.setConnectTimeout(10 * 1000);
+            con.connect();
+            throw new RuntimeException("Shouldn't use DIRECT connection "
+                    + "when proxy is invalid/down");
+        } catch (IOException ie) {
+            System.out.println("Test2 Passed with: " + ie.getMessage());
+        }
+    }
+}
+
+
+class MyProxySelector extends ProxySelector {
+
+    List<Proxy> proxies = new ArrayList<>();
+
+    MyProxySelector() {
+        Proxy p1 = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("2.2.2.2", 2222));
+        Proxy p2 = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("3.3.3.3", 3333));
+        proxies.add(p1);
+        proxies.add(p2);
+    }
+
+    @Override
+    public List<Proxy> select(URI uri) {
+        return proxies;
+    }
+
+    @Override
+    public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
+        // System.out.println("MyProxySelector.connectFailed(): "+sa);
+    }
+}