--- a/jdk/test/java/net/httpclient/http2/server/Http2TestServerConnection.java Wed Jun 28 17:57:20 2017 -0700
+++ b/jdk/test/java/net/httpclient/http2/server/Http2TestServerConnection.java Thu Jun 29 11:10:30 2017 +0100
@@ -25,12 +25,13 @@
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.IOException;
+import java.io.UncheckedIOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.URI;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.SSLSocket;
+import java.net.InetAddress;
+import javax.net.ssl.*;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
@@ -79,6 +80,9 @@
final static byte[] clientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n".getBytes();
Http2TestServerConnection(Http2TestServer server, Socket socket) throws IOException {
+ if (socket instanceof SSLSocket) {
+ handshake(server.serverName(), (SSLSocket)socket);
+ }
System.err.println("TestServer: New connection from " + socket);
this.server = server;
this.streams = Collections.synchronizedMap(new HashMap<>());
@@ -92,6 +96,42 @@
os = new BufferedOutputStream(socket.getOutputStream());
}
+ private static boolean compareIPAddrs(InetAddress addr1, String host) {
+ try {
+ InetAddress addr2 = InetAddress.getByName(host);
+ return addr1.equals(addr2);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+
+ private static void handshake(String name, SSLSocket sock) throws IOException {
+ if (name == null) {
+ // no name set. No need to check
+ return;
+ } else if (name.equals("127.0.0.1")) {
+ name = "localhost";
+ }
+ final String fname = name;
+ final InetAddress addr1 = InetAddress.getByName(name);
+ SSLParameters params = sock.getSSLParameters();
+ SNIMatcher matcher = new SNIMatcher(StandardConstants.SNI_HOST_NAME) {
+ public boolean matches (SNIServerName n) {
+ String host = ((SNIHostName)n).getAsciiName();
+ if (host.equals("127.0.0.1"))
+ host = "localhost";
+ boolean cmp = host.equalsIgnoreCase(fname);
+ if (cmp)
+ return true;
+ return compareIPAddrs(addr1, host);
+ }
+ };
+ List<SNIMatcher> list = List.of(matcher);
+ params.setSNIMatchers(list);
+ sock.setSSLParameters(params);
+ sock.getSession(); // blocks until handshake done
+ }
+
void close() {
streams.forEach((i, q) -> {
q.close();