You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2022/01/30 17:44:59 UTC

[httpcomponents-core] 01/01: Protocol negotiators now keep track the negotiated HTTP protocol version and can report it to the application layer

This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch 5.1.x
in repository https://gitbox.apache.org/repos/asf/httpcomponents-core.git

commit 7429253ca30aedf2801d68ebf8a22eb6da704b08
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Thu Jan 27 18:37:51 2022 +0100

    Protocol negotiators now keep track the negotiated HTTP protocol version and can report it to the application layer
---
 .../hc/core5/http2/impl/nio/ClientHttpProtocolNegotiator.java  |  3 +++
 .../core5/http2/impl/nio/H2OnlyClientProtocolNegotiator.java   |  5 +++--
 .../http2/impl/nio/H2OnlyServerHttpProtocolNegotiator.java     |  2 ++
 .../apache/hc/core5/http2/impl/nio/ProtocolNegotiatorBase.java |  8 +++++++-
 .../hc/core5/http2/impl/nio/ServerHttpProtocolNegotiator.java  | 10 +++++-----
 5 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientHttpProtocolNegotiator.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientHttpProtocolNegotiator.java
index a1a7f4b..228e36a 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientHttpProtocolNegotiator.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientHttpProtocolNegotiator.java
@@ -34,6 +34,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.hc.core5.annotation.Internal;
 import org.apache.hc.core5.concurrent.FutureCallback;
+import org.apache.hc.core5.http.HttpVersion;
 import org.apache.hc.core5.http.impl.nio.BufferedData;
 import org.apache.hc.core5.http.impl.nio.ClientHttp1IOEventHandler;
 import org.apache.hc.core5.http.impl.nio.ClientHttp1StreamDuplexerFactory;
