package org.gingercal; 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.time.Duration; /** Desktop-only transport used to test the CalDAV core against a real server. */ public class JdkHttp implements Http { final HttpClient c = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NEVER) .connectTimeout(Duration.ofSeconds(10)).build(); public int requests; public Resp exec(String method, String url, String[] headers, String body, String contentType) throws IOException { requests++; HttpRequest.Builder b = HttpRequest.newBuilder(URI.create(url)) .method(method, body == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(body)); for (int i = 0; i + 1 < headers.length; i += 2) b.header(headers[i], headers[i + 1]); if (contentType != null) b.header("Content-Type", contentType); try { HttpResponse r; try { r = c.send(b.build(), HttpResponse.BodyHandlers.ofString()); } catch (IOException stale) { // test server drops idle keep-alive sockets r = c.send(b.build(), HttpResponse.BodyHandlers.ofString()); } Resp out = new Resp(); out.code = r.statusCode(); out.body = r.body(); out.etag = r.headers().firstValue("ETag").orElse(null); out.location = r.headers().firstValue("Location").orElse(null); return out; } catch (InterruptedException e) { throw new IOException(e); } } public void close() {} }