Skip to content

Commit 361053d

Browse files
Copilotdoom369
andauthored
Extract resolveHostname helper, close resolver group before EventLoopGroup, simplify error handling
Agent-Logs-Url: https://github.com/doom369/async-http-client/sessions/b617a76d-89c2-45ca-b160-407a5737bcc7 Co-authored-by: doom369 <1536494+doom369@users.noreply.github.com>
1 parent 9f44682 commit 361053d

File tree

3 files changed

+17
-27
lines changed

3 files changed

+17
-27
lines changed

client/src/main/java/org/asynchttpclient/netty/channel/ChannelManager.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -416,12 +416,14 @@ private void doClose() {
416416
ChannelGroupFuture groupFuture = openChannels.close();
417417
channelPool.destroy();
418418
groupFuture.addListener(future -> sslEngineFactory.destroy());
419-
if (addressResolverGroup != null) {
420-
addressResolverGroup.close();
421-
}
422419
}
423420

424421
public void close() {
422+
// Close the resolver group first while the EventLoopGroup is still active,
423+
// since Netty DNS resolvers may need a live EventLoop for clean shutdown.
424+
if (addressResolverGroup != null) {
425+
addressResolverGroup.close();
426+
}
425427
if (allowReleaseEventLoopGroup) {
426428
final long shutdownQuietPeriod = config.getShutdownQuietPeriod().toMillis();
427429
final long shutdownTimeout = config.getShutdownTimeout().toMillis();

client/src/main/java/org/asynchttpclient/netty/request/NettyRequestSender.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474
import org.asynchttpclient.resolver.RequestHostnameResolver;
7575
import org.asynchttpclient.uri.Uri;
7676
import org.asynchttpclient.ws.WebSocketUpgradeHandler;
77-
import org.jetbrains.annotations.Nullable;
77+
7878
import org.slf4j.Logger;
7979
import org.slf4j.LoggerFactory;
8080

@@ -377,11 +377,7 @@ private <T> Future<List<InetSocketAddress>> resolveAddresses(Request request, Pr
377377
int port = ProxyType.HTTPS.equals(proxy.getProxyType()) || uri.isSecured() ? proxy.getSecuredPort() : proxy.getPort();
378378
InetSocketAddress unresolvedRemoteAddress = InetSocketAddress.createUnresolved(proxy.getHost(), port);
379379
scheduleRequestTimeout(future, unresolvedRemoteAddress);
380-
AddressResolver<InetSocketAddress> groupResolver = getGroupResolver();
381-
if (groupResolver != null) {
382-
return RequestHostnameResolver.INSTANCE.resolve(groupResolver, unresolvedRemoteAddress, asyncHandler);
383-
}
384-
return RequestHostnameResolver.INSTANCE.resolve(request.getNameResolver(), unresolvedRemoteAddress, asyncHandler);
380+
return resolveHostname(request, unresolvedRemoteAddress, asyncHandler);
385381
} else {
386382
int port = uri.getExplicitPort();
387383

@@ -393,18 +389,17 @@ private <T> Future<List<InetSocketAddress>> resolveAddresses(Request request, Pr
393389
InetSocketAddress inetSocketAddress = new InetSocketAddress(request.getAddress(), port);
394390
return promise.setSuccess(singletonList(inetSocketAddress));
395391
}
396-
AddressResolver<InetSocketAddress> groupResolver = getGroupResolver();
397-
if (groupResolver != null) {
398-
return RequestHostnameResolver.INSTANCE.resolve(groupResolver, unresolvedRemoteAddress, asyncHandler);
399-
} else {
400-
return RequestHostnameResolver.INSTANCE.resolve(request.getNameResolver(), unresolvedRemoteAddress, asyncHandler);
401-
}
392+
return resolveHostname(request, unresolvedRemoteAddress, asyncHandler);
402393
}
403394
}
404395

405-
private @Nullable AddressResolver<InetSocketAddress> getGroupResolver() {
396+
private Future<List<InetSocketAddress>> resolveHostname(Request request, InetSocketAddress unresolvedRemoteAddress, AsyncHandler<?> asyncHandler) {
406397
AddressResolverGroup<InetSocketAddress> group = channelManager.getAddressResolverGroup();
407-
return group != null ? group.getResolver(channelManager.getEventLoopGroup().next()) : null;
398+
if (group != null) {
399+
AddressResolver<InetSocketAddress> resolver = group.getResolver(channelManager.getEventLoopGroup().next());
400+
return RequestHostnameResolver.INSTANCE.resolve(resolver, unresolvedRemoteAddress, asyncHandler);
401+
}
402+
return RequestHostnameResolver.INSTANCE.resolve(request.getNameResolver(), unresolvedRemoteAddress, asyncHandler);
408403
}
409404

410405
private <T> NettyResponseFuture<T> newNettyResponseFuture(Request request, AsyncHandler<T> asyncHandler, NettyRequest nettyRequest, ProxyServer proxyServer) {

client/src/main/java/org/asynchttpclient/resolver/RequestHostnameResolver.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
import java.net.InetAddress;
2929
import java.net.InetSocketAddress;
30-
import java.net.UnknownHostException;
30+
3131
import java.util.ArrayList;
3232
import java.util.List;
3333

@@ -126,21 +126,14 @@ protected void onSuccess(List<InetSocketAddress> socketAddresses) {
126126

127127
@Override
128128
protected void onFailure(Throwable t) {
129-
// Wrap non-UnknownHostException DNS errors for backward compatibility.
130-
// The JDK resolver always threw UnknownHostException; Netty's async DNS
131-
// resolver may throw DnsErrorCauseException for SERVFAIL or other errors.
132-
Throwable cause = t instanceof UnknownHostException ? t : new UnknownHostException(hostname);
133-
if (!(t instanceof UnknownHostException)) {
134-
cause.initCause(t);
135-
}
136129
try {
137-
asyncHandler.onHostnameResolutionFailure(hostname, cause);
130+
asyncHandler.onHostnameResolutionFailure(hostname, t);
138131
} catch (Exception e) {
139132
LOGGER.error("onHostnameResolutionFailure crashed", e);
140133
promise.tryFailure(e);
141134
return;
142135
}
143-
promise.tryFailure(cause);
136+
promise.tryFailure(t);
144137
}
145138
});
146139

0 commit comments

Comments
 (0)