1
1
mirror of https://github.com/MarginaliaSearch/MarginaliaSearch.git synced 2025-10-05 21:22:39 +02:00
Files
MarginaliaSearch/code/processes/ping-process/java/nu/marginalia/ping/fetcher/PingHttpFetcher.java

91 lines
3.1 KiB
Java

package nu.marginalia.ping.fetcher;
import com.google.inject.Inject;
import nu.marginalia.UserAgent;
import nu.marginalia.WmsaHome;
import nu.marginalia.ping.fetcher.response.*;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.protocol.HttpClientContext;
import org.apache.hc.core5.http.Header;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.io.support.ClassicRequestBuilder;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PingHttpFetcher {
private final UserAgent userAgent = WmsaHome.getUserAgent();
private final HttpClient client;
@Inject
public PingHttpFetcher(HttpClient client) {
this.client = client;
}
public PingRequestResponse fetchUrl(String url, Method method, String etag, String lastModified) {
var builder = ClassicRequestBuilder.create(method.name())
.setUri(url)
.addHeader("Accept", "text/*, */*;q=0.9")
.addHeader("User-Agent", userAgent.uaString())
.addHeader("Accept-Encoding", "gzip");
if (etag != null) {
builder.addHeader("If-None-Match", etag);
}
if (lastModified != null) {
builder.addHeader("If-Modified-Since", lastModified);
}
var req = builder.build();
HttpClientContext context = HttpClientContext.create();
try {
Instant start = Instant.now();
return client.execute(req, context, (rsp) -> {
var entity = rsp.getEntity();
try {
Header[] rawHeaders = rsp.getHeaders();
Map<String, List<String>> headers = new HashMap<>(rawHeaders.length);
for (Header header : rawHeaders) {
headers.computeIfAbsent(header.getName(), k -> new ArrayList<>())
.add(header.getValue());
}
if (method == Method.GET && entity == null) {
return new ProtocolError("GET request returned no content");
}
byte[] body = entity != null ? EntityUtils.toByteArray(entity) : null;
Duration responseTime = Duration.between(start, Instant.now());
return PingRequestResponse.of(
rsp.getVersion(),
rsp.getCode(),
body,
headers,
responseTime,
context.getSSLSession()
);
} finally {
EntityUtils.consume(entity);
}
});
} catch (SocketTimeoutException ex) {
return new TimeoutResponse(ex.getMessage());
} catch (IOException e) {
return new ConnectionError(e.getMessage());
}
}
}