FULL PRODUCT VERSION :
java version " 1.7.0_09 "
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Darwin prome-1s-dhcp94.eng.vmware.com 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64 x86_64
A DESCRIPTION OF THE PROBLEM :
When calculating the proxy exceptionList on Mac OS X, the code in jdk/src/solaris/native/java/lang/java_props_macosx.c does not properly expand OS X-style IP exceptions (169.254/16, 10/8), and specifically ignores Java-style IP exceptions (169.254.*, 10.*).
This causes attempts to open a connection by IP address to incorrectly go through the proxy (if one is configured).
Ideally, the code in java_props_macosx.c should expand OS X-style IP wildcards (10/8) into Java-style (10.*), but at the very least, it should allow Java-style IP wildcards.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1) Set proxy bypass settings (System Preferences -> Network -> Advanced -> Proxies) to include IP address ranges, for example: *.local, 169.254/16
2) Print out System.getProperty( " http.nonProxyHosts " )
3) Try to get proxy for a 169.254/16 address: ProxySelector.getDefault().select(URI.create( " http://169.254.12.14/ " ))
4) Change proxy bypass settings to include Java-style IP range, for example: *.local, 169.254.*
5) Repeat step 2)
6) Repeat step 3)
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Step 2: Should print out " local|*.local|169.254.* "
Step 3: Should return DIRECT
Step 5: Should print out " local|*.local|169.254.* "
Step 6: Should return DIRECT
ACTUAL -
Step 2: Returned HTTP @ proxy.eng.vmware.com:3128 (the configured HTTP proxy)
Step 3: local|*.local|169.254/16|*.169.254/16
Step 5: Returned HTTP @ proxy.eng.vmware.com:3128 (the configured HTTP proxy)
Step 6: local|*.local
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
public class Prox {
public static void main(String[] args) {
System.out.println( " Non-proxy hosts: " + System.getProperty( " http.nonProxyHosts " ));
System.out.println( " Proxies for 169.254.12.14: " );
for (Proxy proxy : ProxySelector.getDefault().select(URI.create( " http://169.254.12.14 " ))) {
System.out.println( " - " + proxy);
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
I'd hoped that I could work around Java not understanding OS X's proxy bypass syntax for IP ranges (10/8, etc.) by using Java-style IP wildcards (10.*) in OS X's network settings, but the code in java_props_macosx.c specifically filters those out (if (strchr(c_exception, '*')) ...).
Only workaround I have for now is to not use ProxySelector, or manually set the http.nonProxyHosts property, but I'd prefer it being picked up correctly from the OS settings.