Skip to content

Commit 9c94e5f

Browse files
committed
Handle multiple headers with the same name
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. Signed-off-by: Robert Elliot <[email protected]>
1 parent 5f2139a commit 9c94e5f

File tree

3 files changed

+32
-23
lines changed

3 files changed

+32
-23
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package ch.qos.logback.access.jetty;
2+
3+
import org.eclipse.jetty.http.HttpField;
4+
import org.eclipse.jetty.http.HttpFields;
5+
6+
import java.util.Map;
7+
import java.util.TreeMap;
8+
9+
class HeaderUtil {
10+
static Map<String, String> buildHeaderMap(HttpFields headers) {
11+
Map<String, String> requestHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
12+
for (HttpField f : headers) {
13+
String existing = requestHeaderMap.get(f.getName());
14+
String value = combine(existing, f.getValue());
15+
requestHeaderMap.put(f.getName(), value);
16+
}
17+
return requestHeaderMap;
18+
}
19+
20+
private static String combine(String existing, String field) {
21+
if (existing == null) {
22+
return field;
23+
} else {
24+
return existing + "," + field;
25+
}
26+
}
27+
}

logback-access-jetty12/src/main/java/ch/qos/logback/access/jetty/JettyServerAdapter.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,13 @@
1414
package ch.qos.logback.access.jetty;
1515

1616
import ch.qos.logback.access.common.spi.ServerAdapter;
17-
18-
import org.eclipse.jetty.http.HttpField;
19-
import org.eclipse.jetty.http.HttpFields;
2017
import org.eclipse.jetty.server.Request;
2118
import org.eclipse.jetty.server.Response;
2219

23-
import java.util.Enumeration;
24-
import java.util.HashMap;
2520
import java.util.Map;
2621

22+
import static ch.qos.logback.access.jetty.HeaderUtil.buildHeaderMap;
23+
2724
/**
2825
* A jetty specific implementation of the {@link ServerAdapter} interface.
2926
*
@@ -57,16 +54,7 @@ public long getRequestTimestamp() {
5754

5855
@Override
5956
public Map<String, String> buildResponseHeaderMap() {
60-
Map<String, String> responseHeaderMap = new HashMap<String, String>();
61-
HttpFields.Mutable httpFields = response.getHeaders();
62-
63-
for(HttpField field: httpFields) {
64-
String key = field.getName();
65-
String value = field.getValue();
66-
responseHeaderMap.put(key, value);
67-
}
68-
69-
return responseHeaderMap;
57+
return buildHeaderMap(response.getHeaders());
7058
}
7159

7260
}

logback-access-jetty12/src/main/java/ch/qos/logback/access/jetty/RequestWrapper.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717
import jakarta.servlet.http.HttpUpgradeHandler;
1818
import jakarta.servlet.http.Part;
1919
import org.eclipse.jetty.http.HttpCookie;
20-
import org.eclipse.jetty.http.HttpField;
2120
import org.eclipse.jetty.http.HttpScheme;
22-
import org.eclipse.jetty.http.HttpURI;
2321
import org.eclipse.jetty.http.HttpVersion;
2422
import org.eclipse.jetty.server.Request;
2523
import org.eclipse.jetty.server.Session;
@@ -37,10 +35,10 @@
3735
import java.util.Locale;
3836
import java.util.Map;
3937
import java.util.Set;
40-
import java.util.TreeMap;
4138
import java.util.stream.Collectors;
4239

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

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

9391
@Override
9492
public Map<String, String> buildRequestHeaderMap() {
95-
Map<String, String> requestHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
96-
for (HttpField f : request.getHeaders()) {
97-
requestHeaderMap.put(f.getName(), f.getValue());
98-
}
99-
return requestHeaderMap;
93+
return buildHeaderMap(request.getHeaders());
10094
}
10195

10296
@Override

0 commit comments

Comments
 (0)