Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[jetty-users] Easiest way to cleanup headers before sending on connector level

Hi,

I have a Jetty server that was upgraded from 9.4 to 10.0. There is one
requirement to do some "header maintenance": Before ethe response is sent to
client, I want all headers created by several addHeaders in a bunch of
servlets, filters and other handlers to be cleaned up. In my case, this is
deduplication and merging of "vary" and "cache-control" headers to assist
NGINX in front so it only gets one header and not multiple.

In Jetty 9.4, I had the following code, added as bean to the connector:

  private static HttpField mergeHttpFields(String name, List<HttpField>
fields) {
    return (fields == null) ? null : new HttpField(name, fields.stream()
        .map(HttpField::getValues)
        .flatMap(Stream::of)
        .distinct()
        .collect(COMMA_JOINER));
  }
  
  private static final HttpChannel.Listener HEADER_MERGER = new
HttpChannel.Listener() {
    @Override
    public void onResponseBegin(Request request) {
      final HttpFields headers = request.getResponse().getHttpFields();
      headers.computeField("Vary", Bootstrap::mergeHttpFields);
      headers.computeField("Cache-Control", Bootstrap::mergeHttpFields);
    }
  };

// This is how its added:  
connector.addBean(HEADER_MERGER);


In 10.0 this no longer compiled, but was easy to fix by using the
HttpFields.Mutable interface instead of HttpFields. But actually the headers
were no longer merged! Debuggig through the code, I figured out that my
header merger was actually called before the response was submitted and
after it ran, the HttpFields were correctly merged. But on the wire they did
not appear, the original headers were sent.

What changed? The Mutable vs. Immutable is the problem: Before the
onResponseBegin() handler is called, the HttpChannel has already made a
Immutable snapshot of the headers, so all changes to the Mutable ones are
lost.

My question now: How to "clean up headers" the easy way with Jetty 10? I
know there might be ways to implement Interceptors, but this makes it really
unreadable and hard to maintain. Does anybody has a better idea how to tell
Jetty to modify the headers before sending them? I found no other Listener
that could achieve this. Is there something like beforeCommit?

Uwe

-----
Uwe Schindler
uschindler@xxxxxxxxxx 
ASF Member, Member of PMC and Committer of Apache Lucene and Apache Solr
Bremen, Germany
https://lucene.apache.org/
https://solr.apache.org/




Back to the top