diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml
deleted file mode 100644
index 14a1edc..0000000
--- a/config/checkstyle/checkstyle.xml
+++ /dev/null
@@ -1,321 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/gradle.properties b/gradle.properties
index 97d5d74..f0e6625 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,5 +1,5 @@
group = org.xbib
name = net-http
-version = 3.3.0
+version = 3.3.1
org.gradle.warning.mode = ALL
diff --git a/gradle/quality/pmd/category/java/codestyle.xml b/gradle/quality/pmd/category/java/codestyle.xml
index ac2f0a0..186ea4b 100644
--- a/gradle/quality/pmd/category/java/codestyle.xml
+++ b/gradle/quality/pmd/category/java/codestyle.xml
@@ -760,7 +760,7 @@ public class HelloWorldBean {
diff --git a/gradle/quality/pmd/category/java/errorprone.xml b/gradle/quality/pmd/category/java/errorprone.xml
index cf289c3..5ee4e89 100644
--- a/gradle/quality/pmd/category/java/errorprone.xml
+++ b/gradle/quality/pmd/category/java/errorprone.xml
@@ -158,7 +158,7 @@ public class A {
message="Avoid using a branching statement as the last in a loop."
externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_errorprone.html#avoidbranchingstatementaslastinloop">
- Using a branching statement as the last part of a loop may be a bug, and/or is confusing.
+ Using a branching statement as the last message of a loop may be a bug, and/or is confusing.
Ensure that the usage is not a bug, or consider using another approach.
2
@@ -1554,7 +1554,7 @@ public class Foo {
diff --git a/net-http-client-netty-secure/src/main/java/org/xbib/net/http/client/netty/secure/HttpsRequestBuilder.java b/net-http-client-netty-secure/src/main/java/org/xbib/net/http/client/netty/secure/HttpsRequestBuilder.java
index 9c02eb7..f731aaa 100644
--- a/net-http-client-netty-secure/src/main/java/org/xbib/net/http/client/netty/secure/HttpsRequestBuilder.java
+++ b/net-http-client-netty-secure/src/main/java/org/xbib/net/http/client/netty/secure/HttpsRequestBuilder.java
@@ -16,7 +16,6 @@ public class HttpsRequestBuilder extends HttpRequestBuilder {
}
public HttpsRequest build() {
- this.headers = validateHeaders(headers);
return new HttpsRequest(this);
}
}
diff --git a/net-http-client-netty-secure/src/main/java/org/xbib/net/http/client/netty/secure/NettyHttpsClientConfig.java b/net-http-client-netty-secure/src/main/java/org/xbib/net/http/client/netty/secure/NettyHttpsClientConfig.java
index 1998260..f480e41 100644
--- a/net-http-client-netty-secure/src/main/java/org/xbib/net/http/client/netty/secure/NettyHttpsClientConfig.java
+++ b/net-http-client-netty-secure/src/main/java/org/xbib/net/http/client/netty/secure/NettyHttpsClientConfig.java
@@ -6,7 +6,6 @@ import io.netty.util.AttributeKey;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.TrustManagerFactory;
diff --git a/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/BaseInteraction.java b/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/BaseInteraction.java
index 1fafd96..9dfcca1 100644
--- a/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/BaseInteraction.java
+++ b/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/BaseInteraction.java
@@ -270,7 +270,8 @@ public abstract class BaseInteraction implements Interaction {
protected abstract Channel nextChannel() throws IOException;
- protected HttpRequest continuation(HttpRequest request, HttpResponse httpResponse) throws URLSyntaxException {
+ protected HttpRequest continuation(HttpRequest request,
+ HttpResponse httpResponse) throws URLSyntaxException {
if (httpResponse == null) {
return null;
}
@@ -282,13 +283,7 @@ public abstract class BaseInteraction implements Interaction {
if (request.canRedirect()) {
int status = httpResponse.getStatus().code();
switch (status) {
- case 300:
- case 301:
- case 302:
- case 303:
- case 305:
- case 307:
- case 308:
+ case 300, 301, 302, 303, 305, 307, 308 -> {
String location = httpResponse.getHeaders().get(HttpHeaderNames.LOCATION);
location = new PercentDecoder(StandardCharsets.UTF_8.newDecoder()).decode(location);
if (location != null) {
@@ -298,7 +293,7 @@ public abstract class BaseInteraction implements Interaction {
HttpRequestBuilder newHttpRequestHttpRequestBuilder = HttpRequest.builder(method, request)
.setURL(redirUrl);
request.getURL().getQueryParams().forEach(pair ->
- newHttpRequestHttpRequestBuilder.addParameter(pair.getKey(), pair.getValue())
+ newHttpRequestHttpRequestBuilder.addParameter(pair.getKey(), pair.getValue())
);
request.cookies().forEach(newHttpRequestHttpRequestBuilder::addCookie);
HttpRequest newHttpRequest = newHttpRequestHttpRequestBuilder.build();
@@ -311,9 +306,9 @@ public abstract class BaseInteraction implements Interaction {
logger.log(Level.FINE, "redirect url: " + redirUrl);
return newHttpRequest;
}
- break;
- default:
- break;
+ }
+ default -> {
+ }
}
}
} catch (MalformedInputException | UnmappableCharacterException e) {
@@ -331,20 +326,13 @@ public abstract class BaseInteraction implements Interaction {
// push promise or something else
return null;
}
- if (request.isBackOff()) {
+ if (request.isBackOffEnabled()) {
BackOff backOff = request.getBackOff() != null ?
request.getBackOff() :
nettyHttpClient.getClientConfig().getBackOff();
int status = httpResponse.getStatus ().code();
switch (status) {
- case 403:
- case 404:
- case 500:
- case 502:
- case 503:
- case 504:
- case 507:
- case 509:
+ case 403, 404, 500, 502, 503, 504, 507, 509 -> {
if (backOff != null) {
long millis = backOff.nextBackOffMillis();
if (millis != BackOff.STOP) {
@@ -357,9 +345,9 @@ public abstract class BaseInteraction implements Interaction {
return request;
}
}
- break;
- default:
- break;
+ }
+ default -> {
+ }
}
}
return null;
diff --git a/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/HttpRequest.java b/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/HttpRequest.java
index 9223197..a5ab0a5 100644
--- a/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/HttpRequest.java
+++ b/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/HttpRequest.java
@@ -2,208 +2,20 @@ package org.xbib.net.http.client.netty;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.PooledByteBufAllocator;
-import java.io.Closeable;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import org.xbib.net.ParameterBuilder;
-import org.xbib.net.Request;
-import org.xbib.net.URL;
-import org.xbib.net.http.HttpHeaders;
+import io.netty.handler.codec.http2.HttpConversionUtil;
import org.xbib.net.http.HttpMethod;
-import org.xbib.net.http.HttpVersion;
-import org.xbib.net.http.client.BackOff;
-import org.xbib.net.http.client.ExceptionListener;
-import org.xbib.net.http.client.HttpResponse;
-import org.xbib.net.http.client.Part;
-import org.xbib.net.http.client.ResponseListener;
-import org.xbib.net.http.client.TimeoutListener;
-import org.xbib.net.http.cookie.Cookie;
+import org.xbib.net.http.client.BaseHttpRequest;
/**
- * HTTP client request.
+ * Netty HTTP client request.
*/
-public class HttpRequest implements org.xbib.net.http.client.HttpRequest, Closeable {
-
- private final HttpRequestBuilder builder;
-
- private CompletableFuture completableFuture;
-
- private int redirectCount;
+public class HttpRequest extends BaseHttpRequest {
protected HttpRequest(HttpRequestBuilder builder) {
- this.builder = builder;
- }
-
- @Override
- public URL getURL() {
- return builder.url;
- }
-
- @Override
- public HttpVersion getVersion() {
- return builder.httpVersion;
- }
-
- @Override
- public HttpMethod getMethod() {
- return builder.httpMethod;
- }
-
- @Override
- public HttpHeaders getHeaders() {
- return builder.headers;
- }
-
- @Override
- public ParameterBuilder getParameters() {
- return builder.parameterBuilder;
- }
-
- public Collection cookies() {
- return builder.cookies;
- }
-
- @Override
- public InetSocketAddress getLocalAddress() {
- return null; // unused
- }
-
- @Override
- public InetSocketAddress getRemoteAddress() {
- return null; // unused
- }
-
- @Override
- public URL getBaseURL() {
- return builder.url;
- }
-
- public ByteBuffer getBody() {
- return builder.body;
- }
-
- @Override
- public CharBuffer getBodyAsChars(Charset charset) {
- return charset.decode(builder.body);
- }
-
- public CharBuffer getBodyAsChars(Charset charset, int offset, int size) {
- ByteBuffer slicedBuffer = (builder.body.duplicate().position(offset)).slice();
- slicedBuffer.limit(size);
- return charset.decode(slicedBuffer);
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public R as(Class cl) {
- return (R) this;
- }
-
- public List getParts() {
- return builder.parts;
- }
-
- public boolean isFollowRedirect() {
- return builder.followRedirect;
- }
-
- public boolean isBackOff() {
- return builder.backOff != null;
- }
-
- public BackOff getBackOff() {
- return builder.backOff;
- }
-
- public boolean canRedirect() {
- if (!builder.followRedirect) {
- return false;
- }
- if (redirectCount >= builder.maxRedirects) {
- return false;
- }
- redirectCount++;
- return true;
- }
-
- public void release() {
- // nothing to do
- }
-
- @Override
- public void close() throws IOException {
- release();
- }
-
- @Override
- public String toString() {
- return "HttpNettyRequest[url=" + builder.url +
- ",version=" + builder.httpVersion +
- ",method=" + builder.httpMethod +
- ",headers=" + builder.headers.entries() +
- ",content=" + (builder.body != null && builder.body.remaining() >= 16 ?
- getBodyAsChars(StandardCharsets.UTF_8, 0, 16) + "..." :
- builder.body != null ? getBodyAsChars(StandardCharsets.UTF_8) : "") +
- "]";
- }
-
- public HttpRequest setCompletableFuture(CompletableFuture completableFuture) {
- this.completableFuture = completableFuture;
- return this;
- }
-
- public CompletableFuture getCompletableFuture() {
- return completableFuture;
- }
-
- public void setResponseListener(ResponseListener responseListener) {
- builder.responseListener = responseListener;
- }
-
- public void onResponse(HttpResponse httpResponse) {
- if (builder.responseListener != null) {
- builder.responseListener.onResponse(httpResponse);
- }
- if (completableFuture != null) {
- completableFuture.complete(this);
- }
- }
-
- public void setExceptionListener(ExceptionListener exceptionListener) {
- builder.exceptionListener = exceptionListener;
- }
-
- public void onException(Throwable throwable) {
- if (builder.exceptionListener != null) {
- builder.exceptionListener.onException(throwable);
- }
- if (completableFuture != null) {
- completableFuture.completeExceptionally(throwable);
- }
- }
-
- public void setTimeoutListener(TimeoutListener timeoutListener) {
- builder.timeoutListener = timeoutListener;
- }
-
- public void onTimeout() {
- if (builder.timeoutListener != null) {
- builder.timeoutListener.onTimeout(this);
- }
- if (completableFuture != null) {
- if (builder.timeoutMillis > 0L) {
- completableFuture.completeOnTimeout(this, builder.timeoutMillis, TimeUnit.MILLISECONDS);
- } else {
- completableFuture.completeOnTimeout(this, 15L, TimeUnit.SECONDS);
- }
+ super(builder);
+ String scheme = builder.getUrl().getScheme();
+ if (this.builder.getVersion().majorVersion() == 2) {
+ this.builder.addHeader(HttpConversionUtil.ExtensionHeaderNames.SCHEME.text().toString(), scheme);
}
}
@@ -247,18 +59,19 @@ public class HttpRequest implements org.xbib.net.http.client.HttpRequest, Closea
return builder(PooledByteBufAllocator.DEFAULT, httpMethod);
}
- public static HttpRequestBuilder builder(HttpMethod httpMethod, HttpRequest httpRequest) {
- return builder(PooledByteBufAllocator.DEFAULT, httpMethod)
- .setVersion(httpRequest.builder.httpVersion)
- .setURL(httpRequest.builder.url)
- .setHeaders(httpRequest.builder.headers)
- .content(httpRequest.builder.body)
- .setResponseListener(httpRequest.builder.responseListener)
- .setTimeoutListener(httpRequest.builder.timeoutListener, httpRequest.builder.timeoutMillis)
- .setExceptionListener(httpRequest.builder.exceptionListener);
+ public static HttpRequestBuilder builder(ByteBufAllocator allocator, HttpMethod httpMethod) {
+ return new HttpRequestBuilder(allocator)
+ .setMethod(httpMethod);
}
- public static HttpRequestBuilder builder(ByteBufAllocator allocator, HttpMethod httpMethod) {
- return new HttpRequestBuilder(allocator).setMethod(httpMethod);
+ public static HttpRequestBuilder builder(HttpMethod httpMethod, HttpRequest httpRequest) {
+ return builder(PooledByteBufAllocator.DEFAULT, httpMethod)
+ .setVersion(httpRequest.getVersion())
+ .setURL(httpRequest.getURL())
+ .setHeaders(httpRequest.getHeaders())
+ .content(httpRequest.getBody())
+ .setResponseListener(httpRequest.getResponseListener())
+ .setTimeoutListener(httpRequest.getTimeoutListener(), httpRequest.getTimeoutMillis())
+ .setExceptionListener(httpRequest.getExceptionListener());
}
}
diff --git a/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/HttpRequestBuilder.java b/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/HttpRequestBuilder.java
index 7e55936..90f326f 100644
--- a/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/HttpRequestBuilder.java
+++ b/net-http-client-netty/src/main/java/org/xbib/net/http/client/netty/HttpRequestBuilder.java
@@ -2,202 +2,87 @@ package org.xbib.net.http.client.netty;
import io.netty.buffer.ByteBufAllocator;
import io.netty.handler.codec.http.HttpUtil;
-import io.netty.handler.codec.http2.HttpConversionUtil;
-import java.io.IOException;
-import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
-import java.time.ZoneOffset;
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
import java.util.Map;
-import java.util.Objects;
-import org.xbib.net.Parameter;
import org.xbib.net.ParameterBuilder;
import org.xbib.net.URL;
-import org.xbib.net.URLBuilder;
import org.xbib.net.http.HttpAddress;
-import org.xbib.net.http.HttpHeaderNames;
-import org.xbib.net.http.HttpHeaderValues;
import org.xbib.net.http.HttpHeaders;
import org.xbib.net.http.HttpMethod;
import org.xbib.net.http.HttpVersion;
-import org.xbib.net.http.client.BackOff;
+import org.xbib.net.http.client.BaseHttpRequestBuilder;
import org.xbib.net.http.client.ExceptionListener;
-import org.xbib.net.http.client.HttpResponse;
-import org.xbib.net.http.client.Part;
+import org.xbib.net.http.client.Message;
import org.xbib.net.http.client.ResponseListener;
import org.xbib.net.http.client.TimeoutListener;
-import org.xbib.net.http.cookie.Cookie;
-public class HttpRequestBuilder implements org.xbib.net.http.client.HttpRequestBuilder {
-
- private static final URL DEFAULT_URL = URL.from("http://localhost");
-
- private static final String DEFAULT_FORM_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=utf-8";
+public class HttpRequestBuilder extends BaseHttpRequestBuilder {
protected final ByteBufAllocator allocator;
- protected HttpAddress httpAddress;
-
- protected URL url;
-
- protected String requestPath;
-
- protected final Collection cookies;
-
- protected HttpMethod httpMethod;
-
- protected HttpHeaders headers;
-
- protected HttpVersion httpVersion;
-
- protected final List removeHeaders;
-
- protected String userAgent;
-
- protected boolean keepalive;
-
- protected boolean gzip;
-
- protected String contentType;
-
- protected ParameterBuilder parameterBuilder;
-
- protected ByteBuffer body;
-
- protected boolean followRedirect;
-
- protected int maxRedirects;
-
- protected boolean enableBackOff;
-
- protected BackOff backOff;
-
- protected ResponseListener responseListener;
-
- protected ExceptionListener exceptionListener;
-
- protected TimeoutListener timeoutListener;
-
- protected long timeoutMillis;
-
- protected final List parts;
-
protected HttpRequestBuilder() {
this(ByteBufAllocator.DEFAULT);
}
protected HttpRequestBuilder(ByteBufAllocator allocator) {
+ super();
this.allocator = allocator;
- this.httpMethod = HttpMethod.GET;
- this.httpVersion = HttpVersion.HTTP_1_1;
this.userAgent = UserAgent.getUserAgent();
- this.gzip = false;
- this.keepalive = true;
- this.url = DEFAULT_URL;
- this.followRedirect = true;
- this.maxRedirects = 10;
- this.headers = new HttpHeaders();
- this.removeHeaders = new ArrayList<>();
- this.cookies = new HashSet<>();
- this.contentType = DEFAULT_FORM_CONTENT_TYPE;
- this.parameterBuilder = Parameter.builder();
- this.timeoutMillis = 0L;
- this.parts = new ArrayList<>();
}
@Override
public HttpRequestBuilder setAddress(HttpAddress httpAddress) {
- this.httpAddress = httpAddress;
- try {
- this.url = URL.builder()
- .scheme(httpAddress.isSecure() ? "https" : "http")
- .host(httpAddress.getInetSocketAddress().getHostString())
- .port(httpAddress.getInetSocketAddress().getPort())
- .build();
- } catch (IOException e) {
- throw new UncheckedIOException(e);
- }
- this.httpVersion = httpAddress.getVersion();
+ super.setAddress(httpAddress);
return this;
}
- public HttpRequestBuilder setURL(String url) {
- return setURL(URL.from(url));
- }
-
@Override
public HttpRequestBuilder setURL(URL url) {
- this.url = url;
+ super.setURL(url);
+ return this;
+ }
+
+ @Override
+ public HttpRequestBuilder setURL(String url) {
+ super.setURL(url);
+ return this;
+ }
+
+ @Override
+ public HttpRequestBuilder setMethod(HttpMethod httpMethod) {
+ super.setMethod(httpMethod);
+ return this;
+ }
+
+ @Override
+ public HttpRequestBuilder setVersion(HttpVersion httpVersion) {
+ super.setVersion(httpVersion);
+ return this;
+ }
+
+ @Override
+ public HttpRequestBuilder setVersion(String httpVersion) {
+ super.setVersion(httpVersion);
return this;
}
@Override
public HttpRequestBuilder setRequestPath(String requestPath) {
- this.requestPath = requestPath;
+ super.setRequestPath(requestPath);
return this;
}
- public HttpRequestBuilder setMethod(HttpMethod httpMethod) {
- this.httpMethod = httpMethod;
- return this;
- }
-
- public HttpRequestBuilder setVersion(HttpVersion httpVersion) {
- this.httpVersion = httpVersion;
- return this;
- }
-
- public HttpRequestBuilder setVersion(String httpVersion) {
- this.httpVersion = HttpVersion.valueOf(httpVersion);
- return this;
- }
-
- public HttpRequestBuilder setHeaders(Map headers) {
- headers.forEach(this::addHeader);
- return this;
- }
-
- public HttpRequestBuilder setHeaders(HttpHeaders headers) {
- this.headers = headers;
+ @Override
+ public HttpRequestBuilder setHeaders(HttpHeaders httpHeaders) {
+ super.setHeaders(httpHeaders);
return this;
}
+ @Override
public HttpRequestBuilder addHeader(String name, String value) {
- this.headers.add(name, value);
- return this;
- }
-
- public HttpRequestBuilder setHeader(String name, String value) {
- this.headers.set(name, value);
- return this;
- }
-
- public HttpRequestBuilder removeHeader(String name) {
- removeHeaders.add(name);
- return this;
- }
-
- public HttpRequestBuilder contentType(String contentType) {
- Objects.requireNonNull(contentType);
- this.contentType = contentType;
- addHeader(HttpHeaderNames.CONTENT_TYPE, contentType);
- return this;
- }
-
- public HttpRequestBuilder contentType(String contentType, Charset charset) {
- Objects.requireNonNull(contentType);
- Objects.requireNonNull(charset);
- this.contentType = contentType;
- addHeader(HttpHeaderNames.CONTENT_TYPE, contentType + "; charset=" + charset.name().toLowerCase());
+ super.addHeader(name, value);
return this;
}
@@ -207,114 +92,63 @@ public class HttpRequestBuilder implements org.xbib.net.http.client.HttpRequestB
return this;
}
- public HttpRequestBuilder setParameters(Map parameters) {
- parameters.forEach(this::addParameter);
+ @Override
+ public HttpRequestBuilder setParameters(Map map) {
+ super.setParameters(map);
return this;
}
- @SuppressWarnings("unchecked")
+ @Override
public HttpRequestBuilder addParameter(String name, Object value) {
- Objects.requireNonNull(name);
- Objects.requireNonNull(value);
- Collection