1 /* 2 * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 8161016 8183369 27 * @library /test/lib 28 * @summary When proxy is set HttpURLConnection should not use DIRECT connection. 29 * @run main/othervm HttpURLConWithProxy 30 */ 31 import java.io.IOException; 32 import java.net.InetAddress; 33 import java.net.InetSocketAddress; 34 import java.net.Proxy; 35 import java.net.ProxySelector; 36 import java.net.ServerSocket; 37 import java.net.SocketAddress; 38 import java.net.URI; 39 import java.net.URL; 40 import java.net.HttpURLConnection; 41 import java.util.ArrayList; 42 import java.util.List; 43 import jdk.test.lib.net.URIBuilder; 44 import java.util.logging.Handler; 45 import java.util.logging.Level; 46 import java.util.logging.Logger; 47 import java.util.logging.LogRecord; 48 49 public class HttpURLConWithProxy { 50 51 private static Logger logger = 52 Logger.getLogger("sun.net.www.protocol.http.HttpURLConnection"); 53 54 public static void main(String... arg) throws Exception { 55 // Remove the default nonProxyHosts to use localhost for testing 56 System.setProperty("http.nonProxyHosts", ""); 57 58 System.setProperty("http.proxyHost", "1.1.1.1"); 59 System.setProperty("http.proxyPort", "1111"); 60 61 // Use the logger to help verify the Proxy was used 62 logger.setLevel(Level.ALL); 63 Handler h = new ProxyHandler(); 64 h.setLevel(Level.ALL); 65 logger.addHandler(h); 66 67 ServerSocket ss; 68 URL url; 69 HttpURLConnection con; 70 InetAddress loopback = InetAddress.getLoopbackAddress(); 71 InetSocketAddress address = new InetSocketAddress(loopback, 0); 72 73 // Test1: using Proxy set by System Property: 74 try { 75 ss = new ServerSocket(); 76 ss.bind(address); 77 url = URIBuilder.newBuilder() 78 .scheme("http") 79 .loopback() 80 .port(ss.getLocalPort()) 81 .toURL(); 82 con = (HttpURLConnection) url.openConnection(); 83 con.setConnectTimeout(10 * 1000); 84 con.connect(); 85 if(con.usingProxy()){ 86 System.out.println("Test1 Passed with: Connection succeeded with proxy"); 87 } else { 88 throw new RuntimeException("Shouldn't use DIRECT connection " 89 + "when proxy is invalid/down"); 90 } 91 } catch (IOException ie) { 92 if(!ProxyHandler.proxyRetried) { 93 throw new RuntimeException("Connection not retried with proxy"); 94 } 95 System.out.println("Test1 Passed with: " + ie.getMessage()); 96 } 97 98 // Test2: using custom ProxySelector implementation 99 ProxyHandler.proxyRetried = false; 100 MyProxySelector myProxySel = new MyProxySelector(); 101 ProxySelector.setDefault(myProxySel); 102 try { 103 ss = new ServerSocket(); 104 ss.bind(address); 105 url = URIBuilder.newBuilder() 106 .scheme("http") 107 .loopback() 108 .port(ss.getLocalPort()) 109 .toURL(); 110 con = (HttpURLConnection) url.openConnection(); 111 con.setConnectTimeout(10 * 1000); 112 con.connect(); 113 if(con.usingProxy()){ 114 System.out.println("Test2 Passed with: Connection succeeded with proxy"); 115 } else { 116 throw new RuntimeException("Shouldn't use DIRECT connection " 117 + "when proxy is invalid/down"); 118 } 119 } catch (IOException ie) { 120 if(!ProxyHandler.proxyRetried) { 121 throw new RuntimeException("Connection not retried with proxy"); 122 } 123 System.out.println("Test2 Passed with: " + ie.getMessage()); 124 } 125 } 126 } 127 128 129 class MyProxySelector extends ProxySelector { 130 131 List<Proxy> proxies = new ArrayList<>(); 132 133 MyProxySelector() { 134 Proxy p1 = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("2.2.2.2", 2222)); 135 Proxy p2 = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("3.3.3.3", 3333)); 136 proxies.add(p1); 137 proxies.add(p2); 138 } 139 140 @Override 141 public List<Proxy> select(URI uri) { 142 return proxies; 143 } 144 145 @Override 146 public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { 147 // System.out.println("MyProxySelector.connectFailed(): "+sa); 148 } 149 } 150 151 class ProxyHandler extends Handler { 152 public static boolean proxyRetried = false; 153 154 @Override 155 public void publish(LogRecord record) { 156 if (record.getMessage().contains("Retrying with proxy")) { 157 proxyRetried = true; 158 } mdio_wait_read(struct mt7628_eth_dev * priv,u32 mask,bool mask_set)159 } 160 161 @Override 162 public void flush() { 163 } 164 165 @Override 166 public void close() throws SecurityException { 167 } 168 } 169