Skip to content

Commit

Permalink
Add reflection metadata for Jetty's ForwardedRequestCustomizer
Browse files Browse the repository at this point in the history
  • Loading branch information
mhalbritter authored and fniephaus committed Apr 29, 2024
1 parent 6bdcebb commit 4bf9d58
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 17 deletions.
62 changes: 62 additions & 0 deletions metadata/org.eclipse.jetty/jetty-server/12.0.1/reflect-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -548,5 +548,67 @@
]
}
]
},
{
"condition": {
"typeReachable": "org.eclipse.jetty.server.ForwardedRequestCustomizer"
},
"name": "org.eclipse.jetty.server.ForwardedRequestCustomizer$Forwarded",
"methods": [
{
"name": "handleRFC7239",
"parameterTypes": [
"org.eclipse.jetty.http.HttpField"
]
},
{
"name": "handleForwardedHost",
"parameterTypes": [
"org.eclipse.jetty.http.HttpField"
]
},
{
"name": "handleForwardedFor",
"parameterTypes": [
"org.eclipse.jetty.http.HttpField"
]
},
{
"name": "handleForwardedPort",
"parameterTypes": [
"org.eclipse.jetty.http.HttpField"
]
},
{
"name": "handleProto",
"parameterTypes": [
"org.eclipse.jetty.http.HttpField"
]
},
{
"name": "handleHttps",
"parameterTypes": [
"org.eclipse.jetty.http.HttpField"
]
},
{
"name": "handleForwardedServer",
"parameterTypes": [
"org.eclipse.jetty.http.HttpField"
]
},
{
"name": "handleCipherSuite",
"parameterTypes": [
"org.eclipse.jetty.http.HttpField"
]
},
{
"name": "handleSslSessionId",
"parameterTypes": [
"org.eclipse.jetty.http.HttpField"
]
}
]
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,24 @@
*/
package jetty;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.time.Duration;

import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
import org.eclipse.jetty.ee10.webapp.WebAppContext;
import org.eclipse.jetty.server.ConnectionFactory;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.ForwardedRequestCustomizer;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.server.Server;
Expand All @@ -20,37 +35,36 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.time.Duration;

import static org.assertj.core.api.Assertions.assertThat;

public class JettyTests {

private static final int PORT = 8080;
private static int port;

private static boolean DEBUG = false;
private static final boolean DEBUG = false;

@BeforeAll
static void beforeAll() {
static void beforeAll() throws IOException {
port = findAvailablePort();
System.out.println("Using port " + port + " for Jetty");
System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", DEBUG ? "debug" : "warn");
}

private static int findAvailablePort() throws IOException {
try (ServerSocket socket = new ServerSocket()) {
socket.bind(null);
return socket.getLocalPort();
}
}

@Test
void typeUtilWorks() {
assertThat(TypeUtil.fromName("java.lang.String")).isEqualTo(String.class);
}

@Test
void http() throws Exception {
Server server = new Server(PORT);
Server server = new Server(port);
server.setHandler(new Handler.Abstract() {
@Override
public boolean handle(Request request, Response response, Callback callback) {
Expand All @@ -72,7 +86,7 @@ public boolean handle(Request request, Response response, Callback callback) {

@Test
void servlet() throws Exception {
Server server = new Server(PORT);
Server server = new Server(port);
ServletContextHandler handler = new ServletContextHandler();
handler.setContextPath("/");
handler.addServlet(HelloWorldServlet.class, "/*");
Expand All @@ -94,7 +108,7 @@ void webapp(@TempDir Path tempDir) throws Exception {
// See https://github.com/eclipse/jetty.project/issues/9116
ResourceFactory.registerResourceFactory("resource", new URLResourceFactory());

Server server = new Server(PORT);
Server server = new Server(port);
WebAppContext context = new WebAppContext();
// EnvConfiguration and PlusConfiguration uses JNDI, which is not what we want to include
context.setBaseResourceAsPath(tempDir);
Expand All @@ -111,9 +125,40 @@ void webapp(@TempDir Path tempDir) throws Exception {
}
}

@Test
void forwardHeaders() throws Exception {
Server server = new Server(port);
for (Connector connector : server.getConnectors()) {
for (ConnectionFactory connectionFactory : connector.getConnectionFactories()) {
if (connectionFactory instanceof HttpConfiguration.ConnectionFactory) {
((HttpConfiguration.ConnectionFactory) connectionFactory).getHttpConfiguration()
.addCustomizer(new ForwardedRequestCustomizer());
}
}
}
server.setHandler(new Handler.Abstract() {
@Override
public boolean handle(Request request, Response response, Callback callback) {
response.setStatus(200);
response.getHeaders().add("Content-Type", "text/plain");
String content = "I am " + Request.getServerName(request) + ":" + Request.getServerPort(request);
response.write(true, ByteBuffer.wrap(content.getBytes(StandardCharsets.UTF_8)), callback);
return true;
}
});
server.start();
try {
HttpResponse<String> response = doHttpRequest("X-Forwarded-Host", "some-host", "X-Forwarded-Port", "12345");
assertThat(response.statusCode()).isEqualTo(200);
assertThat(response.body()).isEqualTo("I am some-host:12345");
} finally {
server.stop();
}
}

private static HttpResponse<String> doHttpRequest(String... headers) throws IOException, InterruptedException {
HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(1)).build();
HttpRequest.Builder request = HttpRequest.newBuilder(URI.create(String.format("http://localhost:%d/", PORT)))
HttpRequest.Builder request = HttpRequest.newBuilder(URI.create(String.format("http://localhost:%d/", port)))
.GET().header("Accept", "text/plain").timeout(Duration.ofSeconds(1));
if (headers.length > 0) {
request.headers(headers);
Expand Down

0 comments on commit 4bf9d58

Please sign in to comment.