src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http2Connection.java
--- a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http2Connection.java Fri Dec 15 14:08:15 2017 +0100
+++ b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http2Connection.java Tue Dec 19 15:48:49 2017 +0000
@@ -116,6 +116,8 @@
Utils.getHpackLogger(this::dbgString, DEBUG_HPACK);
static final ByteBuffer EMPTY_TRIGGER = ByteBuffer.allocate(0);
+ private boolean singleStream; // used only for stream 1, then closed
+
/*
* ByteBuffer pooling strategy for HTTP/2 protocol:
*
@@ -202,7 +204,6 @@
prefaceSent = true;
}
}
-
}
volatile boolean closed;
@@ -397,6 +398,14 @@
return aconn.getALPN().thenCompose(checkAlpnCF);
}
+ synchronized boolean singleStream() {
+ return singleStream;
+ }
+
+ synchronized void setSingleStream(boolean use) {
+ singleStream = use;
+ }
+
static String keyFor(HttpConnection connection) {
boolean isProxy = connection.isProxied();
boolean isSecure = connection.isSecure();
@@ -429,6 +438,10 @@
// P indicates proxy
// Eg: "S:H:foo.com:80"
static String keyString(boolean secure, boolean proxy, String host, int port) {
+ if (secure && port == -1)
+ port = 443;
+ else if (!secure && port == -1)
+ port = 80;
return (secure ? "S:" : "C:") + (proxy ? "P:" : "H:") + host + ":" + port;
}
@@ -436,8 +449,8 @@
return this.key;
}
- void putConnection() {
- client2.putConnection(this);
+ boolean offerConnection() {
+ return client2.offerConnection(this);
}
private HttpPublisher publisher() {
@@ -464,6 +477,7 @@
}
void close() {
+ Log.logTrace("Closing HTTP/2 connection: to {0}", connection.address());
GoAwayFrame f = new GoAwayFrame(0, ErrorFrame.NO_ERROR, "Requested by user".getBytes());
// TODO: set last stream. For now zero ok.
sendFrame(f);
@@ -680,7 +694,12 @@
// corresponding entry in the window controller.
windowController.removeStream(streamid);
}
+ if (singleStream() && streams.isEmpty()) {
+ // should be only 1 stream, but there might be more if server push
+ close();
+ }
}
+
/**
* Increments this connection's send Window by the amount in the given frame.
*/