From e9a54fd748ddf1330ad42abe0d2c39491e1dd911 Mon Sep 17 00:00:00 2001 From: Aaron Lew <64337293+aaronlew02@users.noreply.github.com> Date: Fri, 14 Nov 2025 15:25:39 -0500 Subject: [PATCH] fix(deps): Migrate conformance servers from Jetty 11 to Jetty 12 Signed-off-by: Aaron Lew <64337293+aaronlew02@users.noreply.github.com> --- sigstore-cli/build.gradle.kts | 3 +- .../dev/sigstore/cli/ConformanceServer.java | 57 +++++++++---------- tuf-cli/build.gradle.kts | 3 +- .../tuf/cli/TufConformanceServer.java | 57 +++++++++---------- 4 files changed, 54 insertions(+), 66 deletions(-) diff --git a/sigstore-cli/build.gradle.kts b/sigstore-cli/build.gradle.kts index 2a1b7c5d..986710d6 100644 --- a/sigstore-cli/build.gradle.kts +++ b/sigstore-cli/build.gradle.kts @@ -18,8 +18,7 @@ dependencies { implementation(platform("com.google.oauth-client:google-oauth-client-bom:1.39.0")) implementation("com.google.oauth-client:google-oauth-client") - implementation("org.eclipse.jetty:jetty-server:11.0.26") - implementation("org.eclipse.jetty:jetty-servlet:11.0.26") + implementation("org.eclipse.jetty:jetty-server:12.1.4") implementation("org.slf4j:slf4j-simple:2.0.17") diff --git a/sigstore-cli/src/main/java/dev/sigstore/cli/ConformanceServer.java b/sigstore-cli/src/main/java/dev/sigstore/cli/ConformanceServer.java index 779e9100..a6de9751 100644 --- a/sigstore-cli/src/main/java/dev/sigstore/cli/ConformanceServer.java +++ b/sigstore-cli/src/main/java/dev/sigstore/cli/ConformanceServer.java @@ -16,21 +16,21 @@ package dev.sigstore.cli; import com.google.gson.Gson; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.io.PrintStream; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Map; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.io.Content; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.util.Callback; public class ConformanceServer { @@ -49,30 +49,30 @@ public static void main(String[] args) throws Exception { server.join(); } - public static class ConformanceHandler extends AbstractHandler { + public static class ConformanceHandler extends Handler.Abstract { @Override - public void handle( - String target, - Request baseRequest, - HttpServletRequest request, - HttpServletResponse response) - throws IOException, ServletException { - if ("/".equals(target)) { - handleHealthCheck(response); - baseRequest.setHandled(true); - } else if ("/execute".equals(target) && "POST".equals(request.getMethod())) { - handleExecute(request, response); - baseRequest.setHandled(true); + public boolean handle(Request request, Response response, Callback callback) + throws IOException { + if ("/".equals(request.getHttpURI().getPath())) { + handleHealthCheck(response, callback); + return true; + } else if ("/execute".equals(request.getHttpURI().getPath()) + && "POST".equals(request.getMethod())) { + handleExecute(request, response, callback); + return true; } + return false; } } - private static void handleExecute(HttpServletRequest request, HttpServletResponse response) - throws IOException { + private static void handleExecute(Request request, Response response, Callback callback) { ExecuteRequest executeRequest; - try (InputStream is = request.getInputStream()) { + try (InputStream is = Content.Source.asInputStream(request)) { String requestBody = new String(is.readAllBytes(), StandardCharsets.UTF_8); executeRequest = GSON.fromJson(requestBody, ExecuteRequest.class); + } catch (IOException e) { + callback.failed(e); + return; } // Tests should not be run in parallel, to ensure orderly input/output @@ -106,22 +106,17 @@ private static void handleExecute(HttpServletRequest request, HttpServletRespons "exitCode", exitCode); String jsonResponse = GSON.toJson(responseMap); - response.setStatus(HttpServletResponse.SC_OK); - response.setContentType("application/json"); - byte[] responseBytes = jsonResponse.getBytes(StandardCharsets.UTF_8); - response.setContentLength(responseBytes.length); + response.getHeaders().put(HttpHeader.CONTENT_TYPE, "application/json"); + Content.Sink.write(response, true, jsonResponse, callback); - try (OutputStream os = response.getOutputStream()) { - os.write(responseBytes); - } } finally { System.setOut(originalOut); System.setErr(originalErr); } } - private static void handleHealthCheck(HttpServletResponse response) throws IOException { - response.setStatus(HttpServletResponse.SC_OK); - response.getWriter().println("OK"); + private static void handleHealthCheck(Response response, Callback callback) throws IOException { + response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/plain"); + Content.Sink.write(response, true, "OK", callback); } } diff --git a/tuf-cli/build.gradle.kts b/tuf-cli/build.gradle.kts index 521d57f2..84d3e4be 100644 --- a/tuf-cli/build.gradle.kts +++ b/tuf-cli/build.gradle.kts @@ -18,8 +18,7 @@ dependencies { implementation(platform("com.google.oauth-client:google-oauth-client-bom:1.39.0")) implementation("com.google.oauth-client:google-oauth-client") - implementation("org.eclipse.jetty:jetty-server:11.0.26") - implementation("org.eclipse.jetty:jetty-servlet:11.0.26") + implementation("org.eclipse.jetty:jetty-server:12.1.4") implementation("org.slf4j:slf4j-simple:2.0.17") diff --git a/tuf-cli/src/main/java/dev/sigstore/tuf/cli/TufConformanceServer.java b/tuf-cli/src/main/java/dev/sigstore/tuf/cli/TufConformanceServer.java index 9c074e08..efbd3bac 100644 --- a/tuf-cli/src/main/java/dev/sigstore/tuf/cli/TufConformanceServer.java +++ b/tuf-cli/src/main/java/dev/sigstore/tuf/cli/TufConformanceServer.java @@ -16,21 +16,21 @@ package dev.sigstore.tuf.cli; import com.google.gson.Gson; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.io.PrintStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; import java.util.Map; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.io.Content; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.util.Callback; public class TufConformanceServer { @@ -53,29 +53,30 @@ public static void main(String[] args) throws Exception { server.join(); } - public static class TufConformanceHandler extends AbstractHandler { + public static class TufConformanceHandler extends Handler.Abstract { @Override - public void handle( - String target, - Request baseRequest, - HttpServletRequest request, - HttpServletResponse response) - throws IOException, ServletException { - if ("/".equals(target)) { - handleHealthCheck(response); - } else if ("/execute".equals(target) && "POST".equals(request.getMethod())) { - handleExecute(request, response); + public boolean handle(Request request, Response response, Callback callback) + throws IOException { + if ("/".equals(request.getHttpURI().getPath())) { + handleHealthCheck(response, callback); + return true; + } else if ("/execute".equals(request.getHttpURI().getPath()) + && "POST".equals(request.getMethod())) { + handleExecute(request, response, callback); + return true; } - baseRequest.setHandled(true); + return false; } } - private static void handleExecute(HttpServletRequest request, HttpServletResponse response) - throws IOException { + private static void handleExecute(Request request, Response response, Callback callback) { ExecuteRequest executeRequest; - try (InputStream is = request.getInputStream()) { + try (InputStream is = Content.Source.asInputStream(request)) { String requestBody = new String(is.readAllBytes(), StandardCharsets.UTF_8); executeRequest = GSON.fromJson(requestBody, ExecuteRequest.class); + } catch (IOException e) { + callback.failed(e); + return; } // Tests should not be run in parallel, to ensure orderly input/output @@ -106,14 +107,8 @@ private static void handleExecute(HttpServletRequest request, HttpServletRespons "exitCode", exitCode); String jsonResponse = GSON.toJson(responseMap); - response.setStatus(HttpServletResponse.SC_OK); - response.setContentType("application/json"); - byte[] responseBytes = jsonResponse.getBytes(StandardCharsets.UTF_8); - response.setContentLength(responseBytes.length); - - try (OutputStream os = response.getOutputStream()) { - os.write(responseBytes); - } + response.getHeaders().put(HttpHeader.CONTENT_TYPE, "application/json"); + Content.Sink.write(response, true, jsonResponse, callback); } finally { if (!debug) { System.setOut(originalOut); @@ -122,8 +117,8 @@ private static void handleExecute(HttpServletRequest request, HttpServletRespons } } - private static void handleHealthCheck(HttpServletResponse response) throws IOException { - response.setStatus(HttpServletResponse.SC_OK); - response.getWriter().println("OK"); + private static void handleHealthCheck(Response response, Callback callback) throws IOException { + response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/plain"); + Content.Sink.write(response, true, "OK", callback); } }