mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
8204233: Add configurable option for enhanced socket IOException messages
Reviewed-by: alanb, chegar
This commit is contained in:
parent
7d4135b630
commit
1d79d38007
7 changed files with 269 additions and 8 deletions
|
@ -37,6 +37,7 @@ import java.util.Set;
|
|||
import sun.net.ConnectionResetException;
|
||||
import sun.net.NetHooks;
|
||||
import sun.net.ResourceManager;
|
||||
import sun.net.util.SocketExceptions;
|
||||
|
||||
/**
|
||||
* Default Socket Implementation. This implementation does
|
||||
|
@ -415,7 +416,7 @@ abstract class AbstractPlainSocketImpl extends SocketImpl {
|
|||
}
|
||||
} catch (IOException e) {
|
||||
close();
|
||||
throw e;
|
||||
throw SocketExceptions.of(e, new InetSocketAddress(address, port));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
117
src/java.base/share/classes/sun/net/util/SocketExceptions.java
Normal file
117
src/java.base/share/classes/sun/net/util/SocketExceptions.java
Normal file
|
@ -0,0 +1,117 @@
|
|||
/*
|
||||
* Copyright (c) 2018, 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package sun.net.util;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.security.Security;
|
||||
|
||||
public final class SocketExceptions {
|
||||
private SocketExceptions() {}
|
||||
|
||||
/**
|
||||
* Security or system property which specifies categories of
|
||||
* (potentially sensitive) information that may be included
|
||||
* in exception text. This class only defines one category:
|
||||
* "hostInfo" which represents the hostname and port number
|
||||
* of the remote peer relating to a socket exception.
|
||||
* The property value is a comma separated list of
|
||||
* case insignificant category names.
|
||||
*/
|
||||
private static final String enhancedTextPropname = "jdk.net.includeInExceptions";
|
||||
|
||||
private static final boolean enhancedExceptionText = initTextProp();
|
||||
|
||||
private static boolean initTextProp() {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
public Boolean run() {
|
||||
String val = System.getProperty(enhancedTextPropname);
|
||||
if (val == null) {
|
||||
val = Security.getProperty(enhancedTextPropname);
|
||||
if (val == null)
|
||||
return false;
|
||||
}
|
||||
String[] tokens = val.split(",");
|
||||
for (String token : tokens) {
|
||||
if (token.equalsIgnoreCase("hostinfo"))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Utility which takes an exception and returns either the same exception
|
||||
* or a new exception of the same type with the same stack trace
|
||||
* and detail message enhanced with addressing information from the
|
||||
* given InetSocketAddress.
|
||||
*
|
||||
* If the system/security property "jdk.net.enhanceExceptionText" is not
|
||||
* set or is false, then the original exception is returned.
|
||||
*
|
||||
* Only specific IOException subtypes are supported.
|
||||
*/
|
||||
public static IOException of(IOException e, InetSocketAddress address) {
|
||||
if (!enhancedExceptionText || address == null)
|
||||
return e;
|
||||
int port = address.getPort();
|
||||
String host = address.getHostString();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(e.getMessage());
|
||||
sb.append(": ");
|
||||
sb.append(host);
|
||||
sb.append(':');
|
||||
sb.append(Integer.toString(port));
|
||||
String enhancedMsg = sb.toString();
|
||||
return create(e, enhancedMsg);
|
||||
}
|
||||
|
||||
// return a new instance of the same type with the given detail
|
||||
// msg, or if the type doesn't support detail msgs, return given
|
||||
// instance.
|
||||
|
||||
private static IOException create(IOException e, String msg) {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<IOException>() {
|
||||
public IOException run() {
|
||||
try {
|
||||
Class<?> clazz = e.getClass();
|
||||
Constructor<?> ctor = clazz.getConstructor(String.class);
|
||||
IOException e1 = (IOException)(ctor.newInstance(msg));
|
||||
e1.setStackTrace(e.getStackTrace());
|
||||
return e1;
|
||||
} catch (Exception e0) {
|
||||
// Some eg AsynchronousCloseException have no detail msg
|
||||
return e;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -54,6 +54,7 @@ import java.util.concurrent.locks.ReentrantLock;
|
|||
|
||||
import sun.net.NetHooks;
|
||||
import sun.net.ext.ExtendedSocketOptions;
|
||||
import sun.net.util.SocketExceptions;
|
||||
import static sun.net.ext.ExtendedSocketOptions.SOCK_STREAM;
|
||||
|
||||
/**
|
||||
|
@ -706,7 +707,7 @@ class SocketChannelImpl
|
|||
} catch (IOException ioe) {
|
||||
// connect failed, close the channel
|
||||
close();
|
||||
throw ioe;
|
||||
throw SocketExceptions.of(ioe, isa);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -792,7 +793,7 @@ class SocketChannelImpl
|
|||
} catch (IOException ioe) {
|
||||
// connect failed, close the channel
|
||||
close();
|
||||
throw ioe;
|
||||
throw SocketExceptions.of(ioe, remoteAddress);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue