From f390e3fc54f452497793b27cafea85d03e1bbe66 Mon Sep 17 00:00:00 2001 From: Alex <40795980+AlexProgrammerDE@users.noreply.github.com> Date: Wed, 15 May 2024 11:29:58 +0200 Subject: [PATCH] Allow using SocketAddress proxies instead of just InetSocketAddress (#3243) This commit adds new socketAddress methods and tries to keep backwards compat for users using the old address methods, which are deprecated. I'd recommend removing socketAddress and renaming it back to address on the next major release. Fixes #3242 --- .../netty/transport/ProxyProvider.java | 73 ++++++++++++++++--- .../netty/transport/ProxyProviderTest.java | 34 ++++----- .../http/client/Http2ConnectionProvider.java | 2 +- .../netty/http/client/HttpClientConfig.java | 2 +- 4 files changed, 83 insertions(+), 28 deletions(-) diff --git a/reactor-netty-core/src/main/java/reactor/netty/transport/ProxyProvider.java b/reactor-netty-core/src/main/java/reactor/netty/transport/ProxyProvider.java index 9f34080f44..e036780de6 100644 --- a/reactor-netty-core/src/main/java/reactor/netty/transport/ProxyProvider.java +++ b/reactor-netty-core/src/main/java/reactor/netty/transport/ProxyProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2023 VMware, Inc. or its affiliates, All Rights Reserved. + * Copyright (c) 2017-2024 VMware, Inc. or its affiliates, All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -63,7 +63,7 @@ public static ProxyProvider.TypeSpec builder() { final String username; final Function password; - final Supplier address; + final Supplier address; final Predicate nonProxyHostPredicate; final Supplier httpHeaders; final Proxy type; @@ -102,8 +102,20 @@ public final Proxy getType() { * The supplier for the address to connect to. * * @return The supplier for the address to connect to. + * @deprecated as of 1.2.0. Prefer using {@link #getSocketAddress()}. + * This method will be removed in 1.3.0. */ + @Deprecated public final Supplier getAddress() { + return () -> (InetSocketAddress) address.get(); + } + + /** + * The supplier for the address to connect to. + * + * @return The supplier for the address to connect to. + */ + public final Supplier getSocketAddress() { return this.address; } @@ -125,7 +137,7 @@ public final Predicate getNonProxyHostsPredicate() { * @return a new eventual {@link ProxyHandler} */ public final ProxyHandler newProxyHandler() { - InetSocketAddress proxyAddr = this.address.get(); + SocketAddress proxyAddr = this.address.get(); final boolean b = Objects.nonNull(username) && Objects.nonNull(password); @@ -212,7 +224,7 @@ public boolean equals(Object o) { ProxyProvider that = (ProxyProvider) o; return Objects.equals(username, that.username) && Objects.equals(getPasswordValue(), that.getPasswordValue()) && - Objects.equals(getAddress().get(), that.getAddress().get()) && + Objects.equals(getSocketAddress().get(), that.getSocketAddress().get()) && getNonProxyHostsValue() == that.getNonProxyHostsValue() && Objects.equals(httpHeaders.get(), that.httpHeaders.get()) && getType() == that.getType() && @@ -224,7 +236,7 @@ public int hashCode() { int result = 1; result = 31 * result + Objects.hashCode(username); result = 31 * result + Objects.hashCode(getPasswordValue()); - result = 31 * result + Objects.hashCode(getAddress().get()); + result = 31 * result + Objects.hashCode(getSocketAddress().get()); result = 31 * result + Boolean.hashCode(getNonProxyHostsValue()); result = 31 * result + Objects.hashCode(httpHeaders.get()); result = 31 * result + Objects.hashCode(getType()); @@ -233,7 +245,7 @@ public int hashCode() { } private boolean getNonProxyHostsValue() { - return nonProxyHostPredicate.test(getAddress().get()); + return nonProxyHostPredicate.test(getSocketAddress().get()); } @Nullable @@ -385,7 +397,7 @@ static final class Build implements TypeSpec, AddressSpec, Builder { Function password; String host; int port; - Supplier address; + Supplier address; Predicate nonProxyHostPredicate = ALWAYS_PROXY; Supplier httpHeaders = NO_HTTP_HEADERS; Proxy type; @@ -412,6 +424,11 @@ public final Builder host(String host) { return this; } + @Override + public final Builder address(InetSocketAddress address) { + return socketAddress(address); + } + @Override public final Builder port(int port) { this.port = port; @@ -419,14 +436,26 @@ public final Builder port(int port) { } @Override - public final Builder address(InetSocketAddress address) { + public final Builder socketAddress(SocketAddress address) { Objects.requireNonNull(address, "address"); - this.address = () -> AddressUtils.replaceWithResolved(address); + this.address = () -> { + if (address instanceof InetSocketAddress) { + return AddressUtils.replaceWithResolved((InetSocketAddress) address); + } + else { + return address; + } + }; return this; } @Override public final Builder address(Supplier addressSupplier) { + return socketAddress(addressSupplier); + } + + @Override + public final Builder socketAddress(Supplier addressSupplier) { this.address = Objects.requireNonNull(addressSupplier, "addressSupplier"); return this; } @@ -583,16 +612,42 @@ public interface AddressSpec { * * @param address The address to connect to. * @return {@code this} + * @deprecated as of 1.2.0. Prefer using {@link #socketAddress(SocketAddress)}. + * This method will be removed in 1.3.0. */ + @Deprecated Builder address(InetSocketAddress address); + /** + * The address to connect to. + * + * @param address The address to connect to. + * @return {@code this} + */ + default Builder socketAddress(SocketAddress address) { + throw new UnsupportedOperationException(); + } + /** * The supplier for the address to connect to. * * @param addressSupplier The supplier for the address to connect to. * @return {@code this} + * @deprecated as of 1.2.0. Prefer using {@link #socketAddress(SocketAddress)}. + * This method will be removed in 1.3.0. */ + @Deprecated Builder address(Supplier addressSupplier); + + /** + * The supplier for the address to connect to. + * + * @param addressSupplier The supplier for the address to connect to. + * @return {@code this} + */ + default Builder socketAddress(Supplier addressSupplier) { + throw new UnsupportedOperationException(); + } } public interface Builder { diff --git a/reactor-netty-core/src/test/java/reactor/netty/transport/ProxyProviderTest.java b/reactor-netty-core/src/test/java/reactor/netty/transport/ProxyProviderTest.java index b953e88b8e..8a8e4d74cd 100644 --- a/reactor-netty-core/src/test/java/reactor/netty/transport/ProxyProviderTest.java +++ b/reactor-netty-core/src/test/java/reactor/netty/transport/ProxyProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2022 VMware, Inc. or its affiliates, All Rights Reserved. + * Copyright (c) 2019-2024 VMware, Inc. or its affiliates, All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -106,7 +106,7 @@ void connectTimeoutWithNonPositiveValue() { void connectTimeoutWithDefault() { ProxyProvider provider = ProxyProvider.builder() .type(ProxyProvider.Proxy.SOCKS5) - .address(ADDRESS_1) + .socketAddress(ADDRESS_1) .build(); assertThat(provider.connectTimeoutMillis).isEqualTo(10000); } @@ -227,7 +227,7 @@ void proxyFromSystemProperties_proxyProviderIsNotNullWhenHttpHostSet() { assertThat(provider).isNotNull(); assertThat(provider.getType()).isEqualTo(ProxyProvider.Proxy.HTTP); - assertThat(provider.getAddress().get().getHostString()).isEqualTo("host"); + assertThat(((InetSocketAddress) provider.getSocketAddress().get()).getHostString()).isEqualTo("host"); } @Test @@ -238,7 +238,7 @@ void proxyFromSystemProperties_port80SetByDefaultForHttpProxy() { ProxyProvider provider = ProxyProvider.createFrom(properties); assertThat(provider).isNotNull(); - assertThat(provider.getAddress().get().getPort()).isEqualTo(80); + assertThat(((InetSocketAddress) provider.getSocketAddress().get()).getPort()).isEqualTo(80); } @Test @@ -250,7 +250,7 @@ void proxyFromSystemProperties_parseHttpPortFromSystemProperties() { ProxyProvider provider = ProxyProvider.createFrom(properties); assertThat(provider).isNotNull(); - assertThat(provider.getAddress().get().getPort()).isEqualTo(8080); + assertThat(((InetSocketAddress) provider.getSocketAddress().get()).getPort()).isEqualTo(8080); } @Test @@ -262,7 +262,7 @@ void proxyFromSystemProperties_proxySettingsIsNotNullWhenHttpSHostSet() { assertThat(provider).isNotNull(); assertThat(provider.getType()).isEqualTo(ProxyProvider.Proxy.HTTP); - assertThat(provider.getAddress().get().getHostString()).isEqualTo("host"); + assertThat(((InetSocketAddress) provider.getSocketAddress().get()).getHostString()).isEqualTo("host"); } @Test @@ -273,7 +273,7 @@ void proxyFromSystemProperties_port443SetByDefaultForHttpProxy() { ProxyProvider provider = ProxyProvider.createFrom(properties); assertThat(provider).isNotNull(); - assertThat(provider.getAddress().get().getPort()).isEqualTo(443); + assertThat(((InetSocketAddress) provider.getSocketAddress().get()).getPort()).isEqualTo(443); } @Test @@ -285,7 +285,7 @@ void proxyFromSystemProperties_parseHttpsPortFromSystemProperties() { ProxyProvider provider = ProxyProvider.createFrom(properties); assertThat(provider).isNotNull(); - assertThat(provider.getAddress().get().getPort()).isEqualTo(8443); + assertThat(((InetSocketAddress) provider.getSocketAddress().get()).getPort()).isEqualTo(8443); } @Test @@ -319,7 +319,7 @@ void proxyFromSystemProperties_httpsProxyOverHttpProxy() { ProxyProvider provider = ProxyProvider.createFrom(properties); assertThat(provider).isNotNull(); - assertThat(provider.getAddress().get().getHostString()).isEqualTo("https"); + assertThat(((InetSocketAddress) provider.getSocketAddress().get()).getHostString()).isEqualTo("https"); } @Test @@ -439,7 +439,7 @@ void proxyFromSystemProperties_socksProxy5SetWhenSocksSystemPropertySet() { assertThat(provider).isNotNull(); assertThat(provider.getType()).isEqualTo(ProxyProvider.Proxy.SOCKS5); - assertThat(provider.getAddress().get().getHostString()).isEqualTo("host"); + assertThat(((InetSocketAddress) provider.getSocketAddress().get()).getHostString()).isEqualTo("host"); } @Test @@ -474,7 +474,7 @@ void proxyFromSystemProperties_defaultSocksPort() { ProxyProvider provider = ProxyProvider.createFrom(properties); assertThat(provider).isNotNull(); - assertThat(provider.getAddress().get().getPort()).isEqualTo(1080); + assertThat(((InetSocketAddress) provider.getSocketAddress().get()).getPort()).isEqualTo(1080); } @Test @@ -486,7 +486,7 @@ void proxyFromSystemProperties_overrideSocksPortWithCustomProperty() { ProxyProvider provider = ProxyProvider.createFrom(properties); assertThat(provider).isNotNull(); - assertThat(provider.getAddress().get().getPort()).isEqualTo(2080); + assertThat(((InetSocketAddress) provider.getSocketAddress().get()).getPort()).isEqualTo(2080); } @Test @@ -587,7 +587,7 @@ void proxyFromSystemProperties_errorWhenSocksVersionInvalid() { private ProxyProvider createProxy(InetSocketAddress address, Function passwordFunc) { return ProxyProvider.builder() .type(ProxyProvider.Proxy.SOCKS5) - .address(address) + .socketAddress(address) .username("netty") .password(passwordFunc) .nonProxyHosts(NON_PROXY_HOSTS) @@ -597,7 +597,7 @@ private ProxyProvider createProxy(InetSocketAddress address, Function authHeader) { return ProxyProvider.builder() .type(ProxyProvider.Proxy.HTTP) - .address(address) + .socketAddress(address) .httpHeaders(authHeader) .build(); } @@ -613,7 +613,7 @@ private ProxyProvider createHeaderProxy(InetSocketAddress address, Consumer> createDisposableAcquire( boolean acceptGzip = false; ChannelMetricsRecorder metricsRecorder = config.metricsRecorder() != null ? config.metricsRecorder().get() : null; SocketAddress proxyAddress = ((ClientTransportConfig) config).proxyProvider() != null ? - ((ClientTransportConfig) config).proxyProvider().getAddress().get() : null; + ((ClientTransportConfig) config).proxyProvider().getSocketAddress().get() : null; Function uriTagValue = null; if (config instanceof HttpClientConfig) { acceptGzip = ((HttpClientConfig) config).acceptGzip; diff --git a/reactor-netty-http/src/main/java/reactor/netty/http/client/HttpClientConfig.java b/reactor-netty-http/src/main/java/reactor/netty/http/client/HttpClientConfig.java index b05b1a02fc..57ed331c8f 100644 --- a/reactor-netty-http/src/main/java/reactor/netty/http/client/HttpClientConfig.java +++ b/reactor-netty-http/src/main/java/reactor/netty/http/client/HttpClientConfig.java @@ -983,7 +983,7 @@ static final class HttpClientChannelInitializer implements ChannelPipelineConfig this.metricsRecorder = config.metricsRecorderInternal(); this.opsFactory = config.channelOperationsProvider(); this.protocols = config._protocols; - this.proxyAddress = config.proxyProvider() != null ? config.proxyProvider().getAddress().get() : null; + this.proxyAddress = config.proxyProvider() != null ? config.proxyProvider().getSocketAddress().get() : null; this.sslProvider = config.sslProvider; this.uriTagValue = config.uriTagValue; }