11package com .networknt .aws .lambda .handler .middleware .header ;
22
3- import com .amazonaws .services .lambda .runtime .events .APIGatewayProxyRequestEvent ;
4- import com .amazonaws .services .lambda .runtime .events .APIGatewayProxyResponseEvent ;
5- import com .networknt .aws .lambda .handler .MiddlewareHandler ;
63import com .networknt .aws .lambda .LightLambdaExchange ;
4+ import com .networknt .aws .lambda .handler .MiddlewareHandler ;
75import com .networknt .config .Config ;
86import com .networknt .header .HeaderConfig ;
97import com .networknt .status .Status ;
108import com .networknt .utility .ModuleRegistry ;
119import org .slf4j .Logger ;
1210import org .slf4j .LoggerFactory ;
1311
14- import java .util .List ;
15- import java .util .Map ;
16-
17- public class HeaderMiddleware implements MiddlewareHandler {
12+ import java .util .*;
1813
19- private static final String UNKNOWN_HEADER_OPERATION = "ERR14004" ;
20- private static HeaderConfig CONFIG ;
14+ public abstract class HeaderMiddleware implements MiddlewareHandler {
15+ static HeaderConfig CONFIG ;
2116 private static final Logger LOG = LoggerFactory .getLogger (HeaderMiddleware .class );
2217
2318 public HeaderMiddleware () {
2419 CONFIG = HeaderConfig .load ();
25- LOG .info ("HeaderMiddleware is constructed" );
2620 }
2721
28- /**
29- * Constructor with configuration for testing purpose only
30- * @param cfg HeaderConfig
31- */
3222 public HeaderMiddleware (HeaderConfig cfg ) {
3323 CONFIG = cfg ;
3424 LOG .info ("HeaderMiddleware is constructed" );
3525 }
3626
37- @ Override
38- public Status execute (final LightLambdaExchange exchange ) {
39- if (LOG .isTraceEnabled ()) LOG .trace ("HeaderMiddleware.executeMiddleware starts." );
40- if (!CONFIG .isEnabled ()) {
41- if (LOG .isTraceEnabled ()) LOG .trace ("HeaderMiddleware is not enabled." );
42- return disabledMiddlewareStatus ();
43- }
44- if (LOG .isTraceEnabled ()) LOG .trace ("HeaderMiddleware.executeMiddleware ends." );
45- return this .handleHeaders (exchange );
46- }
47-
48-
49- private Status handleHeaders (LightLambdaExchange exchange ) {
50- // handle request headers
51- if (exchange .isRequestInProgress ()) {
52- APIGatewayProxyRequestEvent requestEvent = exchange .getRequest ();
53- if (requestEvent != null ) {
54- if (LOG .isTraceEnabled ()) LOG .trace ("Request event is not null." );
55- var requestHeaders = requestEvent .getHeaders ();
56- if (requestHeaders != null ) {
57- if (LOG .isTraceEnabled ()) LOG .trace ("Request headers is not null." );
58- // handle all request header
59- List <String > removeList = CONFIG .getRequestRemoveList ();
60- if (removeList != null ) {
61- if (LOG .isTraceEnabled ()) LOG .trace ("Request header removeList found." );
62- removeList .forEach (requestHeaders ::remove );
63- }
64- Map <String , Object > updateMap = CONFIG .getRequestUpdateMap ();
65- if (updateMap != null ) {
66- if (LOG .isTraceEnabled ()) LOG .trace ("Request header updateMap found." );
67- updateMap .forEach ((k , v ) -> requestHeaders .put (k , (String ) v ));
68- }
69-
70- // handle per path prefix header if configured
71- Map <String , Object > pathPrefixHeader = CONFIG .getPathPrefixHeader ();
72- if (pathPrefixHeader != null ) {
73- String path = exchange .getRequest ().getPath ();
74- for (Map .Entry <String , Object > entry : pathPrefixHeader .entrySet ()) {
75- if (path .startsWith (entry .getKey ())) {
76- if (LOG .isTraceEnabled ()) LOG .trace ("Found path " + path + " with prefix " + entry .getKey ());
77- Map <String , Object > valueMap = (Map <String , Object >)entry .getValue ();
78- Map <String , Object > requestHeaderMap = (Map <String , Object >)valueMap .get (HeaderConfig .REQUEST );
79- if (requestHeaderMap != null ) {
80- List <String > requestHeaderRemoveList = (List <String >)requestHeaderMap .get (HeaderConfig .REMOVE );
81- if (requestHeaderRemoveList != null ) {
82- if (LOG .isTraceEnabled ()) LOG .trace ("Request header path prefix removeList found." );
83- requestHeaderRemoveList .forEach (requestHeaders ::remove );
84- }
85- Map <String , Object > requestHeaderUpdateMap = (Map <String , Object >)requestHeaderMap .get (HeaderConfig .UPDATE );
86- if (requestHeaderUpdateMap != null ) {
87- if (LOG .isTraceEnabled ()) LOG .trace ("Request header path prefix updateMap found." );
88- requestHeaderUpdateMap .forEach ((k , v ) -> requestHeaders .put (k , (String ) v ));
89- }
90- }
91- }
92- }
93- }
94- }
95- }
96- }
97- if (exchange .isResponseInProgress ()) {
98- // handle response headers
99- APIGatewayProxyResponseEvent responseEvent = exchange .getResponse ();
100- if (responseEvent != null ) {
101- if (LOG .isTraceEnabled ()) LOG .trace ("Response event is not null." );
102- var responseHeaders = responseEvent .getHeaders ();
103- if (responseHeaders != null ) {
104- if (LOG .isTraceEnabled ()) LOG .trace ("Response headers is not null." );
105- // handler all response header
106- List <String > removeList = CONFIG .getResponseRemoveList ();
107- if (removeList != null ) {
108- if (LOG .isTraceEnabled ()) LOG .trace ("Response header removeList found." );
109- removeList .forEach (responseHeaders ::remove );
110- }
111- Map <String , Object > updateMap = CONFIG .getResponseUpdateMap ();
112- if (updateMap != null ) {
113- if (LOG .isTraceEnabled ()) LOG .trace ("Response header updateMap found." );
114- updateMap .forEach ((k , v ) -> responseHeaders .put (k , (String ) v ));
115- }
116- // handle per path prefix header if configured
117- Map <String , Object > pathPrefixHeader = CONFIG .getPathPrefixHeader ();
118- if (pathPrefixHeader != null ) {
119- String path = exchange .getRequest ().getPath ();
120- for (Map .Entry <String , Object > entry : pathPrefixHeader .entrySet ()) {
121- if (path .startsWith (entry .getKey ())) {
122- if (LOG .isTraceEnabled ()) LOG .trace ("Found path " + path + " with prefix " + entry .getKey ());
123- Map <String , Object > valueMap = (Map <String , Object >)entry .getValue ();
124- Map <String , Object > responseHeaderMap = (Map <String , Object >)valueMap .get (HeaderConfig .RESPONSE );
125- if (responseHeaderMap != null ) {
126- List <String > responseHeaderRemoveList = (List <String >)responseHeaderMap .get (HeaderConfig .REMOVE );
127- if (responseHeaderRemoveList != null ) {
128- if (LOG .isTraceEnabled ()) LOG .trace ("Response header path prefix removeList found." );
129- responseHeaderRemoveList .forEach (responseHeaders ::remove );
130- }
131- Map <String , Object > responseHeaderUpdateMap = (Map <String , Object >)responseHeaderMap .get (HeaderConfig .UPDATE );
132- if (responseHeaderUpdateMap != null ) {
133- if (LOG .isTraceEnabled ()) LOG .trace ("Response header path prefix updateMap found." );
134- responseHeaderUpdateMap .forEach ((k , v ) -> responseHeaders .put (k , (String ) v ));
135- }
136- }
137- }
138- }
139- }
140- }
141- }
142- }
143- return successMiddlewareStatus ();
144- }
145-
146- @ Override
147- public void getCachedConfigurations () {
148- }
149-
15027 @ Override
15128 public boolean isEnabled () {
15229 return CONFIG .isEnabled ();
@@ -167,6 +44,11 @@ public void reload() {
16744
16845 }
16946
47+ @ Override
48+ public boolean isAsynchronous () {
49+ return false ;
50+ }
51+
17052 @ Override
17153 public boolean isContinueOnFailure () {
17254 return false ;
@@ -178,8 +60,33 @@ public boolean isAudited() {
17860 }
17961
18062 @ Override
181- public boolean isAsynchronous () {
182- return false ;
63+ public void getCachedConfigurations () {
64+
18365 }
18466
67+ public void removeHeaders (List <String > removeList , Map <String , String > headers ) {
68+ // convert the list to lower case.
69+ Set <String > lowercaseSet = new HashSet <>();
70+ for (String s : removeList ) {
71+ lowercaseSet .add (s .toLowerCase ());
72+ }
73+ // remove headers with keys in removeList
74+ headers .entrySet ().removeIf (entry -> lowercaseSet .contains (entry .getKey ().toLowerCase ()));
75+ }
76+
77+ public void updateHeaders (Map <String , Object > updateMap , Map <String , String > headers ) {
78+ // convert update map key to lowercase
79+ Map <String , Object > lowercaseUpdateMap = new HashMap <>();
80+ for (Map .Entry <String , Object > entry : updateMap .entrySet ()) {
81+ lowercaseUpdateMap .put (entry .getKey ().toLowerCase (), entry .getValue ());
82+ }
83+ // Iterate over the original map and update values where keys match case-insensitively
84+ for (Map .Entry <String , String > entry : headers .entrySet ()) {
85+ String lowercaseKey = entry .getKey ().toLowerCase ();
86+ if (lowercaseUpdateMap .containsKey (lowercaseKey )) {
87+ headers .put (entry .getKey (), (String )lowercaseUpdateMap .get (lowercaseKey ));
88+ }
89+ }
90+
91+ }
18592}
0 commit comments