update to netty 4.1.84, Java 17, xbib net 3.0.1, update dependencies
This commit is contained in:
parent
d93c79fa63
commit
a9d47cdafe
21 changed files with 162 additions and 51 deletions
|
@ -1,5 +1,5 @@
|
||||||
group = org.xbib
|
group = org.xbib
|
||||||
name = netty-http
|
name = netty-http
|
||||||
version = 4.1.77.0
|
version = 4.1.84.0
|
||||||
|
|
||||||
org.gradle.warning.mode = ALL
|
org.gradle.warning.mode = ALL
|
||||||
|
|
|
@ -6,27 +6,28 @@ java {
|
||||||
}
|
}
|
||||||
|
|
||||||
compileJava {
|
compileJava {
|
||||||
sourceCompatibility = JavaVersion.VERSION_11
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_11
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
|
||||||
compileTestJava {
|
compileTestJava {
|
||||||
sourceCompatibility = JavaVersion.VERSION_11
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_11
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
manifest {
|
manifest {
|
||||||
attributes('Implementation-Title': project.name)
|
attributes('Implementation-Title': project.name)
|
||||||
attributes('Implementation-Version': project.version)
|
attributes('Implementation-Version': project.version)
|
||||||
attributes('Implementation-Vendor': 'Jörg Prante')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(JavaCompile) {
|
tasks.withType(JavaCompile) {
|
||||||
options.compilerArgs << '-Xlint:all,-exports'
|
options.compilerArgs.add('-Xlint:all,-exports')
|
||||||
|
options.encoding = 'UTF-8'
|
||||||
}
|
}
|
||||||
|
|
||||||
javadoc {
|
tasks.withType(Javadoc) {
|
||||||
options.addStringOption('Xdoclint:none', '-quiet')
|
options.addStringOption('Xdoclint:none', '-quiet')
|
||||||
|
options.encoding = 'UTF-8'
|
||||||
}
|
}
|
||||||
|
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,5 +1,5 @@
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|
6
gradlew
vendored
6
gradlew
vendored
|
@ -205,6 +205,12 @@ set -- \
|
||||||
org.gradle.wrapper.GradleWrapperMain \
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
"$@"
|
"$@"
|
||||||
|
|
||||||
|
# Stop when "xargs" is not available.
|
||||||
|
if ! command -v xargs >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
die "xargs is not available"
|
||||||
|
fi
|
||||||
|
|
||||||
# Use "xargs" to parse quoted args.
|
# Use "xargs" to parse quoted args.
|
||||||
#
|
#
|
||||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||||
|
|
14
gradlew.bat
vendored
14
gradlew.bat
vendored
|
@ -14,7 +14,7 @@
|
||||||
@rem limitations under the License.
|
@rem limitations under the License.
|
||||||
@rem
|
@rem
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
@if "%DEBUG%"=="" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
@rem
|
@rem
|
||||||
@rem Gradle startup script for Windows
|
@rem Gradle startup script for Windows
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
if "%OS%"=="Windows_NT" setlocal
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
set DIRNAME=%~dp0
|
set DIRNAME=%~dp0
|
||||||
if "%DIRNAME%" == "" set DIRNAME=.
|
if "%DIRNAME%"=="" set DIRNAME=.
|
||||||
set APP_BASE_NAME=%~n0
|
set APP_BASE_NAME=%~n0
|
||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
set JAVA_EXE=java.exe
|
set JAVA_EXE=java.exe
|
||||||
%JAVA_EXE% -version >NUL 2>&1
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
if "%ERRORLEVEL%" == "0" goto execute
|
if %ERRORLEVEL% equ 0 goto execute
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
:end
|
:end
|
||||||
@rem End local scope for the variables with windows NT shell
|
@rem End local scope for the variables with windows NT shell
|
||||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||||
|
|
||||||
:fail
|
:fail
|
||||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
rem the _cmd.exe /c_ return code!
|
rem the _cmd.exe /c_ return code!
|
||||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
set EXIT_CODE=%ERRORLEVEL%
|
||||||
exit /b 1
|
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||||
|
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||||
|
exit /b %EXIT_CODE%
|
||||||
|
|
||||||
:mainEnd
|
:mainEnd
|
||||||
if "%OS%"=="Windows_NT" endlocal
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
module org.xbib.netty.http.client.api {
|
module org.xbib.netty.http.client.api {
|
||||||
exports org.xbib.netty.http.client.api;
|
exports org.xbib.netty.http.client.api;
|
||||||
requires org.xbib.netty.http.common;
|
requires org.xbib.netty.http.common;
|
||||||
requires org.xbib.net.url;
|
requires org.xbib.net;
|
||||||
requires io.netty.buffer;
|
requires io.netty.buffer;
|
||||||
requires io.netty.common;
|
requires io.netty.common;
|
||||||
requires io.netty.transport;
|
requires io.netty.transport;
|
||||||
|
|
|
@ -16,6 +16,7 @@ import io.netty.handler.codec.http.websocketx.WebSocketFrame;
|
||||||
import io.netty.handler.codec.http2.HttpConversionUtil;
|
import io.netty.handler.codec.http2.HttpConversionUtil;
|
||||||
import io.netty.util.AsciiString;
|
import io.netty.util.AsciiString;
|
||||||
import org.xbib.net.URL;
|
import org.xbib.net.URL;
|
||||||
|
import org.xbib.net.URLBuilder;
|
||||||
import org.xbib.netty.http.common.HttpAddress;
|
import org.xbib.netty.http.common.HttpAddress;
|
||||||
import org.xbib.netty.http.common.HttpResponse;
|
import org.xbib.netty.http.common.HttpResponse;
|
||||||
import org.xbib.netty.http.common.cookie.Cookie;
|
import org.xbib.netty.http.common.cookie.Cookie;
|
||||||
|
@ -668,7 +669,7 @@ public final class Request implements AutoCloseable {
|
||||||
validatedHeaders.set(headers);
|
validatedHeaders.set(headers);
|
||||||
if (url != null) {
|
if (url != null) {
|
||||||
// add our URI parameters to the URL
|
// add our URI parameters to the URL
|
||||||
URL.Builder mutator = url.mutator();
|
URLBuilder mutator = url.mutator();
|
||||||
uriParameters.forEach(e -> mutator.queryParam(e.getKey(), e.getValue()));
|
uriParameters.forEach(e -> mutator.queryParam(e.getKey(), e.getValue()));
|
||||||
// calling build() performs extra percent encoding!
|
// calling build() performs extra percent encoding!
|
||||||
url = mutator.build();
|
url = mutator.build();
|
||||||
|
|
|
@ -5,5 +5,5 @@ module org.xbib.netty.http.client.rest {
|
||||||
requires org.xbib.netty.http.client.api;
|
requires org.xbib.netty.http.client.api;
|
||||||
requires io.netty.buffer;
|
requires io.netty.buffer;
|
||||||
requires io.netty.codec.http;
|
requires io.netty.codec.http;
|
||||||
requires org.xbib.net.url;
|
requires org.xbib.net;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ module org.xbib.netty.http.client {
|
||||||
exports org.xbib.netty.http.client.transport;
|
exports org.xbib.netty.http.client.transport;
|
||||||
requires transitive org.xbib.netty.http.client.api;
|
requires transitive org.xbib.netty.http.client.api;
|
||||||
requires transitive org.xbib.netty.http.common;
|
requires transitive org.xbib.netty.http.common;
|
||||||
requires org.xbib.net.url;
|
requires org.xbib.net;
|
||||||
requires io.netty.handler.proxy;
|
requires io.netty.handler.proxy;
|
||||||
requires java.logging;
|
requires java.logging;
|
||||||
requires io.netty.transport;
|
requires io.netty.transport;
|
||||||
|
|
|
@ -291,7 +291,7 @@ public abstract class BaseTransport implements ClientTransport {
|
||||||
Request.Builder newHttpRequestBuilder = Request.builder(method, request)
|
Request.Builder newHttpRequestBuilder = Request.builder(method, request)
|
||||||
.url(redirUrl);
|
.url(redirUrl);
|
||||||
request.url().getQueryParams().forEach(pair ->
|
request.url().getQueryParams().forEach(pair ->
|
||||||
newHttpRequestBuilder.addParameter(pair.getFirst(), pair.getSecond())
|
newHttpRequestBuilder.addParameter(pair.getKey(), pair.getValue())
|
||||||
);
|
);
|
||||||
request.cookies().forEach(newHttpRequestBuilder::addCookie);
|
request.cookies().forEach(newHttpRequestBuilder::addCookie);
|
||||||
Request newHttpRequest = newHttpRequestBuilder.build();
|
Request newHttpRequest = newHttpRequestBuilder.build();
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
dependencies {
|
dependencies {
|
||||||
api libs.net.url
|
api libs.net
|
||||||
api libs.netty.http2
|
api libs.netty.http2
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ module org.xbib.netty.http.common {
|
||||||
exports org.xbib.netty.http.common.security;
|
exports org.xbib.netty.http.common.security;
|
||||||
exports org.xbib.netty.http.common.util;
|
exports org.xbib.netty.http.common.util;
|
||||||
exports org.xbib.netty.http.common.ws;
|
exports org.xbib.netty.http.common.ws;
|
||||||
requires org.xbib.net.url;
|
requires org.xbib.net;
|
||||||
requires io.netty.buffer;
|
requires io.netty.buffer;
|
||||||
requires io.netty.common;
|
requires io.netty.common;
|
||||||
requires io.netty.transport;
|
requires io.netty.transport;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
module org.xbib.netty.http.server.api {
|
module org.xbib.netty.http.server.api {
|
||||||
exports org.xbib.netty.http.server.api;
|
exports org.xbib.netty.http.server.api;
|
||||||
requires org.xbib.netty.http.common;
|
requires org.xbib.netty.http.common;
|
||||||
requires org.xbib.net.url;
|
requires org.xbib.net;
|
||||||
requires io.netty.buffer;
|
requires io.netty.buffer;
|
||||||
requires io.netty.common;
|
requires io.netty.common;
|
||||||
requires io.netty.handler;
|
requires io.netty.handler;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
dependencies {
|
dependencies {
|
||||||
api project(":netty-http-server-api")
|
api project(":netty-http-server-api")
|
||||||
api project(":netty-http-common")
|
api project(":netty-http-common")
|
||||||
|
implementation libs.net.path
|
||||||
testImplementation project(":netty-http-client")
|
testImplementation project(":netty-http-client")
|
||||||
testImplementation project(":netty-http-bouncycastle")
|
testImplementation project(":netty-http-bouncycastle")
|
||||||
testRuntimeOnly libs.javassist
|
testRuntimeOnly libs.javassist
|
||||||
|
|
|
@ -16,7 +16,8 @@ module org.xbib.netty.http.server {
|
||||||
exports org.xbib.netty.http.server.util;
|
exports org.xbib.netty.http.server.util;
|
||||||
requires transitive org.xbib.netty.http.server.api;
|
requires transitive org.xbib.netty.http.server.api;
|
||||||
requires transitive org.xbib.netty.http.common;
|
requires transitive org.xbib.netty.http.common;
|
||||||
requires org.xbib.net.url;
|
requires org.xbib.net;
|
||||||
|
requires org.xbib.net.path;
|
||||||
requires java.logging;
|
requires java.logging;
|
||||||
requires io.netty.buffer;
|
requires io.netty.buffer;
|
||||||
requires io.netty.common;
|
requires io.netty.common;
|
||||||
|
|
|
@ -7,9 +7,10 @@ import io.netty.handler.codec.http.HttpHeaderValues;
|
||||||
import io.netty.handler.codec.http.HttpHeaders;
|
import io.netty.handler.codec.http.HttpHeaders;
|
||||||
import io.netty.handler.codec.http.HttpMethod;
|
import io.netty.handler.codec.http.HttpMethod;
|
||||||
import io.netty.handler.codec.http.HttpUtil;
|
import io.netty.handler.codec.http.HttpUtil;
|
||||||
import org.xbib.net.Pair;
|
import org.xbib.datastructures.common.Pair;
|
||||||
|
import org.xbib.net.Parameter;
|
||||||
|
import org.xbib.net.ParameterBuilder;
|
||||||
import org.xbib.net.PercentDecoder;
|
import org.xbib.net.PercentDecoder;
|
||||||
import org.xbib.net.QueryParameters;
|
|
||||||
import org.xbib.net.URL;
|
import org.xbib.net.URL;
|
||||||
import org.xbib.netty.http.common.HttpParameters;
|
import org.xbib.netty.http.common.HttpParameters;
|
||||||
import org.xbib.netty.http.server.api.Domain;
|
import org.xbib.netty.http.server.api.Domain;
|
||||||
|
@ -367,7 +368,8 @@ public class HttpServerRequest implements ServerRequest {
|
||||||
.charset(charset, CodingErrorAction.REPLACE)
|
.charset(charset, CodingErrorAction.REPLACE)
|
||||||
.path(fullHttpRequest.uri()) // creates path, query params, fragment
|
.path(fullHttpRequest.uri()) // creates path, query params, fragment
|
||||||
.build();
|
.build();
|
||||||
QueryParameters queryParameters = url.getQueryParams();
|
ParameterBuilder queryParameters = Parameter.builder();
|
||||||
|
//url.getQueryParams();
|
||||||
CharSequence mimeType = HttpUtil.getMimeType(fullHttpRequest);
|
CharSequence mimeType = HttpUtil.getMimeType(fullHttpRequest);
|
||||||
ByteBuf byteBuf = fullHttpRequest.content();
|
ByteBuf byteBuf = fullHttpRequest.content();
|
||||||
if (byteBuf != null) {
|
if (byteBuf != null) {
|
||||||
|
@ -389,9 +391,9 @@ public class HttpServerRequest implements ServerRequest {
|
||||||
.onMalformedInput(CodingErrorAction.REPLACE)
|
.onMalformedInput(CodingErrorAction.REPLACE)
|
||||||
.onUnmappableCharacter(CodingErrorAction.REPLACE));
|
.onUnmappableCharacter(CodingErrorAction.REPLACE));
|
||||||
this.parameters = new HttpParameters(mimeType, charset);
|
this.parameters = new HttpParameters(mimeType, charset);
|
||||||
for (Pair<String, String> pair : queryParameters) {
|
for (Pair<String, Object> pair : queryParameters.build()) {
|
||||||
try {
|
try {
|
||||||
parameters.addRaw(percentDecoder.decode(pair.getFirst()), percentDecoder.decode(pair.getSecond()));
|
parameters.addRaw(percentDecoder.decode(pair.getKey()), percentDecoder.decode(pair.getValue().toString()));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// does not happen
|
// does not happen
|
||||||
throw new IllegalArgumentException(pair.toString());
|
throw new IllegalArgumentException(pair.toString());
|
||||||
|
|
|
@ -18,6 +18,7 @@ import io.netty.handler.ssl.SslContext;
|
||||||
import io.netty.util.DomainWildcardMappingBuilder;
|
import io.netty.util.DomainWildcardMappingBuilder;
|
||||||
import io.netty.util.Mapping;
|
import io.netty.util.Mapping;
|
||||||
import org.xbib.net.URL;
|
import org.xbib.net.URL;
|
||||||
|
import org.xbib.net.URLBuilder;
|
||||||
import org.xbib.netty.http.common.HttpAddress;
|
import org.xbib.netty.http.common.HttpAddress;
|
||||||
import org.xbib.netty.http.common.HttpChannelInitializer;
|
import org.xbib.netty.http.common.HttpChannelInitializer;
|
||||||
import org.xbib.netty.http.common.TransportProvider;
|
import org.xbib.netty.http.common.TransportProvider;
|
||||||
|
@ -241,7 +242,7 @@ public final class Server implements AutoCloseable {
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("no host header in " + headers);
|
throw new IllegalArgumentException("no host header in " + headers);
|
||||||
}
|
}
|
||||||
URL.Builder builder = URL.builder().scheme(scheme).host(host);
|
URLBuilder builder = URL.builder().scheme(scheme).host(host);
|
||||||
if (port != null) {
|
if (port != null) {
|
||||||
builder.port(Integer.parseInt(port));
|
builder.port(Integer.parseInt(port));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
package org.xbib.netty.http.server.endpoint;
|
package org.xbib.netty.http.server.endpoint;
|
||||||
|
|
||||||
import org.xbib.net.Pair;
|
import org.xbib.datastructures.common.Pair;
|
||||||
import org.xbib.net.QueryParameters;
|
import org.xbib.net.Parameter;
|
||||||
import org.xbib.net.path.PathMatcher;
|
import org.xbib.net.PathNormalizer;
|
||||||
import org.xbib.net.path.PathNormalizer;
|
import org.xbib.net.path.simple.Path;
|
||||||
|
import org.xbib.net.path.simple.PathComparator;
|
||||||
|
import org.xbib.net.path.simple.PathMatcher;
|
||||||
import org.xbib.netty.http.common.HttpMethod;
|
import org.xbib.netty.http.common.HttpMethod;
|
||||||
import org.xbib.netty.http.server.api.Domain;
|
import org.xbib.netty.http.server.api.Domain;
|
||||||
import org.xbib.netty.http.server.api.Endpoint;
|
import org.xbib.netty.http.server.api.Endpoint;
|
||||||
|
@ -88,7 +90,7 @@ public class HttpEndpoint implements Endpoint<HttpEndpointDescriptor> {
|
||||||
public ServerRequest resolveRequest(ServerRequest.Builder serverRequestBuilder,
|
public ServerRequest resolveRequest(ServerRequest.Builder serverRequestBuilder,
|
||||||
Domain<? extends EndpointResolver<? extends Endpoint<?>>> domain,
|
Domain<? extends EndpointResolver<? extends Endpoint<?>>> domain,
|
||||||
EndpointResolver<? extends Endpoint<?>> endpointResolver) {
|
EndpointResolver<? extends Endpoint<?>> endpointResolver) {
|
||||||
List<String> context = pathMatcher.tokenizePath(getPrefix());
|
List<String> context = pathMatcher.tokenize(getPrefix());
|
||||||
serverRequestBuilder.setDomain(domain)
|
serverRequestBuilder.setDomain(domain)
|
||||||
.setEndpointResolver(endpointResolver)
|
.setEndpointResolver(endpointResolver)
|
||||||
.setEndpoint((this))
|
.setEndpoint((this))
|
||||||
|
@ -96,9 +98,9 @@ public class HttpEndpoint implements Endpoint<HttpEndpointDescriptor> {
|
||||||
String pattern = path;
|
String pattern = path;
|
||||||
String effectiveRequestPath = serverRequestBuilder.getEffectiveRequestPath();
|
String effectiveRequestPath = serverRequestBuilder.getEffectiveRequestPath();
|
||||||
if (pathMatcher.match(pattern, effectiveRequestPath)) {
|
if (pathMatcher.match(pattern, effectiveRequestPath)) {
|
||||||
QueryParameters queryParameters = pathMatcher.extractUriTemplateVariables(pattern, effectiveRequestPath);
|
Parameter queryParameters = pathMatcher.extractUriTemplateVariables(pattern, effectiveRequestPath);
|
||||||
for (Pair<String, String> pair : queryParameters) {
|
for (Pair<String, Object> pair : queryParameters) {
|
||||||
serverRequestBuilder.addPathParameter(pair.getFirst(), pair.getSecond());
|
serverRequestBuilder.addPathParameter(pair.getKey(), pair.getValue().toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return serverRequestBuilder.build();
|
return serverRequestBuilder.build();
|
||||||
|
@ -134,7 +136,7 @@ public class HttpEndpoint implements Endpoint<HttpEndpointDescriptor> {
|
||||||
|
|
||||||
static class EndpointPathComparator implements Comparator<HttpEndpoint> {
|
static class EndpointPathComparator implements Comparator<HttpEndpoint> {
|
||||||
|
|
||||||
private final Comparator<String> pathComparator;
|
private final PathComparator pathComparator;
|
||||||
|
|
||||||
EndpointPathComparator(String path) {
|
EndpointPathComparator(String path) {
|
||||||
this.pathComparator = pathMatcher.getPatternComparator(path);
|
this.pathComparator = pathMatcher.getPatternComparator(path);
|
||||||
|
@ -142,7 +144,7 @@ public class HttpEndpoint implements Endpoint<HttpEndpointDescriptor> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compare(HttpEndpoint endpoint1, HttpEndpoint endpoint2) {
|
public int compare(HttpEndpoint endpoint1, HttpEndpoint endpoint2) {
|
||||||
return pathComparator.compare(endpoint1.path, endpoint2.path);
|
return pathComparator.compare(Path.of(endpoint1.path), Path.of(endpoint2.path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
package org.xbib.netty.http.server.test.http1;
|
||||||
|
|
||||||
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
import io.netty.handler.codec.http.HttpVersion;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.xbib.net.URL;
|
||||||
|
import org.xbib.netty.http.client.Client;
|
||||||
|
import org.xbib.netty.http.client.api.Request;
|
||||||
|
import org.xbib.netty.http.client.api.ResponseListener;
|
||||||
|
import org.xbib.netty.http.common.HttpAddress;
|
||||||
|
import org.xbib.netty.http.common.HttpParameters;
|
||||||
|
import org.xbib.netty.http.common.HttpResponse;
|
||||||
|
import org.xbib.netty.http.server.HttpServerDomain;
|
||||||
|
import org.xbib.netty.http.server.Server;
|
||||||
|
import org.xbib.netty.http.server.test.NettyHttpTestExtension;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
@ExtendWith(NettyHttpTestExtension.class)
|
||||||
|
class FailureTest {
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(FailureTest.class.getName());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test checks if the server hangs after a failure.
|
||||||
|
* @throws Exception exception
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void testFail() throws Exception {
|
||||||
|
URL url = URL.from("http://localhost:8008/domain/");
|
||||||
|
HttpAddress httpAddress = HttpAddress.http1(url);
|
||||||
|
HttpServerDomain domain = HttpServerDomain.builder(httpAddress)
|
||||||
|
.singleEndpoint("/fail", "/**", (req, resp) -> {
|
||||||
|
HttpParameters parameters = req.getParameters();
|
||||||
|
logger.log(Level.INFO, "got request " + parameters.toString() + ", sending 302 Found");
|
||||||
|
resp.getBuilder().setStatus(HttpResponseStatus.FOUND.code())
|
||||||
|
.build().flush();
|
||||||
|
})
|
||||||
|
.build();
|
||||||
|
Server server = Server.builder(domain)
|
||||||
|
.enableDebug()
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Client client = Client.builder()
|
||||||
|
.build();
|
||||||
|
final AtomicBoolean success1 = new AtomicBoolean(false);
|
||||||
|
try {
|
||||||
|
server.accept();
|
||||||
|
|
||||||
|
// send bad request
|
||||||
|
|
||||||
|
/*Socket socket = new Socket(InetAddress.getByName(url.getHost()), url.getPort());
|
||||||
|
PrintWriter pw = new PrintWriter(socket.getOutputStream());
|
||||||
|
pw.println("GET /::{} HTTP/1.1");
|
||||||
|
pw.println("Host: " + url.getHost() + ":" + url.getPort());
|
||||||
|
pw.println("");
|
||||||
|
pw.flush();
|
||||||
|
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
||||||
|
String t;
|
||||||
|
while ((t = br.readLine()) != null) {
|
||||||
|
logger.log(Level.INFO, t);
|
||||||
|
}
|
||||||
|
br.close();*/
|
||||||
|
|
||||||
|
// send good request
|
||||||
|
|
||||||
|
ResponseListener<HttpResponse> responseListener1 = (resp) -> {
|
||||||
|
logger.log(Level.INFO, "got response = " + resp.getStatus());
|
||||||
|
success1.set(true);
|
||||||
|
};
|
||||||
|
Request getRequest = Request.get().setVersion(HttpVersion.HTTP_1_1)
|
||||||
|
.url(server.getServerConfig().getAddress().base().resolve("/fail"))
|
||||||
|
.addParameter("a", "b")
|
||||||
|
.setResponseListener(responseListener1)
|
||||||
|
.build();
|
||||||
|
client.execute(getRequest).get();
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
server.shutdownGracefully();
|
||||||
|
client.shutdownGracefully();
|
||||||
|
logger.log(Level.INFO, "server and client shut down");
|
||||||
|
}
|
||||||
|
assertTrue(success1.get());
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,30 +9,31 @@ pluginManagement {
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
versionCatalogs {
|
versionCatalogs {
|
||||||
libs {
|
libs {
|
||||||
version('gradle', '7.4.2')
|
version('gradle', '7.5.1')
|
||||||
version('groovy', '3.0.9')
|
version('groovy', '3.0.10')
|
||||||
version('spock', '2.0-groovy-3.0')
|
version('spock', '2.0-groovy-3.0')
|
||||||
version('junit', '5.8.2')
|
version('junit', '5.9.1')
|
||||||
version('netty', '4.1.77.Final')
|
version('netty', '4.1.84.Final')
|
||||||
version('netty-tcnative', '2.0.52.Final')
|
version('netty-tcnative', '2.0.54.Final')
|
||||||
library('groovy-core', 'org.codehaus.groovy', 'groovy').versionRef('groovy')
|
library('groovy-core', 'org.codehaus.groovy', 'groovy').versionRef('groovy')
|
||||||
library('spock-core', 'org.spockframework', 'spock-core').versionRef('spock')
|
library('spock-core', 'org.spockframework', 'spock-core').versionRef('spock')
|
||||||
library('spock-junit4', 'org.spockframework', 'spock-junit4').versionRef('spock')
|
library('spock-junit4', 'org.spockframework', 'spock-junit4').versionRef('spock')
|
||||||
library('junit-jupiter-api', 'org.junit.jupiter', 'junit-jupiter-api').versionRef('junit')
|
library('junit-jupiter-api', 'org.junit.jupiter', 'junit-jupiter-api').versionRef('junit')
|
||||||
library('junit-jupiter-params', 'org.junit.jupiter', 'junit-jupiter-params').versionRef('junit')
|
library('junit-jupiter-params', 'org.junit.jupiter', 'junit-jupiter-params').versionRef('junit')
|
||||||
library('junit-jupiter-engine', 'org.junit.jupiter', 'junit-jupiter-engine').versionRef('junit')
|
library('junit-jupiter-engine', 'org.junit.jupiter', 'junit-jupiter-engine').versionRef('junit')
|
||||||
library('hamcrest', 'org.hamcrest:hamcrest-library:2.2')
|
library('hamcrest', 'org.hamcrest', 'hamcrest-library').version('2.2')
|
||||||
library('netty-http2', 'io.netty', 'netty-codec-http2').versionRef('netty')
|
library('netty-http2', 'io.netty', 'netty-codec-http2').versionRef('netty')
|
||||||
library('netty-handler-proxy', 'io.netty', 'netty-handler-proxy').versionRef('netty')
|
library('netty-handler-proxy', 'io.netty', 'netty-handler-proxy').versionRef('netty')
|
||||||
library('netty-epoll', 'io.netty', 'netty-transport-native-epoll').versionRef('netty')
|
library('netty-epoll', 'io.netty', 'netty-transport-native-epoll').versionRef('netty')
|
||||||
library('netty-kqueue', 'io.netty', 'netty-transport-native-kqueue').versionRef('netty')
|
library('netty-kqueue', 'io.netty', 'netty-transport-native-kqueue').versionRef('netty')
|
||||||
library('netty-boringssl', 'io.netty', 'netty-tcnative-boringssl-static').versionRef('netty-tcnative')
|
library('netty-boringssl', 'io.netty', 'netty-tcnative-boringssl-static').versionRef('netty-tcnative')
|
||||||
library('net-url', 'org.xbib', 'net-url').version('2.1.1')
|
library('net', 'org.xbib', 'net').version('3.0.1')
|
||||||
library('bouncycastle', 'org.bouncycastle', 'bcpkix-jdk18on').version('1.71')
|
library('net-path', 'org.xbib', 'net-path').version('3.0.1')
|
||||||
|
library('bouncycastle', 'org.bouncycastle', 'bcpkix-jdk18on').version('1.72')
|
||||||
library('conscrypt', 'org.conscrypt', 'conscrypt-openjdk-uber').version('2.5.2')
|
library('conscrypt', 'org.conscrypt', 'conscrypt-openjdk-uber').version('2.5.2')
|
||||||
library('jackson', 'com.fasterxml.jackson.core', 'jackson-databind').version('2.12.6')
|
library('jackson', 'com.fasterxml.jackson.core', 'jackson-databind').version('2.12.7')
|
||||||
library('guice', 'org.xbib', 'guice').version('4.4.2')
|
library('guice', 'org.xbib', 'guice').version('5.0.1.0')
|
||||||
library('javassist', 'org.javassist', 'javassist').version('3.28.0-GA')
|
library('javassist', 'org.javassist', 'javassist').version('3.29.1-GA')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue