diff --git a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java index eb8e815aa..f7e8a9ced 100644 --- a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java +++ b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java @@ -1,11 +1,7 @@ package io.avaje.http.client; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.avaje.inject.BeanScope; -import io.avaje.jsonb.Jsonb; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLParameters; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.net.Authenticator; import java.net.CookieHandler; import java.net.CookieManager; @@ -21,15 +17,18 @@ import java.util.concurrent.Executors; import java.util.function.Function; -import static java.util.Objects.requireNonNull; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLParameters; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.avaje.inject.BeanScope; +import io.avaje.jsonb.Jsonb; final class DHttpClientBuilder implements HttpClient.Builder, HttpClient.Builder.State { private java.net.http.HttpClient client; - private String baseUrl; + private String baseUrl = ""; private boolean requestLogging = true; private Duration connectionTimeout = Duration.ofSeconds(20); private Duration requestTimeout = Duration.ofSeconds(20); @@ -168,8 +167,6 @@ private boolean detectTypeExists(String className) { } private DHttpClientContext buildClient() { - requireNonNull(baseUrl, "baseUrl is not specified"); - requireNonNull(requestTimeout, "requestTimeout is not specified"); final var httpClient = client != null ? client : defaultClient(); if (requestLogging) { // register the built-in request/response logging diff --git a/http-client/src/test/java/org/example/dinject/ConfigureWithDITest.java b/http-client/src/test/java/org/example/dinject/ConfigureWithDITest.java index a92d016ea..dc0028ef5 100644 --- a/http-client/src/test/java/org/example/dinject/ConfigureWithDITest.java +++ b/http-client/src/test/java/org/example/dinject/ConfigureWithDITest.java @@ -20,7 +20,7 @@ void configureWith() { HttpClient.Builder builder = HttpClient.builder(); HttpClient.Builder.State state = builder.state(); - assertThat(state.baseUrl()).isNull(); + assertThat(state.baseUrl()).isEmpty(); assertThat(state.bodyAdapter()).isNull(); assertThat(state.client()).isNull(); assertThat(state.requestLogging()).isTrue(); diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java index b1be334ed..d17025183 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java @@ -427,7 +427,7 @@ private void writePaths(Set segments) { } else { // If we have accumulated literals, write them out first if (combinedLiterals.length() > 0) { - writer.append(".path(\"").append(combinedLiterals.toString()).append("\")"); + writeLiteral(combinedLiterals); combinedLiterals.setLength(0); // Clear the buffer } // Write the non-literal segment @@ -441,7 +441,7 @@ private void writePaths(Set segments) { // Write any remaining accumulated literals if (combinedLiterals.length() > 0) { - writer.append(".path(\"").append(combinedLiterals.toString()).append("\")"); + writeLiteral(combinedLiterals); } if (!segments.isEmpty()) { @@ -449,6 +449,15 @@ private void writePaths(Set segments) { } } + private void writeLiteral(StringBuilder combinedLiterals) { + String path = + combinedLiterals.toString().replace("http:/", "http://").replace("https:/", "https://"); + writer + .append(path.startsWith("http:") || path.startsWith("https:") ? ".url(\"" : ".path(\"") + .append(path) + .append("\")"); + } + private boolean isMap(MethodParam param) { return isMap(param.utype().mainType()); } diff --git a/http-generator-client/src/test/java/io/avaje/http/generator/client/clients/ApiClient.java b/http-generator-client/src/test/java/io/avaje/http/generator/client/clients/ApiClient.java index 7c3d57baa..4347de659 100644 --- a/http-generator-client/src/test/java/io/avaje/http/generator/client/clients/ApiClient.java +++ b/http-generator-client/src/test/java/io/avaje/http/generator/client/clients/ApiClient.java @@ -15,4 +15,7 @@ public interface ApiClient { @Get("/consecutive/paths/{accept}/generate") String consecutive(String accept); + + @Get("http://localhost:6969/test") + String staticUrl(); } diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/Util.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/Util.java index 8a1569139..3a6a79b63 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/Util.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/Util.java @@ -98,6 +98,10 @@ static String combinePath(String beanPath, String webMethodPath) { if (!webMethodPath.isEmpty() && !webMethodPath.startsWith("/")) { sb.append("/"); } + + if (webMethodPath.startsWith("https:") || webMethodPath.startsWith("http:")) { + return webMethodPath; + } sb.append(trimTrailingSlash(webMethodPath)); } return sb.toString();