Skip to content

Commit 8e5bbb9

Browse files
committed
use case insensitive headers in all events
1 parent 46ec9fa commit 8e5bbb9

16 files changed

+168
-97
lines changed

aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayCustomAuthorizerEvent.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.amazonaws.services.lambda.runtime.events;
22

3+
import com.amazonaws.services.lambda.runtime.events.models.HttpHeaders;
34
import lombok.AllArgsConstructor;
45
import lombok.Builder;
56
import lombok.Data;
@@ -26,7 +27,7 @@ public class APIGatewayCustomAuthorizerEvent {
2627
private String resource;
2728
private String path;
2829
private String httpMethod;
29-
private Map<String, String> headers;
30+
private HttpHeaders<String> headers;
3031
private Map<String, String> queryStringParameters;
3132
private Map<String, String> pathParameters;
3233
private Map<String, String> stageVariables;

aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayProxyRequestEvent.java

+17-76
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.amazonaws.services.lambda.runtime.events;
22

3+
import com.amazonaws.services.lambda.runtime.events.models.HttpHeaders;
4+
35
import java.io.Serializable;
46
import java.util.*;
57

@@ -16,9 +18,9 @@ public class APIGatewayProxyRequestEvent implements Serializable, Cloneable {
1618

1719
private String httpMethod;
1820

19-
private Headers<String> headers = new Headers<>();
21+
private HttpHeaders<String> headers;
2022

21-
private Headers<List<String>> multiValueHeaders = new Headers<>();
23+
private HttpHeaders<List<String>> multiValueHeaders;
2224

2325
private Map<String, String> queryStringParameters;
2426

@@ -34,77 +36,6 @@ public class APIGatewayProxyRequestEvent implements Serializable, Cloneable {
3436

3537
private Boolean isBase64Encoded;
3638

37-
/**
38-
* Class that represents Http Headers.
39-
*
40-
* Not using a standard map, because we need insensitive case.
41-
*/
42-
public static class Headers<T> implements Map<String, T> {
43-
44-
// Headers are case insensitive (https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2)
45-
private Map<String, T> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
46-
47-
@Override
48-
public int size() {
49-
return map.size();
50-
}
51-
52-
@Override
53-
public boolean isEmpty() {
54-
return map.isEmpty();
55-
}
56-
57-
@Override
58-
public boolean containsKey(Object key) {
59-
return map.containsKey(key);
60-
}
61-
62-
@Override
63-
public boolean containsValue(Object value) {
64-
return map.containsValue(value);
65-
}
66-
67-
@Override
68-
public T get(Object key) {
69-
return map.get(key);
70-
}
71-
72-
@Override
73-
public T put(String key, T value) {
74-
return map.put(key, value);
75-
}
76-
77-
@Override
78-
public T remove(Object key) {
79-
return map.remove(key);
80-
}
81-
82-
@Override
83-
public void putAll(Map<? extends String, ? extends T> m) {
84-
map.putAll(m);
85-
}
86-
87-
@Override
88-
public void clear() {
89-
map.clear();
90-
}
91-
92-
@Override
93-
public Set<String> keySet() {
94-
return map.keySet();
95-
}
96-
97-
@Override
98-
public Collection<T> values() {
99-
return map.values();
100-
}
101-
102-
@Override
103-
public Set<Entry<String, T>> entrySet() {
104-
return map.entrySet();
105-
}
106-
}
107-
10839
/**
10940
* class that represents proxy request context
11041
*/
@@ -1015,14 +946,19 @@ public APIGatewayProxyRequestEvent withHttpMethod(String httpMethod) {
1015946
* @return The headers sent with the request
1016947
*/
1017948
public Map<String, String> getHeaders() {
1018-
return headers.map;
949+
return headers;
1019950
}
1020951

1021952
/**
1022953
* @param headers The headers sent with the request
1023954
*/
1024955
public void setHeaders(Map<String, String> headers) {
1025-
this.headers.putAll(headers);
956+
if (this.headers == null && headers != null && !headers.isEmpty()) {
957+
this.headers = new HttpHeaders<>();
958+
}
959+
if (headers != null && !headers.isEmpty()) {
960+
this.headers.putAll(headers);
961+
}
1026962
}
1027963

1028964
/**
@@ -1045,7 +981,12 @@ public Map<String, List<String>> getMultiValueHeaders() {
1045981
* @param multiValueHeaders The multi value headers sent with the request
1046982
*/
1047983
public void setMultiValueHeaders(Map<String, List<String>> multiValueHeaders) {
1048-
this.multiValueHeaders.putAll(multiValueHeaders);
984+
if (this.multiValueHeaders == null && multiValueHeaders != null && !multiValueHeaders.isEmpty()) {
985+
this.multiValueHeaders = new HttpHeaders<>();
986+
}
987+
if (multiValueHeaders != null && !multiValueHeaders.isEmpty()) {
988+
this.multiValueHeaders.putAll(multiValueHeaders);
989+
}
1049990
}
1050991

1051992
/**

aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayProxyResponseEvent.java

+16-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.amazonaws.services.lambda.runtime.events;
22

3+
import com.amazonaws.services.lambda.runtime.events.models.HttpHeaders;
4+
35
import java.io.Serializable;
46
import java.util.List;
57
import java.util.Map;
@@ -13,9 +15,9 @@ public class APIGatewayProxyResponseEvent implements Serializable, Cloneable {
1315

1416
private Integer statusCode;
1517

16-
private Map<String, String> headers;
18+
private HttpHeaders<String> headers;
1719

18-
private Map<String, List<String>> multiValueHeaders;
20+
private HttpHeaders<List<String>> multiValueHeaders;
1921

2022
private String body;
2123

@@ -60,7 +62,12 @@ public Map<String, String> getHeaders() {
6062
* @param headers The Http headers return in the response
6163
*/
6264
public void setHeaders(Map<String, String> headers) {
63-
this.headers = headers;
65+
if (this.headers == null && headers != null && !headers.isEmpty()) {
66+
this.headers = new HttpHeaders<>();
67+
}
68+
if (headers != null && !headers.isEmpty()) {
69+
this.headers.putAll(headers);
70+
}
6471
}
6572

6673
/**
@@ -83,7 +90,12 @@ public Map<String, List<String>> getMultiValueHeaders() {
8390
* @param multiValueHeaders the Http multi value headers to return in the response
8491
*/
8592
public void setMultiValueHeaders(Map<String, List<String>> multiValueHeaders) {
86-
this.multiValueHeaders = multiValueHeaders;
93+
if (this.multiValueHeaders == null && multiValueHeaders != null && !multiValueHeaders.isEmpty()) {
94+
this.multiValueHeaders = new HttpHeaders<>();
95+
}
96+
if (multiValueHeaders != null && !multiValueHeaders.isEmpty()) {
97+
this.multiValueHeaders.putAll(multiValueHeaders);
98+
}
8799
}
88100

89101
/**

aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.amazonaws.services.lambda.runtime.events;
22

3+
import com.amazonaws.services.lambda.runtime.events.models.HttpHeaders;
34
import lombok.AllArgsConstructor;
45
import lombok.Builder;
56
import lombok.Data;
@@ -31,7 +32,7 @@ public class APIGatewayV2CustomAuthorizerEvent {
3132
private String rawPath;
3233
private String rawQueryString;
3334
private List<String> cookies;
34-
private Map<String, String> headers;
35+
private HttpHeaders<String> headers;
3536
private Map<String, String> queryStringParameters;
3637
private RequestContext requestContext;
3738
private Map<String, String> pathParameters;

aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2HTTPEvent.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
package com.amazonaws.services.lambda.runtime.events;
1515

16+
import com.amazonaws.services.lambda.runtime.events.models.HttpHeaders;
1617
import lombok.AllArgsConstructor;
1718
import lombok.Builder;
1819
import lombok.Data;
@@ -34,7 +35,7 @@ public class APIGatewayV2HTTPEvent {
3435
private String rawPath;
3536
private String rawQueryString;
3637
private List<String> cookies;
37-
private Map<String, String> headers;
38+
private HttpHeaders<String> headers;
3839
private Map<String, String> queryStringParameters;
3940
private Map<String, String> pathParameters;
4041
private Map<String, String> stageVariables;

aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2HTTPResponse.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
package com.amazonaws.services.lambda.runtime.events;
1515

16+
import com.amazonaws.services.lambda.runtime.events.models.HttpHeaders;
1617
import lombok.AllArgsConstructor;
1718
import lombok.Builder;
1819
import lombok.Data;
@@ -27,8 +28,8 @@
2728
@NoArgsConstructor
2829
public class APIGatewayV2HTTPResponse {
2930
private int statusCode;
30-
private Map<String, String> headers;
31-
private Map<String, List<String>> multiValueHeaders;
31+
private HttpHeaders<String> headers;
32+
private HttpHeaders<List<String>> multiValueHeaders;
3233
private List<String> cookies;
3334
private String body;
3435
private boolean isBase64Encoded;

aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2WebSocketResponse.java

+16-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.amazonaws.services.lambda.runtime.events;
22

3+
import com.amazonaws.services.lambda.runtime.events.models.HttpHeaders;
4+
35
import java.io.Serializable;
46
import java.util.Map;
57

@@ -12,8 +14,8 @@ public class APIGatewayV2WebSocketResponse implements Serializable, Cloneable {
1214

1315
private boolean isBase64Encoded = false;
1416
private int statusCode;
15-
private Map<String, String> headers;
16-
private Map<String, String[]> multiValueHeaders;
17+
private HttpHeaders<String> headers;
18+
private HttpHeaders<String[]> multiValueHeaders;
1719
private String body;
1820

1921
public boolean isIsBase64Encoded() {
@@ -37,15 +39,25 @@ public Map<String, String> getHeaders() {
3739
}
3840

3941
public void setHeaders(Map<String, String> headers) {
40-
this.headers = headers;
42+
if (this.headers == null && headers != null && !headers.isEmpty()) {
43+
this.headers = new HttpHeaders<>();
44+
}
45+
if (headers != null && !headers.isEmpty()) {
46+
this.headers.putAll(headers);
47+
}
4148
}
4249

4350
public Map<String, String[]> getMultiValueHeaders() {
4451
return multiValueHeaders;
4552
}
4653

4754
public void setMultiValueHeaders(Map<String, String[]> multiValueHeaders) {
48-
this.multiValueHeaders = multiValueHeaders;
55+
if (this.multiValueHeaders == null && multiValueHeaders != null && !multiValueHeaders.isEmpty()) {
56+
this.multiValueHeaders = new HttpHeaders<>();
57+
}
58+
if (multiValueHeaders != null && !multiValueHeaders.isEmpty()) {
59+
this.multiValueHeaders.putAll(multiValueHeaders);
60+
}
4961
}
5062

5163
public String getBody() {

aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/ApplicationLoadBalancerRequestEvent.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.amazonaws.services.lambda.runtime.events;
22

3+
import com.amazonaws.services.lambda.runtime.events.models.HttpHeaders;
34
import lombok.Data;
45
import lombok.NoArgsConstructor;
56

@@ -40,8 +41,8 @@ public static class RequestContext implements Serializable, Cloneable {
4041
private String path;
4142
private Map<String, String> queryStringParameters;
4243
private Map<String, List<String>> multiValueQueryStringParameters;
43-
private Map<String, String> headers;
44-
private Map<String, List<String>> multiValueHeaders;
44+
private HttpHeaders<String> headers;
45+
private HttpHeaders<List<String>> multiValueHeaders;
4546
private String body;
4647
private boolean isBase64Encoded;
4748

aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/ApplicationLoadBalancerResponseEvent.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.amazonaws.services.lambda.runtime.events;
22

3+
import com.amazonaws.services.lambda.runtime.events.models.HttpHeaders;
34
import lombok.Data;
45
import lombok.NoArgsConstructor;
56

@@ -22,8 +23,8 @@ public class ApplicationLoadBalancerResponseEvent implements Serializable, Clone
2223
private int statusCode;
2324
private String statusDescription;
2425
private boolean isBase64Encoded;
25-
private Map<String, String> headers;
26-
private Map<String, List<String>> multiValueHeaders;
26+
private HttpHeaders<String> headers;
27+
private HttpHeaders<List<String>> multiValueHeaders;
2728
private String body;
2829

2930
}

0 commit comments

Comments
 (0)