Pass HTTPScheme to ClientHttp2RequestDispatcher 21/114521/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 25 Nov 2024 14:39:34 +0000 (15:39 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 25 Nov 2024 14:59:23 +0000 (15:59 +0100)
We know whether or not we are being set up for HTTPS, pass that
knowledge down to ClientHttp2RequestDispatcher, which thus loses a
dependency on TlsHandler.

JIRA: NETCONF-1419
Change-Id: I23fcf6003915fb4a87e2f46dbdeb6b07a8d59b62
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
transport/transport-http/src/main/java/org/opendaylight/netconf/transport/http/ClientHttp2RequestDispatcher.java
transport/transport-http/src/main/java/org/opendaylight/netconf/transport/http/HTTPClient.java

index 3e677476fbb3a55b6b7bbf2e8c167bf662ab92d7..93208e8c069bef22f4409b5a8607c9f78923bef9 100644 (file)
@@ -7,16 +7,14 @@
  */
 package org.opendaylight.netconf.transport.http;
 
-import static io.netty.handler.codec.http2.HttpConversionUtil.ExtensionHeaderNames.SCHEME;
-import static io.netty.handler.codec.http2.HttpConversionUtil.ExtensionHeaderNames.STREAM_ID;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.util.concurrent.FutureCallback;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.handler.codec.http.FullHttpRequest;
 import io.netty.handler.codec.http.FullHttpResponse;
-import io.netty.handler.codec.http.HttpScheme;
-import io.netty.handler.ssl.SslHandler;
+import io.netty.handler.codec.http2.HttpConversionUtil.ExtensionHeaderNames;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -37,13 +35,10 @@ final class ClientHttp2RequestDispatcher extends ClientRequestDispatcher {
     // identifier for streams initiated from client require to be odd-numbered, 1 is reserved
     // see https://datatracker.ietf.org/doc/html/rfc7540#section-5.1.1
     private final AtomicInteger streamIdCounter = new AtomicInteger(3);
+    private final HTTPScheme scheme;
 
-    private boolean ssl = false;
-
-    @Override
-    public void handlerAdded(final ChannelHandlerContext ctx) throws Exception {
-        ssl = ctx.pipeline().get(SslHandler.class) != null;
-        super.handlerAdded(ctx);
+    ClientHttp2RequestDispatcher(final HTTPScheme scheme) {
+        this.scheme = requireNonNull(scheme);
     }
 
     @Override
@@ -51,8 +46,8 @@ final class ClientHttp2RequestDispatcher extends ClientRequestDispatcher {
             final FutureCallback<FullHttpResponse> callback) {
         final var streamId = nextStreamId();
         request.headers()
-            .setInt(STREAM_ID.text(), streamId)
-            .set(SCHEME.text(), ssl ? HttpScheme.HTTPS.name() : HttpScheme.HTTP.name());
+            .setInt(ExtensionHeaderNames.STREAM_ID.text(), streamId)
+            .set(ExtensionHeaderNames.SCHEME.text(), scheme);
 
         // Map has to be populated first, simply because a response may arrive sooner than the successful callback
         map.put(streamId, callback);
@@ -70,7 +65,7 @@ final class ClientHttp2RequestDispatcher extends ClientRequestDispatcher {
 
     @Override
     protected void channelRead0(final ChannelHandlerContext ctx, final FullHttpResponse response) {
-        final var streamId = response.headers().getInt(STREAM_ID.text());
+        final var streamId = response.headers().getInt(ExtensionHeaderNames.STREAM_ID.text());
         if (streamId == null) {
             LOG.warn("Unexpected response with no stream ID -- Dropping response object {}", response);
             return;
index d5303b7e3acac6d448591ff66181e659124829c1..ac5c1524ccd93645dca07d826cf144c4251b66ee 100644 (file)
@@ -52,7 +52,7 @@ public abstract sealed class HTTPClient extends HTTPTransportStack permits Plain
         super(listener, scheme);
         this.authProvider = authProvider;
         this.http2 = http2;
-        dispatcher = http2 ? new ClientHttp2RequestDispatcher() : new ClientHttp1RequestDispatcher();
+        dispatcher = http2 ? new ClientHttp2RequestDispatcher(scheme) : new ClientHttp1RequestDispatcher();
     }
 
     /**