diff --git a/vertx-web-client/src/main/java/io/vertx/ext/web/client/HttpRequest.java b/vertx-web-client/src/main/java/io/vertx/ext/web/client/HttpRequest.java index 4d36d1deb0..f0fd9dcca8 100644 --- a/vertx-web-client/src/main/java/io/vertx/ext/web/client/HttpRequest.java +++ b/vertx-web-client/src/main/java/io/vertx/ext/web/client/HttpRequest.java @@ -159,7 +159,8 @@ public interface HttpRequest { HttpRequest uri(String value); /** - * @return the request uri or {@code null} when none is set for absolute URI templates + * @return the request uri or {@code null} when none is set for absolute URI templates, when the request + * uri is a template, the template is extrapolated tolerating missing variables. */ String uri(); diff --git a/vertx-web-client/src/main/java/io/vertx/ext/web/client/impl/HttpRequestImpl.java b/vertx-web-client/src/main/java/io/vertx/ext/web/client/impl/HttpRequestImpl.java index 6df9471b4c..f915206a20 100644 --- a/vertx-web-client/src/main/java/io/vertx/ext/web/client/impl/HttpRequestImpl.java +++ b/vertx-web-client/src/main/java/io/vertx/ext/web/client/impl/HttpRequestImpl.java @@ -35,6 +35,7 @@ import io.vertx.ext.web.client.HttpResponse; import io.vertx.ext.web.codec.BodyCodec; import io.vertx.ext.web.multipart.MultipartForm; +import io.vertx.uritemplate.ExpandOptions; import io.vertx.uritemplate.UriTemplate; import io.vertx.uritemplate.Variables; @@ -48,6 +49,8 @@ */ public class HttpRequestImpl implements HttpRequest { + private static final ExpandOptions INTERNAL_EXPAND_OPTIONS = new ExpandOptions().setAllowVariableMiss(true); + private final WebClientBase client; private ProxyOptions proxyOptions; private final Address address; @@ -205,7 +208,14 @@ public HttpRequest uri(String value) { } public String uri() { - return uri.toString(); + if (uri == null) { + return null; + } else if (uri instanceof UriTemplate) { + UriTemplate uriTemplate = (UriTemplate) uri; + return uriTemplate.expandToString(templateParams(), INTERNAL_EXPAND_OPTIONS); + } else { + return uri.toString(); + } } @Override diff --git a/vertx-web-client/src/test/java/io/vertx/ext/web/client/tests/UriTemplateTest.java b/vertx-web-client/src/test/java/io/vertx/ext/web/client/tests/UriTemplateTest.java index 1313d0bc5c..0cb8e06e39 100644 --- a/vertx-web-client/src/test/java/io/vertx/ext/web/client/tests/UriTemplateTest.java +++ b/vertx-web-client/src/test/java/io/vertx/ext/web/client/tests/UriTemplateTest.java @@ -73,10 +73,16 @@ public void testTemplateExpansion() throws Exception { Map query = new HashMap<>(); query.put("color", "red"); query.put("currency", EURO_SYMBOL); - testRequest(client -> client.request(HttpMethod.GET, UriTemplate.of("/{action}?username={username}{&query*}")) - .setTemplateParam("action", "info") - .setTemplateParam("username", "vietj") - .setTemplateParam("query", query), req -> { + testRequest(client -> { + HttpRequest request = client.request(HttpMethod.GET, UriTemplate.of("/{action}?username={username}{&query*}")) + .setTemplateParam("action", "info") + .setTemplateParam("query", query); + // Missing variable is accepted + assertEquals("/info?username=&color=red¤cy=%E2%82%AC", request.uri()); + request.setTemplateParam("username", "vietj"); + assertEquals("/info?username=vietj&color=red¤cy=%E2%82%AC", request.uri()); + return request; + }, req -> { assertEquals("/info", req.path()); assertEquals("vietj", req.getParam("username")); assertEquals("red", req.getParam("color"));