feat: add Fetcher seam with an identifying user agent
This commit is contained in:
@@ -0,0 +1,14 @@
|
|||||||
|
package dev.marcospaulo.canalhandia;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/** The one place the plugin talks to the network, so tests can replace it. */
|
||||||
|
interface Fetcher {
|
||||||
|
|
||||||
|
/** GET a URL, returning the body. */
|
||||||
|
String get(String url) throws IOException, InterruptedException;
|
||||||
|
|
||||||
|
/** POST JSON with a bearer token, returning the body. */
|
||||||
|
String postJson(String url, String json, String bearer)
|
||||||
|
throws IOException, InterruptedException;
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package dev.marcospaulo.canalhandia;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.http.HttpClient;
|
||||||
|
import java.net.http.HttpRequest;
|
||||||
|
import java.net.http.HttpResponse;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.Duration;
|
||||||
|
|
||||||
|
final class HttpFetcher implements Fetcher {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pt.minecraft.wiki answers 403 to a default user agent — MediaWiki policy
|
||||||
|
* requires callers to identify themselves.
|
||||||
|
*/
|
||||||
|
private static final String AGENT =
|
||||||
|
"Canalhandia-Minecraft-Bot/1.0 (https://marcospaulo.dev.br)";
|
||||||
|
|
||||||
|
private final HttpClient http = HttpClient.newBuilder()
|
||||||
|
.connectTimeout(Duration.ofSeconds(10))
|
||||||
|
.build();
|
||||||
|
private final int timeoutSeconds;
|
||||||
|
|
||||||
|
HttpFetcher(int timeoutSeconds) {
|
||||||
|
this.timeoutSeconds = timeoutSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String get(String url) throws IOException, InterruptedException {
|
||||||
|
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
|
||||||
|
.timeout(Duration.ofSeconds(timeoutSeconds))
|
||||||
|
.header("User-Agent", AGENT)
|
||||||
|
.GET()
|
||||||
|
.build();
|
||||||
|
return body(http.send(request, HttpResponse.BodyHandlers.ofString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String postJson(String url, String json, String bearer)
|
||||||
|
throws IOException, InterruptedException {
|
||||||
|
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
|
||||||
|
.timeout(Duration.ofSeconds(timeoutSeconds))
|
||||||
|
.header("Content-Type", "application/json")
|
||||||
|
.header("User-Agent", AGENT)
|
||||||
|
.header("Authorization", "Bearer " + bearer)
|
||||||
|
.POST(HttpRequest.BodyPublishers.ofString(json, StandardCharsets.UTF_8))
|
||||||
|
.build();
|
||||||
|
return body(http.send(request, HttpResponse.BodyHandlers.ofString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String body(HttpResponse<String> response) throws IOException {
|
||||||
|
if (response.statusCode() / 100 != 2) {
|
||||||
|
throw new IOException("HTTP " + response.statusCode() + ": "
|
||||||
|
+ AiText.forLog(response.body()));
|
||||||
|
}
|
||||||
|
return response.body();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user