@@ -93,6 +94,7 @@ public class ClientHttpProtocolNegotiator extends ProtocolNegotiatorBase {
     }
 
     private void startHttp1() throws IOException {
+        setNegotiatedProtocol(HttpVersion.HTTP_1_1);
         final ByteBuffer data = inBuf != null ? inBuf.data() : null;
         startProtocol(new ClientHttp1IOEventHandler(http1StreamHandlerFactory.create(ioSession)), data);
         if (inBuf != null) {
@@ -101,6 +103,7 @@ public class ClientHttpProtocolNegotiator extends ProtocolNegotiatorBase {
     }
 
     private void startHttp2() throws IOException {
+        setNegotiatedProtocol(HttpVersion.HTTP_2);
         final ByteBuffer data = inBuf != null ? inBuf.data() : null;
         startProtocol(new ClientH2IOEventHandler(http2StreamHandlerFactory.create(ioSession)), data);
         if (inBuf != null) {
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2OnlyClientProtocolNegotiator.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2OnlyClientProtocolNegotiator.java
index a4f7df5..8c8cfe4 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2OnlyClientProtocolNegotiator.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2OnlyClientProtocolNegotiator.java
@@ -34,6 +34,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.hc.core5.annotation.Internal;
 import org.apache.hc.core5.concurrent.FutureCallback;
+import org.apache.hc.core5.http.HttpVersion;
 import org.apache.hc.core5.http2.ssl.ApplicationProtocol;
 import org.apache.hc.core5.reactor.IOSession;
 import org.apache.hc.core5.reactor.ProtocolIOSession;
@@ -102,8 +103,8 @@ public class H2OnlyClientProtocolNegotiator extends ProtocolNegotiatorBase {
         }
         if (!preface.hasRemaining()) {
             session.clearEvent(SelectionKey.OP_WRITE);
-            final ClientH2StreamMultiplexer streamMultiplexer = http2StreamHandlerFactory.create(ioSession);
-            startProtocol(new ClientH2IOEventHandler(streamMultiplexer), null);
+            setNegotiatedProtocol(HttpVersion.HTTP_2);
+            startProtocol(new ClientH2IOEventHandler(http2StreamHandlerFactory.create(ioSession)), null);
             preface = null;
         }
     }
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2OnlyServerHttpProtocolNegotiator.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2OnlyServerHttpProtocolNegotiator.java
index a770f01..78f3b0a 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2OnlyServerHttpProtocolNegotiator.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2OnlyServerHttpProtocolNegotiator.java
@@ -33,6 +33,7 @@ import java.nio.ByteBuffer;
 import org.apache.hc.core5.annotation.Internal;
 import org.apache.hc.core5.concurrent.FutureCallback;
 import org.apache.hc.core5.http.ConnectionClosedException;
+import org.apache.hc.core5.http.HttpVersion;
 import org.apache.hc.core5.http.impl.nio.BufferedData;
 import org.apache.hc.core5.reactor.IOSession;
 import org.apache.hc.core5.reactor.ProtocolIOSession;
@@ -90,6 +91,7 @@ public class H2OnlyServerHttpProtocolNegotiator extends ProtocolNegotiatorBase {
                     throw new ProtocolNegotiationException("Unexpected HTTP/2 preface");
                 }
             }
+            setNegotiatedProtocol(HttpVersion.HTTP_2);
             startProtocol(new ServerH2IOEventHandler(http2StreamHandlerFactory.create(ioSession)), data.hasRemaining() ? data : null);
         } else {
             if (endOfStream) {
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ProtocolNegotiatorBase.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ProtocolNegotiatorBase.java
index 89e787c..c56f952 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ProtocolNegotiatorBase.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ProtocolNegotiatorBase.java
@@ -55,6 +55,7 @@ abstract class ProtocolNegotiatorBase implements HttpConnectionEventHandler {
     private final AtomicReference<HttpConnectionEventHandler> protocolHandlerRef;
     private final FutureCallback<ProtocolIOSession> resultCallback;
     private final AtomicBoolean completed;
+    private final AtomicReference<ProtocolVersion> negotiatedProtocolRef;
 
     ProtocolNegotiatorBase(
             final ProtocolIOSession ioSession,
@@ -63,6 +64,7 @@ abstract class ProtocolNegotiatorBase implements HttpConnectionEventHandler {
         this.protocolHandlerRef = new AtomicReference<>();
         this.resultCallback = resultCallback;
         this.completed = new AtomicBoolean();
+        this.negotiatedProtocolRef = new AtomicReference<>();
     }
 
     void startProtocol(final HttpConnectionEventHandler protocolHandler, final ByteBuffer data) throws IOException {
@@ -77,6 +79,10 @@ abstract class ProtocolNegotiatorBase implements HttpConnectionEventHandler {
         }
     }
 
+    void setNegotiatedProtocol(final ProtocolVersion protocolVersion) {
+        negotiatedProtocolRef.set(protocolVersion);
+    }
+
     @Override
     public void timeout(final IOSession session, final Timeout timeout) {
         exception(session, SocketTimeoutExceptionFactory.create(timeout));
@@ -138,7 +144,7 @@ abstract class ProtocolNegotiatorBase implements HttpConnectionEventHandler {
 
     @Override
     public ProtocolVersion getProtocolVersion() {
-        return null;
+        return negotiatedProtocolRef.get();
     }
 
     @Override
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ServerHttpProtocolNegotiator.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ServerHttpProtocolNegotiator.java
index 8d9aed2..d9f9653 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ServerHttpProtocolNegotiator.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ServerHttpProtocolNegotiator.java
@@ -34,10 +34,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.hc.core5.annotation.Internal;
 import org.apache.hc.core5.concurrent.FutureCallback;
 import org.apache.hc.core5.http.ConnectionClosedException;
+import org.apache.hc.core5.http.HttpVersion;
 import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.impl.nio.BufferedData;
 import org.apache.hc.core5.http.impl.nio.ServerHttp1IOEventHandler;
-import org.apache.hc.core5.http.impl.nio.ServerHttp1StreamDuplexer;
 import org.apache.hc.core5.http.impl.nio.ServerHttp1StreamDuplexerFactory;
 import org.apache.hc.core5.http2.HttpVersionPolicy;
 import org.apache.hc.core5.http2.ssl.ApplicationProtocol;
@@ -92,13 +92,13 @@ public class ServerHttpProtocolNegotiator extends ProtocolNegotiatorBase {
     }
 
     private void startHttp1(final TlsDetails tlsDetails, final ByteBuffer data) throws IOException {
-        final ServerHttp1StreamDuplexer http1StreamHandler = http1StreamHandlerFactory.create(
-                tlsDetails != null ? URIScheme.HTTPS.id : URIScheme.HTTP.id,
-                ioSession);
-        startProtocol(new ServerHttp1IOEventHandler(http1StreamHandler), data);
+        setNegotiatedProtocol(HttpVersion.HTTP_1_1);
+        startProtocol(new ServerHttp1IOEventHandler(http1StreamHandlerFactory.create(
+                tlsDetails != null ? URIScheme.HTTPS.id : URIScheme.HTTP.id, ioSession)), data);
     }
 
     private void startHttp2(final ByteBuffer data) throws IOException {
+        setNegotiatedProtocol(HttpVersion.HTTP_2);
         startProtocol(new ServerH2IOEventHandler(http2StreamHandlerFactory.create(ioSession)), data);
     }