DownloaderImpl: Auto-close resources and simplify header setting

The headers should be overwritten in the same way, based on how
`.header` is the same as `.removeHeader().addHeader()`.

We weren’t closing the request resources after using them, potentially
leaking file handles. This will add autoclosing for both the request
and the body objects.
This commit is contained in:
Bertrand Jaunet 2025-01-28 08:03:26 +01:00 committed by Profpatsch
parent 47263f5254
commit 410c01547c

View file

@ -137,7 +137,8 @@ public final class DownloaderImpl extends Downloader {
} }
final okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder() final okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder()
.method(httpMethod, requestBody).url(url) .method(httpMethod, requestBody)
.url(url)
.addHeader("User-Agent", USER_AGENT); .addHeader("User-Agent", USER_AGENT);
final String cookies = getCookies(url); final String cookies = getCookies(url);
@ -145,38 +146,33 @@ public final class DownloaderImpl extends Downloader {
requestBuilder.addHeader("Cookie", cookies); requestBuilder.addHeader("Cookie", cookies);
} }
for (final Map.Entry<String, List<String>> pair : headers.entrySet()) { headers.forEach((headerName, headerValueList) -> {
final String headerName = pair.getKey();
final List<String> headerValueList = pair.getValue();
if (headerValueList.size() > 1) {
requestBuilder.removeHeader(headerName); requestBuilder.removeHeader(headerName);
for (final String headerValue : headerValueList) { headerValueList.forEach(headerValue ->
requestBuilder.addHeader(headerName, headerValue); requestBuilder.addHeader(headerName, headerValue));
} });
} else if (headerValueList.size() == 1) {
requestBuilder.header(headerName, headerValueList.get(0));
}
}
final okhttp3.Response response = client.newCall(requestBuilder.build()).execute();
try (
okhttp3.Response response = client.newCall(requestBuilder.build()).execute()
) {
if (response.code() == 429) { if (response.code() == 429) {
response.close();
throw new ReCaptchaException("reCaptcha Challenge requested", url); throw new ReCaptchaException("reCaptcha Challenge requested", url);
} }
final ResponseBody body = response.body();
String responseBodyToReturn = null; String responseBodyToReturn = null;
try (ResponseBody body = response.body()) {
if (body != null) { if (body != null) {
responseBodyToReturn = body.string(); responseBodyToReturn = body.string();
} }
}
final String latestUrl = response.request().url().toString(); final String latestUrl = response.request().url().toString();
return new Response(response.code(), response.message(), response.headers().toMultimap(), return new Response(
responseBodyToReturn, latestUrl); response.code(),
response.message(),
response.headers().toMultimap(),
responseBodyToReturn,
latestUrl);
}
} }
} }