diff --git a/client/src/main/java/org/asynchttpclient/DefaultAsyncHttpClient.java b/client/src/main/java/org/asynchttpclient/DefaultAsyncHttpClient.java index 8d2c3f7ab1..7e8c21f901 100644 --- a/client/src/main/java/org/asynchttpclient/DefaultAsyncHttpClient.java +++ b/client/src/main/java/org/asynchttpclient/DefaultAsyncHttpClient.java @@ -194,7 +194,7 @@ public ListenableFuture executeRequest(Request request, AsyncHandler h try { List cookies = config.getCookieStore().get(request.getUri()); if (!cookies.isEmpty()) { - RequestBuilder requestBuilder = new RequestBuilder(request); + RequestBuilder requestBuilder = request.toBuilder(); for (Cookie cookie : cookies) { requestBuilder.addOrReplaceCookie(cookie); } @@ -264,7 +264,7 @@ private FilterContext preProcessRequest(FilterContext fc) throws Filte } if (request.getRangeOffset() != 0) { - RequestBuilder builder = new RequestBuilder(request); + RequestBuilder builder = request.toBuilder(); builder.setHeader("Range", "bytes=" + request.getRangeOffset() + "-"); request = builder.build(); } diff --git a/client/src/main/java/org/asynchttpclient/Request.java b/client/src/main/java/org/asynchttpclient/Request.java index 0bcf3ae710..cf6a82dee2 100644 --- a/client/src/main/java/org/asynchttpclient/Request.java +++ b/client/src/main/java/org/asynchttpclient/Request.java @@ -180,4 +180,12 @@ public interface Request { * @return the NameResolver to be used to resolve hostnams's IP */ NameResolver getNameResolver(); + + /** + * @return a new request builder using this request as a prototype + */ + @SuppressWarnings("deprecation") + default RequestBuilder toBuilder() { + return new RequestBuilder(this); + } } diff --git a/client/src/main/java/org/asynchttpclient/RequestBuilder.java b/client/src/main/java/org/asynchttpclient/RequestBuilder.java index 4b0d485ba4..4761f0c2c4 100644 --- a/client/src/main/java/org/asynchttpclient/RequestBuilder.java +++ b/client/src/main/java/org/asynchttpclient/RequestBuilder.java @@ -39,10 +39,15 @@ public RequestBuilder(String method, boolean disableUrlEncoding, boolean validat super(method, disableUrlEncoding, validateHeaders); } + /** + * @deprecated Use request.toBuilder() instead + */ + @Deprecated public RequestBuilder(Request prototype) { super(prototype); } + @Deprecated public RequestBuilder(Request prototype, boolean disableUrlEncoding, boolean validateHeaders) { super(prototype, disableUrlEncoding, validateHeaders); } diff --git a/client/src/main/java/org/asynchttpclient/handler/resumable/ResumableAsyncHandler.java b/client/src/main/java/org/asynchttpclient/handler/resumable/ResumableAsyncHandler.java index 399638fbb2..d6b671a270 100644 --- a/client/src/main/java/org/asynchttpclient/handler/resumable/ResumableAsyncHandler.java +++ b/client/src/main/java/org/asynchttpclient/handler/resumable/ResumableAsyncHandler.java @@ -198,7 +198,7 @@ public Request adjustRequestRange(Request request) { byteTransferred.set(resumableListener.length()); } - RequestBuilder builder = new RequestBuilder(request); + RequestBuilder builder = request.toBuilder(); if (request.getHeaders().get(RANGE) == null && byteTransferred.get() != 0) { builder.setHeader(RANGE, "bytes=" + byteTransferred.get() + "-"); } diff --git a/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ConnectSuccessInterceptor.java b/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ConnectSuccessInterceptor.java index 753df0020d..eb2e98e36f 100644 --- a/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ConnectSuccessInterceptor.java +++ b/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ConnectSuccessInterceptor.java @@ -52,7 +52,7 @@ public boolean exitAfterHandlingConnect(Channel channel, future.setReuseChannel(true); future.setConnectAllowed(false); - Request targetRequest = new RequestBuilder(future.getTargetRequest()).build(); + Request targetRequest = future.getTargetRequest().toBuilder().build(); if (whenHandshaked == null) { requestSender.drainChannelAndExecuteNextRequest(channel, future, targetRequest); } else { diff --git a/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ProxyUnauthorized407Interceptor.java b/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ProxyUnauthorized407Interceptor.java index cb076b861c..57436e9ae5 100644 --- a/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ProxyUnauthorized407Interceptor.java +++ b/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ProxyUnauthorized407Interceptor.java @@ -163,7 +163,7 @@ public boolean exitAfterHandling407(Channel channel, throw new IllegalStateException("Invalid Authentication scheme " + proxyRealm.getScheme()); } - RequestBuilder nextRequestBuilder = new RequestBuilder(future.getCurrentRequest()).setHeaders(requestHeaders); + RequestBuilder nextRequestBuilder = future.getCurrentRequest().toBuilder().setHeaders(requestHeaders); if (future.getCurrentRequest().getUri().isSecured()) { nextRequestBuilder.setMethod(CONNECT); } diff --git a/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Unauthorized401Interceptor.java b/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Unauthorized401Interceptor.java index 34f81f3187..269042529b 100644 --- a/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Unauthorized401Interceptor.java +++ b/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Unauthorized401Interceptor.java @@ -162,7 +162,7 @@ public boolean exitAfterHandling401(final Channel channel, throw new IllegalStateException("Invalid Authentication scheme " + realm.getScheme()); } - final Request nextRequest = new RequestBuilder(future.getCurrentRequest()).setHeaders(requestHeaders).build(); + final Request nextRequest = future.getCurrentRequest().toBuilder().setHeaders(requestHeaders).build(); LOGGER.debug("Sending authentication to {}", request.getUri()); if (future.isKeepAlive() diff --git a/client/src/test/java/org/asynchttpclient/RequestBuilderTest.java b/client/src/test/java/org/asynchttpclient/RequestBuilderTest.java index 41fed53a4c..968c408fbc 100644 --- a/client/src/test/java/org/asynchttpclient/RequestBuilderTest.java +++ b/client/src/test/java/org/asynchttpclient/RequestBuilderTest.java @@ -72,7 +72,7 @@ public void testEncodesQueryParameters() { public void testChaining() { Request request = get("http://foo.com").addQueryParam("x", "value").build(); - Request request2 = new RequestBuilder(request).build(); + Request request2 = request.toBuilder().build(); assertEquals(request2.getUri(), request.getUri()); } diff --git a/client/src/test/java/org/asynchttpclient/filter/FilterTest.java b/client/src/test/java/org/asynchttpclient/filter/FilterTest.java index 10b36507a5..14997d6234 100644 --- a/client/src/test/java/org/asynchttpclient/filter/FilterTest.java +++ b/client/src/test/java/org/asynchttpclient/filter/FilterTest.java @@ -101,7 +101,7 @@ public void replayResponseFilterTest() throws Exception { ResponseFilter responseFilter = new ResponseFilter() { public FilterContext filter(FilterContext ctx) { if (replay.getAndSet(false)) { - Request request = new RequestBuilder(ctx.getRequest()).addHeader("X-Replay", "true").build(); + Request request = ctx.getRequest().toBuilder().addHeader("X-Replay", "true").build(); return new FilterContext.FilterContextBuilder().asyncHandler(ctx.getAsyncHandler()).request(request).replayRequest(true).build(); } return ctx; @@ -123,7 +123,7 @@ public void replayStatusCodeResponseFilterTest() throws Exception { ResponseFilter responseFilter = new ResponseFilter() { public FilterContext filter(FilterContext ctx) { if (ctx.getResponseStatus() != null && ctx.getResponseStatus().getStatusCode() == 200 && replay.getAndSet(false)) { - Request request = new RequestBuilder(ctx.getRequest()).addHeader("X-Replay", "true").build(); + Request request = ctx.getRequest().toBuilder().addHeader("X-Replay", "true").build(); return new FilterContext.FilterContextBuilder().asyncHandler(ctx.getAsyncHandler()).request(request).replayRequest(true).build(); } return ctx; @@ -145,7 +145,7 @@ public void replayHeaderResponseFilterTest() throws Exception { ResponseFilter responseFilter = new ResponseFilter() { public FilterContext filter(FilterContext ctx) { if (ctx.getResponseHeaders() != null && ctx.getResponseHeaders().get("Ping").equals("Pong") && replay.getAndSet(false)) { - Request request = new RequestBuilder(ctx.getRequest()).addHeader("Ping", "Pong").build(); + Request request = ctx.getRequest().toBuilder().addHeader("Ping", "Pong").build(); return new FilterContext.FilterContextBuilder().asyncHandler(ctx.getAsyncHandler()).request(request).replayRequest(true).build(); } return ctx; diff --git a/extras/simple/src/main/java/org/asynchttpclient/extras/simple/SimpleAsyncHttpClient.java b/extras/simple/src/main/java/org/asynchttpclient/extras/simple/SimpleAsyncHttpClient.java index 8d5bf18afe..b1926b3988 100644 --- a/extras/simple/src/main/java/org/asynchttpclient/extras/simple/SimpleAsyncHttpClient.java +++ b/extras/simple/src/main/java/org/asynchttpclient/extras/simple/SimpleAsyncHttpClient.java @@ -275,7 +275,7 @@ public Future options(BodyConsumer bodyConsumer, ThrowableHandler thro } private RequestBuilder rebuildRequest(Request rb) { - return new RequestBuilder(rb); + return rb.toBuilder(); } private Future execute(RequestBuilder rb, BodyConsumer bodyConsumer, ThrowableHandler throwableHandler) throws IOException { @@ -422,7 +422,7 @@ public Builder() { } private Builder(SimpleAsyncHttpClient client) { - this.requestBuilder = new RequestBuilder(client.requestBuilder.build()); + this.requestBuilder = client.requestBuilder.build().toBuilder(); this.defaultThrowableHandler = client.defaultThrowableHandler; this.errorDocumentBehaviour = client.errorDocumentBehaviour; this.enableResumableDownload = client.resumeEnabled;