Introduced http2-client.mod and http2-client-transport.mod. These modules download dependencies via a [files] section. They can be used to have the server provide the dependencies in case of a web application proxies request using HTTP/2. Fixed ContentProvider to set the context ClassLoader before reading the Jetty XML context file, which may reference classes from the web application. Signed-off-by: Simone Bordet <simone.bordet@gmail.com>
This commit is contained in:
parent
6527aa559b
commit
bb52d95a62
|
@ -1,8 +1,12 @@
|
||||||
# DO NOT EDIT THIS FILE - See: https://jetty.org/docs/
|
# DO NOT EDIT THIS FILE - See: https://jetty.org/docs/
|
||||||
|
|
||||||
[description]
|
[description]
|
||||||
Adds the Jetty HTTP client to the server classpath.
|
Adds the Jetty HTTP client dependencies to the server classpath.
|
||||||
|
|
||||||
|
[tags]
|
||||||
|
client
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
lib/jetty-client-${jetty.version}.jar
|
|
||||||
lib/jetty-alpn-client-${jetty.version}.jar
|
lib/jetty-alpn-client-${jetty.version}.jar
|
||||||
|
lib/jetty-alpn-java-client-${jetty.version}.jar
|
||||||
|
lib/jetty-client-${jetty.version}.jar
|
||||||
|
|
|
@ -385,6 +385,10 @@ public class ContextProvider extends ScanningAppProvider
|
||||||
// Handle a context XML file
|
// Handle a context XML file
|
||||||
if (FileID.isXml(path))
|
if (FileID.isXml(path))
|
||||||
{
|
{
|
||||||
|
ClassLoader coreContextClassLoader = Environment.CORE.equals(environment) ? findCoreContextClassLoader(path) : null;
|
||||||
|
if (coreContextClassLoader != null)
|
||||||
|
Thread.currentThread().setContextClassLoader(coreContextClassLoader);
|
||||||
|
|
||||||
context = applyXml(context, path, env, properties);
|
context = applyXml(context, path, env, properties);
|
||||||
|
|
||||||
// Look for the contextHandler itself
|
// Look for the contextHandler itself
|
||||||
|
@ -401,13 +405,11 @@ public class ContextProvider extends ScanningAppProvider
|
||||||
throw new IllegalStateException("Unknown context type of " + context);
|
throw new IllegalStateException("Unknown context type of " + context);
|
||||||
|
|
||||||
// Set the classloader if we have a coreContextClassLoader
|
// Set the classloader if we have a coreContextClassLoader
|
||||||
ClassLoader coreContextClassLoader = Environment.CORE.equals(environment) ? findCoreContextClassLoader(path) : null;
|
|
||||||
if (coreContextClassLoader != null)
|
if (coreContextClassLoader != null)
|
||||||
contextHandler.setClassLoader(coreContextClassLoader);
|
contextHandler.setClassLoader(coreContextClassLoader);
|
||||||
|
|
||||||
return contextHandler;
|
return contextHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise it must be a directory or an archive
|
// Otherwise it must be a directory or an archive
|
||||||
else if (!Files.isDirectory(path) && !FileID.isWebArchive(path))
|
else if (!Files.isDirectory(path) && !FileID.isWebArchive(path))
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
[description]
|
||||||
|
Adds the Jetty HTTP/2 client transport dependencies to the server classpath.
|
||||||
|
|
||||||
|
[tags]
|
||||||
|
client
|
||||||
|
http2
|
||||||
|
|
||||||
|
[depends]
|
||||||
|
client
|
||||||
|
http2-client
|
||||||
|
|
||||||
|
[files]
|
||||||
|
maven://org.eclipse.jetty.http2/jetty-http2-client-transport/${jetty.version}/jar|lib/http2/jetty-http2-client-transport-${jetty.version}.jar
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
lib/http2/jetty-http2-client-transport-${jetty.version}.jar
|
|
@ -0,0 +1,18 @@
|
||||||
|
[description]
|
||||||
|
Adds the Jetty HTTP/2 client dependencies to the server classpath.
|
||||||
|
|
||||||
|
[tags]
|
||||||
|
client
|
||||||
|
http2
|
||||||
|
|
||||||
|
[files]
|
||||||
|
maven://org.eclipse.jetty/jetty-alpn-client/${jetty.version}/jar|lib/jetty-alpn-client-${jetty.version}.jar
|
||||||
|
maven://org.eclipse.jetty/jetty-alpn-java-client/${jetty.version}/jar|lib/jetty-alpn-java-client-${jetty.version}.jar
|
||||||
|
maven://org.eclipse.jetty.http2/jetty-http2-client/${jetty.version}/jar|lib/http2/jetty-http2-client-${jetty.version}.jar
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
lib/jetty-alpn-client-${jetty.version}.jar
|
||||||
|
lib/jetty-alpn-java-client-${jetty.version}.jar
|
||||||
|
lib/http2/jetty-http2-client-${jetty.version}.jar
|
||||||
|
lib/http2/jetty-http2-common-${jetty.version}.jar
|
||||||
|
lib/http2/jetty-http2-hpack-${jetty.version}.jar
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-tests</artifactId>
|
||||||
|
<version>12.0.13-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>jetty-test-http2-client-transport-provided-webapp</artifactId>
|
||||||
|
<name>Core :: Tests :: HTTP/2 Client Transport Provided WebApp</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.deploy.skip>true</maven.deploy.skip>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-server</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty.http2</groupId>
|
||||||
|
<artifactId>jetty-http2-client-transport</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,59 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
|
||||||
|
//
|
||||||
|
// This program and the accompanying materials are made available under the
|
||||||
|
// terms of the Eclipse Public License v. 2.0 which is available at
|
||||||
|
// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
|
||||||
|
// which is available at https://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
|
||||||
|
// ========================================================================
|
||||||
|
//
|
||||||
|
|
||||||
|
package org.eclipse.jetty.test.http2.client.transport.provided;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.client.HttpClient;
|
||||||
|
import org.eclipse.jetty.http2.client.HTTP2Client;
|
||||||
|
import org.eclipse.jetty.http2.client.transport.HttpClientTransportOverHTTP2;
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.Request;
|
||||||
|
import org.eclipse.jetty.server.Response;
|
||||||
|
import org.eclipse.jetty.util.Callback;
|
||||||
|
|
||||||
|
public class HTTP2ClientTransportProvidedHandler extends Handler.Abstract
|
||||||
|
{
|
||||||
|
private final HttpClient httpClient = new HttpClient(new HttpClientTransportOverHTTP2(new HTTP2Client()));
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doStart() throws Exception
|
||||||
|
{
|
||||||
|
addBean(httpClient);
|
||||||
|
super.doStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean handle(Request request, Response response, Callback callback) throws Exception
|
||||||
|
{
|
||||||
|
// Verify that the HTTP2Client dependencies are provided by the server
|
||||||
|
// by making a request to an external server, as if this Handler was a proxy.
|
||||||
|
|
||||||
|
httpClient.newRequest("https://webtide.com/")
|
||||||
|
.timeout(15, TimeUnit.SECONDS)
|
||||||
|
.send(result ->
|
||||||
|
{
|
||||||
|
if (result.isSucceeded())
|
||||||
|
{
|
||||||
|
response.setStatus(result.getResponse().getStatus());
|
||||||
|
callback.succeeded();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
callback.failed(result.getFailure());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,6 +14,7 @@
|
||||||
<modules>
|
<modules>
|
||||||
<module>jetty-test-client-transports</module>
|
<module>jetty-test-client-transports</module>
|
||||||
<module>jetty-test-jmx</module>
|
<module>jetty-test-jmx</module>
|
||||||
|
<module>jetty-test-http2-client-transport-provided-webapp</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
|
|
@ -158,6 +158,10 @@
|
||||||
<artifactId>jetty-gcloud-session-manager</artifactId>
|
<artifactId>jetty-gcloud-session-manager</artifactId>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty.http2</groupId>
|
||||||
|
<artifactId>jetty-http2-client-transport</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.eclipse.jetty.http2</groupId>
|
<groupId>org.eclipse.jetty.http2</groupId>
|
||||||
<artifactId>jetty-http2-server</artifactId>
|
<artifactId>jetty-http2-server</artifactId>
|
||||||
|
|
|
@ -1892,4 +1892,54 @@ public class DistributionTests extends AbstractJettyHomeTest
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHTTP2ClientInCoreWebAppProvidedByServer() throws Exception
|
||||||
|
{
|
||||||
|
String jettyVersion = System.getProperty("jettyVersion");
|
||||||
|
JettyHomeTester distribution = JettyHomeTester.Builder.newInstance()
|
||||||
|
.jettyVersion(jettyVersion)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
try (JettyHomeTester.Run run1 = distribution.start("--add-modules=http,http2-client-transport,core-deploy"))
|
||||||
|
{
|
||||||
|
assertTrue(run1.awaitFor(START_TIMEOUT, TimeUnit.SECONDS));
|
||||||
|
assertEquals(0, run1.getExitValue());
|
||||||
|
|
||||||
|
Path jettyLogging = distribution.getJettyBase().resolve("resources/jetty-logging.properties");
|
||||||
|
String loggingConfig = """
|
||||||
|
org.eclipse.jetty.LEVEL=DEBUG
|
||||||
|
""";
|
||||||
|
Files.writeString(jettyLogging, loggingConfig, StandardOpenOption.TRUNCATE_EXISTING);
|
||||||
|
|
||||||
|
String name = "test-webapp";
|
||||||
|
Path webapps = distribution.getJettyBase().resolve("webapps");
|
||||||
|
Path webAppDirLib = webapps.resolve(name + ".d").resolve("lib");
|
||||||
|
Path webAppJar = distribution.resolveArtifact("org.eclipse.jetty:jetty-test-http2-client-transport-provided-webapp:jar:" + jettyVersion);
|
||||||
|
Files.copy(webAppJar, Files.createDirectories(webAppDirLib).resolve("webapp.jar"));
|
||||||
|
Files.writeString(webapps.resolve(name + ".xml"), """
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://jetty.org/configure_10_0.dtd">
|
||||||
|
<Configure class="org.eclipse.jetty.server.handler.ContextHandler">
|
||||||
|
<Set name="contextPath">/test</Set>
|
||||||
|
<Set name="handler">
|
||||||
|
<New class="org.eclipse.jetty.test.http2.client.transport.provided.HTTP2ClientTransportProvidedHandler" />
|
||||||
|
</Set>
|
||||||
|
</Configure>
|
||||||
|
""");
|
||||||
|
|
||||||
|
int port = Tester.freePort();
|
||||||
|
try (JettyHomeTester.Run run2 = distribution.start("jetty.http.port=" + port))
|
||||||
|
{
|
||||||
|
assertTrue(run2.awaitConsoleLogsFor("Started oejs.Server@", START_TIMEOUT, TimeUnit.SECONDS));
|
||||||
|
|
||||||
|
startHttpClient();
|
||||||
|
URI serverUri = URI.create("http://localhost:" + port + "/test/");
|
||||||
|
ContentResponse response = client.newRequest(serverUri)
|
||||||
|
.timeout(15, TimeUnit.SECONDS)
|
||||||
|
.send();
|
||||||
|
assertEquals(HttpStatus.OK_200, response.getStatus());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue