Skip to content

Commit ecf936f

Browse files
authored
Create a new HttpClient per connection (#1243)
* Create a new HttpClient for each connection If the instance is using Java 21, the HttpClient resources will be cleaned using its AutoCloseable interface
1 parent ef86181 commit ecf936f

File tree

3 files changed

+23
-11
lines changed

3 files changed

+23
-11
lines changed

proxy/src/main/java/com/velocitypowered/proxy/VelocityServer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -595,8 +595,8 @@ public void closeListeners() {
595595
this.cm.closeEndpoints(false);
596596
}
597597

598-
public HttpClient getHttpClient() {
599-
return cm.getHttpClient();
598+
public HttpClient createHttpClient() {
599+
return cm.createHttpClient();
600600
}
601601

602602
public Ratelimiter getIpAttemptLimiter() {

proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialLoginSessionHandler.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import io.netty.buffer.ByteBuf;
4444
import java.net.InetSocketAddress;
4545
import java.net.URI;
46+
import java.net.http.HttpClient;
4647
import java.net.http.HttpRequest;
4748
import java.net.http.HttpResponse;
4849
import java.security.GeneralSecurityException;
@@ -213,7 +214,8 @@ public boolean handle(EncryptionResponsePacket packet) {
213214
server.getVersion().getName() + "/" + server.getVersion().getVersion())
214215
.uri(URI.create(url))
215216
.build();
216-
server.getHttpClient().sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString())
217+
final HttpClient httpClient = server.createHttpClient();
218+
httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString())
217219
.whenCompleteAsync((response, throwable) -> {
218220
if (mcConnection.isClosed()) {
219221
// The player disconnected after we authenticated them.
@@ -264,7 +266,18 @@ public boolean handle(EncryptionResponsePacket packet) {
264266
response.statusCode(), login.getUsername(), playerIp);
265267
inbound.disconnect(Component.translatable("multiplayer.disconnect.authservers_down"));
266268
}
267-
}, mcConnection.eventLoop());
269+
}, mcConnection.eventLoop())
270+
.thenRun(() -> {
271+
if (httpClient instanceof final AutoCloseable closeable) {
272+
try {
273+
closeable.close();
274+
} catch (Exception e) {
275+
// In Java 21, the HttpClient does not throw any Exception
276+
// when trying to clean its resources, so this should not happen
277+
logger.error("An unknown error occurred while trying to close an HttpClient", e);
278+
}
279+
}
280+
});
268281
} catch (GeneralSecurityException e) {
269282
logger.error("Unable to enable encryption", e);
270283
mcConnection.close(true);

proxy/src/main/java/com/velocitypowered/proxy/network/ConnectionManager.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,9 @@ public final class ConnectionManager {
6262
public final BackendChannelInitializerHolder backendChannelInitializer;
6363

6464
private final SeparatePoolInetNameResolver resolver;
65-
private final HttpClient httpClient;
6665

6766
/**
68-
* Initalizes the {@code ConnectionManager}.
67+
* Initializes the {@code ConnectionManager}.
6968
*
7069
* @param server a reference to the Velocity server
7170
*/
@@ -79,9 +78,6 @@ public ConnectionManager(VelocityServer server) {
7978
this.backendChannelInitializer = new BackendChannelInitializerHolder(
8079
new BackendChannelInitializer(this.server));
8180
this.resolver = new SeparatePoolInetNameResolver(GlobalEventExecutor.INSTANCE);
82-
this.httpClient = HttpClient.newBuilder()
83-
.executor(this.workerGroup)
84-
.build();
8581
}
8682

8783
public void logChannelInformation() {
@@ -238,8 +234,11 @@ public ServerChannelInitializerHolder getServerChannelInitializer() {
238234
return this.serverChannelInitializer;
239235
}
240236

241-
public HttpClient getHttpClient() {
242-
return this.httpClient;
237+
@SuppressWarnings("checkstyle:MissingJavadocMethod")
238+
public HttpClient createHttpClient() {
239+
return HttpClient.newBuilder()
240+
.executor(this.workerGroup)
241+
.build();
243242
}
244243

245244
public BackendChannelInitializerHolder getBackendChannelInitializer() {

0 commit comments

Comments
 (0)