JDK-8241138 : http.nonProxyHosts=* causes StringIndexOutOfBoundsException in DefaultProxySelector
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.net
  • Affected Version: 11
  • Priority: P3
  • Status: Closed
  • Resolution: Fixed
  • Submitted: 2020-03-18
  • Updated: 2020-11-24
  • Resolved: 2020-04-03
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 11 JDK 13 JDK 15
11.0.10-oracleFixed 13.0.6Fixed 15 b18Fixed
Description
A DESCRIPTION OF THE PROBLEM :
12:25:19     [junit] 12:25:19,375 INFO  [MyTest] System property 'http.nonProxyHosts' = '*'

<snip>
12:25:49     [junit] Caused by: java.lang.StringIndexOutOfBoundsException: begin 1, end 0, length 1
12:25:49     [junit] 	at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3319)
12:25:49     [junit] 	at java.base/java.lang.String.substring(String.java:1874)
12:25:49     [junit] 	at java.base/sun.net.spi.DefaultProxySelector.disjunctToRegex(DefaultProxySelector.java:399)
12:25:49     [junit] 	at java.base/sun.net.spi.DefaultProxySelector.toPattern(DefaultProxySelector.java:386)
12:25:49     [junit] 	at java.base/sun.net.spi.DefaultProxySelector$4.run(DefaultProxySelector.java:281)
12:25:49     [junit] 	at java.base/sun.net.spi.DefaultProxySelector$4.run(DefaultProxySelector.java:223)
12:25:49     [junit] 	at java.base/java.security.AccessController.doPrivileged(Native Method)
12:25:49     [junit] 	at java.base/sun.net.spi.DefaultProxySelector.select(DefaultProxySelector.java:222)


It looks like the fix http://mail.openjdk.java.net/pipermail/net-dev/2018-March/011223.html for https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8144300 didn't consider the "*" case. 

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
javac Main.java && java Main

using code below

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@24a35978
ACTUAL -
java.lang.StringIndexOutOfBoundsException: begin 1, end 0, length 1
	at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3319)
	at java.base/java.lang.String.substring(String.java:1874)
	at java.base/sun.net.spi.DefaultProxySelector.disjunctToRegex(DefaultProxySelector.java:399)
	at java.base/sun.net.spi.DefaultProxySelector.toPattern(DefaultProxySelector.java:386)
	at java.base/sun.net.spi.DefaultProxySelector$4.run(DefaultProxySelector.java:281)
	at java.base/sun.net.spi.DefaultProxySelector$4.run(DefaultProxySelector.java:223)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/sun.net.spi.DefaultProxySelector.select(DefaultProxySelector.java:222)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1181)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1081)
	at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1515)
	at java.base/java.net.URLConnection.getContent(URLConnection.java:749)
	at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getContent(HttpsURLConnectionImpl.java:430)
	at java.base/java.net.URL.getContent(URL.java:1154)
	at Main.main(Main.java:11)


---------- BEGIN SOURCE ----------
import java.net.URL;
public class Main {

    public static void main(String[] args) {

        System.setProperty("https.proxyHost", "192.168.1.1");
        System.setProperty("http.proxyPort", "808");
        System.setProperty("http.nonProxyHosts", "*");
        try {
            URL url=new URL("https://google.com");
            System.out.println(url.getContent());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
System.setProperty("http.nonProxyHosts", "**");

FREQUENCY : always



Comments
Fix request (13u) It is needed in 13u, too. The patch applies clean barring copyright date in context. Tests are running, will set labels on success.
24-11-2020

Fix Request (11u) This fixes the regression introduced in 11. Patch applies cleanly to 11u, new test fails without the patch, passes with it. tier{1,2} pass after patching.
21-08-2020

URL: https://hg.openjdk.java.net/jdk/jdk/rev/b7eb1b6624fb User: dfuchs Date: 2020-04-03 16:25:59 +0000
03-04-2020

A RFR thread containing a proposed fix has been submitted in net-dev mailing list https://mail.openjdk.java.net/pipermail/net-dev/2020-March/013672.html
18-03-2020

The observations on Windows 10: JDK 8: Pass JDK 11: Fail ILW=HLM=p3
18-03-2020