diff --git a/bom/pom.xml b/bom/pom.xml index 50020fb58996398d8717f5325773795c1e0a0472..867f23157e07a8c9d57a537f72f6bf8271ab511b 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client-project</artifactId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <artifactId>async-http-client-bom</artifactId> diff --git a/client/pom.xml b/client/pom.xml index dc4a23aeeca99fa0c36b64805bcc05e4628eddea..59b67c17d1b9b15be1c540a04fef7efd37e8ae72 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -2,7 +2,7 @@ <parent> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client-project</artifactId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>async-http-client</artifactId> diff --git a/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java b/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java index d56b90fd24f1e7fe827b9d04d5e6514a7e19d140..a2ddbd946734dd780ca88f9572f2f7a9c105fca2 100644 --- a/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java +++ b/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java @@ -38,6 +38,8 @@ import java.util.Set; import static io.netty.handler.codec.http.HttpHeaderNames.*; import static org.asynchttpclient.util.HttpConstants.Methods.GET; +import static org.asynchttpclient.util.HttpConstants.Methods.HEAD; +import static org.asynchttpclient.util.HttpConstants.Methods.OPTIONS; import static org.asynchttpclient.util.HttpConstants.ResponseStatusCodes.*; import static org.asynchttpclient.util.HttpUtils.followRedirect; import static org.asynchttpclient.util.MiscUtils.isNonEmpty; @@ -87,7 +89,7 @@ public class Redirect30xInterceptor { String originalMethod = request.getMethod(); boolean switchToGet = !originalMethod.equals(GET) - && (statusCode == MOVED_PERMANENTLY_301 || statusCode == SEE_OTHER_303 || (statusCode == FOUND_302 && !config.isStrict302Handling())); + && !originalMethod.equals(OPTIONS) && !originalMethod.equals(HEAD) && (statusCode == MOVED_PERMANENTLY_301 || statusCode == SEE_OTHER_303 || (statusCode == FOUND_302 && !config.isStrict302Handling())); boolean keepBody = statusCode == TEMPORARY_REDIRECT_307 || statusCode == PERMANENT_REDIRECT_308 || (statusCode == FOUND_302 && config.isStrict302Handling()); final RequestBuilder requestBuilder = new RequestBuilder(switchToGet ? GET : originalMethod) @@ -126,7 +128,6 @@ public class Redirect30xInterceptor { HttpHeaders responseHeaders = response.headers(); String location = responseHeaders.get(LOCATION); Uri newUri = Uri.create(future.getUri(), location); - LOGGER.debug("Redirecting to {}", newUri); CookieStore cookieStore = config.getCookieStore(); diff --git a/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java b/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java index 663ced6ce1d49cd0a0d8bb76243f10104b1a9f8f..4cfee06cd63a0019f825e4fcf5bd849625d2e374 100755 --- a/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java +++ b/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java @@ -140,6 +140,7 @@ public final class NettyRequestFactory { if (connect) { // assign proxy-auth as configured on request headers.set(PROXY_AUTHORIZATION, request.getHeaders().getAll(PROXY_AUTHORIZATION)); + headers.set(USER_AGENT, request.getHeaders().getAll(USER_AGENT)); } else { // assign headers as configured on request diff --git a/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestSender.java b/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestSender.java index 4fa0589a841dc44582413ad34b8ca417ed074dfb..aed08b7a709c32a5a35f0ee116259f8a1d75f7b3 100755 --- a/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestSender.java +++ b/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestSender.java @@ -275,6 +275,12 @@ public final class NettyRequestSender { // some headers are only set when performing the first request HttpHeaders headers = future.getNettyRequest().getHttpRequest().headers(); + if(proxy != null && proxy.getCustomHeaders() != null ) { + HttpHeaders customHeaders = proxy.getCustomHeaders().apply(request); + if(customHeaders != null) { + headers.add(customHeaders); + } + } Realm realm = future.getRealm(); Realm proxyRealm = future.getProxyRealm(); requestFactory.addAuthorizationHeader(headers, perConnectionAuthorizationHeader(request, proxy, realm)); @@ -464,7 +470,7 @@ public final class NettyRequestSender { public void abort(Channel channel, NettyResponseFuture<?> future, Throwable t) { if (channel != null) { - Object attribute = Channels.getAttribute(future.channel()); + Object attribute = Channels.getAttribute(channel); if (attribute instanceof StreamedResponsePublisher) { ((StreamedResponsePublisher) attribute).setError(t); } diff --git a/client/src/main/java/org/asynchttpclient/proxy/ProxyServer.java b/client/src/main/java/org/asynchttpclient/proxy/ProxyServer.java index 13c33590beaa4e05090036db83367db2d02ab265..bdbc76db8ee3978f5d415f3f4ed1e6ef574ebe52 100644 --- a/client/src/main/java/org/asynchttpclient/proxy/ProxyServer.java +++ b/client/src/main/java/org/asynchttpclient/proxy/ProxyServer.java @@ -16,11 +16,15 @@ */ package org.asynchttpclient.proxy; +import io.netty.handler.codec.http.HttpHeaders; + import org.asynchttpclient.Realm; +import org.asynchttpclient.Request; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.Function; import static org.asynchttpclient.util.Assertions.assertNotNull; import static org.asynchttpclient.util.MiscUtils.isNonEmpty; @@ -36,15 +40,22 @@ public class ProxyServer { private final Realm realm; private final List<String> nonProxyHosts; private final ProxyType proxyType; + private final Function<Request, HttpHeaders> customHeaders; public ProxyServer(String host, int port, int securedPort, Realm realm, List<String> nonProxyHosts, - ProxyType proxyType) { + ProxyType proxyType, Function<Request, HttpHeaders> customHeaders) { this.host = host; this.port = port; this.securedPort = securedPort; this.realm = realm; this.nonProxyHosts = nonProxyHosts; this.proxyType = proxyType; + this.customHeaders = customHeaders; + } + + public ProxyServer(String host, int port, int securedPort, Realm realm, List<String> nonProxyHosts, + ProxyType proxyType) { + this(host, port, securedPort, realm, nonProxyHosts, proxyType, null); } public String getHost() { @@ -71,6 +82,10 @@ public class ProxyServer { return proxyType; } + public Function<Request, HttpHeaders> getCustomHeaders() { + return customHeaders; + } + /** * Checks whether proxy should be used according to nonProxyHosts settings of * it, or we want to go directly to target host. If <code>null</code> proxy is @@ -118,6 +133,7 @@ public class ProxyServer { private Realm realm; private List<String> nonProxyHosts; private ProxyType proxyType; + private Function<Request, HttpHeaders> customHeaders; public Builder(String host, int port) { this.host = host; @@ -157,11 +173,16 @@ public class ProxyServer { return this; } + public Builder setCustomHeaders(Function<Request, HttpHeaders> customHeaders) { + this.customHeaders = customHeaders; + return this; + } + public ProxyServer build() { List<String> nonProxyHosts = this.nonProxyHosts != null ? Collections.unmodifiableList(this.nonProxyHosts) : Collections.emptyList(); ProxyType proxyType = this.proxyType != null ? this.proxyType : ProxyType.HTTP; - return new ProxyServer(host, port, securedPort, realm, nonProxyHosts, proxyType); + return new ProxyServer(host, port, securedPort, realm, nonProxyHosts, proxyType, customHeaders); } } } diff --git a/client/src/test/java/org/asynchttpclient/AsyncStreamHandlerTest.java b/client/src/test/java/org/asynchttpclient/AsyncStreamHandlerTest.java index ce7607e92e8cde280a3f40a5a65503a8e07219b9..17dc2213ba70111f7532858ed1f9c6a0821fc149 100644 --- a/client/src/test/java/org/asynchttpclient/AsyncStreamHandlerTest.java +++ b/client/src/test/java/org/asynchttpclient/AsyncStreamHandlerTest.java @@ -428,6 +428,8 @@ public class AsyncStreamHandlerTest extends HttpTest { })); } + // This test is flaky - see https://github.com/AsyncHttpClient/async-http-client/issues/1728#issuecomment-699962325 + // For now, just run again if fails @Test(groups = "online") public void asyncOptionsTest() throws Throwable { diff --git a/client/src/test/java/org/asynchttpclient/BasicHttpProxyToHttpsTest.java b/client/src/test/java/org/asynchttpclient/BasicHttpProxyToHttpsTest.java index a1919f6f4a119b9e934b0231e0e3aa0693afd0c8..260395674ac638021509cb6de9e99663886a47df 100644 --- a/client/src/test/java/org/asynchttpclient/BasicHttpProxyToHttpsTest.java +++ b/client/src/test/java/org/asynchttpclient/BasicHttpProxyToHttpsTest.java @@ -31,18 +31,20 @@ import java.io.IOException; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import static io.netty.handler.codec.http.HttpHeaderNames.PROXY_AUTHENTICATE; -import static io.netty.handler.codec.http.HttpHeaderNames.PROXY_AUTHORIZATION; +import static io.netty.handler.codec.http.HttpHeaderNames.*; import static org.asynchttpclient.Dsl.*; import static org.asynchttpclient.test.TestUtils.addHttpConnector; import static org.asynchttpclient.test.TestUtils.addHttpsConnector; +import static org.asynchttpclient.config.AsyncHttpClientConfigDefaults.*; /** - * Test that validates that when having an HTTP proxy and trying to access an HTTPS through the proxy the proxy credentials should be passed during the CONNECT request. + * Test that validates that when having an HTTP proxy and trying to access an HTTPS + * through the proxy the proxy credentials and a custom user-agent (if set) should be passed during the CONNECT request. */ public class BasicHttpProxyToHttpsTest { private static final Logger LOGGER = LoggerFactory.getLogger(BasicHttpProxyToHttpsTest.class); + private static final String CUSTOM_USER_AGENT = "custom-user-agent"; private int httpPort; private int proxyPort; @@ -66,13 +68,24 @@ public class BasicHttpProxyToHttpsTest { ConnectHandler connectHandler = new ConnectHandler() { @Override + // This proxy receives a CONNECT request from the client before making the real request for the target host. protected boolean handleAuthentication(HttpServletRequest request, HttpServletResponse response, String address) { + + // If the userAgent of the CONNECT request is the same as the default userAgent, + // then the custom userAgent was not properly propagated and the test should fail. + String userAgent = request.getHeader(USER_AGENT.toString()); + if(userAgent.equals(defaultUserAgent())) { + return false; + } + + // If the authentication failed, the test should also fail. String authorization = request.getHeader(PROXY_AUTHORIZATION.toString()); if (authorization == null) { response.setStatus(HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED); response.setHeader(PROXY_AUTHENTICATE.toString(), "Basic realm=\"Fake Realm\""); return false; - } else if (authorization.equals("Basic am9obmRvZTpwYXNz")) { + } + else if (authorization.equals("Basic am9obmRvZTpwYXNz")) { return true; } response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); @@ -98,6 +111,7 @@ public class BasicHttpProxyToHttpsTest { String targetUrl = "https://localhost:" + httpPort + "/foo/bar"; Request request = get(targetUrl) .setProxyServer(proxyServer("127.0.0.1", proxyPort).setRealm(realm(AuthScheme.BASIC, "johndoe", "pass"))) + .setHeader("user-agent", CUSTOM_USER_AGENT) // .setRealm(realm(AuthScheme.BASIC, "user", "passwd")) .build(); Future<Response> responseFuture = client.executeRequest(request); @@ -107,4 +121,4 @@ public class BasicHttpProxyToHttpsTest { Assert.assertEquals("/foo/bar", response.getHeader("X-pathInfo")); } } -} \ No newline at end of file +} diff --git a/client/src/test/java/org/asynchttpclient/Head302Test.java b/client/src/test/java/org/asynchttpclient/Head302Test.java index 2072f3dbb3cbe6d824745e288cd194dffadabc65..2a3f5bf2943888befd972ac45bd54ec67a6da2c7 100644 --- a/client/src/test/java/org/asynchttpclient/Head302Test.java +++ b/client/src/test/java/org/asynchttpclient/Head302Test.java @@ -70,9 +70,17 @@ public class Head302Test extends AbstractBasicTest { private static class Head302handler extends AbstractHandler { public void handle(String s, org.eclipse.jetty.server.Request r, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { if ("HEAD".equalsIgnoreCase(request.getMethod())) { - response.setStatus(HttpServletResponse.SC_FOUND); // 302 - response.setHeader("Location", request.getPathInfo() + "_moved"); - } else if ("GET".equalsIgnoreCase(request.getMethod())) { + // See https://github.com/AsyncHttpClient/async-http-client/issues/1728#issuecomment-700007980 + // When setFollowRedirect == TRUE, a follow-up request to a HEAD request will also be a HEAD. + // This will cause an infinite loop, which will error out once the maximum amount of redirects is hit (default 5). + // Instead, we (arbitrarily) choose to allow for 3 redirects and then return a 200. + if(request.getRequestURI().endsWith("_moved_moved_moved")) { + response.setStatus(HttpServletResponse.SC_OK); + } else { + response.setStatus(HttpServletResponse.SC_FOUND); // 302 + response.setHeader("Location", request.getPathInfo() + "_moved"); + } + } else if ("GET".equalsIgnoreCase(request.getMethod()) ) { response.setStatus(HttpServletResponse.SC_OK); } else { response.setStatus(HttpServletResponse.SC_FORBIDDEN); diff --git a/client/src/test/java/org/asynchttpclient/MultipleHeaderTest.java b/client/src/test/java/org/asynchttpclient/MultipleHeaderTest.java index 0bad2af9b1f64ae648c2a5bc1b3450c504cfaffc..f46e622f97503c6b2b6883188ae53e3feb43729e 100644 --- a/client/src/test/java/org/asynchttpclient/MultipleHeaderTest.java +++ b/client/src/test/java/org/asynchttpclient/MultipleHeaderTest.java @@ -53,8 +53,8 @@ public class MultipleHeaderTest extends AbstractBasicTest { socket.shutdownInput(); if (req.endsWith("MultiEnt")) { OutputStreamWriter outputStreamWriter = new OutputStreamWriter(socket.getOutputStream()); - outputStreamWriter.append("HTTP/1.0 200 OK\n" + "Connection: close\n" + "Content-Type: text/plain; charset=iso-8859-1\n" + "Content-Length: 2\n" - + "Content-Length: 1\n" + "\n0\n"); + outputStreamWriter.append("HTTP/1.0 200 OK\n" + "Connection: close\n" + "Content-Type: text/plain; charset=iso-8859-1\n" + "X-Duplicated-Header: 2\n" + + "X-Duplicated-Header: 1\n" + "\n0\n"); outputStreamWriter.flush(); socket.shutdownOutput(); } else if (req.endsWith("MultiOther")) { @@ -148,7 +148,7 @@ public class MultipleHeaderTest extends AbstractBasicTest { public State onHeadersReceived(HttpHeaders response) { try { int i = 0; - for (String header : response.getAll(CONTENT_LENGTH)) { + for (String header : response.getAll("X-Duplicated-Header")) { clHeaders[i++] = header; } } finally { diff --git a/client/src/test/java/org/asynchttpclient/netty/NettyConnectionResetByPeerTest.java b/client/src/test/java/org/asynchttpclient/netty/NettyConnectionResetByPeerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6a3dcc9ce1452b269a98974c779b38cca0a5956a --- /dev/null +++ b/client/src/test/java/org/asynchttpclient/netty/NettyConnectionResetByPeerTest.java @@ -0,0 +1,108 @@ +package org.asynchttpclient.netty; + +import org.asynchttpclient.DefaultAsyncHttpClient; +import org.asynchttpclient.DefaultAsyncHttpClientConfig; +import org.asynchttpclient.RequestBuilder; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketException; +import java.util.Arrays; +import java.util.concurrent.Exchanger; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.not; +import static org.testng.Assert.assertTrue; + +public class NettyConnectionResetByPeerTest { + + private String resettingServerAddress; + + @BeforeTest + public void setUp() { + resettingServerAddress = createResettingServer(); + } + + @Test + public void testAsyncHttpClientConnectionResetByPeer() throws InterruptedException { + try { + DefaultAsyncHttpClientConfig config = new DefaultAsyncHttpClientConfig.Builder() + .setRequestTimeout(1500) + .build(); + new DefaultAsyncHttpClient(config).executeRequest( + new RequestBuilder("GET").setUrl(resettingServerAddress) + ) + .get(); + } catch (ExecutionException e) { + Throwable ex = e.getCause(); + assertThat(ex, is(instanceOf(IOException.class))); + } + } + + private static String createResettingServer() { + return createServer(sock -> { + try (Socket socket = sock) { + socket.setSoLinger(true, 0); + InputStream inputStream = socket.getInputStream(); + //to not eliminate read + OutputStream os = new OutputStream() { + @Override + public void write(int b) { + // Do nothing + } + }; + os.write(startRead(inputStream)); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + + private static String createServer(Consumer<Socket> handler) { + Exchanger<Integer> portHolder = new Exchanger<>(); + Thread t = new Thread(() -> { + try (ServerSocket ss = new ServerSocket(0)) { + portHolder.exchange(ss.getLocalPort()); + while (true) { + handler.accept(ss.accept()); + } + } catch (Exception e) { + if (e instanceof InterruptedException) { + Thread.currentThread() + .interrupt(); + } + throw new RuntimeException(e); + } + }); + t.setDaemon(true); + t.start(); + return tryGetAddress(portHolder); + } + + private static String tryGetAddress(Exchanger<Integer> portHolder) { + try { + return "http://localhost:" + portHolder.exchange(0); + } catch (InterruptedException e) { + Thread.currentThread() + .interrupt(); + throw new RuntimeException(e); + } + } + + private static byte[] startRead(InputStream inputStream) throws IOException { + byte[] buffer = new byte[4]; + int length = inputStream.read(buffer); + return Arrays.copyOf(buffer, length); + } + +} diff --git a/client/src/test/java/org/asynchttpclient/proxy/CustomHeaderProxyTest.java b/client/src/test/java/org/asynchttpclient/proxy/CustomHeaderProxyTest.java new file mode 100644 index 0000000000000000000000000000000000000000..37b8c0edd804471b662b5f5ebdbb9f33f9170b04 --- /dev/null +++ b/client/src/test/java/org/asynchttpclient/proxy/CustomHeaderProxyTest.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2010-2012 Sonatype, Inc. All rights reserved. + * + * This program is licensed to you under the Apache License Version 2.0, + * and you may not use this file except in compliance with the Apache License Version 2.0. + * You may obtain a copy of the Apache License Version 2.0 at http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the Apache License Version 2.0 is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Apache License Version 2.0 for the specific language governing permissions and limitations there under. + */ +package org.asynchttpclient.proxy; + +import io.netty.handler.codec.http.DefaultHttpHeaders; +import org.asynchttpclient.AbstractBasicTest; +import org.asynchttpclient.AsyncHttpClient; +import org.asynchttpclient.AsyncHttpClientConfig; +import org.asynchttpclient.Response; +import org.asynchttpclient.request.body.generator.ByteArrayBodyGenerator; +import org.asynchttpclient.test.EchoHandler; +import org.asynchttpclient.util.HttpConstants; +import org.eclipse.jetty.proxy.ConnectHandler; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +import static org.asynchttpclient.Dsl.*; +import static org.asynchttpclient.test.TestUtils.*; +import static org.testng.Assert.assertEquals; + +/** + * Proxy usage tests. + */ +public class CustomHeaderProxyTest extends AbstractBasicTest { + + private Server server2; + + private final String customHeaderName = "Custom-Header"; + private final String customHeaderValue = "Custom-Value"; + + public AbstractHandler configureHandler() throws Exception { + return new ProxyHandler(customHeaderName, customHeaderValue); + } + + @BeforeClass(alwaysRun = true) + public void setUpGlobal() throws Exception { + server = new Server(); + ServerConnector connector = addHttpConnector(server); + server.setHandler(configureHandler()); + server.start(); + port1 = connector.getLocalPort(); + + server2 = new Server(); + ServerConnector connector2 = addHttpsConnector(server2); + server2.setHandler(new EchoHandler()); + server2.start(); + port2 = connector2.getLocalPort(); + + logger.info("Local HTTP server started successfully"); + } + + @AfterClass(alwaysRun = true) + public void tearDownGlobal() throws Exception { + server.stop(); + server2.stop(); + } + + @Test + public void testHttpProxy() throws Exception { + AsyncHttpClientConfig config = config() + .setFollowRedirect(true) + .setProxyServer( + proxyServer("localhost", port1) + .setCustomHeaders((req) -> new DefaultHttpHeaders().add(customHeaderName, customHeaderValue)) + .build() + ) + .setUseInsecureTrustManager(true) + .build(); + try (AsyncHttpClient asyncHttpClient = asyncHttpClient(config)) { + Response r = asyncHttpClient.executeRequest(post(getTargetUrl2()).setBody(new ByteArrayBodyGenerator(LARGE_IMAGE_BYTES))).get(); + assertEquals(r.getStatusCode(), 200); + } + } + + public static class ProxyHandler extends ConnectHandler { + String customHeaderName; + String customHeaderValue; + + public ProxyHandler(String customHeaderName, String customHeaderValue) { + this.customHeaderName = customHeaderName; + this.customHeaderValue = customHeaderValue; + } + + @Override + public void handle(String s, Request r, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + if (HttpConstants.Methods.CONNECT.equalsIgnoreCase(request.getMethod())) { + if (request.getHeader(customHeaderName).equals(customHeaderValue)) { + response.setStatus(HttpServletResponse.SC_OK); + super.handle(s, r, request, response); + } else { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + r.setHandled(true); + } + } else { + super.handle(s, r, request, response); + } + } + } +} diff --git a/example/pom.xml b/example/pom.xml index 53370cee89a0b35ee8f33ff5f98a68cf4e2f64ee..5643feaab933c139e76618538487f31c9558ece2 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -2,7 +2,7 @@ <parent> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client-project</artifactId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>async-http-client-example</artifactId> diff --git a/extras/guava/pom.xml b/extras/guava/pom.xml index e2321d495d28f53bac499932b76e5a9b0c2686c7..39fd913a5f33ab760b9f6530e48d59b41abca57a 100644 --- a/extras/guava/pom.xml +++ b/extras/guava/pom.xml @@ -2,7 +2,7 @@ <parent> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client-extras-parent</artifactId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>async-http-client-extras-guava</artifactId> diff --git a/extras/jdeferred/pom.xml b/extras/jdeferred/pom.xml index a994986262dfd3f22c9802d6b699172c83a82f19..d3c7d6a9e4b2a7a9b622f40d8fde2f0dff18248f 100644 --- a/extras/jdeferred/pom.xml +++ b/extras/jdeferred/pom.xml @@ -18,7 +18,7 @@ <parent> <artifactId>async-http-client-extras-parent</artifactId> <groupId>org.asynchttpclient</groupId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <artifactId>async-http-client-extras-jdeferred</artifactId> <name>Asynchronous Http Client JDeferred Extras</name> diff --git a/extras/pom.xml b/extras/pom.xml index f8a8c0783df873666af6c1fd6ba9569883e5d950..5fccc3bce69321509b4de34ea8e468750d8d3dcd 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -2,7 +2,7 @@ <parent> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client-project</artifactId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>async-http-client-extras-parent</artifactId> diff --git a/extras/registry/pom.xml b/extras/registry/pom.xml index 52eb4270aa33caa5d1a94cee73ee34c8658c5db2..492ef41f655f45d2262e5b1aaf7f8dfc84494979 100644 --- a/extras/registry/pom.xml +++ b/extras/registry/pom.xml @@ -2,7 +2,7 @@ <parent> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client-extras-parent</artifactId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>async-http-client-extras-registry</artifactId> diff --git a/extras/retrofit2/pom.xml b/extras/retrofit2/pom.xml index eda110146e3d0bf24883b25d67f354a0ce607e51..f95bd3a092ed95e91470e56f5734610f5aac8028 100644 --- a/extras/retrofit2/pom.xml +++ b/extras/retrofit2/pom.xml @@ -4,7 +4,7 @@ <parent> <artifactId>async-http-client-extras-parent</artifactId> <groupId>org.asynchttpclient</groupId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <artifactId>async-http-client-extras-retrofit2</artifactId> diff --git a/extras/rxjava/pom.xml b/extras/rxjava/pom.xml index e6d95f7b47f361464fb797986a20079b5f35f3b2..06680338a4c8445bc9452c7297146c9fdfa2269e 100644 --- a/extras/rxjava/pom.xml +++ b/extras/rxjava/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>async-http-client-extras-parent</artifactId> <groupId>org.asynchttpclient</groupId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <artifactId>async-http-client-extras-rxjava</artifactId> <name>Asynchronous Http Client RxJava Extras</name> diff --git a/extras/rxjava2/pom.xml b/extras/rxjava2/pom.xml index d9b623fb2d12399d5f4f268598205e2403489342..e1c7af8f3d9b4e0ffce5ba659c97defa4abacbbb 100644 --- a/extras/rxjava2/pom.xml +++ b/extras/rxjava2/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>async-http-client-extras-parent</artifactId> <groupId>org.asynchttpclient</groupId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <artifactId>async-http-client-extras-rxjava2</artifactId> <name>Asynchronous Http Client RxJava2 Extras</name> diff --git a/extras/simple/pom.xml b/extras/simple/pom.xml index 24a921392b47f34dd6f8e9ed6cd0098faae971e0..92ee8730e3ba3244939d2b964be551fafd2723cb 100644 --- a/extras/simple/pom.xml +++ b/extras/simple/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>async-http-client-extras-parent</artifactId> <groupId>org.asynchttpclient</groupId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <artifactId>async-http-client-extras-simple</artifactId> <name>Asynchronous Http Simple Client</name> diff --git a/extras/typesafeconfig/pom.xml b/extras/typesafeconfig/pom.xml index 3f6bb126ecbafda3680b6f097a774c73f3384b3d..437b657438ac60128053ea4e2818fea1882d30e1 100644 --- a/extras/typesafeconfig/pom.xml +++ b/extras/typesafeconfig/pom.xml @@ -4,7 +4,7 @@ <parent> <artifactId>async-http-client-extras-parent</artifactId> <groupId>org.asynchttpclient</groupId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <artifactId>async-http-client-extras-typesafe-config</artifactId> diff --git a/netty-utils/pom.xml b/netty-utils/pom.xml index 82c156db76f7d01b3e1f2b1af61c7adbd3414908..d2be381f148361d21cba6d884e44b244b3bb8d11 100644 --- a/netty-utils/pom.xml +++ b/netty-utils/pom.xml @@ -2,7 +2,7 @@ <parent> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client-project</artifactId> - <version>2.12.2</version> + <version>2.12.3</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>async-http-client-netty-utils</artifactId> diff --git a/pom.xml b/pom.xml index 51af8f99529410241c17d5039e6c7a7e73a7d498..0ab1e952ec60cde82c639d31e182a340a7de331c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client-project</artifactId> - <version>2.12.2</version> + <version>2.12.3</version> <packaging>pom</packaging> <name>Asynchronous Http Client Project</name> @@ -34,7 +34,7 @@ <connection>scm:git:git@github.com:AsyncHttpClient/async-http-client.git</connection> <developerConnection>scm:git:git@github.com:AsyncHttpClient/async-http-client.git</developerConnection> <url>https://github.com/AsyncHttpClient/async-http-client/tree/master</url> - <tag>async-http-client-project-2.12.2</tag> + <tag>async-http-client-project-2.12.3</tag> </scm> <distributionManagement> @@ -466,7 +466,7 @@ <surefire.redirectTestOutputToFile>true</surefire.redirectTestOutputToFile> <source.property>1.8</source.property> <target.property>1.8</target.property> - <netty.version>4.1.53.Final</netty.version> + <netty.version>4.1.60.Final</netty.version> <slf4j.version>1.7.30</slf4j.version> <reactive-streams.version>1.0.3</reactive-streams.version> <activation.version>1.2.2</activation.version>