From ffd76c89def990ad944d956038ac9a98be88cfae Mon Sep 17 00:00:00 2001 From: Pierre De Rop Date: Tue, 20 Sep 2022 11:29:05 +0200 Subject: [PATCH] Adapt to new Netty5 Header API (#2484) * renamed io.netty.buffer.api package to io.netty.buffer * renamed io.netty5.handler.codec.http.HttpHeaders to io.netty5.handler.codec.http.headers.HttpHeaders * Adapted to new HttpHeaders API * removed the old ServerCookieEncoder/ServerCookieDecoder/ClientCookieDecoder/ClientCookieEncoder classes, which are not available anymore. * Replaced old netty Cookie class by HttpCookiePair/HttpSetCookie. * The Cookies class is used to cache Set-Cookie headers found from http response headers. * The ServerCookies class is used to cache Cookies headers found from http request headers. * Updated reactor-netty5-http/build.gradle in order to enumerate the methods which have been removed --- .../main/java/reactor/netty5/BufferFlux.java | 8 +- .../main/java/reactor/netty5/BufferMono.java | 8 +- .../java/reactor/netty5/NettyOutbound.java | 4 +- .../java/reactor/netty5/ReactorNetty.java | 6 +- .../AbstractChannelMetricsHandler.java | 2 +- .../netty5/channel/ChannelOperations.java | 4 +- .../channel/ChannelOperationsHandler.java | 2 +- .../java/reactor/netty5/channel/MonoSend.java | 2 +- .../reactor/netty5/channel/MonoSendMany.java | 2 +- .../transport/BufferAllocatorMetrics.java | 4 +- .../reactor/netty5/transport/Transport.java | 2 +- .../netty5/transport/TransportConfig.java | 4 +- .../logging/AdvancedBufferFormat.java | 2 +- .../logging/ReactorNettyLoggingHandler.java | 2 +- .../java/reactor/netty5/BufferFluxTest.java | 4 +- .../java/reactor/netty5/BufferMonoTest.java | 4 +- .../reactor/netty5/NettyOutboundTest.java | 6 +- .../java/reactor/netty5/ReactorNettyTest.java | 2 +- .../netty5/channel/MonoSendManyTest.java | 2 +- .../reactor/netty5/tcp/TcpClientTests.java | 4 +- .../reactor/netty5/tcp/TcpServerTests.java | 4 +- .../ReactorNettyLoggingHandlerTest.java | 4 +- .../reactor/netty5/udp/UdpClientTest.java | 4 +- .../reactor/netty5/udp/UdpMetricsTests.java | 2 +- .../http/client/http2/H2Application.java | 4 +- .../http/client/http2/H2CApplication.java | 4 +- .../http/client/send/headers/Application.java | 4 +- ...stomForwardedHeaderHandlerApplication.java | 6 +- .../http/server/sse/Application.java | 4 +- .../udp/server/send/Application.java | 2 +- reactor-netty5-http/build.gradle | 13 ++- .../java/reactor/netty5/http/Cookies.java | 70 ++++++-------- .../java/reactor/netty5/http/HttpInfos.java | 6 +- .../reactor/netty5/http/HttpOperations.java | 13 +-- .../AbstractHttpClientMetricsHandler.java | 2 +- .../http/client/FailedHttpClientRequest.java | 13 +-- .../Http2StreamBridgeClientHandler.java | 2 +- .../netty5/http/client/HttpClient.java | 92 ++++--------------- .../netty5/http/client/HttpClientConfig.java | 33 +------ .../netty5/http/client/HttpClientConnect.java | 23 ++--- .../http/client/HttpClientFinalizer.java | 6 +- .../netty5/http/client/HttpClientInfos.java | 2 +- .../http/client/HttpClientOperations.java | 43 ++++----- .../http/client/HttpClientProxyProvider.java | 11 +-- .../netty5/http/client/HttpClientRequest.java | 6 +- .../http/client/HttpClientResponse.java | 2 +- .../http/client/RedirectClientException.java | 4 +- .../client/WebsocketClientOperations.java | 9 +- .../http/client/WebsocketFinalizer.java | 4 +- .../AbstractHttpServerMetricsHandler.java | 2 +- .../DefaultHttpForwardedHeaderHandler.java | 22 ++--- .../http/server/HAProxyMessageDetector.java | 2 +- .../Http2StreamBridgeServerHandler.java | 12 +-- .../netty5/http/server/HttpServer.java | 39 -------- .../netty5/http/server/HttpServerConfig.java | 88 +++--------------- .../netty5/http/server/HttpServerInfos.java | 4 +- .../http/server/HttpServerOperations.java | 88 +++++++----------- .../netty5/http/server/HttpServerRequest.java | 2 +- .../http/server/HttpServerResponse.java | 6 +- .../netty5/http/server/HttpServerRoutes.java | 2 +- .../http/server/HttpTrafficHandler.java | 16 +--- .../MicrometerHttpServerMetricsHandler.java | 5 +- .../http/server/NonSslRedirectDetector.java | 2 +- .../http/server/NonSslRedirectHandler.java | 2 +- .../netty5/http/server/ServerCookies.java | 45 ++++----- .../http/server/SimpleCompressionHandler.java | 2 +- .../server/WebsocketServerOperations.java | 9 +- .../logging/AbstractAccessLogArgProvider.java | 8 +- .../server/logging/AccessLogArgProvider.java | 4 +- .../server/logging/AccessLogHandlerH1.java | 2 +- .../http/websocket/WebsocketInbound.java | 2 +- .../http/websocket/WebsocketOutbound.java | 4 +- .../java/reactor/netty5/BaseHttpTest.java | 28 ++++++ .../netty5/channel/FluxReceiveTest.java | 2 +- .../java/reactor/netty5/http/Http2Tests.java | 4 +- .../HttpCompressionClientServerTests.java | 14 +-- .../netty5/http/HttpCookieHandlingTests.java | 39 ++++---- .../netty5/http/HttpMetricsHandlerTests.java | 2 +- .../netty5/http/HttpOperationsTest.java | 6 +- .../netty5/http/HttpProtocolsTests.java | 7 +- .../java/reactor/netty5/http/HttpTests.java | 4 +- .../http/client/HttpClientOperationsTest.java | 27 ++---- .../client/HttpClientProxyProviderTest.java | 2 +- .../http/client/HttpClientProxyTest.java | 8 +- .../netty5/http/client/HttpClientTest.java | 30 +++--- .../http/client/HttpClientWithTomcatTest.java | 2 +- .../netty5/http/client/HttpRedirectTest.java | 2 +- .../client/WebsocketClientOperationsTest.java | 12 ++- .../netty5/http/client/WebsocketTest.java | 10 +- .../http/server/ConnectionInfoTests.java | 8 +- .../netty5/http/server/HttpSendFileTests.java | 4 +- .../netty5/http/server/HttpServerTests.java | 56 ++++++----- .../http/server/TrailerHeadersTests.java | 2 +- .../logging/AccessLogArgProviderH1Tests.java | 9 +- .../logging/AccessLogArgProviderH2Tests.java | 8 +- .../logging/AccessLogHandlerH1Tests.java | 11 +-- .../logging/AccessLogHandlerH2Tests.java | 10 +- .../http/server/logging/AccessLogTest.java | 16 ++-- .../reactor/netty5/tcp/SslProviderTests.java | 2 +- .../transport/BufferAllocatorMetricsTest.java | 6 +- 100 files changed, 472 insertions(+), 693 deletions(-) diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/BufferFlux.java b/reactor-netty5-core/src/main/java/reactor/netty5/BufferFlux.java index fca6be907f..41595ce36c 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/BufferFlux.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/BufferFlux.java @@ -16,9 +16,9 @@ package reactor.netty5; import io.netty5.buffer.BufferInputStream; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; -import io.netty5.buffer.api.CompositeBuffer; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; +import io.netty5.buffer.CompositeBuffer; import io.netty5.util.Send; import io.netty5.channel.socket.DatagramPacket; import io.netty5.handler.codec.http.HttpContent; @@ -39,7 +39,7 @@ import java.util.Objects; import java.util.function.Function; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; /** * A decorating {@link Flux} {@link NettyInbound} with various {@link Buffer} related diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/BufferMono.java b/reactor-netty5-core/src/main/java/reactor/netty5/BufferMono.java index 53945fdb20..cc4494d506 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/BufferMono.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/BufferMono.java @@ -16,9 +16,9 @@ package reactor.netty5; import io.netty5.buffer.BufferInputStream; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; -import io.netty5.buffer.api.CompositeBuffer; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; +import io.netty5.buffer.CompositeBuffer; import org.reactivestreams.Publisher; import reactor.core.CoreSubscriber; import reactor.core.Fuseable; @@ -30,7 +30,7 @@ import java.nio.charset.Charset; import java.util.Objects; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static java.util.Objects.requireNonNull; /** diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/NettyOutbound.java b/reactor-netty5-core/src/main/java/reactor/netty5/NettyOutbound.java index 6ae0840740..9ae15ea9a8 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/NettyOutbound.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/NettyOutbound.java @@ -30,8 +30,8 @@ import java.util.function.Consumer; import java.util.function.Predicate; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; import io.netty5.channel.Channel; import io.netty5.channel.DefaultFileRegion; import io.netty5.handler.stream.ChunkedNioFile; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/ReactorNetty.java b/reactor-netty5-core/src/main/java/reactor/netty5/ReactorNetty.java index 0476afce57..fde27de93c 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/ReactorNetty.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/ReactorNetty.java @@ -36,9 +36,9 @@ import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import io.netty5.buffer.BufferUtil; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; -import io.netty5.buffer.api.BufferHolder; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; +import io.netty5.buffer.BufferHolder; import io.netty5.channel.nio.AbstractNioChannel; import io.netty5.util.Resource; import io.netty5.channel.Channel; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/channel/AbstractChannelMetricsHandler.java b/reactor-netty5-core/src/main/java/reactor/netty5/channel/AbstractChannelMetricsHandler.java index 8b119fa360..32d6556a40 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/channel/AbstractChannelMetricsHandler.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/channel/AbstractChannelMetricsHandler.java @@ -15,7 +15,7 @@ */ package reactor.netty5.channel; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.ChannelHandler; import io.netty5.channel.ChannelHandlerAdapter; import io.netty5.channel.ChannelHandlerContext; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/channel/ChannelOperations.java b/reactor-netty5-core/src/main/java/reactor/netty5/channel/ChannelOperations.java index 435d4cccc7..39ac395626 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/channel/ChannelOperations.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/channel/ChannelOperations.java @@ -23,8 +23,8 @@ import java.util.function.Consumer; import java.util.function.Predicate; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; import io.netty5.util.Resource; import io.netty5.channel.Channel; import io.netty5.channel.ChannelHandler; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/channel/ChannelOperationsHandler.java b/reactor-netty5-core/src/main/java/reactor/netty5/channel/ChannelOperationsHandler.java index 29756678d6..2d7bd2165d 100755 --- a/reactor-netty5-core/src/main/java/reactor/netty5/channel/ChannelOperationsHandler.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/channel/ChannelOperationsHandler.java @@ -15,7 +15,7 @@ */ package reactor.netty5.channel; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.util.Resource; import io.netty5.channel.ChannelHandlerAdapter; import io.netty5.channel.ChannelHandlerContext; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/channel/MonoSend.java b/reactor-netty5-core/src/main/java/reactor/netty5/channel/MonoSend.java index 77a314a529..2567cc209d 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/channel/MonoSend.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/channel/MonoSend.java @@ -21,7 +21,7 @@ import java.util.function.ToIntFunction; import io.netty.buffer.ByteBufHolder; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.util.Resource; import io.netty5.channel.Channel; import io.netty5.channel.ChannelHandlerContext; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/channel/MonoSendMany.java b/reactor-netty5-core/src/main/java/reactor/netty5/channel/MonoSendMany.java index 42ee0dc1d8..c1c7630f67 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/channel/MonoSendMany.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/channel/MonoSendMany.java @@ -30,7 +30,7 @@ import java.util.stream.Stream; import io.netty.buffer.ByteBufHolder; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.util.Resource; import io.netty5.channel.Channel; import io.netty5.channel.ChannelHandlerContext; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/transport/BufferAllocatorMetrics.java b/reactor-netty5-core/src/main/java/reactor/netty5/transport/BufferAllocatorMetrics.java index 4c4e30c6e8..5f25e87cef 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/transport/BufferAllocatorMetrics.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/transport/BufferAllocatorMetrics.java @@ -17,8 +17,8 @@ import io.micrometer.core.instrument.Gauge; import io.micrometer.core.instrument.Tags; -import io.netty5.buffer.api.BufferAllocator; -import io.netty5.buffer.api.pool.BufferAllocatorMetric; +import io.netty5.buffer.BufferAllocator; +import io.netty5.buffer.pool.BufferAllocatorMetric; import reactor.netty5.internal.util.MapUtils; import java.util.concurrent.ConcurrentHashMap; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/transport/Transport.java b/reactor-netty5-core/src/main/java/reactor/netty5/transport/Transport.java index 7508b2780d..86cfdf4067 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/transport/Transport.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/transport/Transport.java @@ -22,7 +22,7 @@ import java.util.Objects; import java.util.function.Supplier; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.ChannelOption; import io.netty5.channel.EventLoopGroup; import io.netty5.channel.group.ChannelGroup; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/transport/TransportConfig.java b/reactor-netty5-core/src/main/java/reactor/netty5/transport/TransportConfig.java index bf354c27f3..6eec8ba58f 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/transport/TransportConfig.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/transport/TransportConfig.java @@ -23,8 +23,8 @@ import java.util.Objects; import java.util.function.Supplier; -import io.netty5.buffer.api.BufferAllocator; -import io.netty5.buffer.api.pool.BufferAllocatorMetricProvider; +import io.netty5.buffer.BufferAllocator; +import io.netty5.buffer.pool.BufferAllocatorMetricProvider; import io.netty5.channel.Channel; import io.netty5.channel.ChannelFactory; import io.netty5.channel.ChannelInitializer; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/transport/logging/AdvancedBufferFormat.java b/reactor-netty5-core/src/main/java/reactor/netty5/transport/logging/AdvancedBufferFormat.java index 6ec0a30911..dd51f0c3e7 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/transport/logging/AdvancedBufferFormat.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/transport/logging/AdvancedBufferFormat.java @@ -18,7 +18,7 @@ import java.nio.charset.Charset; import io.netty.buffer.ByteBufHolder; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.handler.logging.LogLevel; import io.netty5.handler.logging.LoggingHandler; diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/transport/logging/ReactorNettyLoggingHandler.java b/reactor-netty5-core/src/main/java/reactor/netty5/transport/logging/ReactorNettyLoggingHandler.java index 419592f242..ef33db77dd 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/transport/logging/ReactorNettyLoggingHandler.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/transport/logging/ReactorNettyLoggingHandler.java @@ -21,7 +21,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufHolder; import io.netty5.buffer.BufferUtil; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.Channel; import io.netty5.channel.ChannelHandlerContext; import io.netty5.handler.logging.BufferFormat; diff --git a/reactor-netty5-core/src/test/java/reactor/netty5/BufferFluxTest.java b/reactor-netty5-core/src/test/java/reactor/netty5/BufferFluxTest.java index c5d65108f1..19aac326cc 100644 --- a/reactor-netty5-core/src/test/java/reactor/netty5/BufferFluxTest.java +++ b/reactor-netty5-core/src/test/java/reactor/netty5/BufferFluxTest.java @@ -15,7 +15,7 @@ */ package reactor.netty5; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -37,7 +37,7 @@ import java.util.Random; import java.util.stream.Collectors; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static org.assertj.core.api.Assertions.assertThat; class BufferFluxTest { diff --git a/reactor-netty5-core/src/test/java/reactor/netty5/BufferMonoTest.java b/reactor-netty5-core/src/test/java/reactor/netty5/BufferMonoTest.java index 77a3c4398f..e004647e86 100644 --- a/reactor-netty5-core/src/test/java/reactor/netty5/BufferMonoTest.java +++ b/reactor-netty5-core/src/test/java/reactor/netty5/BufferMonoTest.java @@ -15,7 +15,7 @@ */ package reactor.netty5; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import org.junit.jupiter.api.Test; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; @@ -27,7 +27,7 @@ import java.util.Arrays; import java.util.Random; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; class BufferMonoTest { static final Random rndm = new Random(); diff --git a/reactor-netty5-core/src/test/java/reactor/netty5/NettyOutboundTest.java b/reactor-netty5-core/src/test/java/reactor/netty5/NettyOutboundTest.java index 1a7ed7802e..8be94d3a1c 100644 --- a/reactor-netty5-core/src/test/java/reactor/netty5/NettyOutboundTest.java +++ b/reactor-netty5-core/src/test/java/reactor/netty5/NettyOutboundTest.java @@ -34,8 +34,8 @@ import java.util.function.Predicate; import javax.net.ssl.SSLException; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; import io.netty5.channel.ChannelHandlerContext; import io.netty5.channel.DefaultFileRegion; import io.netty5.channel.FileRegion; @@ -53,7 +53,7 @@ import org.reactivestreams.Publisher; import reactor.core.publisher.Mono; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static org.assertj.core.api.Assertions.assertThat; class NettyOutboundTest { diff --git a/reactor-netty5-core/src/test/java/reactor/netty5/ReactorNettyTest.java b/reactor-netty5-core/src/test/java/reactor/netty5/ReactorNettyTest.java index 6e6cfca3dc..275a494541 100644 --- a/reactor-netty5-core/src/test/java/reactor/netty5/ReactorNettyTest.java +++ b/reactor-netty5-core/src/test/java/reactor/netty5/ReactorNettyTest.java @@ -15,7 +15,7 @@ */ package reactor.netty5; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.AbstractChannel; import io.netty5.channel.Channel; import io.netty5.channel.ChannelShutdownDirection; diff --git a/reactor-netty5-core/src/test/java/reactor/netty5/channel/MonoSendManyTest.java b/reactor-netty5-core/src/test/java/reactor/netty5/channel/MonoSendManyTest.java index 33c4c985fb..ba7de390e5 100644 --- a/reactor-netty5-core/src/test/java/reactor/netty5/channel/MonoSendManyTest.java +++ b/reactor-netty5-core/src/test/java/reactor/netty5/channel/MonoSendManyTest.java @@ -25,7 +25,7 @@ import java.util.function.Function; import java.util.stream.Collectors; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.util.Resource; import io.netty5.channel.ChannelHandlerAdapter; import io.netty5.channel.embedded.EmbeddedChannel; diff --git a/reactor-netty5-core/src/test/java/reactor/netty5/tcp/TcpClientTests.java b/reactor-netty5-core/src/test/java/reactor/netty5/tcp/TcpClientTests.java index c4433f0caf..37181338ab 100644 --- a/reactor-netty5-core/src/test/java/reactor/netty5/tcp/TcpClientTests.java +++ b/reactor-netty5-core/src/test/java/reactor/netty5/tcp/TcpClientTests.java @@ -40,7 +40,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.ChannelOption; import io.netty5.channel.EventLoopGroup; import io.netty5.channel.MultithreadEventLoopGroup; @@ -70,7 +70,7 @@ import reactor.util.Loggers; import reactor.util.retry.Retry; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assumptions.assumeThat; diff --git a/reactor-netty5-core/src/test/java/reactor/netty5/tcp/TcpServerTests.java b/reactor-netty5-core/src/test/java/reactor/netty5/tcp/TcpServerTests.java index 0ca82be92b..c319277b53 100644 --- a/reactor-netty5-core/src/test/java/reactor/netty5/tcp/TcpServerTests.java +++ b/reactor-netty5-core/src/test/java/reactor/netty5/tcp/TcpServerTests.java @@ -43,7 +43,7 @@ import javax.net.ssl.SNIHostName; import com.fasterxml.jackson.databind.ObjectMapper; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.AdaptiveReadHandleFactory; import io.netty5.channel.ChannelHandlerAdapter; import io.netty5.channel.ChannelHandlerContext; @@ -82,7 +82,7 @@ import reactor.util.Logger; import reactor.util.Loggers; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/reactor-netty5-core/src/test/java/reactor/netty5/transport/logging/ReactorNettyLoggingHandlerTest.java b/reactor-netty5-core/src/test/java/reactor/netty5/transport/logging/ReactorNettyLoggingHandlerTest.java index d3aaf96f8d..a90194d711 100644 --- a/reactor-netty5-core/src/test/java/reactor/netty5/transport/logging/ReactorNettyLoggingHandlerTest.java +++ b/reactor-netty5-core/src/test/java/reactor/netty5/transport/logging/ReactorNettyLoggingHandlerTest.java @@ -15,13 +15,13 @@ */ package reactor.netty5.transport.logging; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import java.nio.charset.Charset; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/reactor-netty5-core/src/test/java/reactor/netty5/udp/UdpClientTest.java b/reactor-netty5-core/src/test/java/reactor/netty5/udp/UdpClientTest.java index d8c0744bb0..4c573c91de 100644 --- a/reactor-netty5-core/src/test/java/reactor/netty5/udp/UdpClientTest.java +++ b/reactor-netty5-core/src/test/java/reactor/netty5/udp/UdpClientTest.java @@ -25,8 +25,8 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.CompositeBuffer; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.CompositeBuffer; import io.netty5.channel.EventLoopGroup; import io.netty5.channel.MultithreadEventLoopGroup; import io.netty5.channel.nio.NioHandler; diff --git a/reactor-netty5-core/src/test/java/reactor/netty5/udp/UdpMetricsTests.java b/reactor-netty5-core/src/test/java/reactor/netty5/udp/UdpMetricsTests.java index f4067836db..dc53e895b2 100644 --- a/reactor-netty5-core/src/test/java/reactor/netty5/udp/UdpMetricsTests.java +++ b/reactor-netty5-core/src/test/java/reactor/netty5/udp/UdpMetricsTests.java @@ -23,7 +23,7 @@ import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import io.micrometer.core.tck.MeterRegistryAssert; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.socket.DatagramPacket; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/http2/H2Application.java b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/http2/H2Application.java index 5167464aa9..719b399778 100644 --- a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/http2/H2Application.java +++ b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/http2/H2Application.java @@ -15,7 +15,7 @@ */ package reactor.netty5.examples.documentation.http.client.http2; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import reactor.core.publisher.Mono; import reactor.netty5.http.HttpProtocol; import reactor.netty5.http.client.HttpClient; @@ -39,4 +39,4 @@ public static void main(String[] args) { System.out.println("Used stream ID: " + response.getT2().get("x-http2-stream-id")); System.out.println("Response: " + response.getT1()); } -} \ No newline at end of file +} diff --git a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/http2/H2CApplication.java b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/http2/H2CApplication.java index ced6c6dd77..645b95c7b9 100644 --- a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/http2/H2CApplication.java +++ b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/http2/H2CApplication.java @@ -15,7 +15,7 @@ */ package reactor.netty5.examples.documentation.http.client.http2; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import reactor.core.publisher.Mono; import reactor.netty5.http.HttpProtocol; import reactor.netty5.http.client.HttpClient; @@ -38,4 +38,4 @@ public static void main(String[] args) { System.out.println("Used stream ID: " + response.getT2().get("x-http2-stream-id")); System.out.println("Response: " + response.getT1()); } -} \ No newline at end of file +} diff --git a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/send/headers/Application.java b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/send/headers/Application.java index a918016021..baec4377f6 100644 --- a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/send/headers/Application.java +++ b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/client/send/headers/Application.java @@ -25,7 +25,7 @@ public class Application { public static void main(String[] args) { HttpClient client = HttpClient.create() - .headers(h -> h.set(HttpHeaderNames.CONTENT_LENGTH, 5)); //<1> + .headers(h -> h.set(HttpHeaderNames.CONTENT_LENGTH, "5")); //<1> client.post() .uri("https://example.com/") @@ -33,4 +33,4 @@ public static void main(String[] args) { .response() .block(); } -} \ No newline at end of file +} diff --git a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/server/clientaddress/CustomForwardedHeaderHandlerApplication.java b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/server/clientaddress/CustomForwardedHeaderHandlerApplication.java index 45db3a9e82..c991518d60 100644 --- a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/server/clientaddress/CustomForwardedHeaderHandlerApplication.java +++ b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/server/clientaddress/CustomForwardedHeaderHandlerApplication.java @@ -28,9 +28,9 @@ public static void main(String[] args) { DisposableServer server = HttpServer.create() .forwarded((connectionInfo, request) -> { // <1> - String hostHeader = request.headers().get("X-Forwarded-Host"); + CharSequence hostHeader = request.headers().get("X-Forwarded-Host"); if (hostHeader != null) { - String[] hosts = hostHeader.split(",", 2); + String[] hosts = hostHeader.toString().split(",", 2); InetSocketAddress hostAddress = AddressUtils.createUnresolved( hosts[hosts.length - 1].trim(), connectionInfo.getHostAddress().getPort()); @@ -48,4 +48,4 @@ public static void main(String[] args) { server.onDispose() .block(); } -} \ No newline at end of file +} diff --git a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/server/sse/Application.java b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/server/sse/Application.java index f0e4043c5e..a9fdb3d599 100644 --- a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/server/sse/Application.java +++ b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/http/server/sse/Application.java @@ -16,8 +16,8 @@ package reactor.netty5.examples.documentation.http.server.sse; import com.fasterxml.jackson.databind.ObjectMapper; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; import reactor.netty5.DisposableServer; diff --git a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/udp/server/send/Application.java b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/udp/server/send/Application.java index ddd360d7bf..cf91463d2a 100644 --- a/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/udp/server/send/Application.java +++ b/reactor-netty5-examples/src/main/java/reactor/netty5/examples/documentation/udp/server/send/Application.java @@ -15,7 +15,7 @@ */ package reactor.netty5.examples.documentation.udp.server.send; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.socket.DatagramPacket; import reactor.core.publisher.Mono; import reactor.netty5.Connection; diff --git a/reactor-netty5-http/build.gradle b/reactor-netty5-http/build.gradle index 2bccf40264..ec264ae1e5 100644 --- a/reactor-netty5-http/build.gradle +++ b/reactor-netty5-http/build.gradle @@ -239,7 +239,6 @@ task japicmp(type: JapicmpTask) { 'reactor.netty.http.server.HttpServerRequest#receiveForm(java.util.function.Consumer)', // Changes related to Netty 5 package change - 'reactor.netty.http.Cookies#newClientResponseHolder(io.netty.handler.codec.http.HttpHeaders, io.netty.handler.codec.http.cookie.ClientCookieDecoder)', 'reactor.netty.http.HttpInfos#method()', 'reactor.netty.http.HttpInfos#version()', 'reactor.netty.http.HttpResources#getOrCreateDefaultResolver()', @@ -277,7 +276,17 @@ task japicmp(type: JapicmpTask) { 'reactor.netty.http.server.logging.AccessLogHandlerFactory#create(java.util.function.Function)', - 'reactor.netty.http.websocket.WebsocketInbound#headers()' + 'reactor.netty.http.websocket.WebsocketInbound#headers()', + + // API removed after adaptation to new HttpHeaders/Cookies Netty API (#12735) + 'reactor.netty.http.Cookies#newClientResponseHolder(io.netty.handler.codec.http.HttpHeaders, io.netty.handler.codec.http.cookie.ClientCookieDecoder)', + 'reactor.netty.http.server.ServerCookies#newServerRequestHolder(io.netty.handler.codec.http.HttpHeaders, io.netty.handler.codec.http.cookie.ServerCookieDecoder)', + 'reactor.netty.http.client.HttpClient#cookie(java.lang.String, java.util.function.Consumer)', + 'reactor.netty.http.client.HttpClient#cookieCodec(io.netty.handler.codec.http.cookie.ClientCookieEncoder)', + 'reactor.netty.http.client.HttpClient#cookieCodec(io.netty.handler.codec.http.cookie.ClientCookieEncoder, io.netty.handler.codec.http.cookie.ClientCookieDecoder)', + 'reactor.netty.http.client.HttpClient#cookiesWhen(java.lang.String, java.util.function.Function)', + 'reactor.netty.http.client.HttpClientConfig#cookieEncoder()', + 'reactor.netty.http.client.HttpClientConfig#cookieDecoder()' ] classExcludes = [ // TODO temporary disable multipart on the client diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/Cookies.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/Cookies.java index 831ee92e90..2bc4e39155 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/Cookies.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/Cookies.java @@ -18,21 +18,20 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.List; +import java.util.Iterator; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import io.netty5.handler.codec.http.HttpHeaderNames; -import io.netty5.handler.codec.http.HttpHeaders; -import io.netty5.handler.codec.http.cookie.ClientCookieDecoder; -import io.netty5.handler.codec.http.cookie.Cookie; -import io.netty5.handler.codec.http.cookie.CookieDecoder; -import io.netty5.handler.codec.http.cookie.ServerCookieDecoder; +import io.netty5.handler.codec.http.headers.HttpCookiePair; +import io.netty5.handler.codec.http.headers.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpSetCookie; +import reactor.util.Logger; +import reactor.util.Loggers; /** - * Store cookies for the http channel. + * Holder for Set-Cookie headers found from response headers * * @since 0.6 */ @@ -44,31 +43,25 @@ public class Cookies { * @param headers client response headers * @return a new cookies holder from client response headers */ - public static Cookies newClientResponseHolder(HttpHeaders headers, ClientCookieDecoder decoder) { - return new Cookies(headers, HttpHeaderNames.SET_COOKIE, true, decoder); + public static Cookies newClientResponseHolder(HttpHeaders headers) { + return new Cookies(headers); } final static int NOT_READ = 0; final static int READING = 1; final static int READ = 2; - final HttpHeaders nettyHeaders; - final CharSequence cookiesHeaderName; - final boolean isClientChannel; - final CookieDecoder decoder; + protected final HttpHeaders nettyHeaders; - protected Map> cachedCookies; + protected Map> cachedCookies; volatile int state; static final AtomicIntegerFieldUpdater STATE = AtomicIntegerFieldUpdater.newUpdater(Cookies.class, "state"); + static final Logger log = Loggers.getLogger(Cookies.class); - protected Cookies(HttpHeaders nettyHeaders, CharSequence cookiesHeaderName, boolean isClientChannel, - CookieDecoder decoder) { + protected Cookies(HttpHeaders nettyHeaders) { this.nettyHeaders = Objects.requireNonNull(nettyHeaders, "nettyHeaders"); - this.cookiesHeaderName = cookiesHeaderName; - this.isClientChannel = isClientChannel; - this.decoder = Objects.requireNonNull(decoder, "decoder"); cachedCookies = Collections.emptyMap(); } @@ -77,7 +70,7 @@ protected Cookies(HttpHeaders nettyHeaders, CharSequence cookiesHeaderName, bool * * @return the cached map of cookies */ - public Map> getCachedCookies() { + public Map> getCachedCookies() { if (!markReadingCookies()) { for (;;) { if (hasReadCookies()) { @@ -86,35 +79,30 @@ public Map> getCachedCookies() { } } - List allCookieHeaders = allCookieHeaders(); - Map> cookies = new HashMap<>(); - for (String aCookieHeader : allCookieHeaders) { - Set decode; - if (isClientChannel) { - final Cookie c = ((ClientCookieDecoder) decoder).decode(aCookieHeader); - if (c == null) { - continue; - } - Set existingCookiesOfName = cookies.computeIfAbsent(c.name(), k -> new HashSet<>()); - existingCookiesOfName.add(c); + Map> cookies = new HashMap<>(); + Iterator setCookieItr = nettyHeaders.getSetCookiesIterator(); + int setCookieIndex = -1; + while (setCookieItr.hasNext()) { + try { + setCookieIndex++; + HttpSetCookie setCookie = setCookieItr.next(); + Set existingCookiesOfName = cookies.computeIfAbsent(setCookie.name(), k -> new HashSet<>()); + existingCookiesOfName.add(setCookie); } - else { - decode = ((ServerCookieDecoder) decoder).decode(aCookieHeader); - for (Cookie cookie : decode) { - Set existingCookiesOfName = cookies.computeIfAbsent(cookie.name(), k -> new HashSet<>()); - existingCookiesOfName.add(cookie); + catch (IllegalArgumentException err) { + // Ignore invalid syntax or whatever decoding error for the current Set-Cookie header. + // Since we don't know which Set-Cookie header is not parsed, we log the Set-Cookie header index number. + if (log.isDebugEnabled()) { + log.debug("Ignoring invalid Set-Cookie header (header index #{}) : {}", setCookieIndex, err.toString()); } } } + cachedCookies = Collections.unmodifiableMap(cookies); markReadCookies(); return cachedCookies; } - protected List allCookieHeaders() { - return nettyHeaders.getAll(cookiesHeaderName); - } - protected final boolean hasReadCookies() { return state == READ; } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/HttpInfos.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/HttpInfos.java index b550a21e0e..ae88bc76c4 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/HttpInfos.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/HttpInfos.java @@ -20,7 +20,7 @@ import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpVersion; -import io.netty5.handler.codec.http.cookie.Cookie; +import io.netty5.handler.codec.http.headers.HttpCookiePair; /** * An Http Reactive Channel with several accessors related to HTTP flow: headers, params, @@ -32,11 +32,11 @@ public interface HttpInfos { /** - * Returns resolved HTTP cookies + * Returns resolved HTTP cookies. * * @return Resolved HTTP cookies */ - Map> cookies(); + Map> cookies(); /** * Returns the decoded path portion from the {@link #uri()} diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/HttpOperations.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/HttpOperations.java index cbaea0635e..b7aed8e283 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/HttpOperations.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/HttpOperations.java @@ -26,8 +26,9 @@ import java.util.function.Predicate; import java.util.regex.Pattern; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.util.Resource; import io.netty5.channel.ChannelHandler; import io.netty5.channel.CombinedChannelDuplexHandler; @@ -229,12 +230,12 @@ public final NettyOutbound sendFile(Path file, long position, long count) { if (!HttpUtil.isTransferEncodingChunked(outboundHttpMessage()) && !HttpUtil.isContentLengthSet( outboundHttpMessage()) && count < Integer.MAX_VALUE) { outboundHttpMessage().headers() - .setInt(HttpHeaderNames.CONTENT_LENGTH, (int) count); + .set(HttpHeaderNames.CONTENT_LENGTH, String.valueOf(count)); } else if (!HttpUtil.isContentLengthSet(outboundHttpMessage())) { - outboundHttpMessage().headers() - .remove(HttpHeaderNames.CONTENT_LENGTH) - .remove(HttpHeaderNames.TRANSFER_ENCODING); + HttpHeaders headers = outboundHttpMessage().headers(); + headers.remove(HttpHeaderNames.CONTENT_LENGTH); + headers.remove(HttpHeaderNames.TRANSFER_ENCODING); HttpUtil.setTransferEncodingChunked(outboundHttpMessage(), true); } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/AbstractHttpClientMetricsHandler.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/AbstractHttpClientMetricsHandler.java index 496f332048..f5f4897bac 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/AbstractHttpClientMetricsHandler.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/AbstractHttpClientMetricsHandler.java @@ -16,7 +16,7 @@ package reactor.netty5.http.client; import io.netty.buffer.ByteBufHolder; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.Channel; import io.netty5.channel.ChannelHandlerAdapter; import io.netty5.channel.ChannelHandlerContext; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/FailedHttpClientRequest.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/FailedHttpClientRequest.java index 374d0e763c..2064a4daa4 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/FailedHttpClientRequest.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/FailedHttpClientRequest.java @@ -17,11 +17,10 @@ import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpHeaderValues; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpVersion; -import io.netty5.handler.codec.http.cookie.ClientCookieDecoder; -import io.netty5.handler.codec.http.cookie.Cookie; +import io.netty5.handler.codec.http.headers.HttpCookiePair; import reactor.netty5.http.Cookies; import reactor.netty5.http.HttpOperations; import reactor.util.context.ContextView; @@ -40,7 +39,6 @@ final class FailedHttpClientRequest implements HttpClientRequest { final ContextView contextView; - final ClientCookieDecoder cookieDecoder; final HttpHeaders headers; final boolean isWebsocket; final HttpMethod method; @@ -50,7 +48,6 @@ final class FailedHttpClientRequest implements HttpClientRequest { FailedHttpClientRequest(ContextView contextView, HttpClientConfig c) { this.contextView = contextView; - this.cookieDecoder = c.cookieDecoder; this.headers = c.headers; this.isWebsocket = c.websocketClientSpec != null; this.method = c.method; @@ -60,7 +57,7 @@ final class FailedHttpClientRequest implements HttpClientRequest { } @Override - public HttpClientRequest addCookie(Cookie cookie) { + public HttpClientRequest addCookie(HttpCookiePair cookie) { throw new UnsupportedOperationException("Should not add Cookie"); } @@ -70,8 +67,8 @@ public HttpClientRequest addHeader(CharSequence name, CharSequence value) { } @Override - public Map> cookies() { - return Cookies.newClientResponseHolder(headers, cookieDecoder) + public Map> cookies() { + return Cookies.newClientResponseHolder(headers) .getCachedCookies(); } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/Http2StreamBridgeClientHandler.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/Http2StreamBridgeClientHandler.java index f177b47642..251ce39b1d 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/Http2StreamBridgeClientHandler.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/Http2StreamBridgeClientHandler.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http.client; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.ChannelHandlerAdapter; import io.netty5.channel.ChannelHandlerContext; import io.netty5.handler.codec.http.DefaultHttpContent; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClient.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClient.java index 8f54e7f330..a1738cee12 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClient.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClient.java @@ -27,17 +27,14 @@ import java.util.function.Function; import java.util.function.Supplier; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpHeaderValues; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpCookiePair; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpUtil; import io.netty5.handler.codec.http.HttpVersion; -import io.netty5.handler.codec.http.cookie.ClientCookieDecoder; -import io.netty5.handler.codec.http.cookie.ClientCookieEncoder; -import io.netty5.handler.codec.http.cookie.Cookie; -import io.netty5.handler.codec.http.cookie.DefaultCookie; import io.netty5.handler.ssl.OpenSsl; import io.netty5.handler.ssl.SslContext; import org.reactivestreams.Publisher; @@ -426,12 +423,12 @@ else if (configuration().acceptGzip) { * * @return a new {@link HttpClient} */ - public final HttpClient cookie(Cookie cookie) { + public final HttpClient cookie(HttpCookiePair cookie) { Objects.requireNonNull(cookie, "cookie"); - if (!cookie.value().isEmpty()) { + if (cookie.value().length() > 0) { HttpClient dup = duplicate(); HttpHeaders headers = configuration().headers.copy(); - headers.add(HttpHeaderNames.COOKIE, dup.configuration().cookieEncoder.encode(cookie)); + headers.addCookie(cookie); dup.configuration().headers = headers; return dup; } @@ -439,75 +436,24 @@ public final HttpClient cookie(Cookie cookie) { } /** - * Apply cookies configuration. - * - * @param cookieBuilder the header {@link Consumer} to invoke before requesting - * - * @return a new {@link HttpClient} - */ - public final HttpClient cookie(String name, Consumer cookieBuilder) { - Objects.requireNonNull(name, "name"); - Objects.requireNonNull(cookieBuilder, "cookieBuilder"); - Cookie cookie = new DefaultCookie(name, ""); - cookieBuilder.accept(cookie); - return cookie(cookie); - } - - /** - * Configure the - * {@link ClientCookieEncoder}, {@link ClientCookieDecoder} will be - * chosen based on the encoder - * - * @param encoder the preferred ClientCookieEncoder - * - * @return a new {@link HttpClient} - */ - public final HttpClient cookieCodec(ClientCookieEncoder encoder) { - Objects.requireNonNull(encoder, "encoder"); - ClientCookieDecoder decoder = encoder == ClientCookieEncoder.LAX ? - ClientCookieDecoder.LAX : ClientCookieDecoder.STRICT; - return cookieCodec(encoder, decoder); - } - - /** - * Configure the - * {@link ClientCookieEncoder} and {@link ClientCookieDecoder} + * Apply cookies configuration emitted by the specified Mono before requesting. * - * @param encoder the preferred ClientCookieEncoder - * @param decoder the preferred ClientCookieDecoder + * @param cookieMono the mono providing the {@link HttpCookiePair} to add before sending * * @return a new {@link HttpClient} */ - public final HttpClient cookieCodec(ClientCookieEncoder encoder, ClientCookieDecoder decoder) { - Objects.requireNonNull(encoder, "encoder"); - Objects.requireNonNull(decoder, "decoder"); - HttpClient dup = duplicate(); - dup.configuration().cookieEncoder = encoder; - dup.configuration().cookieDecoder = decoder; - return dup; - } - - /** - * Apply cookies configuration emitted by the returned Mono before requesting. - * - * @param cookieBuilder the cookies {@link Function} to invoke before sending - * - * @return a new {@link HttpClient} - */ - public final HttpClient cookiesWhen(String name, Function> cookieBuilder) { - Objects.requireNonNull(name, "name"); - Objects.requireNonNull(cookieBuilder, "cookieBuilder"); + public final HttpClient cookiesWhen(Mono cookieMono) { + Objects.requireNonNull(cookieMono, "cookieMono"); HttpClient dup = duplicate(); dup.configuration().deferredConf(config -> - cookieBuilder.apply(new DefaultCookie(name, "")) - .map(c -> { - if (!c.value().isEmpty()) { - HttpHeaders headers = configuration().headers.copy(); - headers.add(HttpHeaderNames.COOKIE, config.cookieEncoder.encode(c)); - config.headers = headers; - } - return config; - })); + cookieMono.map(c -> { + if (c.value().length() > 0) { + HttpHeaders headers = configuration().headers.copy(); + headers.addCookie(c); + config.headers = headers; + } + return config; + })); return dup; } @@ -1358,7 +1304,7 @@ public final HttpClient wiretap(boolean enable) { } static boolean isCompressing(HttpHeaders h) { - return h.contains(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP, true); + return h.containsIgnoreCase(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP); } static String reactorNettyVersion() { diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConfig.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConfig.java index 4493fb9239..fa69f160bc 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConfig.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConfig.java @@ -37,14 +37,11 @@ import io.netty5.channel.ChannelInitializer; import io.netty5.channel.ChannelOption; import io.netty5.channel.ChannelPipeline; -import io.netty5.handler.codec.http.DefaultHttpHeaders; import io.netty5.handler.codec.http.HttpClientCodec; import io.netty5.handler.codec.http.HttpClientUpgradeHandler; import io.netty5.handler.codec.http.HttpContentDecompressor; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpMethod; -import io.netty5.handler.codec.http.cookie.ClientCookieDecoder; -import io.netty5.handler.codec.http.cookie.ClientCookieEncoder; import io.netty5.handler.codec.http2.Http2ClientUpgradeCodec; import io.netty5.handler.codec.http2.Http2FrameCodec; import io.netty5.handler.codec.http2.Http2FrameCodecBuilder; @@ -111,7 +108,7 @@ public int channelHash() { @Override public ChannelOperations.OnSetup channelOperationsProvider() { - return (ch, c, msg) -> new HttpClientOperations(ch, c, cookieEncoder, cookieDecoder); + return (ch, c, msg) -> new HttpClientOperations(ch, c); } @Override @@ -119,24 +116,6 @@ public ConnectionProvider connectionProvider() { return httpConnectionProvider().http1ConnectionProvider(); } - /** - * Return the configured {@link ClientCookieDecoder} or the default {@link ClientCookieDecoder#STRICT}. - * - * @return the configured {@link ClientCookieDecoder} or the default {@link ClientCookieDecoder#STRICT} - */ - public ClientCookieDecoder cookieDecoder() { - return cookieDecoder; - } - - /** - * Return the configured {@link ClientCookieEncoder} or the default {@link ClientCookieEncoder#STRICT}. - * - * @return the configured {@link ClientCookieEncoder} or the default {@link ClientCookieEncoder#STRICT} - */ - public ClientCookieEncoder cookieEncoder() { - return cookieEncoder; - } - /** * Return the configured HTTP response decoder options or the default. * @@ -298,8 +277,6 @@ public WebsocketClientSpec websocketClientSpec() { String baseUrl; BiFunction> body; Function, ? extends Mono> connector; - ClientCookieDecoder cookieDecoder; - ClientCookieEncoder cookieEncoder; HttpResponseDecoderSpec decoder; Function, Mono> deferredConf; BiConsumer doAfterRequest; @@ -329,10 +306,8 @@ public WebsocketClientSpec websocketClientSpec() { Supplier remoteAddress) { super(connectionProvider, options, remoteAddress); this.acceptGzip = false; - this.cookieDecoder = ClientCookieDecoder.STRICT; - this.cookieEncoder = ClientCookieEncoder.STRICT; this.decoder = new HttpResponseDecoderSpec(); - this.headers = new DefaultHttpHeaders(); + this.headers = HttpHeaders.newHeaders(); this.method = HttpMethod.GET; this.protocols = new HttpProtocol[]{HttpProtocol.HTTP11}; this._protocols = h11; @@ -345,8 +320,6 @@ public WebsocketClientSpec websocketClientSpec() { this.baseUrl = parent.baseUrl; this.body = parent.body; this.connector = parent.connector; - this.cookieDecoder = parent.cookieDecoder; - this.cookieEncoder = parent.cookieEncoder; this.decoder = parent.decoder; this.deferredConf = parent.deferredConf; this.doAfterRequest = parent.doAfterRequest; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConnect.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConnect.java index 38caf34ab6..7539c01c66 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConnect.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConnect.java @@ -34,7 +34,7 @@ import io.netty5.channel.ChannelOption; import io.netty5.handler.codec.http.HttpHeaderNames; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpResponseStatus; import io.netty5.handler.codec.http.HttpUtil; @@ -502,18 +502,19 @@ Publisher requestWithBody(HttpClientOperations ch) { Consumer consumer = null; if (fromURI != null && !toURI.equals(fromURI)) { if (handler instanceof RedirectSendHandler) { - headers.remove(HttpHeaderNames.EXPECT) - .remove(HttpHeaderNames.COOKIE) - .remove(HttpHeaderNames.AUTHORIZATION) - .remove(HttpHeaderNames.PROXY_AUTHORIZATION); + headers.remove(HttpHeaderNames.EXPECT); + headers.remove(HttpHeaderNames.COOKIE); + headers.remove(HttpHeaderNames.AUTHORIZATION); + headers.remove(HttpHeaderNames.PROXY_AUTHORIZATION); } else { - consumer = request -> - request.requestHeaders() - .remove(HttpHeaderNames.EXPECT) - .remove(HttpHeaderNames.COOKIE) - .remove(HttpHeaderNames.AUTHORIZATION) - .remove(HttpHeaderNames.PROXY_AUTHORIZATION); + consumer = request -> { + HttpHeaders requestHeaders = request.requestHeaders(); + requestHeaders.remove(HttpHeaderNames.EXPECT); + requestHeaders.remove(HttpHeaderNames.COOKIE); + requestHeaders.remove(HttpHeaderNames.AUTHORIZATION); + requestHeaders.remove(HttpHeaderNames.PROXY_AUTHORIZATION); + }; } } if (this.redirectRequestConsumer != null) { diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientFinalizer.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientFinalizer.java index d85f81bfc4..d54d7a344d 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientFinalizer.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientFinalizer.java @@ -20,8 +20,8 @@ import java.util.function.BiFunction; import java.util.function.Function; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; import io.netty5.channel.ChannelOption; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; @@ -32,7 +32,7 @@ import reactor.netty5.NettyOutbound; import reactor.netty5.channel.ChannelOperations; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; /** * Configures the HTTP request before calling one of the terminal, diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientInfos.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientInfos.java index 34d827a3d1..e56d17ab21 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientInfos.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientInfos.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http.client; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import reactor.netty5.http.HttpInfos; import reactor.util.annotation.Nullable; import reactor.util.context.ContextView; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientOperations.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientOperations.java index 15e57020df..08f1834c0a 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientOperations.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientOperations.java @@ -31,9 +31,9 @@ import java.util.function.Supplier; import io.netty.buffer.ByteBufHolder; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; -import io.netty5.buffer.api.CompositeBuffer; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; +import io.netty5.buffer.CompositeBuffer; import io.netty5.channel.ChannelHandler; import io.netty5.channel.ChannelHandlerContext; import io.netty5.channel.ChannelOption; @@ -42,7 +42,8 @@ import io.netty5.handler.codec.http.EmptyLastHttpContent; import io.netty5.handler.codec.http.FullHttpResponse; import io.netty5.handler.codec.http.HttpHeaderNames; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpCookiePair; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpMessage; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpObjectAggregator; @@ -52,9 +53,6 @@ import io.netty5.handler.codec.http.HttpUtil; import io.netty5.handler.codec.http.HttpVersion; import io.netty5.handler.codec.http.LastHttpContent; -import io.netty5.handler.codec.http.cookie.ClientCookieDecoder; -import io.netty5.handler.codec.http.cookie.ClientCookieEncoder; -import io.netty5.handler.codec.http.cookie.Cookie; import io.netty5.handler.codec.http.websocketx.extensions.compression.WebSocketClientCompressionHandler; import io.netty5.handler.timeout.ReadTimeoutHandler; import io.netty5.util.Resource; @@ -90,8 +88,6 @@ class HttpClientOperations extends HttpOperations final boolean isSecure; final HttpRequest nettyRequest; final HttpHeaders requestHeaders; - final ClientCookieEncoder cookieEncoder; - final ClientCookieDecoder cookieDecoder; final Sinks.One trailerHeaders; Supplier[] redirectedFrom = EMPTY_REDIRECTIONS; @@ -125,8 +121,6 @@ class HttpClientOperations extends HttpOperations this.responseState = replaced.responseState; this.followRedirectPredicate = replaced.followRedirectPredicate; this.requestHeaders = replaced.requestHeaders; - this.cookieEncoder = replaced.cookieEncoder; - this.cookieDecoder = replaced.cookieDecoder; this.resourceUrl = replaced.resourceUrl; this.path = replaced.path; this.responseTimeout = replaced.responseTimeout; @@ -134,23 +128,20 @@ class HttpClientOperations extends HttpOperations this.trailerHeaders = replaced.trailerHeaders; } - HttpClientOperations(Connection c, ConnectionObserver listener, ClientCookieEncoder encoder, ClientCookieDecoder decoder) { + HttpClientOperations(Connection c, ConnectionObserver listener) { super(c, listener); this.isSecure = c.channel() .pipeline() .get(NettyPipeline.SslHandler) != null; this.nettyRequest = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"); this.requestHeaders = nettyRequest.headers(); - this.cookieDecoder = decoder; - this.cookieEncoder = encoder; this.trailerHeaders = Sinks.unsafe().one(); } @Override - public HttpClientRequest addCookie(Cookie cookie) { + public HttpClientRequest addCookie(HttpCookiePair cookie) { if (!hasSentHeaders()) { - this.requestHeaders.add(HttpHeaderNames.COOKIE, - cookieEncoder.encode(cookie)); + this.requestHeaders.addCookie(cookie); } else { throw new IllegalStateException("Status and headers already sent"); @@ -225,7 +216,7 @@ public HttpClientOperations withConnection(Consumer withConn } @Override - public Map> cookies() { + public Map> cookies() { ResponseState responseState = this.responseState; if (responseState != null && responseState.cookieHolder != null) { return responseState.cookieHolder.getCachedCookies(); @@ -295,7 +286,7 @@ public HttpClientRequest header(CharSequence name, CharSequence value) { @Override public HttpClientRequest headers(HttpHeaders headers) { if (!hasSentHeaders()) { - String host = requestHeaders.get(HttpHeaderNames.HOST); + CharSequence host = requestHeaders.get(HttpHeaderNames.HOST); this.requestHeaders.set(headers); this.requestHeaders.set(HttpHeaderNames.HOST, host); } @@ -439,7 +430,7 @@ final URI websocketUri() { uri = new URI(url); } else { - String host = requestHeaders().get(HttpHeaderNames.HOST); + CharSequence host = requestHeaders().get(HttpHeaderNames.HOST); uri = new URI((isSecure ? HttpClient.WSS_SCHEME : HttpClient.WS_SCHEME) + "://" + host + (url.startsWith("/") ? url : "/" + url)); } @@ -598,8 +589,7 @@ protected void onInboundNext(ChannelHandlerContext ctx, Object msg) { if (log.isDebugEnabled()) { log.debug(format(channel(), "Received response (auto-read:{}) : {}"), channel().getOption(ChannelOption.AUTO_READ), - responseHeaders().entries() - .toString()); + responseHeaders().toString()); } if (notRedirected(response)) { @@ -703,7 +693,6 @@ final boolean notRedirected(HttpResponse response) { if (log.isDebugEnabled()) { log.debug(format(channel(), "Received redirect location: {}"), response.headers() - .entries() .toString()); } redirecting = new RedirectClientException(response.headers(), response.status()); @@ -716,7 +705,7 @@ final boolean notRedirected(HttpResponse response) { protected HttpMessage newFullBodyMessage(Buffer body) { HttpRequest request = new DefaultFullHttpRequest(version(), method(), uri(), body); - requestHeaders.setInt(HttpHeaderNames.CONTENT_LENGTH, body.readableBytes()); + requestHeaders.set(HttpHeaderNames.CONTENT_LENGTH, String.valueOf(body.readableBytes())); requestHeaders.remove(HttpHeaderNames.TRANSFER_ENCODING); request.headers() @@ -753,7 +742,7 @@ final void setNettyResponse(HttpResponse nettyResponse) { ResponseState state = responseState; if (state == null) { this.responseState = - new ResponseState(nettyResponse, nettyResponse.headers(), cookieDecoder); + new ResponseState(nettyResponse, nettyResponse.headers()); } } @@ -788,10 +777,10 @@ static final class ResponseState { final HttpHeaders headers; final Cookies cookieHolder; - ResponseState(HttpResponse response, HttpHeaders headers, ClientCookieDecoder decoder) { + ResponseState(HttpResponse response, HttpHeaders headers) { this.response = response; this.headers = headers; - this.cookieHolder = Cookies.newClientResponseHolder(headers, decoder); + this.cookieHolder = Cookies.newClientResponseHolder(headers); } } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientProxyProvider.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientProxyProvider.java index f8224cd370..e9d2f49533 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientProxyProvider.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientProxyProvider.java @@ -17,8 +17,7 @@ import io.netty.contrib.handler.proxy.HttpProxyHandler; import io.netty.contrib.handler.proxy.ProxyHandler; -import io.netty5.handler.codec.http.DefaultHttpHeaders; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import reactor.netty5.transport.ProxyProvider; import java.util.Objects; @@ -103,10 +102,10 @@ public Build get() { @Override public Build httpHeaders(Consumer headers) { if (headers != null) { - this.httpHeaders = () -> new DefaultHttpHeaders() { - { - headers.accept(this); - } + this.httpHeaders = () -> { + HttpHeaders newHeaders = HttpHeaders.newHeaders(); + headers.accept(newHeaders); + return newHeaders; }; } return get(); diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientRequest.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientRequest.java index df4144a0ca..109ea09980 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientRequest.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientRequest.java @@ -15,8 +15,8 @@ */ package reactor.netty5.http.client; -import io.netty5.handler.codec.http.HttpHeaders; -import io.netty5.handler.codec.http.cookie.Cookie; +import io.netty5.handler.codec.http.headers.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpCookiePair; import java.time.Duration; @@ -34,7 +34,7 @@ public interface HttpClientRequest extends HttpClientInfos { * * @return this outbound */ - HttpClientRequest addCookie(Cookie cookie); + HttpClientRequest addCookie(HttpCookiePair cookie); /** * Add an outbound http header, appending the value if the header is already set. diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientResponse.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientResponse.java index 4320a4c646..b0a037f8f3 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientResponse.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientResponse.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http.client; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpResponseStatus; import reactor.core.publisher.Mono; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/RedirectClientException.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/RedirectClientException.java index 042c91d26e..6ac13a3f26 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/RedirectClientException.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/RedirectClientException.java @@ -18,7 +18,7 @@ import java.util.Objects; import io.netty5.handler.codec.http.HttpHeaderNames; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpResponseStatus; /** @@ -31,7 +31,7 @@ final class RedirectClientException extends RuntimeException { final HttpResponseStatus status; RedirectClientException(HttpHeaders headers, HttpResponseStatus status) { - location = Objects.requireNonNull(headers.get(HttpHeaderNames.LOCATION)); + location = Objects.requireNonNull(headers.get(HttpHeaderNames.LOCATION)).toString(); this.status = Objects.requireNonNull(status); } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/WebsocketClientOperations.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/WebsocketClientOperations.java index 15e7b2af5c..07127801f9 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/WebsocketClientOperations.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/WebsocketClientOperations.java @@ -18,14 +18,14 @@ import java.net.URI; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.Channel; import io.netty5.channel.ChannelFutureListeners; import io.netty5.channel.ChannelHandlerContext; import io.netty5.handler.codec.http.EmptyLastHttpContent; import io.netty5.handler.codec.http.FullHttpResponse; import io.netty5.handler.codec.http.HttpHeaderNames; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpObjectAggregator; import io.netty5.handler.codec.http.websocketx.CloseWebSocketFrame; import io.netty5.handler.codec.http.websocketx.PingWebSocketFrame; @@ -68,12 +68,13 @@ final class WebsocketClientOperations extends HttpClientOperations onCloseState = Sinks.unsafe().one(); String subprotocols = websocketClientSpec.protocols(); + HttpHeaders replacedRequestHeaders = replaced.requestHeaders(); + replacedRequestHeaders.remove(HttpHeaderNames.HOST); handshaker = WebSocketClientHandshakerFactory.newHandshaker(currentURI, websocketClientSpec.version(), subprotocols != null && !subprotocols.isEmpty() ? subprotocols : null, true, - replaced.requestHeaders() - .remove(HttpHeaderNames.HOST), + replacedRequestHeaders, websocketClientSpec.maxFramePayloadLength()); handshaker.handshake(channel) diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/WebsocketFinalizer.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/WebsocketFinalizer.java index f19aace73c..e36e615568 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/WebsocketFinalizer.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/WebsocketFinalizer.java @@ -20,7 +20,7 @@ import java.util.function.BiFunction; import java.util.function.Function; -import io.netty5.buffer.api.BufferAllocator; +import io.netty5.buffer.BufferAllocator; import io.netty5.channel.ChannelOption; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; @@ -31,7 +31,7 @@ import reactor.netty5.http.websocket.WebsocketInbound; import reactor.netty5.http.websocket.WebsocketOutbound; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static reactor.netty5.http.client.HttpClientFinalizer.contentReceiver; /** diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/AbstractHttpServerMetricsHandler.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/AbstractHttpServerMetricsHandler.java index f43bc7aa5f..bd0e26e6e5 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/AbstractHttpServerMetricsHandler.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/AbstractHttpServerMetricsHandler.java @@ -16,7 +16,7 @@ package reactor.netty5.http.server; import io.netty.buffer.ByteBufHolder; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.ChannelHandlerAdapter; import io.netty5.channel.ChannelHandlerContext; import io.netty5.handler.codec.http.HttpContent; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/DefaultHttpForwardedHeaderHandler.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/DefaultHttpForwardedHeaderHandler.java index bdd75daef0..a66198c2ac 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/DefaultHttpForwardedHeaderHandler.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/DefaultHttpForwardedHeaderHandler.java @@ -42,9 +42,9 @@ final class DefaultHttpForwardedHeaderHandler implements BiFunction { final BiPredicate compress; - final ServerCookieDecoder cookieDecoder; - final ServerCookieEncoder cookieEncoder; final HttpServerFormDecoderProvider formDecoderProvider; final BiFunction forwardedHeaderHandler; final ConnectionObserver listener; @@ -70,15 +66,11 @@ final class Http2StreamBridgeServerHandler extends ChannelHandlerAdapter impleme Http2StreamBridgeServerHandler( @Nullable BiPredicate compress, - ServerCookieDecoder decoder, - ServerCookieEncoder encoder, HttpServerFormDecoderProvider formDecoderProvider, @Nullable BiFunction forwardedHeaderHandler, ConnectionObserver listener, @Nullable BiFunction, ? super Connection, ? extends Mono> mapHandle) { this.compress = compress; - this.cookieDecoder = decoder; - this.cookieEncoder = encoder; this.formDecoderProvider = formDecoderProvider; this.forwardedHeaderHandler = forwardedHeaderHandler; this.listener = listener; @@ -116,8 +108,6 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) { secured, remoteAddress, forwardedHeaderHandler), - cookieDecoder, - cookieEncoder, formDecoderProvider, mapHandle, secured); diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServer.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServer.java index df1aa4b857..3df98c7e53 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServer.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServer.java @@ -27,8 +27,6 @@ import io.netty5.channel.group.ChannelGroup; import io.netty5.handler.codec.http.HttpRequest; -import io.netty5.handler.codec.http.cookie.ServerCookieDecoder; -import io.netty5.handler.codec.http.cookie.ServerCookieEncoder; import io.netty5.handler.ssl.JdkSslContext; import io.netty5.handler.ssl.OpenSsl; import io.netty5.handler.ssl.SslContext; @@ -220,43 +218,6 @@ public final HttpServer compress(int minResponseSize) { return dup; } - /** - * Configure the - * {@link ServerCookieEncoder}; {@link ServerCookieDecoder} will be - * chosen based on the encoder - * - * @param encoder the preferred ServerCookieEncoder - * - * @return a new {@link HttpServer} - */ - public final HttpServer cookieCodec(ServerCookieEncoder encoder) { - Objects.requireNonNull(encoder, "encoder"); - ServerCookieDecoder decoder = encoder == ServerCookieEncoder.LAX ? - ServerCookieDecoder.LAX : ServerCookieDecoder.STRICT; - HttpServer dup = duplicate(); - dup.configuration().cookieEncoder = encoder; - dup.configuration().cookieDecoder = decoder; - return dup; - } - - /** - * Configure the - * {@link ServerCookieEncoder} and {@link ServerCookieDecoder} - * - * @param encoder the preferred ServerCookieEncoder - * @param decoder the preferred ServerCookieDecoder - * - * @return a new {@link HttpServer} - */ - public final HttpServer cookieCodec(ServerCookieEncoder encoder, ServerCookieDecoder decoder) { - Objects.requireNonNull(encoder, "encoder"); - Objects.requireNonNull(decoder, "decoder"); - HttpServer dup = duplicate(); - dup.configuration().cookieEncoder = encoder; - dup.configuration().cookieDecoder = decoder; - return dup; - } - /** * Specifies a custom request handler for deriving information about the connection. * diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerConfig.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerConfig.java index eb56b4ef09..bbf8590b59 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerConfig.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerConfig.java @@ -27,8 +27,6 @@ import io.netty5.handler.codec.http.HttpRequest; import io.netty5.handler.codec.http.HttpServerCodec; import io.netty5.handler.codec.http.HttpServerUpgradeHandler; -import io.netty5.handler.codec.http.cookie.ServerCookieDecoder; -import io.netty5.handler.codec.http.cookie.ServerCookieEncoder; import io.netty5.handler.codec.http2.CleartextHttp2ServerUpgradeHandler; import io.netty5.handler.codec.http2.Http2CodecUtil; import io.netty5.handler.codec.http2.Http2FrameCodec; @@ -99,24 +97,6 @@ public BiPredicate compressPredicate() { return compressPredicate; } - /** - * Return the configured {@link ServerCookieDecoder} or the default {@link ServerCookieDecoder#STRICT}. - * - * @return the configured {@link ServerCookieDecoder} or the default {@link ServerCookieDecoder#STRICT} - */ - public ServerCookieDecoder cookieDecoder() { - return cookieDecoder; - } - - /** - * Return the configured {@link ServerCookieEncoder} or the default {@link ServerCookieEncoder#STRICT}. - * - * @return the configured {@link ServerCookieEncoder} or the default {@link ServerCookieEncoder#STRICT} - */ - public ServerCookieEncoder cookieEncoder() { - return cookieEncoder; - } - /** * Return the configured HTTP request decoder options or the default. * @@ -257,8 +237,6 @@ public Function uriTagValue() { boolean accessLogEnabled; Function accessLog; BiPredicate compressPredicate; - ServerCookieDecoder cookieDecoder; - ServerCookieEncoder cookieEncoder; HttpRequestDecoderSpec decoder; HttpServerFormDecoderProvider formDecoderProvider; BiFunction forwardedHeaderHandler; @@ -277,8 +255,6 @@ public Function uriTagValue() { HttpServerConfig(Map, ?> options, Map, ?> childOptions, Supplier localAddress) { super(options, childOptions, localAddress); - this.cookieDecoder = ServerCookieDecoder.STRICT; - this.cookieEncoder = ServerCookieEncoder.STRICT; this.decoder = new HttpRequestDecoderSpec(); this.formDecoderProvider = DEFAULT_FORM_DECODER_SPEC; this.maxKeepAliveRequests = -1; @@ -294,8 +270,6 @@ public Function uriTagValue() { this.accessLogEnabled = parent.accessLogEnabled; this.accessLog = parent.accessLog; this.compressPredicate = parent.compressPredicate; - this.cookieDecoder = parent.cookieDecoder; - this.cookieEncoder = parent.cookieEncoder; this.decoder = parent.decoder; this.formDecoderProvider = parent.formDecoderProvider; this.forwardedHeaderHandler = parent.forwardedHeaderHandler; @@ -400,8 +374,6 @@ static void addStreamHandlers(Channel ch, boolean accessLogEnabled, @Nullable Function accessLog, @Nullable BiPredicate compressPredicate, - ServerCookieDecoder decoder, - ServerCookieEncoder encoder, HttpServerFormDecoderProvider formDecoderProvider, @Nullable BiFunction forwardedHeaderHandler, ConnectionObserver listener, @@ -416,7 +388,7 @@ static void addStreamHandlers(Channel ch, } pipeline.addLast(NettyPipeline.H2ToHttp11Codec, HTTP2_STREAM_FRAME_TO_HTTP_OBJECT) .addLast(NettyPipeline.HttpTrafficHandler, - new Http2StreamBridgeServerHandler(compressPredicate, decoder, encoder, formDecoderProvider, + new Http2StreamBridgeServerHandler(compressPredicate, formDecoderProvider, forwardedHeaderHandler, listener, mapHandle)); boolean alwaysCompress = compressPredicate == null && minCompressionSize == 0; @@ -482,7 +454,7 @@ static BiPredicate compressPredicate( BiPredicate lengthPredicate = (req, res) -> { - String length = res.responseHeaders() + CharSequence length = res.responseHeaders() .get(HttpHeaderNames.CONTENT_LENGTH); if (length == null) { @@ -490,7 +462,7 @@ static BiPredicate compressPredicate( } try { - return Long.parseLong(length) >= minResponseSize; + return Long.parseLong(length.toString()) >= minResponseSize; } catch (NumberFormatException nfe) { return true; @@ -507,8 +479,6 @@ static void configureH2Pipeline(ChannelPipeline p, boolean accessLogEnabled, @Nullable Function accessLog, @Nullable BiPredicate compressPredicate, - ServerCookieDecoder cookieDecoder, - ServerCookieEncoder cookieEncoder, HttpServerFormDecoderProvider formDecoderProvider, @Nullable BiFunction forwardedHeaderHandler, Http2Settings http2Settings, @@ -534,8 +504,8 @@ static void configureH2Pipeline(ChannelPipeline p, p.addLast(NettyPipeline.HttpCodec, http2FrameCodecBuilder.build()) .addLast(NettyPipeline.H2MultiplexHandler, - new Http2MultiplexHandler(new H2Codec(accessLogEnabled, accessLog, compressPredicate, cookieDecoder, - cookieEncoder, formDecoderProvider, forwardedHeaderHandler, listener, mapHandle, + new Http2MultiplexHandler(new H2Codec(accessLogEnabled, accessLog, compressPredicate, + formDecoderProvider, forwardedHeaderHandler, listener, mapHandle, metricsRecorder, minCompressionSize, opsFactory, uriTagValue))); IdleTimeoutHandler.addIdleTimeoutHandler(p, idleTimeout); @@ -554,8 +524,6 @@ static void configureHttp11OrH2CleartextPipeline(ChannelPipeline p, boolean accessLogEnabled, @Nullable Function accessLog, @Nullable BiPredicate compressPredicate, - ServerCookieDecoder cookieDecoder, - ServerCookieEncoder cookieEncoder, HttpRequestDecoderSpec decoder, HttpServerFormDecoderProvider formDecoderProvider, @Nullable BiFunction forwardedHeaderHandler, @@ -574,7 +542,7 @@ static void configureHttp11OrH2CleartextPipeline(ChannelPipeline p, decoder.allowDuplicateContentLengths()); Http11OrH2CleartextCodec upgrader = new Http11OrH2CleartextCodec(accessLogEnabled, accessLog, compressPredicate, - cookieDecoder, cookieEncoder, p.get(NettyPipeline.LoggingHandler) != null, formDecoderProvider, + p.get(NettyPipeline.LoggingHandler) != null, formDecoderProvider, forwardedHeaderHandler, http2Settings, listener, mapHandle, metricsRecorder, minCompressionSize, opsFactory, uriTagValue, decoder.validateHeaders()); @@ -588,7 +556,7 @@ static void configureHttp11OrH2CleartextPipeline(ChannelPipeline p, NettyPipeline.H2CUpgradeHandler, h2cUpgradeHandler) .addBefore(NettyPipeline.ReactiveBridge, NettyPipeline.HttpTrafficHandler, - new HttpTrafficHandler(compressPredicate, cookieDecoder, cookieEncoder, formDecoderProvider, + new HttpTrafficHandler(compressPredicate, formDecoderProvider, forwardedHeaderHandler, idleTimeout, listener, mapHandle, maxKeepAliveRequests)); if (accessLogEnabled) { @@ -627,8 +595,6 @@ static void configureHttp11Pipeline(ChannelPipeline p, boolean accessLogEnabled, @Nullable Function accessLog, @Nullable BiPredicate compressPredicate, - ServerCookieDecoder cookieDecoder, - ServerCookieEncoder cookieEncoder, HttpRequestDecoderSpec decoder, HttpServerFormDecoderProvider formDecoderProvider, @Nullable BiFunction forwardedHeaderHandler, @@ -646,7 +612,7 @@ static void configureHttp11Pipeline(ChannelPipeline p, decoder.allowDuplicateContentLengths())) .addBefore(NettyPipeline.ReactiveBridge, NettyPipeline.HttpTrafficHandler, - new HttpTrafficHandler(compressPredicate, cookieDecoder, cookieEncoder, formDecoderProvider, + new HttpTrafficHandler(compressPredicate, formDecoderProvider, forwardedHeaderHandler, idleTimeout, listener, mapHandle, maxKeepAliveRequests)); if (accessLogEnabled) { @@ -831,8 +797,6 @@ static final class H2Codec extends ChannelInitializer { final boolean accessLogEnabled; final Function accessLog; final BiPredicate compressPredicate; - final ServerCookieDecoder cookieDecoder; - final ServerCookieEncoder cookieEncoder; final HttpServerFormDecoderProvider formDecoderProvider; final BiFunction forwardedHeaderHandler; final ConnectionObserver listener; @@ -847,8 +811,6 @@ static final class H2Codec extends ChannelInitializer { boolean accessLogEnabled, @Nullable Function accessLog, @Nullable BiPredicate compressPredicate, - ServerCookieDecoder decoder, - ServerCookieEncoder encoder, HttpServerFormDecoderProvider formDecoderProvider, @Nullable BiFunction forwardedHeaderHandler, ConnectionObserver listener, @@ -860,8 +822,6 @@ static final class H2Codec extends ChannelInitializer { this.accessLogEnabled = accessLogEnabled; this.accessLog = accessLog; this.compressPredicate = compressPredicate; - this.cookieDecoder = decoder; - this.cookieEncoder = encoder; this.formDecoderProvider = formDecoderProvider; this.forwardedHeaderHandler = forwardedHeaderHandler; this.listener = listener; @@ -875,7 +835,7 @@ static final class H2Codec extends ChannelInitializer { @Override protected void initChannel(Channel ch) { ch.pipeline().remove(this); - addStreamHandlers(ch, accessLogEnabled, accessLog, compressPredicate, cookieDecoder, cookieEncoder, + addStreamHandlers(ch, accessLogEnabled, accessLog, compressPredicate, formDecoderProvider, forwardedHeaderHandler, listener, mapHandle, metricsRecorder, minCompressionSize, opsFactory, uriTagValue); } @@ -887,8 +847,6 @@ static final class Http11OrH2CleartextCodec extends ChannelInitializer final boolean accessLogEnabled; final Function accessLog; final BiPredicate compressPredicate; - final ServerCookieDecoder cookieDecoder; - final ServerCookieEncoder cookieEncoder; final HttpServerFormDecoderProvider formDecoderProvider; final BiFunction forwardedHeaderHandler; final Http2FrameCodec http2FrameCodec; @@ -904,8 +862,6 @@ static final class Http11OrH2CleartextCodec extends ChannelInitializer boolean accessLogEnabled, @Nullable Function accessLog, @Nullable BiPredicate compressPredicate, - ServerCookieDecoder cookieDecoder, - ServerCookieEncoder cookieEncoder, boolean debug, HttpServerFormDecoderProvider formDecoderProvider, @Nullable BiFunction forwardedHeaderHandler, @@ -920,8 +876,6 @@ static final class Http11OrH2CleartextCodec extends ChannelInitializer this.accessLogEnabled = accessLogEnabled; this.accessLog = accessLog; this.compressPredicate = compressPredicate; - this.cookieDecoder = cookieDecoder; - this.cookieEncoder = cookieEncoder; this.formDecoderProvider = formDecoderProvider; this.forwardedHeaderHandler = forwardedHeaderHandler; Http2FrameCodecBuilder http2FrameCodecBuilder = @@ -949,7 +903,7 @@ static final class Http11OrH2CleartextCodec extends ChannelInitializer @Override protected void initChannel(Channel ch) { ch.pipeline().remove(this); - addStreamHandlers(ch, accessLogEnabled, accessLog, compressPredicate, cookieDecoder, cookieEncoder, + addStreamHandlers(ch, accessLogEnabled, accessLog, compressPredicate, formDecoderProvider, forwardedHeaderHandler, listener, mapHandle, metricsRecorder, minCompressionSize, opsFactory, uriTagValue); } @@ -971,8 +925,6 @@ static final class H2OrHttp11Codec extends ApplicationProtocolNegotiationHandler final boolean accessLogEnabled; final Function accessLog; final BiPredicate compressPredicate; - final ServerCookieDecoder cookieDecoder; - final ServerCookieEncoder cookieEncoder; final HttpRequestDecoderSpec decoder; final HttpServerFormDecoderProvider formDecoderProvider; final BiFunction forwardedHeaderHandler; @@ -992,8 +944,6 @@ static final class H2OrHttp11Codec extends ApplicationProtocolNegotiationHandler this.accessLogEnabled = initializer.accessLogEnabled; this.accessLog = initializer.accessLog; this.compressPredicate = compressPredicate(initializer.compressPredicate, initializer.minCompressionSize); - this.cookieDecoder = initializer.cookieDecoder; - this.cookieEncoder = initializer.cookieEncoder; this.decoder = initializer.decoder; this.formDecoderProvider = initializer.formDecoderProvider; this.forwardedHeaderHandler = initializer.forwardedHeaderHandler; @@ -1017,14 +967,14 @@ protected void configurePipeline(ChannelHandlerContext ctx, String protocol) { ChannelPipeline p = ctx.pipeline(); if (ApplicationProtocolNames.HTTP_2.equals(protocol)) { - configureH2Pipeline(p, accessLogEnabled, accessLog, compressPredicate, cookieDecoder, cookieEncoder, + configureH2Pipeline(p, accessLogEnabled, accessLog, compressPredicate, formDecoderProvider, forwardedHeaderHandler, http2Settings, idleTimeout, listener, mapHandle, metricsRecorder, minCompressionSize, opsFactory, uriTagValue, decoder.validateHeaders()); return; } if (ApplicationProtocolNames.HTTP_1_1.equals(protocol)) { - configureHttp11Pipeline(p, accessLogEnabled, accessLog, compressPredicate, cookieDecoder, cookieEncoder, + configureHttp11Pipeline(p, accessLogEnabled, accessLog, compressPredicate, decoder, formDecoderProvider, forwardedHeaderHandler, idleTimeout, listener, mapHandle, maxKeepAliveRequests, metricsRecorder, minCompressionSize, uriTagValue); return; @@ -1039,8 +989,6 @@ static final class HttpServerChannelInitializer implements ChannelPipelineConfig final boolean accessLogEnabled; final Function accessLog; final BiPredicate compressPredicate; - final ServerCookieDecoder cookieDecoder; - final ServerCookieEncoder cookieEncoder; final HttpRequestDecoderSpec decoder; final HttpServerFormDecoderProvider formDecoderProvider; final BiFunction forwardedHeaderHandler; @@ -1062,8 +1010,6 @@ static final class HttpServerChannelInitializer implements ChannelPipelineConfig this.accessLogEnabled = config.accessLogEnabled; this.accessLog = config.accessLog; this.compressPredicate = config.compressPredicate; - this.cookieDecoder = config.cookieDecoder; - this.cookieEncoder = config.cookieEncoder; this.decoder = config.decoder; this.formDecoderProvider = config.formDecoderProvider; this.forwardedHeaderHandler = config.forwardedHeaderHandler; @@ -1107,8 +1053,6 @@ else if ((protocols & h11) == h11) { accessLogEnabled, accessLog, compressPredicate(compressPredicate, minCompressionSize), - cookieDecoder, - cookieEncoder, decoder, formDecoderProvider, forwardedHeaderHandler, @@ -1126,8 +1070,6 @@ else if ((protocols & h2) == h2) { accessLogEnabled, accessLog, compressPredicate(compressPredicate, minCompressionSize), - cookieDecoder, - cookieEncoder, formDecoderProvider, forwardedHeaderHandler, http2Settings, @@ -1148,8 +1090,6 @@ else if ((protocols & h2) == h2) { accessLogEnabled, accessLog, compressPredicate(compressPredicate, minCompressionSize), - cookieDecoder, - cookieEncoder, decoder, formDecoderProvider, forwardedHeaderHandler, @@ -1169,8 +1109,6 @@ else if ((protocols & h11) == h11) { accessLogEnabled, accessLog, compressPredicate(compressPredicate, minCompressionSize), - cookieDecoder, - cookieEncoder, decoder, formDecoderProvider, forwardedHeaderHandler, @@ -1188,8 +1126,6 @@ else if ((protocols & h2c) == h2c) { accessLogEnabled, accessLog, compressPredicate(compressPredicate, minCompressionSize), - cookieDecoder, - cookieEncoder, formDecoderProvider, forwardedHeaderHandler, http2Settings, diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerInfos.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerInfos.java index 56f4674b24..85acfa292e 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerInfos.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerInfos.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http.server; -import io.netty5.handler.codec.http.cookie.Cookie; +import io.netty5.handler.codec.http.headers.HttpCookiePair; import reactor.netty5.http.HttpInfos; import java.util.List; @@ -36,5 +36,5 @@ public interface HttpServerInfos extends HttpInfos { * * @return Resolved HTTP cookies */ - Map> allCookies(); + Map> allCookies(); } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerOperations.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerOperations.java index 34a494492d..c0c087ea2e 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerOperations.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerOperations.java @@ -31,15 +31,13 @@ import java.util.function.Consumer; import java.util.function.Function; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.Channel; import io.netty5.channel.ChannelFutureListeners; import io.netty5.channel.ChannelHandlerContext; import io.netty5.channel.ChannelOption; -import io.netty5.handler.codec.DefaultHeaders; import io.netty5.handler.codec.TooLongFrameException; import io.netty5.handler.codec.http.DefaultFullHttpResponse; -import io.netty5.handler.codec.http.DefaultHttpHeaders; import io.netty5.handler.codec.http.DefaultHttpResponse; import io.netty5.handler.codec.http.DefaultLastHttpContent; import io.netty5.handler.codec.http.EmptyLastHttpContent; @@ -48,7 +46,9 @@ import io.netty5.handler.codec.http.HttpContent; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpHeaderValues; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpCookiePair; +import io.netty5.handler.codec.http.headers.HttpHeaders; +import io.netty5.handler.codec.http.headers.DefaultHttpHeaders; import io.netty5.handler.codec.http.HttpMessage; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpRequest; @@ -57,9 +57,7 @@ import io.netty5.handler.codec.http.HttpUtil; import io.netty5.handler.codec.http.HttpVersion; import io.netty5.handler.codec.http.LastHttpContent; -import io.netty5.handler.codec.http.cookie.Cookie; -import io.netty5.handler.codec.http.cookie.ServerCookieDecoder; -import io.netty5.handler.codec.http.cookie.ServerCookieEncoder; +import io.netty5.handler.codec.http.headers.HttpSetCookie; import io.netty5.handler.codec.http.websocketx.CloseWebSocketFrame; import io.netty5.handler.codec.http.websocketx.WebSocketCloseStatus; import io.netty5.handler.codec.http2.HttpConversionUtil; @@ -86,7 +84,7 @@ import reactor.util.annotation.Nullable; import reactor.util.context.Context; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static io.netty5.handler.codec.http.HttpUtil.isTransferEncodingChunked; import static reactor.netty5.ReactorNetty.format; import static reactor.netty5.http.server.HttpServerFormDecoderProvider.DEFAULT_FORM_DECODER_SPEC; @@ -102,8 +100,6 @@ class HttpServerOperations extends HttpOperations compressionPredicate; final ConnectionInfo connectionInfo; - final ServerCookieDecoder cookieDecoder; - final ServerCookieEncoder cookieEncoder; final ServerCookies cookieHolder; final HttpServerFormDecoderProvider formDecoderProvider; final BiFunction, ? super Connection, ? extends Mono> mapHandle; @@ -122,8 +118,6 @@ class HttpServerOperations extends HttpOperations compressionPredicate, @Nullable ConnectionInfo connectionInfo, - ServerCookieDecoder decoder, - ServerCookieEncoder encoder, HttpServerFormDecoderProvider formDecoderProvider, @Nullable BiFunction, ? super Connection, ? extends Mono> mapHandle, boolean secured) { - this(c, listener, nettyRequest, compressionPredicate, connectionInfo, decoder, encoder, formDecoderProvider, + this(c, listener, nettyRequest, compressionPredicate, connectionInfo, formDecoderProvider, mapHandle, true, secured); } HttpServerOperations(Connection c, ConnectionObserver listener, HttpRequest nettyRequest, @Nullable BiPredicate compressionPredicate, @Nullable ConnectionInfo connectionInfo, - ServerCookieDecoder decoder, - ServerCookieEncoder encoder, HttpServerFormDecoderProvider formDecoderProvider, @Nullable BiFunction, ? super Connection, ? extends Mono> mapHandle, boolean resolvePath, @@ -161,9 +151,7 @@ class HttpServerOperations extends HttpOperations> cookies() { + public Map> cookies() { if (cookieHolder != null) { return cookieHolder.getCachedCookies(); } @@ -267,7 +254,7 @@ public Map> cookies() { } @Override - public Map> allCookies() { + public Map> allCookies() { if (cookieHolder != null) { return cookieHolder.getAllCachedCookies(); } @@ -602,8 +589,8 @@ protected void onInboundClose() { @Override protected void afterMarkSentHeaders() { if (HttpResponseStatus.NOT_MODIFIED.equals(status())) { - responseHeaders.remove(HttpHeaderNames.TRANSFER_ENCODING) - .remove(HttpHeaderNames.CONTENT_LENGTH); + responseHeaders.remove(HttpHeaderNames.TRANSFER_ENCODING); + responseHeaders.remove(HttpHeaderNames.CONTENT_LENGTH); } if (compressionPredicate != null && compressionPredicate.test(this, this)) { compression(true); @@ -653,9 +640,9 @@ else if (markSentBody()) { // of trailer fields at the end of the message, the sender SHOULD // generate a Trailer header field before the message body to indicate // which fields will be present in the trailers. - String declaredHeaderNames = responseHeaders.get(HttpHeaderNames.TRAILER); + CharSequence declaredHeaderNames = responseHeaders.get(HttpHeaderNames.TRAILER); if (declaredHeaderNames != null) { - HttpHeaders trailerHeaders = new TrailerHeaders(declaredHeaderNames); + HttpHeaders trailerHeaders = new TrailerHeaders(declaredHeaderNames.toString()); try { trailerHeadersConsumer.accept(trailerHeaders); } @@ -735,7 +722,7 @@ static void sendDecodingFailures( HttpResponseStatus.BAD_REQUEST, ctx.bufferAllocator().allocate(0)); response.headers() - .setInt(HttpHeaderNames.CONTENT_LENGTH, 0) + .set(HttpHeaderNames.CONTENT_LENGTH, HttpHeaderValues.ZERO) .set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE); Connection ops = ChannelOperations.get(ctx.channel()); @@ -874,7 +861,7 @@ static final class FailedHttpServerRequest extends HttpServerOperations { HttpRequest nettyRequest, HttpResponse nettyResponse, boolean secure) { - super(c, listener, nettyRequest, null, null, ServerCookieDecoder.STRICT, ServerCookieEncoder.STRICT, + super(c, listener, nettyRequest, null, null, DEFAULT_FORM_DECODER_SPEC, null, false, secure); this.customResponse = nettyResponse; String tempPath = ""; @@ -928,8 +915,23 @@ static final class TrailerHeaders extends DefaultHttpHeaders { DISALLOWED_TRAILER_HEADER_NAMES.add("warning"); } + /** + * Contains the headers names specified with {@link HttpHeaderNames#TRAILER} + */ + final Set declaredHeaderNames; + TrailerHeaders(String declaredHeaderNames) { - super(true, new TrailerNameValidator(filterHeaderNames(declaredHeaderNames))); + super(16, true, true, true); + this.declaredHeaderNames = filterHeaderNames(declaredHeaderNames); + } + + @Override + protected CharSequence validateKey(@Nullable CharSequence name) { + if (name == null || !declaredHeaderNames.contains(name.toString())) { + throw new IllegalArgumentException("Trailer header name [" + name + + "] not declared with [Trailer] header, or it is not a valid trailer header name"); + } + return super.validateKey(name); } static Set filterHeaderNames(String declaredHeaderNames) { @@ -946,25 +948,5 @@ static Set filterHeaderNames(String declaredHeaderNames) { } return result; } - - static final class TrailerNameValidator implements DefaultHeaders.NameValidator { - - /** - * Contains the headers names specified with {@link HttpHeaderNames#TRAILER} - */ - final Set declaredHeaderNames; - - TrailerNameValidator(Set declaredHeaderNames) { - this.declaredHeaderNames = declaredHeaderNames; - } - - @Override - public void validateName(CharSequence name) { - if (!declaredHeaderNames.contains(name.toString())) { - throw new IllegalArgumentException("Trailer header name [" + name + - "] not declared with [Trailer] header, or it is not a valid trailer header name"); - } - } - } } } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerRequest.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerRequest.java index 8a5dc5ed8d..62155dbb7a 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerRequest.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerRequest.java @@ -21,7 +21,7 @@ import java.util.function.Function; import io.netty5.handler.codec.http.HttpContent; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import reactor.core.publisher.Flux; import reactor.netty5.Connection; import reactor.netty5.NettyInbound; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerResponse.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerResponse.java index ae5081f359..66fc12162f 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerResponse.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerResponse.java @@ -18,10 +18,10 @@ import java.util.function.BiFunction; import java.util.function.Consumer; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpResponseStatus; -import io.netty5.handler.codec.http.cookie.Cookie; +import io.netty5.handler.codec.http.headers.HttpSetCookie; import org.reactivestreams.Publisher; import reactor.core.publisher.Mono; import reactor.netty5.Connection; @@ -44,7 +44,7 @@ public interface HttpServerResponse extends NettyOutbound, HttpServerInfos { * * @return this {@link HttpServerResponse} */ - HttpServerResponse addCookie(Cookie cookie); + HttpServerResponse addCookie(HttpSetCookie cookie); /** * Adds an outbound HTTP header, appending the value if the header already exist. diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerRoutes.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerRoutes.java index bf13f5d03a..188b17cf97 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerRoutes.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpServerRoutes.java @@ -342,7 +342,7 @@ default HttpServerRoutes ws(Predicate condition, WebsocketServerSpec websocketServerSpec) { return route(condition, (req, resp) -> { if (req.requestHeaders() - .containsValue(HttpHeaderNames.CONNECTION, HttpHeaderValues.UPGRADE, true)) { + .containsIgnoreCase(HttpHeaderNames.CONNECTION, HttpHeaderValues.UPGRADE)) { HttpServerOperations ops = (HttpServerOperations) req; return ops.withWebsocketSupport(req.uri(), websocketServerSpec, handler); } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpTrafficHandler.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpTrafficHandler.java index e490dcf081..fac821373f 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpTrafficHandler.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/HttpTrafficHandler.java @@ -35,8 +35,6 @@ import io.netty5.handler.codec.http.HttpStatusClass; import io.netty5.handler.codec.http.HttpVersion; import io.netty5.handler.codec.http.LastHttpContent; -import io.netty5.handler.codec.http.cookie.ServerCookieDecoder; -import io.netty5.handler.codec.http.cookie.ServerCookieEncoder; import io.netty5.handler.ssl.SslHandler; import io.netty5.util.Resource; import io.netty5.util.concurrent.Future; @@ -67,8 +65,6 @@ final class HttpTrafficHandler extends ChannelHandlerAdapter implements Runnable static final HttpVersion H2 = HttpVersion.valueOf("HTTP/2.0"); final BiPredicate compress; - final ServerCookieDecoder cookieDecoder; - final ServerCookieEncoder cookieEncoder; final HttpServerFormDecoderProvider formDecoderProvider; final BiFunction forwardedHeaderHandler; final Duration idleTimeout; @@ -94,8 +90,6 @@ final class HttpTrafficHandler extends ChannelHandlerAdapter implements Runnable HttpTrafficHandler( @Nullable BiPredicate compress, - ServerCookieDecoder decoder, - ServerCookieEncoder encoder, HttpServerFormDecoderProvider formDecoderProvider, @Nullable BiFunction forwardedHeaderHandler, @Nullable Duration idleTimeout, @@ -106,8 +100,6 @@ final class HttpTrafficHandler extends ChannelHandlerAdapter implements Runnable this.formDecoderProvider = formDecoderProvider; this.forwardedHeaderHandler = forwardedHeaderHandler; this.compress = compress; - this.cookieEncoder = encoder; - this.cookieDecoder = decoder; this.idleTimeout = idleTimeout; this.mapHandle = mapHandle; this.maxKeepAliveRequests = maxKeepAliveRequests; @@ -193,8 +185,6 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) { secure, remoteAddress, forwardedHeaderHandler), - cookieDecoder, - cookieEncoder, formDecoderProvider, mapHandle, secure); @@ -389,8 +379,6 @@ public void run() { secure, remoteAddress, forwardedHeaderHandler), - cookieDecoder, - cookieEncoder, formDecoderProvider, mapHandle, secure); @@ -468,9 +456,9 @@ static boolean isNotModified(HttpResponse response) { } static boolean isMultipart(HttpResponse response) { - String contentType = response.headers() + CharSequence contentType = response.headers() .get(HttpHeaderNames.CONTENT_TYPE); - return contentType != null && contentType.regionMatches(true, + return contentType != null && contentType.toString().regionMatches(true, 0, MULTIPART_PREFIX, 0, diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/MicrometerHttpServerMetricsHandler.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/MicrometerHttpServerMetricsHandler.java index 37020bd283..3628292a01 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/MicrometerHttpServerMetricsHandler.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/MicrometerHttpServerMetricsHandler.java @@ -122,7 +122,10 @@ static final class ResponseTimeHandlerContext extends RequestReplyReceiverContex String status; ResponseTimeHandlerContext(MicrometerHttpServerMetricsRecorder recorder, String path, HttpRequest request) { - super((carrier, key) -> Objects.requireNonNull(carrier).headers().get(key)); + super((carrier, key) -> { + CharSequence value = Objects.requireNonNull(carrier).headers().get(key); + return value != null ? value.toString() : null; + }); this.recorder = recorder; this.method = request.method().name(); this.path = path; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/NonSslRedirectDetector.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/NonSslRedirectDetector.java index 87aa885854..0f6a6aa503 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/NonSslRedirectDetector.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/NonSslRedirectDetector.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http.server; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.ChannelHandlerContext; import io.netty5.channel.ChannelPipeline; import io.netty5.handler.codec.ByteToMessageDecoder; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/NonSslRedirectHandler.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/NonSslRedirectHandler.java index da970731d5..508719cc54 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/NonSslRedirectHandler.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/NonSslRedirectHandler.java @@ -73,7 +73,7 @@ private String getRequestedUrlInHttps(HttpRequest request) { // Don't use String#replace because of its bad performance due to regex return HTTPS_PROTOCOL + uri.substring(HTTP_PROTOCOL.length()); } - String host = request.headers().get(HOST); + CharSequence host = request.headers().get(HOST); if (host == null) { return null; } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/ServerCookies.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/ServerCookies.java index 6ee83fabd1..9862528a19 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/ServerCookies.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/ServerCookies.java @@ -15,10 +15,8 @@ */ package reactor.netty5.http.server; -import io.netty5.handler.codec.http.HttpHeaderNames; -import io.netty5.handler.codec.http.HttpHeaders; -import io.netty5.handler.codec.http.cookie.Cookie; -import io.netty5.handler.codec.http.cookie.ServerCookieDecoder; +import io.netty5.handler.codec.http.headers.HttpCookiePair; +import io.netty5.handler.codec.http.headers.HttpHeaders; import reactor.netty5.http.Cookies; import java.util.ArrayList; @@ -30,7 +28,7 @@ import java.util.Set; /** - * {@link Cookies} holder from server request headers. + * Holder for Cookie headers found from request headers * * @author Violeta Georgieva * @since 1.0.8 @@ -43,23 +41,19 @@ public final class ServerCookies extends Cookies { * @param headers server request headers * @return a new cookies holder from server request headers */ - public static ServerCookies newServerRequestHolder(HttpHeaders headers, ServerCookieDecoder decoder) { - return new ServerCookies(headers, HttpHeaderNames.COOKIE, false, decoder); + public static ServerCookies newServerRequestHolder(HttpHeaders headers) { + return new ServerCookies(headers); } - final ServerCookieDecoder serverCookieDecoder; + Map> allCachedCookies; - Map> allCachedCookies; - - ServerCookies(HttpHeaders nettyHeaders, CharSequence cookiesHeaderName, boolean isClientChannel, - ServerCookieDecoder decoder) { - super(nettyHeaders, cookiesHeaderName, isClientChannel, decoder); - this.serverCookieDecoder = decoder; + ServerCookies(HttpHeaders nettyHeaders) { + super(nettyHeaders); allCachedCookies = Collections.emptyMap(); } @Override - public Map> getCachedCookies() { + public Map> getCachedCookies() { getAllCachedCookies(); return cachedCookies; } @@ -70,7 +64,7 @@ public Map> getCachedCookies() { * * @return the cached map of cookies */ - public Map> getAllCachedCookies() { + public Map> getAllCachedCookies() { if (!markReadingCookies()) { for (;;) { if (hasReadCookies()) { @@ -79,17 +73,16 @@ public Map> getAllCachedCookies() { } } - List allCookieHeaders = allCookieHeaders(); - Map> cookies = new HashMap<>(); - Map> allCookies = new HashMap<>(); - for (String aCookieHeader : allCookieHeaders) { - List decode = serverCookieDecoder.decodeAll(aCookieHeader); - for (Cookie cookie : decode) { - Set existingCookiesOfNameSet = cookies.computeIfAbsent(cookie.name(), k -> new HashSet<>()); - existingCookiesOfNameSet.add(cookie); - List existingCookiesOfNameList = allCookies.computeIfAbsent(cookie.name(), k -> new ArrayList<>()); - existingCookiesOfNameList.add(cookie); + Map> cookies = new HashMap<>(); + Map> allCookies = new HashMap<>(); + for (HttpCookiePair cookie : nettyHeaders.getCookies()) { + Set existingCookiesOfName = cookies.computeIfAbsent(cookie.name(), k -> new HashSet<>()); + if (existingCookiesOfName.size() == 0) { + // if the set is non empty, it means we have previously added the same Set-Cookie with the same name. + existingCookiesOfName.add(cookie); } + List existingCookiesOfNameList = allCookies.computeIfAbsent(cookie.name(), k -> new ArrayList<>()); + existingCookiesOfNameList.add(cookie); } cachedCookies = Collections.unmodifiableMap(cookies); allCachedCookies = Collections.unmodifiableMap(allCookies); diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/SimpleCompressionHandler.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/SimpleCompressionHandler.java index 9b9e6a95e8..595bbdfe59 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/SimpleCompressionHandler.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/SimpleCompressionHandler.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http.server; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.ChannelHandlerContext; import io.netty5.handler.codec.http.DefaultHttpContent; import io.netty5.handler.codec.http.DefaultHttpRequest; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/WebsocketServerOperations.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/WebsocketServerOperations.java index 0c0f3cc4d7..62eda74cef 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/WebsocketServerOperations.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/WebsocketServerOperations.java @@ -17,14 +17,14 @@ import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.Channel; import io.netty5.channel.ChannelFutureListeners; import io.netty5.channel.ChannelHandlerContext; import io.netty5.handler.codec.http.DefaultFullHttpRequest; import io.netty5.handler.codec.http.EmptyLastHttpContent; import io.netty5.handler.codec.http.HttpHeaderNames; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpRequest; import io.netty5.handler.codec.http.websocketx.CloseWebSocketFrame; import io.netty5.handler.codec.http.websocketx.PingWebSocketFrame; @@ -108,11 +108,12 @@ final class WebsocketServerOperations extends HttpServerOperations } } + HttpHeaders responseHeaders = replaced.responseHeaders(); + responseHeaders.remove(HttpHeaderNames.TRANSFER_ENCODING); handshakerResult = handshaker.handshake(channel, request, - replaced.responseHeaders - .remove(HttpHeaderNames.TRANSFER_ENCODING)) + responseHeaders) .addListener(f -> { if (replaced.rebind(this)) { markPersistent(false); diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AbstractAccessLogArgProvider.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AbstractAccessLogArgProvider.java index 80b47c21f7..d243eac264 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AbstractAccessLogArgProvider.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AbstractAccessLogArgProvider.java @@ -16,7 +16,7 @@ package reactor.netty5.http.server.logging; import io.netty5.handler.codec.http.HttpMethod; -import io.netty5.handler.codec.http.cookie.Cookie; +import io.netty5.handler.codec.http.headers.HttpCookiePair; import reactor.netty5.ReactorNetty; import reactor.util.annotation.Nullable; @@ -46,7 +46,7 @@ abstract class AbstractAccessLogArgProvider> cookies; + Map> cookies; AbstractAccessLogArgProvider(@Nullable SocketAddress remoteAddress) { this.remoteAddress = remoteAddress; @@ -100,7 +100,7 @@ public long duration() { @Override @Nullable - public Map> cookies() { + public Map> cookies() { return cookies; } @@ -127,7 +127,7 @@ void clear() { this.cookies = null; } - SELF cookies(Map> cookies) { + SELF cookies(Map> cookies) { this.cookies = cookies; return get(); } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AccessLogArgProvider.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AccessLogArgProvider.java index 03e14c1f91..4043bfe9a9 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AccessLogArgProvider.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AccessLogArgProvider.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http.server.logging; -import io.netty5.handler.codec.http.cookie.Cookie; +import io.netty5.handler.codec.http.headers.HttpCookiePair; import reactor.util.annotation.Nullable; import java.net.SocketAddress; @@ -133,5 +133,5 @@ public interface AccessLogArgProvider { * @since 1.0.6 */ @Nullable - Map> cookies(); + Map> cookies(); } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AccessLogHandlerH1.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AccessLogHandlerH1.java index c10c2f8f1f..08a0c1b145 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AccessLogHandlerH1.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/server/logging/AccessLogHandlerH1.java @@ -16,7 +16,7 @@ package reactor.netty5.http.server.logging; import io.netty.buffer.ByteBufHolder; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.ChannelHandler; import io.netty5.channel.ChannelHandlerContext; import io.netty5.handler.codec.http.HttpRequest; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/websocket/WebsocketInbound.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/websocket/WebsocketInbound.java index f60a8bba10..ef3eb14305 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/websocket/WebsocketInbound.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/websocket/WebsocketInbound.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http.websocket; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.websocketx.WebSocketCloseStatus; import io.netty5.handler.codec.http.websocketx.WebSocketFrame; import io.netty5.handler.codec.http.websocketx.WebSocketFrameAggregator; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/websocket/WebsocketOutbound.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/websocket/WebsocketOutbound.java index 8611dbca14..9f65804f8c 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/websocket/WebsocketOutbound.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/websocket/WebsocketOutbound.java @@ -19,8 +19,8 @@ import java.util.function.BiFunction; import java.util.function.Function; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; import io.netty5.handler.codec.http.websocketx.BinaryWebSocketFrame; import io.netty5.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty5.handler.codec.http.websocketx.WebSocketFrame; diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/BaseHttpTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/BaseHttpTest.java index 1a24fa5d46..5c0a9921f0 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/BaseHttpTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/BaseHttpTest.java @@ -15,6 +15,7 @@ */ package reactor.netty5; +import io.netty5.handler.codec.http.headers.HttpHeaders; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.params.provider.Arguments; import reactor.netty5.http.HttpProtocol; @@ -145,4 +146,31 @@ protected static Stream h2cCompatibleCombinations() { Arguments.of(new HttpProtocol[]{HttpProtocol.H2C, HttpProtocol.HTTP11}, new HttpProtocol[]{HttpProtocol.H2C, HttpProtocol.HTTP11}) ); } + + /** + * Returns the value of a header with the specified name. + * + * @param headers the headers to get the {@code name} from + * @param name the name of the header to retrieve + * @return the header value for the specified header name, or null if not found + */ + @Nullable + protected static String getHeader(HttpHeaders headers, CharSequence name) { + return getHeader(headers, name, null); + } + + /** + * Returns the value of a header with the specified name. + * + * @param headers the headers to get the {@code name} from + * @param name the name of the header to retrieve + * @param defValue the default value to return in case the header name is not found + * @return the header value for the specified header name, or defValue if not found + */ + @Nullable + protected static String getHeader(HttpHeaders headers, CharSequence name, @Nullable String defValue) { + CharSequence value = headers.get(name); + return value != null ? value.toString() : defValue; + } + } diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/channel/FluxReceiveTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/channel/FluxReceiveTest.java index e022800d9b..da470678c7 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/channel/FluxReceiveTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/channel/FluxReceiveTest.java @@ -21,7 +21,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.embedded.EmbeddedChannel; import io.netty5.handler.timeout.ReadTimeoutHandler; import org.junit.jupiter.api.Test; diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/Http2Tests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/Http2Tests.java index 555579ccbc..60cc9d0a5c 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/Http2Tests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/Http2Tests.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.handler.ssl.util.InsecureTrustManagerFactory; import io.netty5.handler.ssl.util.SelfSignedCertificate; import org.junit.jupiter.api.BeforeAll; @@ -494,7 +494,7 @@ private void doTestIssue1394_SchemeHttps(Predicate predicate, HttpProtoc .wiretap(true) .get() .uri("https://example.com") - .responseSingle((res, bytes) -> Mono.just(res.responseHeaders().get("x-http2-stream-id", "null"))) + .responseSingle((res, bytes) -> Mono.just(getHeader(res.responseHeaders(), "x-http2-stream-id", "null"))) .as(StepVerifier::create) .expectNextMatches(predicate) .expectComplete() diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpCompressionClientServerTests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpCompressionClientServerTests.java index 2462301582..d219adb9eb 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpCompressionClientServerTests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpCompressionClientServerTests.java @@ -25,7 +25,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.zip.GZIPInputStream; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.ssl.util.InsecureTrustManagerFactory; import io.netty5.handler.ssl.util.SelfSignedCertificate; import org.junit.jupiter.api.Test; @@ -98,7 +98,7 @@ void trueEnabledIncludeContentEncoding(HttpServer server, HttpClient client) { client.port(disposableServer.port()) .compress(true) - .headers(h -> assertThat(h.contains("Accept-Encoding", "gzip", true)).isTrue()) + .headers(h -> assertThat(h.containsIgnoreCase("Accept-Encoding", "gzip")).isTrue()) .get() .uri("/test") .responseContent() @@ -170,7 +170,7 @@ void serverCompressionAlwaysEnabled(HttpServer server, HttpClient client) throws .block(Duration.ofSeconds(10)); assertThat(resp).isNotNull(); - assertThat(resp.getT2().get("content-encoding")).isEqualTo("gzip"); + assertThat(getHeader(resp.getT2(), "content-encoding")).isEqualTo("gzip"); assertThat(new String(resp.getT1(), Charset.defaultCharset())).isNotEqualTo("reply"); @@ -248,7 +248,7 @@ private void testServerCompressionPredicateTrue(HttpServer server, HttpClient cl .block(Duration.ofSeconds(10)); assertThat(resp).isNotNull(); - assertThat(resp.getT1().get("content-encoding")).isEqualTo("gzip"); + assertThat(getHeader(resp.getT1(), "content-encoding")).isEqualTo("gzip"); byte[] replyBuffer = resp.getT2(); @@ -287,7 +287,7 @@ void serverCompressionPredicateFalse(HttpServer server, HttpClient client) { //check the server didn't send the gzip header, only transfer-encoding HttpHeaders headers = resp.getT2(); - assertThat(headers.get("transFER-encoding")).isEqualTo("chunked"); + assertThat(getHeader(headers, "transFER-encoding")).isEqualTo("chunked"); assertThat(headers.get("conTENT-encoding")).isNull(); //check the server sent plain text @@ -313,7 +313,7 @@ void serverCompressionEnabledBigResponse(HttpServer server, HttpClient client) t .block(Duration.ofSeconds(10)); assertThat(resp).isNotNull(); - assertThat(resp.getT2().get("content-encoding")).isEqualTo("gzip"); + assertThat(getHeader(resp.getT2(), "content-encoding")).isEqualTo("gzip"); assertThat(new String(resp.getT1(), Charset.defaultCharset())).isNotEqualTo("reply"); @@ -380,7 +380,7 @@ void compressionActivatedOnClientAddsHeader(HttpServer server, HttpClient client .bindNow(Duration.ofSeconds(10)); client.port(disposableServer.port()) .compress(true) - .headers(h -> zip.set(h.get("accept-encoding"))) + .headers(h -> zip.set(getHeader(h, "accept-encoding"))) .get() .uri("/test") .responseContent() diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpCookieHandlingTests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpCookieHandlingTests.java index 8d3f62b380..f886a6c34b 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpCookieHandlingTests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpCookieHandlingTests.java @@ -22,12 +22,8 @@ import java.util.function.Function; import io.netty5.handler.codec.http.HttpHeaderNames; -import io.netty5.handler.codec.http.cookie.ClientCookieDecoder; -import io.netty5.handler.codec.http.cookie.ClientCookieEncoder; -import io.netty5.handler.codec.http.cookie.Cookie; -import io.netty5.handler.codec.http.cookie.DefaultCookie; -import io.netty5.handler.codec.http.cookie.ServerCookieDecoder; -import io.netty5.handler.codec.http.cookie.ServerCookieEncoder; +import io.netty5.handler.codec.http.headers.DefaultHttpSetCookie; +import io.netty5.handler.codec.http.headers.HttpCookiePair; import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; import reactor.netty5.BaseHttpTest; @@ -52,7 +48,7 @@ void clientWillIgnoreMalformedCookies() { .log("server received")))) .bindNow(); - Mono>> cookieResponse = + Mono>> cookieResponse = createClient(disposableServer.port()) .get() .uri("/test") @@ -73,13 +69,13 @@ void clientWithoutCookieGetsANewOneFromServer() { disposableServer = createServer() .route(r -> r.get("/test", (req, resp) -> - resp.addCookie(new DefaultCookie("cookie1", "test_value")) + resp.addCookie(new DefaultHttpSetCookie("cookie1", "test_value")) .send(req.receive() .transferOwnership() .log("server received")))) .bindNow(); - Mono>> cookieResponse = + Mono>> cookieResponse = createClient(disposableServer.port()) .get() .uri("/test") @@ -90,8 +86,8 @@ void clientWithoutCookieGetsANewOneFromServer() { StepVerifier.create(cookieResponse) .expectNextMatches(l -> { // Suppressed "CollectionUndefinedEquality", the CharSequence is String - Set cookies = l.get("cookie1"); - return cookies.stream().anyMatch(e -> e.value().equals("test_value")); + Set cookies = l.get("cookie1"); + return cookies.stream().anyMatch(e -> e.value().toString().equals("test_value")); }) .expectComplete() .verify(Duration.ofSeconds(30)); @@ -102,14 +98,14 @@ void clientWithoutCookieGetsANewOneFromServer() { void customCookieEncoderDecoder() { disposableServer = createServer() - .cookieCodec(ServerCookieEncoder.LAX, ServerCookieDecoder.LAX) - .handle((req, res) -> res.addCookie(new DefaultCookie("cookie1", "test_value")) + //.cookieCodec(ServerCookieEncoder.LAX, ServerCookieDecoder.LAX) + .handle((req, res) -> res.addCookie(new DefaultHttpSetCookie("cookie1", "test_value")) .sendString(Mono.just("test"))) .bindNow(); - Mono>> response = + Mono>> response = createClient(disposableServer.port()) - .cookieCodec(ClientCookieEncoder.LAX, ClientCookieDecoder.LAX) + //.cookieCodec(ClientCookieEncoder.LAX, ClientCookieDecoder.LAX) .get() .uri("/") .responseSingle((res, bytes) -> Mono.just(res.cookies())) @@ -119,8 +115,8 @@ void customCookieEncoderDecoder() { StepVerifier.create(response) .expectNextMatches(map -> { // Suppressed "CollectionUndefinedEquality", the CharSequence is String - Set cookies = map.get("cookie1"); - return cookies.stream().anyMatch(e -> e.value().equals("test_value")); + Set cookies = map.get("cookie1"); + return cookies.stream().anyMatch(e -> e.value().toString().equals("test_value")); }) .expectComplete() .verify(Duration.ofSeconds(30)); @@ -138,7 +134,7 @@ void testServerCookiesDecodingMultipleCookiesSameName_AllCookies() { @SuppressWarnings("CollectionUndefinedEquality") private void doTestServerCookiesDecodingMultipleCookiesSameName( - Function>> cookies, + Function>> cookies, String expectedResponse) { disposableServer = createServer() @@ -148,12 +144,15 @@ private void doTestServerCookiesDecodingMultipleCookiesSameName( // the CharSequence is String .get("test") .stream() - .map(Cookie::value) + .map(HttpCookiePair::value) + .map(charSequence -> charSequence.toString()) .reduce("", (a, b) -> a + " " + b)))) .bindNow(); + // the new parser seems to refuse to parse a Cookie header where multiple cookies are not space separated + // (and indeed, from https://www.rfc-editor.org/rfc/rfc6265#section-4.2.1, cookie pairs should space separated) createClient(disposableServer.port()) - .headers(h -> h.add(HttpHeaderNames.COOKIE, "test=value1;test=value2")) + .headers(h -> h.add(HttpHeaderNames.COOKIE, "test=value1; test=value2")) .get() .uri("/") .responseContent() diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpMetricsHandlerTests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpMetricsHandlerTests.java index 6077d81d66..fe967fd461 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpMetricsHandlerTests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpMetricsHandlerTests.java @@ -24,7 +24,7 @@ import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import io.micrometer.core.tck.MeterRegistryAssert; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.Channel; import io.netty5.channel.ChannelHandlerAdapter; import io.netty5.channel.ChannelHandlerContext; diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpOperationsTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpOperationsTest.java index 84ecf9e675..ec56a960e6 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpOperationsTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpOperationsTest.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.ChannelHandler; import io.netty5.channel.embedded.EmbeddedChannel; import io.netty5.handler.codec.http.DefaultHttpContent; @@ -28,7 +28,7 @@ import io.netty5.handler.codec.http.HttpResponseStatus; import io.netty5.handler.codec.http.HttpVersion; import io.netty5.handler.codec.http.LastHttpContent; -import io.netty5.handler.codec.http.cookie.Cookie; +import io.netty5.handler.codec.http.headers.HttpCookiePair; import io.netty.contrib.handler.codec.json.JsonObjectDecoder; import java.nio.charset.StandardCharsets; import org.junit.jupiter.api.Test; @@ -187,7 +187,7 @@ static final class TestHttpInfos implements HttpInfos { String uri; @Override - public Map> cookies() { + public Map> cookies() { return null; } diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpProtocolsTests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpProtocolsTests.java index 6c084d45a9..de494e3c4d 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpProtocolsTests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpProtocolsTests.java @@ -20,7 +20,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; import ch.qos.logback.core.read.ListAppender; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.Channel; import io.netty5.channel.ChannelHandler; import io.netty5.handler.codec.http.HttpHeaderNames; @@ -362,7 +362,8 @@ void testAccessLog(HttpServer server, HttpClient client) throws Exception { .uri("/") .responseSingle((res, bytes) -> { protocol.set(res.responseHeaders().get("x-http2-stream-id") != null ? "2.0" : "1.1"); - return Mono.just(res.responseHeaders().get(NettyPipeline.AccessLogHandler)); + String header = getHeader(res.responseHeaders(), NettyPipeline.AccessLogHandler); + return Mono.just(header == null ? "HEADER VALUE NOT FOUND" : header); }) .as(StepVerifier::create) .expectNext("FOUND") @@ -555,7 +556,7 @@ private void doTestTrailerHeaders(HttpClient client, String expectedHeaderValue, .responseSingle((res, bytes) -> bytes.asString().zipWith(res.trailerHeaders())) .as(StepVerifier::create) .expectNextMatches(t -> expectedResponse.equals(t.getT1()) && - expectedHeaderValue.equals(t.getT2().get("foo", "empty"))) + expectedHeaderValue.equals(t.getT2().get("foo", "empty").toString())) .expectComplete() .verify(Duration.ofSeconds(5)); } diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpTests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpTests.java index de16077164..d624d73040 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpTests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/HttpTests.java @@ -22,7 +22,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpHeaderValues; import org.assertj.core.api.Assertions; @@ -39,7 +39,7 @@ import reactor.test.StepVerifier; import reactor.util.function.Tuple2; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientOperationsTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientOperationsTest.java index ecfae78d0f..666a6d933e 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientOperationsTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientOperationsTest.java @@ -15,19 +15,18 @@ */ package reactor.netty5.http.client; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.ChannelHandlerAdapter; import io.netty5.channel.embedded.EmbeddedChannel; import io.netty5.handler.codec.http.DefaultFullHttpResponse; -import io.netty5.handler.codec.http.DefaultHttpHeaders; import io.netty5.handler.codec.http.DefaultLastHttpContent; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpResponseStatus; import io.netty5.handler.codec.http.LastHttpContent; -import io.netty5.handler.codec.http.cookie.ClientCookieDecoder; -import io.netty5.handler.codec.http.cookie.ClientCookieEncoder; import io.netty.contrib.handler.codec.json.JsonObjectDecoder; import java.nio.charset.StandardCharsets; + +import io.netty5.handler.codec.http.headers.HttpHeaders; import org.junit.jupiter.api.Test; import reactor.netty5.ConnectionObserver; import reactor.netty5.NettyPipeline; @@ -44,8 +43,7 @@ class HttpClientOperationsTest { void addDecoderReplaysLastHttp() { EmbeddedChannel channel = new EmbeddedChannel(); Buffer buf = channel.bufferAllocator().copyOf("{\"foo\":1}".getBytes(StandardCharsets.UTF_8)); - new HttpClientOperations(() -> channel, ConnectionObserver.emptyListener(), - ClientCookieEncoder.STRICT, ClientCookieDecoder.STRICT) + new HttpClientOperations(() -> channel, ConnectionObserver.emptyListener()) .addHandlerLast(new JsonObjectDecoder()); channel.writeInbound(new DefaultLastHttpContent(buf)); @@ -67,8 +65,7 @@ void addDecoderReplaysLastHttp() { void addNamedDecoderReplaysLastHttp() { EmbeddedChannel channel = new EmbeddedChannel(); Buffer buf = channel.bufferAllocator().copyOf("{\"foo\":1}".getBytes(StandardCharsets.UTF_8)); - new HttpClientOperations(() -> channel, ConnectionObserver.emptyListener(), - ClientCookieEncoder.STRICT, ClientCookieDecoder.STRICT) + new HttpClientOperations(() -> channel, ConnectionObserver.emptyListener()) .addHandlerLast("json", new JsonObjectDecoder()); channel.writeInbound(new DefaultLastHttpContent(buf)); @@ -90,8 +87,7 @@ void addNamedDecoderReplaysLastHttp() { void addEncoderReplaysLastHttp() { EmbeddedChannel channel = new EmbeddedChannel(); Buffer buf = channel.bufferAllocator().copyOf("{\"foo\":1}".getBytes(StandardCharsets.UTF_8)); - new HttpClientOperations(() -> channel, ConnectionObserver.emptyListener(), - ClientCookieEncoder.STRICT, ClientCookieDecoder.STRICT) + new HttpClientOperations(() -> channel, ConnectionObserver.emptyListener()) .addHandlerLast(new JsonObjectDecoder()); channel.writeInbound(new DefaultLastHttpContent(buf)); @@ -113,8 +109,7 @@ void addEncoderReplaysLastHttp() { void addNamedEncoderReplaysLastHttp() { EmbeddedChannel channel = new EmbeddedChannel(); Buffer buf = channel.bufferAllocator().copyOf("{\"foo\":1}".getBytes(StandardCharsets.UTF_8)); - new HttpClientOperations(() -> channel, ConnectionObserver.emptyListener(), - ClientCookieEncoder.STRICT, ClientCookieDecoder.STRICT) + new HttpClientOperations(() -> channel, ConnectionObserver.emptyListener()) .addHandlerLast("json", new JsonObjectDecoder()); channel.writeInbound(new DefaultLastHttpContent(buf)); @@ -139,12 +134,11 @@ void testConstructorWithProvidedReplacement() { }); HttpClientOperations ops1 = new HttpClientOperations(() -> channel, - ConnectionObserver.emptyListener(), - ClientCookieEncoder.STRICT, ClientCookieDecoder.STRICT); + ConnectionObserver.emptyListener()); ops1.followRedirectPredicate((req, res) -> true); ops1.started = true; ops1.retrying = true; - ops1.redirecting = new RedirectClientException(new DefaultHttpHeaders().add(HttpHeaderNames.LOCATION, "/"), + ops1.redirecting = new RedirectClientException(HttpHeaders.newHeaders().add(HttpHeaderNames.LOCATION, "/"), HttpResponseStatus.MOVED_PERMANENTLY); HttpClientOperations ops2 = new HttpClientOperations(ops1); @@ -170,8 +164,7 @@ void testStatus() { private void doTestStatus(HttpResponseStatus status) { EmbeddedChannel channel = new EmbeddedChannel(); HttpClientOperations ops = new HttpClientOperations(() -> channel, - ConnectionObserver.emptyListener(), - ClientCookieEncoder.STRICT, ClientCookieDecoder.STRICT); + ConnectionObserver.emptyListener()); ops.setNettyResponse(new DefaultFullHttpResponse(HTTP_1_1, status, channel.bufferAllocator().allocate(0))); assertThat(ops.status().reasonPhrase()).isEqualTo(status.reasonPhrase()); } diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientProxyProviderTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientProxyProviderTest.java index 61dcaa5585..afe20ee18f 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientProxyProviderTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientProxyProviderTest.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http.client; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import org.junit.jupiter.api.Test; import reactor.netty5.transport.ProxyProvider; diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientProxyTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientProxyTest.java index 472b4baa69..44a68426b5 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientProxyTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientProxyTest.java @@ -16,7 +16,7 @@ package reactor.netty5.http.client; import io.netty5.channel.ChannelHandler; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.ssl.util.InsecureTrustManagerFactory; import io.netty5.resolver.AddressResolverGroup; import io.netty5.resolver.NoopAddressResolverGroup; @@ -90,7 +90,7 @@ void proxy_1(Hoverfly hoverfly) { true)) .expectNextMatches(t -> t.getT2().contains("Hoverfly") && - "FOUND".equals(t.getT2().get("Logging-Handler")) && + "FOUND".equals(getHeader(t.getT2(), "Logging-Handler")) && "test".equals(t.getT1())) .expectComplete() .verify(Duration.ofSeconds(30)); @@ -107,7 +107,7 @@ void proxy_2(Hoverfly hoverfly) { true)) .expectNextMatches(t -> t.getT2().contains("Hoverfly") && - "FOUND".equals(t.getT2().get("Logging-Handler")) && + "FOUND".equals(getHeader(t.getT2(), "Logging-Handler")) && "test".equals(t.getT1())) .expectComplete() .verify(Duration.ofSeconds(30)); @@ -158,7 +158,7 @@ void testIssue804(Hoverfly hoverfly) { false)) .expectNextMatches(t -> t.getT2().contains("Hoverfly") && - "NOT FOUND".equals(t.getT2().get("Logging-Handler")) && + "NOT FOUND".equals(getHeader(t.getT2(), "Logging-Handler")) && "test".equals(t.getT1())) .expectComplete() .verify(Duration.ofSeconds(30)); diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientTest.java index ff5c095979..78df8eafab 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientTest.java @@ -57,8 +57,8 @@ import java.util.function.Function; import javax.net.ssl.SSLException; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; import io.netty5.channel.Channel; import io.netty5.channel.ChannelHandler; import io.netty5.channel.ChannelHandlerAdapter; @@ -74,7 +74,8 @@ import io.netty5.handler.codec.http.HttpContentDecompressor; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpHeaderValues; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.DefaultHttpCookiePair; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpObjectDecoder; import io.netty5.handler.codec.http.HttpResponseEncoder; @@ -122,7 +123,7 @@ import reactor.util.function.Tuple2; import reactor.util.function.Tuples; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -435,7 +436,7 @@ void gzip() { .expectNextMatches(tuple -> { String content1 = tuple.getT1().getT1(); return !content1.equals(content) - && "gzip".equals(tuple.getT1().getT2()); + && "gzip".equals(tuple.getT1().getT2().toString()); }) .expectComplete() .verify(Duration.ofSeconds(30)); @@ -457,7 +458,7 @@ void gzip() { .expectNextMatches(tuple -> { String content1 = tuple.getT1().getT1(); return content1.equals(content) - && "".equals(tuple.getT1().getT2()); + && "".equals(tuple.getT1().getT2().toString()); }) .expectComplete() .verify(Duration.ofSeconds(30)); @@ -479,7 +480,7 @@ private void doTestGzip(boolean gzipEnabled) { createServer() .handle((req, res) -> res.sendString(Mono.just(req.requestHeaders() .get(HttpHeaderNames.ACCEPT_ENCODING, - "no gzip")))) + "no gzip").toString()))) .bindNow(); HttpClient client = createHttpClientForContextWithPort(); @@ -504,8 +505,7 @@ void testUserAgent() { .handle((req, resp) -> { assertThat(req.requestHeaders() .contains(HttpHeaderNames.USER_AGENT) && - req.requestHeaders() - .get(HttpHeaderNames.USER_AGENT) + getHeader(req.requestHeaders(), HttpHeaderNames.USER_AGENT, "") .equals(HttpClient.USER_AGENT)) .as("" + req.requestHeaders() .get(HttpHeaderNames.USER_AGENT)) @@ -786,7 +786,7 @@ void testCookie() { .bindNow(); createHttpClientForContextWithAddress() - .cookie("test", c -> c.setValue("lol")) + .cookie(new DefaultHttpCookiePair("test", "lol")) .get() .uri("/201") .responseContent() @@ -1168,8 +1168,8 @@ void doOnError() { void withConnector() { disposableServer = createServer() .handle((req, resp) -> - resp.sendString(Mono.just(req.requestHeaders() - .get("test")))) + resp.sendString(Mono.just(getHeader(req.requestHeaders(), "test", + "header not found from server")))) .bindNow(); Mono content = createHttpClientForContextWithPort() @@ -1207,7 +1207,7 @@ void testPreferContentLengthWhenPost() { StepVerifier.create( createHttpClientForContextWithAddress() - .headers(h -> h.add(HttpHeaderNames.CONTENT_LENGTH, 5)) + .headers(h -> h.add(HttpHeaderNames.CONTENT_LENGTH, "5")) .post() .uri("/") .send(Mono.just(preferredAllocator().copyOf("hello".getBytes(Charset.defaultCharset())))) @@ -1661,7 +1661,7 @@ void testDoOnRequestInvokedBeforeSendingRequest() { .post() .uri("/") .send((req, out) -> { - String header = req.requestHeaders().get("test"); + CharSequence header = req.requestHeaders().get("test"); if (header != null) { return out.sendString(Flux.just("FOUND")); } @@ -2857,7 +2857,7 @@ void testCustomUserAgentHeaderPreserved() { disposableServer = createServer() .handle((req, res) -> res.sendString(Mono.just(req.requestHeaders() - .get(HttpHeaderNames.USER_AGENT, "")))) + .get(HttpHeaderNames.USER_AGENT, "").toString()))) .bindNow(); HttpClient client = createClient(disposableServer.port()); diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientWithTomcatTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientWithTomcatTest.java index 12619f17e1..d14ab37874 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientWithTomcatTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientWithTomcatTest.java @@ -18,7 +18,7 @@ import io.netty5.channel.Channel; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpHeaderValues; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpResponseStatus; import org.junit.jupiter.api.AfterAll; diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpRedirectTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpRedirectTest.java index 7bab332144..215c1f59fa 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpRedirectTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpRedirectTest.java @@ -547,7 +547,7 @@ void testHttpRequestIfRedirectHttpToHttpsEnabled() { StepVerifier .create(client.get().uri(uri).response() .doOnNext(response -> { - String location = response.responseHeaders().get(HttpHeaderNames.LOCATION); + CharSequence location = response.responseHeaders().get(HttpHeaderNames.LOCATION); String expectedLocation = uri.replace("http://", "https://"); assertThat(response.status()).isEqualTo(HttpResponseStatus.PERMANENT_REDIRECT); diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/WebsocketClientOperationsTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/WebsocketClientOperationsTest.java index 249cccabd0..9346c14473 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/WebsocketClientOperationsTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/WebsocketClientOperationsTest.java @@ -29,6 +29,7 @@ import java.time.Duration; import java.util.List; +import java.util.Objects; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; @@ -61,7 +62,9 @@ private void failOnClientServerError( .route(routes -> routes.post("/login", (req, res) -> res.status(serverStatus).sendHeaders()) .get("/ws", (req, res) -> { - int token = Integer.parseInt(req.requestHeaders().get("Authorization")); + String auth = Objects.requireNonNull(getHeader(req.requestHeaders(), "Authorization"), + "Authorization header not found"); + int token = Integer.parseInt(auth); if (token >= 400) { return res.status(token).send(); } @@ -94,8 +97,11 @@ private Mono login(int port) { @Test void testConfigureWebSocketVersion() { disposableServer = createServer() - .handle((in, out) -> out.sendWebsocket((i, o) -> - o.sendString(Mono.just(in.requestHeaders().get("sec-websocket-version"))))) + .handle((in, out) -> out.sendWebsocket((i, o) -> { + String version = Objects.requireNonNull(getHeader(in.requestHeaders(), "sec-websocket-version"), + "sec-websocket-version header not found"); + return o.sendString(Mono.just(version)); + })) .bindNow(); List response = createClient(disposableServer.port()) diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/WebsocketTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/WebsocketTest.java index ef14757a57..935c79080f 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/WebsocketTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/WebsocketTest.java @@ -34,8 +34,6 @@ import io.netty5.handler.codec.CorruptedFrameException; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpResponseStatus; -import io.netty5.handler.codec.http.cookie.ClientCookieDecoder; -import io.netty5.handler.codec.http.cookie.ClientCookieEncoder; import io.netty5.handler.codec.http.websocketx.CloseWebSocketFrame; import io.netty5.handler.codec.http.websocketx.PingWebSocketFrame; import io.netty5.handler.codec.http.websocketx.PongWebSocketFrame; @@ -163,7 +161,7 @@ void webSocketRespondsToRequestsFromClients() { disposableServer = createServer() .route(r -> r.get("/test/{param}", (req, res) -> { - log.debug(req.requestHeaders().get("test")); + log.debug(getHeader(req.requestHeaders(), "test", "header not found")); return res.header("content-type", "text/plain") .sendWebsocket((in, out) -> out.sendString(in.receive() @@ -1246,12 +1244,12 @@ private void doTestIssue970(boolean compress) { .get(perMessageDeflateEncoder) != null) ); - String header = in.headers() + CharSequence header = in.headers() .get(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS); return in.receive() .aggregate() .asString() - .zipWith(Mono.just(header == null ? "null" : header)); + .zipWith(Mono.just(header == null ? "null" : header.toString())); }; Predicate> predicate = t -> "test".equals(t.getT1()) && "null".equals(t.getT2()); @@ -1279,7 +1277,7 @@ private void doTestIssue970(boolean compress) { void websocketOperationsBadValues() throws Exception { EmbeddedChannel channel = new EmbeddedChannel(); HttpClientOperations parent = new HttpClientOperations(Connection.from(channel), - ConnectionObserver.emptyListener(), ClientCookieEncoder.STRICT, ClientCookieDecoder.STRICT); + ConnectionObserver.emptyListener()); WebsocketClientOperations ops = new WebsocketClientOperations(new URI(""), WebsocketClientSpec.builder().build(), parent); diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/ConnectionInfoTests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/ConnectionInfoTests.java index 336d5ef54a..b13bdb1c15 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/ConnectionInfoTests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/ConnectionInfoTests.java @@ -27,8 +27,8 @@ import javax.net.ssl.SSLException; -import io.netty5.buffer.api.Buffer; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.buffer.Buffer; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpRequest; import io.netty5.handler.ssl.SslContext; import io.netty5.handler.ssl.SslContextBuilder; @@ -248,10 +248,10 @@ void customForwardedHandlerForMultipleHost() { serverRequest -> Assertions.assertThat(serverRequest.hostAddress().getHostString()).isEqualTo("b.example.com"), (connectionInfo, request) -> { - String hostHeader = request.headers().get(DefaultHttpForwardedHeaderHandler.X_FORWARDED_HOST_HEADER); + CharSequence hostHeader = request.headers().get(DefaultHttpForwardedHeaderHandler.X_FORWARDED_HOST_HEADER); if (hostHeader != null) { InetSocketAddress hostAddress = AddressUtils.createUnresolved( - hostHeader.split(",", 2)[1].trim(), + hostHeader.toString().split(",", 2)[1].trim(), connectionInfo.getHostAddress().getPort()); connectionInfo = connectionInfo.withHostAddress(hostAddress); } diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/HttpSendFileTests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/HttpSendFileTests.java index c2d1734671..eab3ac0ac6 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/HttpSendFileTests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/HttpSendFileTests.java @@ -39,7 +39,7 @@ import java.util.function.Function; import java.util.logging.Level; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpMethod; import org.junit.jupiter.api.Test; @@ -53,7 +53,7 @@ import reactor.netty5.http.client.HttpClient; import reactor.util.annotation.Nullable; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static org.assertj.core.api.Assertions.assertThat; class HttpSendFileTests extends BaseHttpTest { diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/HttpServerTests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/HttpServerTests.java index 3aff9e5766..ff80596614 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/HttpServerTests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/HttpServerTests.java @@ -48,7 +48,7 @@ import java.util.stream.Collectors; import java.util.zip.GZIPOutputStream; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.Channel; import io.netty5.channel.ChannelHandlerAdapter; import io.netty5.channel.ChannelHandlerContext; @@ -65,7 +65,7 @@ import io.netty5.handler.codec.http.HttpContent; import io.netty5.handler.codec.http.HttpContentDecompressor; import io.netty5.handler.codec.http.HttpHeaderNames; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpMessage; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpObjectDecoder; @@ -74,8 +74,6 @@ import io.netty5.handler.codec.http.HttpServerCodec; import io.netty5.handler.codec.http.HttpVersion; import io.netty5.handler.codec.http.HttpUtil; -import io.netty5.handler.codec.http.cookie.ServerCookieDecoder; -import io.netty5.handler.codec.http.cookie.ServerCookieEncoder; import io.netty5.handler.codec.http.websocketx.WebSocketCloseStatus; import io.netty5.handler.ssl.SniCompletionEvent; import io.netty5.handler.ssl.SslContext; @@ -123,7 +121,7 @@ import javax.net.ssl.SNIHostName; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.fail; @@ -530,7 +528,7 @@ private void checkResponse(String url, InetSocketAddress address) { } else if (code == 205) { return !h.contains("Transfer-Encoding") && - h.getInt("Content-Length").equals(0) && + "0".equals(getHeader(h, "Content-Length")) && "NO BODY".equals(t.getT3()); } else { @@ -554,7 +552,7 @@ void testContentLengthHeadRequest() { .sendString(Flux.just("OK").hide())) .route(req -> req.uri().startsWith("/3"), (req, res) -> { - res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, 2); + res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, "2"); return res.sendString(Mono.just("OK")) .then() .doOnSuccess(aVoid -> sentHeaders.set(res.responseHeaders())); @@ -566,7 +564,7 @@ void testContentLengthHeadRequest() { .sendHeaders()) .route(req -> req.uri().startsWith("/6"), (req, res) -> { - res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, 2); + res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, "2"); return res.sendHeaders() .then() .doOnSuccess(aVoid -> sentHeaders.set(res.responseHeaders())); @@ -582,35 +580,35 @@ void testContentLengthHeadRequest() { .doOnSuccess(aVoid -> sentHeaders.set(res.responseHeaders()))) .route(req -> req.uri().startsWith("/9"), (req, res) -> { - res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, 2); + res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, "2"); return res.send() .then() .doOnSuccess(aVoid -> sentHeaders.set(res.responseHeaders())); }) .route(req -> req.uri().startsWith("/10"), (req, res) -> { - res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, 0); + res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, "0"); return res.sendString(Mono.just("OK")) .then() .doOnSuccess(aVoid -> sentHeaders.set(res.responseHeaders())); }) .route(req -> req.uri().startsWith("/11"), (req, res) -> { - res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, 0); + res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, "0"); return res.sendString(Flux.just("OK").hide()) .then() .doOnSuccess(aVoid -> sentHeaders.set(res.responseHeaders())); }) .route(req -> req.uri().startsWith("/12"), (req, res) -> { - res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, 2); + res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, "2"); return res.sendObject(res.alloc().copyOf("OK", Charset.defaultCharset())) .then() .doOnSuccess(aVoid -> sentHeaders.set(res.responseHeaders())); }) .route(req -> req.uri().startsWith("/13"), (req, res) -> { - res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, 0); + res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, "0"); return res.sendObject(res.alloc().copyOf("OK", Charset.defaultCharset())) .then() .doOnSuccess(aVoid -> sentHeaders.set(res.responseHeaders())); @@ -643,7 +641,7 @@ void testIssue1153() { createServer() .host("localhost") .handle((req, res) -> { - res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, 2); + res.responseHeaders().set(HttpHeaderNames.CONTENT_LENGTH, "2"); return Mono.empty() .then() .doFinally(s -> sentHeaders.set(res.responseHeaders())); @@ -667,8 +665,8 @@ private void doTestContentLengthHeadRequest(String url, InetSocketAddress addres StepVerifier.create(response) .expectNextMatches(t -> { if (chunk) { - String chunked = t.getT1().get(HttpHeaderNames.TRANSFER_ENCODING); - String cl = t.getT1().get(HttpHeaderNames.CONTENT_LENGTH); + CharSequence chunked = t.getT1().get(HttpHeaderNames.TRANSFER_ENCODING); + CharSequence cl = t.getT1().get(HttpHeaderNames.CONTENT_LENGTH); if (HttpMethod.GET.equals(method)) { return chunked != null && cl == null && "OK".equals(t.getT2()); } @@ -677,9 +675,9 @@ private void doTestContentLengthHeadRequest(String url, InetSocketAddress addres } } else if (close) { - String connClosed = t.getT1().get(HttpHeaderNames.CONNECTION); - String chunked = t.getT1().get(HttpHeaderNames.TRANSFER_ENCODING); - String cl = t.getT1().get(HttpHeaderNames.CONTENT_LENGTH); + String connClosed = getHeader(t.getT1(), HttpHeaderNames.CONNECTION); + String chunked = getHeader(t.getT1(), HttpHeaderNames.TRANSFER_ENCODING); + String cl = getHeader(t.getT1(), HttpHeaderNames.CONTENT_LENGTH); if (HttpMethod.GET.equals(method)) { return "close".equals(connClosed) && chunked == null && cl == null && "OK".equals(t.getT2()); } @@ -688,17 +686,19 @@ else if (close) { } } else { - String chunkedReceived = t.getT1().get(HttpHeaderNames.TRANSFER_ENCODING); - String clReceived = t.getT1().get(HttpHeaderNames.CONTENT_LENGTH); - String chunkedSent = sentHeaders.get().get(HttpHeaderNames.TRANSFER_ENCODING); - String clSent = sentHeaders.get().get(HttpHeaderNames.CONTENT_LENGTH); + String chunkedReceived = getHeader(t.getT1(), HttpHeaderNames.TRANSFER_ENCODING); + String clReceived = getHeader(t.getT1(), HttpHeaderNames.CONTENT_LENGTH); + String chunkedSent = getHeader(sentHeaders.get(), HttpHeaderNames.TRANSFER_ENCODING); + String clSent = getHeader(sentHeaders.get(), HttpHeaderNames.CONTENT_LENGTH); if (HttpMethod.GET.equals(method)) { return chunkedReceived == null && chunkedSent == null && + clReceived != null && clSent != null && Integer.parseInt(clReceived) == Integer.parseInt(clSent) && "OK".equals(t.getT2()); } else { return chunkedReceived == null && chunkedSent == null && + clReceived != null && clSent != null && Integer.parseInt(clReceived) == Integer.parseInt(clSent) && "NO BODY".equals(t.getT2()); } @@ -1074,7 +1074,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception } })) .handle((req, res) -> res.sendString( - Mono.just(req.requestHeaders().get("test", "not found")))) + Mono.just(getHeader(req.requestHeaders(), "test", "not found")))) .bindNow(); StepVerifier.create( @@ -1752,7 +1752,7 @@ private void doTestHttpServerWithDomainSockets(HttpServer server, HttpClient cli assertThat(req.remoteAddress()).isNull(); assertThat(req.scheme()).isNotNull().isEqualTo(expectedScheme); }); - assertThat(req.requestHeaders().get(HttpHeaderNames.HOST)).isEqualTo("localhost"); + assertThat(getHeader(req.requestHeaders(), HttpHeaderNames.HOST)).isEqualTo("localhost"); return res.send(req.receive().transferOwnership()); }) .bindNow(); @@ -1797,8 +1797,6 @@ private void doTestStatus(HttpResponseStatus status) { new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"), null, null, - ServerCookieDecoder.STRICT, - ServerCookieEncoder.STRICT, DEFAULT_FORM_DECODER_SPEC, null, false); @@ -2319,7 +2317,7 @@ void testMaxKeepAliveRequests(int maxKeepAliveRequests) { .uri("/") .responseSingle((res, bytes) -> bytes.asString() - .zipWith(Mono.just(res.responseHeaders().get(HttpHeaderNames.CONNECTION, "persistent"))))) + .zipWith(Mono.just(getHeader(res.responseHeaders(), HttpHeaderNames.CONNECTION, "persistent"))))) .collectList() .as(StepVerifier::create) .expectNextMatches(l -> { @@ -2386,8 +2384,6 @@ private void doTestIsFormUrlencoded(String headerValue, boolean expectation) { request, null, null, - ServerCookieDecoder.STRICT, - ServerCookieEncoder.STRICT, DEFAULT_FORM_DECODER_SPEC, null, false); diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/TrailerHeadersTests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/TrailerHeadersTests.java index 571490bd22..6303596821 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/TrailerHeadersTests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/TrailerHeadersTests.java @@ -15,7 +15,7 @@ */ package reactor.netty5.http.server; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogArgProviderH1Tests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogArgProviderH1Tests.java index 64115f76be..081f45758c 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogArgProviderH1Tests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogArgProviderH1Tests.java @@ -15,12 +15,11 @@ */ package reactor.netty5.http.server.logging; -import io.netty5.handler.codec.http.DefaultHttpHeaders; import io.netty5.handler.codec.http.DefaultHttpRequest; import io.netty5.handler.codec.http.DefaultHttpResponse; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpHeaderValues; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpRequest; import io.netty5.handler.codec.http.HttpResponse; @@ -47,11 +46,11 @@ class AccessLogArgProviderH1Tests { private static final HttpResponse response; static { - HttpHeaders requestHttpHeaders = new DefaultHttpHeaders(); + HttpHeaders requestHttpHeaders = HttpHeaders.newHeaders(); requestHttpHeaders.add(HEADER_CONNECTION_NAME, HEADER_CONNECTION_VALUE); request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, URI, requestHttpHeaders); - HttpHeaders responseHttpHeaders = new DefaultHttpHeaders(); + HttpHeaders responseHttpHeaders = HttpHeaders.newHeaders(); responseHttpHeaders.add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON); response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, responseHttpHeaders); } @@ -138,7 +137,7 @@ void responseHeader() { assertThat(accessLogArgProvider.responseHeader(HttpHeaderNames.CONTENT_TYPE)).isNull(); accessLogArgProvider.response(response); assertThat(accessLogArgProvider.responseHeader(HttpHeaderNames.CONTENT_TYPE)) - .isEqualTo(HttpHeaderValues.APPLICATION_JSON.toString()); + .isEqualTo(HttpHeaderValues.APPLICATION_JSON); } } diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogArgProviderH2Tests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogArgProviderH2Tests.java index 9070fe70fa..fd238792ff 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogArgProviderH2Tests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogArgProviderH2Tests.java @@ -19,9 +19,9 @@ import io.netty5.handler.codec.http.HttpHeaderValues; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpResponseStatus; -import io.netty5.handler.codec.http2.DefaultHttp2Headers; +import io.netty5.handler.codec.http2.headers.DefaultHttp2Headers; import io.netty5.handler.codec.http2.DefaultHttp2HeadersFrame; -import io.netty5.handler.codec.http2.Http2Headers; +import io.netty5.handler.codec.http2.headers.Http2Headers; import io.netty5.handler.codec.http2.Http2HeadersFrame; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -44,13 +44,13 @@ class AccessLogArgProviderH2Tests { private static final Http2HeadersFrame responseHeaders; static { - Http2Headers requestHttpHeaders = new DefaultHttp2Headers(); + Http2Headers requestHttpHeaders = new DefaultHttp2Headers(2, true, true, true); requestHttpHeaders.add(HEADER_CONNECTION_NAME, HEADER_CONNECTION_VALUE); requestHttpHeaders.method(HttpMethod.GET.name()); requestHttpHeaders.path(URI); requestHeaders = new DefaultHttp2HeadersFrame(requestHttpHeaders); - Http2Headers responseHttpHeaders = new DefaultHttp2Headers(); + Http2Headers responseHttpHeaders = new DefaultHttp2Headers(2, true, true, true); responseHttpHeaders.add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON); responseHttpHeaders.status(HttpResponseStatus.OK.codeAsText()); responseHeaders = new DefaultHttp2HeadersFrame(responseHttpHeaders); diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogHandlerH1Tests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogHandlerH1Tests.java index 769bce6d92..cb798a14cf 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogHandlerH1Tests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogHandlerH1Tests.java @@ -15,16 +15,15 @@ */ package reactor.netty5.http.server.logging; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.embedded.EmbeddedChannel; import io.netty5.handler.codec.http.DefaultHttpContent; -import io.netty5.handler.codec.http.DefaultHttpHeaders; import io.netty5.handler.codec.http.DefaultHttpRequest; import io.netty5.handler.codec.http.DefaultHttpResponse; import io.netty5.handler.codec.http.DefaultLastHttpContent; import io.netty5.handler.codec.http.HttpHeaderNames; import io.netty5.handler.codec.http.HttpHeaderValues; -import io.netty5.handler.codec.http.HttpHeaders; +import io.netty5.handler.codec.http.headers.HttpHeaders; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpRequest; import io.netty5.handler.codec.http.HttpResponse; @@ -87,18 +86,18 @@ void responseChunked() { } private HttpRequest newHttpRequest() { - HttpHeaders requestHeaders = new DefaultHttpHeaders(); + HttpHeaders requestHeaders = HttpHeaders.newHeaders(); requestHeaders.add(HEADER_CONNECTION_NAME, HEADER_CONNECTION_VALUE); return new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, URI, requestHeaders); } private HttpResponse newHttpResponse(boolean chunked) { - HttpHeaders responseHeaders = new DefaultHttpHeaders(); + HttpHeaders responseHeaders = HttpHeaders.newHeaders(); if (chunked) { responseHeaders.add(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED); } else { - responseHeaders.add(HttpHeaderNames.CONTENT_LENGTH, RESPONSE_CONTENT.length); + responseHeaders.add(HttpHeaderNames.CONTENT_LENGTH, String.valueOf(RESPONSE_CONTENT.length)); } return new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, responseHeaders); } diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogHandlerH2Tests.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogHandlerH2Tests.java index 6ba9add372..f91867fb62 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogHandlerH2Tests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogHandlerH2Tests.java @@ -15,14 +15,14 @@ */ package reactor.netty5.http.server.logging; -import io.netty5.buffer.api.Buffer; +import io.netty5.buffer.Buffer; import io.netty5.channel.embedded.EmbeddedChannel; import io.netty5.handler.codec.http.HttpMethod; import io.netty5.handler.codec.http.HttpResponseStatus; import io.netty5.handler.codec.http2.DefaultHttp2DataFrame; -import io.netty5.handler.codec.http2.DefaultHttp2Headers; +import io.netty5.handler.codec.http2.headers.DefaultHttp2Headers; import io.netty5.handler.codec.http2.DefaultHttp2HeadersFrame; -import io.netty5.handler.codec.http2.Http2Headers; +import io.netty5.handler.codec.http2.headers.Http2Headers; import org.junit.jupiter.api.Test; import java.net.SocketAddress; @@ -48,13 +48,13 @@ void accessLogArgs() { args.requestHeader(HEADER_CONNECTION_NAME)); })); - Http2Headers requestHeaders = new DefaultHttp2Headers(); + Http2Headers requestHeaders = new DefaultHttp2Headers(2, true, true, true); requestHeaders.method(HttpMethod.GET.name()); requestHeaders.path(URI); requestHeaders.add(HEADER_CONNECTION_NAME, HEADER_CONNECTION_VALUE); channel.writeInbound(new DefaultHttp2HeadersFrame(requestHeaders)); - Http2Headers responseHeaders = new DefaultHttp2Headers(); + Http2Headers responseHeaders = new DefaultHttp2Headers(1, true, true, true); responseHeaders.status(HttpResponseStatus.OK.codeAsText()); channel.writeOutbound(new DefaultHttp2HeadersFrame(responseHeaders)); diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogTest.java index d8f81aaaa9..d5ca31e265 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/server/logging/AccessLogTest.java @@ -20,7 +20,8 @@ import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.Appender; import io.netty5.channel.ChannelHandler; -import io.netty5.handler.codec.http.cookie.Cookie; +import io.netty5.handler.codec.http.headers.DefaultHttpCookiePair; +import io.netty5.handler.codec.http.headers.HttpCookiePair; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -47,6 +48,7 @@ class AccessLogTest extends BaseHttpTest { static final String ACCESS_LOG_HANDLER = "AccessLogHandler"; static final Logger ROOT = (Logger) LoggerFactory.getLogger(LOG.getName()); static final String NOT_FOUND = "NOT FOUND"; + static final String HEADER_NOT_FOUND = "HEADER NOT FOUND"; static final String FOUND = "FOUND"; static final String CUSTOM_FORMAT = "method={}, uri={}, cookie: {}"; static final String URI_1 = "/example/test"; @@ -209,13 +211,13 @@ void assertAccessLogging( @Nullable private Tuple2 getHttpClientResponse(String uri) { return createClient(disposableServer.port()) - .cookie(COOKIE_KEY, cookie -> cookie.setValue(COOKIE_VALUE)) + .cookie(new DefaultHttpCookiePair(COOKIE_KEY, COOKIE_VALUE)) .get() .uri(uri) .responseSingle((res, bytes) -> bytes.asString() .defaultIfEmpty("") - .zipWith(Mono.just(res.responseHeaders().get(ACCESS_LOG_HANDLER)))) + .zipWith(Mono.just(getHeader(res.responseHeaders(), ACCESS_LOG_HANDLER, HEADER_NOT_FOUND)))) .block(Duration.ofSeconds(30)); } @@ -228,13 +230,13 @@ private void sleep(long ms) { } } - static String cookieToString(@Nullable Map> cookies) { + static String cookieToString(@Nullable Map> cookies) { if (cookies != null) { - Optional>> firstEntry = cookies.entrySet().stream().findFirst(); + Optional>> firstEntry = cookies.entrySet().stream().findFirst(); if (firstEntry.isPresent()) { String key = firstEntry.get().getKey().toString(); - Optional firstCookie = firstEntry.get().getValue().stream().findFirst(); - String value = firstCookie.isPresent() ? firstCookie.get().value() : ""; + Optional firstCookie = firstEntry.get().getValue().stream().findFirst(); + String value = firstCookie.isPresent() ? firstCookie.get().value().toString() : ""; return key + "=" + value; } } diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/tcp/SslProviderTests.java b/reactor-netty5-http/src/test/java/reactor/netty5/tcp/SslProviderTests.java index 22511beb22..3dbd194ed2 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/tcp/SslProviderTests.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/tcp/SslProviderTests.java @@ -46,7 +46,7 @@ import javax.net.ssl.SNIServerName; import javax.net.ssl.SSLHandshakeException; -import static io.netty5.buffer.api.DefaultBufferAllocators.preferredAllocator; +import static io.netty5.buffer.DefaultBufferAllocators.preferredAllocator; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/transport/BufferAllocatorMetricsTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/transport/BufferAllocatorMetricsTest.java index 3c4e74236c..82f9c25ec7 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/transport/BufferAllocatorMetricsTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/transport/BufferAllocatorMetricsTest.java @@ -19,9 +19,9 @@ import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; -import io.netty5.buffer.api.Buffer; -import io.netty5.buffer.api.BufferAllocator; -import io.netty5.buffer.api.pool.PooledBufferAllocator; +import io.netty5.buffer.Buffer; +import io.netty5.buffer.BufferAllocator; +import io.netty5.buffer.pool.PooledBufferAllocator; import io.netty5.channel.ChannelOption; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach;