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]

Reply via email to