This is an automated email from the ASF dual-hosted git repository.
FrankChen021 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new 9e354d4f41b build(deps): bump jetty.version from 12.1.11 to 12.1.12
(#19956)
9e354d4f41b is described below
commit 9e354d4f41b94f7fa4c48fb8c3186cae399d35b4
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
AuthorDate: Wed Aug 12 09:41:12 2026 +0800
build(deps): bump jetty.version from 12.1.11 to 12.1.12 (#19956)
* build(deps): bump jetty.version from 12.1.11 to 12.1.12
Bumps `jetty.version` from 12.1.11 to 12.1.12.
Updates `org.eclipse.jetty:jetty-client` from 12.1.11 to 12.1.12
Updates `org.eclipse.jetty:jetty-http` from 12.1.11 to 12.1.12
Updates `org.eclipse.jetty:jetty-io` from 12.1.11 to 12.1.12
Updates `org.eclipse.jetty:jetty-server` from 12.1.11 to 12.1.12
Updates `org.eclipse.jetty.ee8:jetty-ee8-servlet` from 12.1.11 to 12.1.12
Updates `org.eclipse.jetty.ee8:jetty-ee8-servlets` from 12.1.11 to 12.1.12
Updates `org.eclipse.jetty.ee8:jetty-ee8-proxy` from 12.1.11 to 12.1.12
Updates `org.eclipse.jetty:jetty-rewrite` from 12.1.11 to 12.1.12
Updates `org.eclipse.jetty:jetty-util` from 12.1.11 to 12.1.12
Updates `org.eclipse.jetty:jetty-security` from 12.1.11 to 12.1.12
---
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-client
dependency-version: 12.1.12
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty:jetty-http
dependency-version: 12.1.12
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty:jetty-io
dependency-version: 12.1.12
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty:jetty-server
dependency-version: 12.1.12
dependency-type: direct:development
update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty.ee8:jetty-ee8-servlet
dependency-version: 12.1.12
dependency-type: direct:development
update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty.ee8:jetty-ee8-servlets
dependency-version: 12.1.12
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty.ee8:jetty-ee8-proxy
dependency-version: 12.1.12
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty:jetty-rewrite
dependency-version: 12.1.12
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty:jetty-util
dependency-version: 12.1.12
dependency-type: direct:development
update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty:jetty-security
dependency-version: 12.1.12
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <[email protected]>
* fix: preserve response context through Jetty proxy
* test: avoid deprecated URL constructor
---------
Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot]
<49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Frank Chen <[email protected]>
---
licenses.yaml | 2 +-
pom.xml | 2 +-
.../druid/server/AsyncQueryForwardingServlet.java | 20 +++++++++++++
.../server/AsyncQueryForwardingServletTest.java | 33 ++++++++++++++++++++++
4 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/licenses.yaml b/licenses.yaml
index e6db039fe9c..6feb605b5cc 100644
--- a/licenses.yaml
+++ b/licenses.yaml
@@ -2350,7 +2350,7 @@ name: Jetty
license_category: binary
module: java-core
license_name: Eclipse Public License 2.0
-version: 12.1.11
+version: 12.1.12
libraries:
- org.eclipse.jetty: jetty-alpn-client
- org.eclipse.jetty: jetty-client
diff --git a/pom.xml b/pom.xml
index 692aedf3521..36abf2a3907 100644
--- a/pom.xml
+++ b/pom.xml
@@ -104,7 +104,7 @@
<guice.version>6.0.0</guice.version>
<hamcrest.version>3.0</hamcrest.version>
<iceberg.core.version>1.10.0</iceberg.core.version>
- <jetty.version>12.1.11</jetty.version>
+ <jetty.version>12.1.12</jetty.version>
<jersey.version>1.19.4</jersey.version>
<jackson.version>2.22.1</jackson.version>
<codehaus.jackson.version>1.9.13</codehaus.jackson.version>
diff --git
a/services/src/main/java/org/apache/druid/server/AsyncQueryForwardingServlet.java
b/services/src/main/java/org/apache/druid/server/AsyncQueryForwardingServlet.java
index 7b8cd453b40..7870e99ee60 100644
---
a/services/src/main/java/org/apache/druid/server/AsyncQueryForwardingServlet.java
+++
b/services/src/main/java/org/apache/druid/server/AsyncQueryForwardingServlet.java
@@ -66,6 +66,7 @@ import org.eclipse.jetty.client.Request;
import org.eclipse.jetty.client.Response;
import org.eclipse.jetty.client.Result;
import org.eclipse.jetty.ee8.proxy.AsyncProxyServlet;
+import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpMethod;
@@ -627,10 +628,29 @@ public class AsyncQueryForwardingServlet extends
AsyncProxyServlet implements Qu
Response serverResponse
)
{
+ // Response context is JSON rather than a comma-separated header value, so
copy it verbatim instead of allowing
+ // Jetty's generic proxy header handling to parse it as a list.
+ final HttpField responseContext =
serverResponse.getHeaders().getField(QueryResource.HEADER_RESPONSE_CONTEXT);
+ if (responseContext != null) {
+ proxyResponse.setHeader(responseContext.getName(),
responseContext.getValue());
+ }
StandardResponseHeaderFilterHolder.deduplicateHeadersInProxyServlet(proxyResponse,
serverResponse);
super.onServerResponseHeaders(clientRequest, proxyResponse,
serverResponse);
}
+ @Override
+ protected HttpField filterServerResponseHeader(
+ HttpServletRequest clientRequest,
+ Response serverResponse,
+ HttpField field
+ )
+ {
+ if
(QueryResource.HEADER_RESPONSE_CONTEXT.equalsIgnoreCase(field.getName())) {
+ return null;
+ }
+ return super.filterServerResponseHeader(clientRequest, serverResponse,
field);
+ }
+
@VisibleForTesting
static String getAvaticaConnectionId(Map<String, Object> requestMap)
{
diff --git
a/services/src/test/java/org/apache/druid/server/AsyncQueryForwardingServletTest.java
b/services/src/test/java/org/apache/druid/server/AsyncQueryForwardingServletTest.java
index 9903eb379db..19a0f770c57 100644
---
a/services/src/test/java/org/apache/druid/server/AsyncQueryForwardingServletTest.java
+++
b/services/src/test/java/org/apache/druid/server/AsyncQueryForwardingServletTest.java
@@ -33,6 +33,7 @@ import com.google.inject.Module;
import com.google.inject.servlet.GuiceFilter;
import org.apache.calcite.avatica.Meta;
import org.apache.calcite.avatica.remote.Service;
+import org.apache.commons.io.IOUtils;
import
org.apache.druid.common.exception.AllowedRegexErrorResponseTransformStrategy;
import org.apache.druid.common.exception.ErrorResponseTransformStrategy;
import org.apache.druid.common.utils.SocketUtil;
@@ -112,11 +113,16 @@ import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
+import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -131,6 +137,8 @@ import java.util.zip.Deflater;
public class AsyncQueryForwardingServletTest extends BaseJettyTest
{
+ private static final String RESPONSE_CONTEXT = "{\"missingSegments\":[]}";
+
private static int port1;
private static int port2;
@@ -181,6 +189,7 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
Jerseys.addResource(binder, SlowResource.class);
Jerseys.addResource(binder, ExceptionResource.class);
Jerseys.addResource(binder, DefaultResource.class);
+ Jerseys.addResource(binder, ResponseContextResource.class);
LifecycleModule.register(binder, Server.class);
}
}
@@ -210,6 +219,16 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
Assert.assertNotEquals("gzip", postNoGzip.getContentEncoding());
}
+ @Test
+ public void testProxyResponseContextHeader() throws Exception
+ {
+ final URL url = URI.create("http://localhost:" + port +
"/proxy/response-context").toURL();
+ final HttpURLConnection get = (HttpURLConnection) url.openConnection();
+
+ Assert.assertEquals(DEFAULT_RESPONSE_CONTENT,
IOUtils.toString(get.getInputStream(), StandardCharsets.UTF_8));
+ Assert.assertEquals(RESPONSE_CONTEXT,
get.getHeaderField(QueryResource.HEADER_RESPONSE_CONTEXT));
+ }
+
@Test(timeout = 60_000L)
public void testDeleteBroadcast() throws Exception
{
@@ -1038,6 +1057,19 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
return server;
}
+ @Path("/response-context")
+ public static class ResponseContextResource
+ {
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public javax.ws.rs.core.Response get()
+ {
+ return javax.ws.rs.core.Response.ok(DEFAULT_RESPONSE_CONTENT)
+
.header(QueryResource.HEADER_RESPONSE_CONTEXT, RESPONSE_CONTEXT)
+ .build();
+ }
+ }
+
public static class ProxyJettyServerInit implements JettyServerInitializer
{
@@ -1115,6 +1147,7 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
root.addFilter(GuiceFilter.class, "/slow/*", null);
root.addFilter(GuiceFilter.class, "/default/*", null);
root.addFilter(GuiceFilter.class, "/exception/*", null);
+ root.addFilter(GuiceFilter.class, "/response-context/*", null);
final Handler.Sequence handlerList = new Handler.Sequence();
handlerList.setHandlers(
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]