Skip to content

Commit 4effedc

Browse files
Support a custom DnsAddressResolverGroup builder function (#2745)
Support a user provided function to build a DnsAddressResolverGroup
1 parent 68dbe82 commit 4effedc

File tree

5 files changed

+58
-2
lines changed

5 files changed

+58
-2
lines changed

docs/asciidoc/http-client.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,7 @@ Default: 0.
537537
| `completeOncePreferredResolved` | When this setting is enabled, the resolver notifies as soon as all queries for the preferred address type are complete.
538538
When this setting is disabled, the resolver notifies when all possible address types are complete.
539539
This configuration is applicable for `DnsNameResolver#resolveAll(String)`. By default, this setting is enabled.
540+
| `dnsAddressResolverGroupProvider` | Sets a custom function to create a `DnsAddressResolverGroup` given a `DnsNameResolverBuilder`
540541
| `disableOptionalRecord` | Disables the automatic inclusion of an optional record that tries to give a hint to the remote DNS server about
541542
how much data the resolver can read per response. By default, this setting is enabled.
542543
| `disableRecursionDesired` | Specifies whether this resolver has to send a DNS query with the recursion desired (RD) flag set.

docs/asciidoc/tcp-client.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ The following listing shows the available configurations:
419419
| `completeOncePreferredResolved` | When this setting is enabled, the resolver notifies as soon as all queries for the preferred address type are complete.
420420
When this setting is disabled, the resolver notifies when all possible address types are complete.
421421
This configuration is applicable for `DnsNameResolver#resolveAll(String)`. By default, this setting is enabled.
422+
| `dnsAddressResolverGroupProvider` | Sets a custom function to create a `DnsAddressResolverGroup` given a `DnsNameResolverBuilder`
422423
| `disableOptionalRecord` | Disables the automatic inclusion of an optional record that tries to give a hint to the remote DNS server about
423424
how much data the resolver can read per response. By default, this setting is enabled.
424425
| `disableRecursionDesired` | Specifies whether this resolver has to send a DNS query with the recursion desired (RD) flag set.

reactor-netty-core/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ task japicmp(type: JapicmpTask) {
240240
compatibilityChangeExcludes = [ "METHOD_NEW_DEFAULT" ]
241241

242242
methodExcludes = [
243+
'reactor.netty.transport.NameResolverProvider#dnsAddressResolverGroupProvider()',
244+
'reactor.netty.transport.NameResolverProvider$NameResolverSpec#dnsAddressResolverGroupProvider(java.util.function.Function)'
243245
]
244246
}
245247

reactor-netty-core/src/main/java/reactor/netty/transport/NameResolverProvider.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.time.Duration;
3939
import java.util.List;
4040
import java.util.Objects;
41+
import java.util.function.Function;
4142
import java.util.function.Supplier;
4243

4344
/**
@@ -122,6 +123,16 @@ public interface NameResolverSpec {
122123
*/
123124
NameResolverSpec disableRecursionDesired(boolean disable);
124125

126+
/**
127+
* Sets the custom function to build the {@link DnsAddressResolverGroup} given a {@link DnsNameResolverBuilder}
128+
*
129+
* @param dnsAddressResolverGroupProvider the {@link DnsAddressResolverGroup} provider function
130+
* @return {@code this}
131+
* @since 1.1.6
132+
*/
133+
NameResolverSpec dnsAddressResolverGroupProvider(
134+
Function<DnsNameResolverBuilder, DnsAddressResolverGroup> dnsAddressResolverGroupProvider);
135+
125136
/**
126137
* Specifies a custom {@link HostsFileEntriesResolver} to be used for hosts file entries.
127138
* Default to {@link DefaultHostsFileEntriesResolver}.
@@ -295,6 +306,17 @@ public Duration cacheNegativeTimeToLive() {
295306
return cacheNegativeTimeToLive;
296307
}
297308

309+
/**
310+
* Returns the configured custom provider of {@link DnsAddressResolverGroup} or null
311+
*
312+
* @return the configured custom provider of {@link DnsAddressResolverGroup} or null
313+
* @since 1.1.6
314+
*/
315+
@Nullable
316+
public Function<DnsNameResolverBuilder, DnsAddressResolverGroup> dnsAddressResolverGroupProvider() {
317+
return dnsAddressResolverGroupProvider;
318+
}
319+
298320
/**
299321
* Returns the configured custom {@link HostsFileEntriesResolver} to be used for hosts file entries or null.
300322
*
@@ -452,6 +474,7 @@ public boolean equals(Object o) {
452474
}
453475
NameResolverProvider that = (NameResolverProvider) o;
454476
return completeOncePreferredResolved == that.completeOncePreferredResolved &&
477+
Objects.equals(dnsAddressResolverGroupProvider, that.dnsAddressResolverGroupProvider) &&
455478
disableRecursionDesired == that.disableRecursionDesired &&
456479
disableOptionalRecord == that.disableOptionalRecord &&
457480
maxPayloadSize == that.maxPayloadSize &&
@@ -479,6 +502,7 @@ public int hashCode() {
479502
result = 31 * result + Objects.hashCode(cacheMinTimeToLive);
480503
result = 31 * result + Objects.hashCode(cacheNegativeTimeToLive);
481504
result = 31 * result + Boolean.hashCode(completeOncePreferredResolved);
505+
result = 31 * result + Objects.hashCode(dnsAddressResolverGroupProvider);
482506
result = 31 * result + Boolean.hashCode(disableRecursionDesired);
483507
result = 31 * result + Boolean.hashCode(disableOptionalRecord);
484508
result = 31 * result + Objects.hashCode(loggingFactory);
@@ -547,6 +571,9 @@ public DnsAddressResolverGroup newNameResolverGroup(LoopResources defaultLoopRes
547571
if (searchDomains != null) {
548572
builder.searchDomains(searchDomains);
549573
}
574+
if (dnsAddressResolverGroupProvider != null) {
575+
return dnsAddressResolverGroupProvider.apply(builder);
576+
}
550577
return roundRobinSelection ? new RoundRobinDnsAddressResolverGroup(builder) : new DnsAddressResolverGroup(builder);
551578
}
552579

@@ -570,11 +597,14 @@ public DnsAddressResolverGroup newNameResolverGroup(LoopResources defaultLoopRes
570597
final boolean roundRobinSelection;
571598
final Iterable<String> searchDomains;
572599

600+
final Function<DnsNameResolverBuilder, DnsAddressResolverGroup> dnsAddressResolverGroupProvider;
601+
573602
NameResolverProvider(Build build) {
574603
this.cacheMaxTimeToLive = build.cacheMaxTimeToLive;
575604
this.cacheMinTimeToLive = build.cacheMinTimeToLive;
576605
this.cacheNegativeTimeToLive = build.cacheNegativeTimeToLive;
577606
this.completeOncePreferredResolved = build.completeOncePreferredResolved;
607+
this.dnsAddressResolverGroupProvider = build.dnsAddressResolverGroupProvider;
578608
this.disableOptionalRecord = build.disableOptionalRecord;
579609
this.disableRecursionDesired = build.disableRecursionDesired;
580610
this.hostsFileEntriesResolver = build.hostsFileEntriesResolver;
@@ -622,6 +652,8 @@ static final class Build implements NameResolverSpec {
622652
boolean roundRobinSelection;
623653
Iterable<String> searchDomains;
624654

655+
Function<DnsNameResolverBuilder, DnsAddressResolverGroup> dnsAddressResolverGroupProvider;
656+
625657
@Override
626658
public NameResolverSpec cacheMaxTimeToLive(Duration cacheMaxTimeToLive) {
627659
this.cacheMaxTimeToLive = Objects.requireNonNull(cacheMaxTimeToLive);
@@ -658,6 +690,13 @@ public NameResolverSpec disableRecursionDesired(boolean disable) {
658690
return this;
659691
}
660692

693+
@Override
694+
public NameResolverSpec dnsAddressResolverGroupProvider(
695+
Function<DnsNameResolverBuilder, DnsAddressResolverGroup> dnsAddressResolverGroupProvider) {
696+
this.dnsAddressResolverGroupProvider = Objects.requireNonNull(dnsAddressResolverGroupProvider);
697+
return this;
698+
}
699+
661700
@Override
662701
public NameResolverSpec hostsFileEntriesResolver(HostsFileEntriesResolver hostsFileEntriesResolver) {
663702
this.hostsFileEntriesResolver = Objects.requireNonNull(hostsFileEntriesResolver);

reactor-netty-core/src/test/java/reactor/netty/transport/NameResolverProviderTest.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@
1919
import io.netty.handler.codec.dns.DnsRecord;
2020
import io.netty.handler.logging.LogLevel;
2121
import io.netty.resolver.ResolvedAddressTypes;
22+
import io.netty.resolver.dns.DnsAddressResolverGroup;
2223
import io.netty.resolver.dns.DnsCache;
2324
import io.netty.resolver.dns.DnsCacheEntry;
25+
import io.netty.resolver.dns.DnsNameResolverBuilder;
2426
import io.netty.resolver.dns.DnsServerAddressStreamProviders;
27+
import io.netty.resolver.dns.RoundRobinDnsAddressResolverGroup;
2528
import io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider;
2629
import org.junit.jupiter.api.BeforeEach;
2730
import org.junit.jupiter.api.Test;
@@ -36,6 +39,7 @@
3639
import java.time.Duration;
3740
import java.util.Collections;
3841
import java.util.List;
42+
import java.util.function.Function;
3943
import java.util.function.Supplier;
4044

4145
import static org.assertj.core.api.Assertions.assertThat;
@@ -125,6 +129,15 @@ void completeOncePreferredResolved() {
125129
assertThat(builder.build().isCompleteOncePreferredResolved()).isFalse();
126130
}
127131

132+
@Test
133+
void dnsAddressResolverGroupProvider() {
134+
assertThat(builder.build().dnsAddressResolverGroupProvider()).isNull();
135+
136+
Function<DnsNameResolverBuilder, DnsAddressResolverGroup> provider = RoundRobinDnsAddressResolverGroup::new;
137+
builder.dnsAddressResolverGroupProvider(provider);
138+
assertThat(builder.build().dnsAddressResolverGroupProvider()).isEqualTo(provider);
139+
}
140+
128141
@Test
129142
void disableOptionalRecord() {
130143
assertThat(builder.build().isDisableOptionalRecord()).isFalse();
@@ -143,10 +156,10 @@ void disableRecursionDesired() {
143156

144157
@Test
145158
void hostsFileEntriesResolver() {
146-
assertThat(builder.build().hostsFileEntriesResolver).isNull();
159+
assertThat(builder.build().hostsFileEntriesResolver()).isNull();
147160

148161
builder.hostsFileEntriesResolver((inetHost, resolvedAddressTypes) -> null);
149-
assertThat(builder.build().hostsFileEntriesResolver).isNotNull();
162+
assertThat(builder.build().hostsFileEntriesResolver()).isNotNull();
150163
}
151164

152165
@Test

0 commit comments

Comments
 (0)