Skip to content

Commit

Permalink
Handle multiple headers with the same name
Browse files Browse the repository at this point in the history
Pushes the fixes in dropwizard/dropwizard#8008
upstream into logback-access, where they probably should be.

Unfortunately `HttpGetUtil` uses `HttpURLConnection`, which makes it
hard to write a test for this because `HttpURLConnection` combines the
headers for you.
  • Loading branch information
Mahoney committed Jan 16, 2025
1 parent 79d5676 commit 311c082
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ch.qos.logback.access.jetty;

import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpFields;

import java.util.Map;
import java.util.TreeMap;

class HeaderUtil {
static Map<String, String> buildHeaderMap(HttpFields headers) {
Map<String, String> requestHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
for (HttpField f : headers) {
String existing = requestHeaderMap.get(f.getName());
String value = combine(existing, f.getValue());
requestHeaderMap.put(f.getName(), value);
}
return requestHeaderMap;
}

private static String combine(String existing, String field) {
if (existing == null) {
return field;
} else {
return existing + "," + field;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,13 @@
package ch.qos.logback.access.jetty;

import ch.qos.logback.access.common.spi.ServerAdapter;

import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import static ch.qos.logback.access.jetty.HeaderUtil.buildHeaderMap;

/**
* A jetty specific implementation of the {@link ServerAdapter} interface.
*
Expand Down Expand Up @@ -57,16 +54,7 @@ public long getRequestTimestamp() {

@Override
public Map<String, String> buildResponseHeaderMap() {
Map<String, String> responseHeaderMap = new HashMap<String, String>();
HttpFields.Mutable httpFields = response.getHeaders();

for(HttpField field: httpFields) {
String key = field.getName();
String value = field.getValue();
responseHeaderMap.put(key, value);
}

return responseHeaderMap;
return buildHeaderMap(response.getHeaders());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@
import jakarta.servlet.http.HttpUpgradeHandler;
import jakarta.servlet.http.Part;
import org.eclipse.jetty.http.HttpCookie;
import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpScheme;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Session;
Expand All @@ -37,10 +35,10 @@
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.stream.Collectors;

import static ch.qos.logback.access.common.spi.IAccessEvent.NA;
import static ch.qos.logback.access.jetty.HeaderUtil.buildHeaderMap;
import static java.nio.charset.StandardCharsets.UTF_8;

public class RequestWrapper implements HttpServletRequest, WrappedHttpRequest {
Expand Down Expand Up @@ -92,11 +90,7 @@ public Enumeration<String> getHeaderNames() {

@Override
public Map<String, String> buildRequestHeaderMap() {
Map<String, String> requestHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
for (HttpField f : request.getHeaders()) {
requestHeaderMap.put(f.getName(), f.getValue());
}
return requestHeaderMap;
return buildHeaderMap(request.getHeaders());
}

@Override
Expand Down

0 comments on commit 311c082

Please sign in to comment.