From 751fe799d4df116cac68a3a58b5e49835b6c1ffd Mon Sep 17 00:00:00 2001 From: "Rodriguez, Ignacio | Nacho" Date: Thu, 7 Nov 2019 11:08:09 +0900 Subject: [PATCH 1/2] Added toBuilder methods to Request --- .../org/asynchttpclient/DefaultAsyncHttpClient.java | 4 ++-- .../java/org/asynchttpclient/DefaultRequest.java | 10 ++++++++++ .../src/main/java/org/asynchttpclient/Request.java | 12 ++++++++++++ .../handler/resumable/ResumableAsyncHandler.java | 2 +- .../handler/intercept/ConnectSuccessInterceptor.java | 2 +- .../intercept/ProxyUnauthorized407Interceptor.java | 2 +- .../intercept/Unauthorized401Interceptor.java | 2 +- .../java/org/asynchttpclient/RequestBuilderTest.java | 2 +- .../java/org/asynchttpclient/filter/FilterTest.java | 6 +++--- .../extras/simple/SimpleAsyncHttpClient.java | 4 ++-- 10 files changed, 34 insertions(+), 12 deletions(-) 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/DefaultRequest.java b/client/src/main/java/org/asynchttpclient/DefaultRequest.java index 4cabb41792..d2aee62836 100644 --- a/client/src/main/java/org/asynchttpclient/DefaultRequest.java +++ b/client/src/main/java/org/asynchttpclient/DefaultRequest.java @@ -246,6 +246,16 @@ public NameResolver getNameResolver() { return nameResolver; } + @Override + public RequestBuilder toBuilder() { + return new RequestBuilder(this); + } + + @Override + public RequestBuilder toBuilder(boolean disableUrlEncoding, boolean validateHeaders) { + return new RequestBuilder(this, disableUrlEncoding, validateHeaders); + } + @Override public List getQueryParams() { if (queryParams == null) diff --git a/client/src/main/java/org/asynchttpclient/Request.java b/client/src/main/java/org/asynchttpclient/Request.java index 0bcf3ae710..f94f680f38 100644 --- a/client/src/main/java/org/asynchttpclient/Request.java +++ b/client/src/main/java/org/asynchttpclient/Request.java @@ -180,4 +180,16 @@ 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 + */ + RequestBuilder toBuilder(); + + /** + * @param disableUrlEncoding whether to disable url encoding or not + * @param validateHeaders whether to enable header validation or not + * @return a new request builder using this request as a prototype + */ + RequestBuilder toBuilder(boolean disableUrlEncoding, boolean 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; From 7acd3afa8154a21a864a84bc0710b3160ab842fe Mon Sep 17 00:00:00 2001 From: "Rodriguez, Ignacio | Nacho" Date: Thu, 7 Nov 2019 17:57:02 +0900 Subject: [PATCH 2/2] deprecated RequestBuilder prototype methods and moved implementation as default on the Request interface --- .../java/org/asynchttpclient/DefaultRequest.java | 10 ---------- .../src/main/java/org/asynchttpclient/Request.java | 12 ++++-------- .../java/org/asynchttpclient/RequestBuilder.java | 5 +++++ 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/client/src/main/java/org/asynchttpclient/DefaultRequest.java b/client/src/main/java/org/asynchttpclient/DefaultRequest.java index d2aee62836..4cabb41792 100644 --- a/client/src/main/java/org/asynchttpclient/DefaultRequest.java +++ b/client/src/main/java/org/asynchttpclient/DefaultRequest.java @@ -246,16 +246,6 @@ public NameResolver getNameResolver() { return nameResolver; } - @Override - public RequestBuilder toBuilder() { - return new RequestBuilder(this); - } - - @Override - public RequestBuilder toBuilder(boolean disableUrlEncoding, boolean validateHeaders) { - return new RequestBuilder(this, disableUrlEncoding, validateHeaders); - } - @Override public List getQueryParams() { if (queryParams == null) diff --git a/client/src/main/java/org/asynchttpclient/Request.java b/client/src/main/java/org/asynchttpclient/Request.java index f94f680f38..cf6a82dee2 100644 --- a/client/src/main/java/org/asynchttpclient/Request.java +++ b/client/src/main/java/org/asynchttpclient/Request.java @@ -184,12 +184,8 @@ public interface Request { /** * @return a new request builder using this request as a prototype */ - RequestBuilder toBuilder(); - - /** - * @param disableUrlEncoding whether to disable url encoding or not - * @param validateHeaders whether to enable header validation or not - * @return a new request builder using this request as a prototype - */ - RequestBuilder toBuilder(boolean disableUrlEncoding, boolean validateHeaders); + @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); }