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/27 17:40:18 UTC

[httpcomponents-core] branch master updated: 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 master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-core.git


The following commit(s) were added to refs/heads/master by this push:
     new fc1d4da  Protocol negotiators now keep track the negotiated HTTP protocol version and can report it to the application layer
fc1d4da is described below

commit fc1d4dab4ac265c1d03382a8e061e19026721756
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 +++
 .../hc/core5/http2/impl/nio/H2OnlyClientProtocolNegotiator.java   | 2 ++
 .../core5/http2/impl/nio/H2OnlyServerHttpProtocolNegotiator.java  | 2 ++
 .../apache/hc/core5/http2/impl/nio/ProtocolNegotiatorBase.java    | 8 +++++++-
 .../hc/core5/http2/impl/nio/ServerHttpProtocolNegotiator.java     | 4 ++++
 5 files changed, 18 insertions(+), 1 deletion(-)

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 9c2152f..2576cf8 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;
@@ -125,8 +126,10 @@ public class ClientHttpProtocolNegotiator extends ProtocolNegotiatorBase {
                 break;
         }
         if (preface == null) {
+            setNegotiatedProtocol(HttpVersion.HTTP_1_1);
             startHttp1();
         } else {
+            setNegotiatedProtocol(HttpVersion.HTTP_2);
             ioSession.setEvent(SelectionKey.OP_WRITE);
         }
     }
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 388e034..840eb33 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.http.impl.nio.BufferedData;
 import org.apache.hc.core5.http2.ssl.ApplicationProtocol;
 import org.apache.hc.core5.reactor.IOSession;
@@ -94,6 +95,7 @@ public class H2OnlyClientProtocolNegotiator extends ProtocolNegotiatorBase {
                 }
             }
         }
+        setNegotiatedProtocol(HttpVersion.HTTP_2);
         this.preface = ByteBuffer.wrap(ClientHttpProtocolNegotiator.PREFACE);
         ioSession.setEvent(SelectionKey.OP_WRITE);
     }
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..512bf6f 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;
@@ -69,6 +70,7 @@ public class H2OnlyServerHttpProtocolNegotiator extends ProtocolNegotiatorBase {
 
     @Override
     public void connected(final IOSession session) throws IOException {
+        setNegotiatedProtocol(HttpVersion.HTTP_2);
     }
 
     @Override
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 f6febff..53db09c 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,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.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;
@@ -119,6 +120,7 @@ public class ServerHttpProtocolNegotiator extends ProtocolNegotiatorBase {
                 }
                 break;
             case FORCE_HTTP_1:
+                setNegotiatedProtocol(HttpVersion.HTTP_1_1);
                 startHttp1(tlsDetails, null);
                 break;
         }
@@ -155,8 +157,10 @@ public class ServerHttpProtocolNegotiator extends ProtocolNegotiatorBase {
                 }
             }
             if (validH2Preface) {
+                setNegotiatedProtocol(HttpVersion.HTTP_2);
                 startHttp2(data.hasRemaining() ? data : null);
             } else {
+                setNegotiatedProtocol(HttpVersion.HTTP_1_1);
                 data.rewind();
                 startHttp1(ioSession.getTlsDetails(), data);
             }