4
4
import java .nio .charset .Charset ;
5
5
import java .nio .charset .StandardCharsets ;
6
6
import java .util .Base64 ;
7
+ import java .util .List ;
7
8
import java .util .Map ;
8
9
import java .util .Map .Entry ;
9
10
import java .util .concurrent .CountDownLatch ;
10
11
import java .util .concurrent .TimeUnit ;
11
-
12
12
import com .amazonaws .serverless .proxy .internal .HttpUtils ;
13
+ import com .amazonaws .serverless .proxy .internal .servlet .AwsHttpServletRequest ;
14
+ import com .amazonaws .serverless .proxy .model .RequestSource ;
13
15
import org .apache .commons .logging .Log ;
14
16
import org .apache .commons .logging .LogFactory ;
15
17
import org .springframework .cloud .function .serverless .web .ServerlessHttpServletRequest ;
36
38
import jakarta .servlet .ServletContext ;
37
39
import jakarta .servlet .http .HttpServletRequest ;
38
40
41
+ import static com .amazonaws .serverless .proxy .internal .servlet .AwsHttpServletRequest .decodeValueIfEncoded ;
42
+ import static com .amazonaws .serverless .proxy .internal .servlet .AwsHttpServletRequest .getQueryParamValuesAsList ;
43
+
39
44
class AwsSpringHttpProcessingUtils {
40
45
41
46
private static Log logger = LogFactory .getLog (AwsSpringHttpProcessingUtils .class );
@@ -116,13 +121,8 @@ private static HttpServletRequest generateRequest1(String request, Context lambd
116
121
117
122
ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest (servletContext , v1Request .getHttpMethod (), v1Request .getPath ());
118
123
119
- populateQueryStringParameters (v1Request .getQueryStringParameters (), httpRequest );
120
- if (v1Request .getMultiValueQueryStringParameters () != null ) {
121
- MultiValueMapAdapter <String , String > queryStringParameters = new MultiValueMapAdapter (v1Request .getMultiValueQueryStringParameters ());
122
- queryStringParameters .forEach ((k , v ) -> {
123
- httpRequest .setParameter (k , v .toArray (new String [0 ]));
124
- });
125
- }
124
+ populateQueryStringParametersV1 (v1Request , httpRequest );
125
+ populateMultiValueQueryStringParametersV1 (v1Request , httpRequest );
126
126
127
127
if (v1Request .getMultiValueHeaders () != null ) {
128
128
MultiValueMapAdapter headers = new MultiValueMapAdapter (v1Request .getMultiValueHeaders ());
@@ -156,7 +156,7 @@ private static HttpServletRequest generateRequest2(String request, Context lambd
156
156
157
157
ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest (servletContext ,
158
158
v2Request .getRequestContext ().getHttp ().getMethod (), v2Request .getRequestContext ().getHttp ().getPath ());
159
- populateQueryStringParameters (v2Request .getQueryStringParameters (), httpRequest );
159
+ populateQueryStringParametersV2 (v2Request .getQueryStringParameters (), httpRequest );
160
160
161
161
v2Request .getHeaders ().forEach (httpRequest ::setHeader );
162
162
@@ -176,14 +176,43 @@ private static HttpServletRequest generateRequest2(String request, Context lambd
176
176
return httpRequest ;
177
177
}
178
178
179
- private static void populateQueryStringParameters (Map <String , String > requestParameters , ServerlessHttpServletRequest httpRequest ) {
179
+ private static void populateQueryStringParametersV2 (Map <String , String > requestParameters , ServerlessHttpServletRequest httpRequest ) {
180
180
if (!CollectionUtils .isEmpty (requestParameters )) {
181
181
for (Entry <String , String > entry : requestParameters .entrySet ()) {
182
182
// fix according to parseRawQueryString
183
183
httpRequest .setParameter (entry .getKey (), entry .getValue ());
184
184
}
185
185
}
186
186
}
187
+
188
+ private static void populateQueryStringParametersV1 (AwsProxyRequest v1Request , ServerlessHttpServletRequest httpRequest ) {
189
+ Map <String , String > requestParameters = v1Request .getQueryStringParameters ();
190
+ if (!CollectionUtils .isEmpty (requestParameters )) {
191
+ // decode all keys and values in map
192
+ for (Entry <String , String > entry : requestParameters .entrySet ()) {
193
+ String k = v1Request .getRequestSource () == RequestSource .ALB ? decodeValueIfEncoded (entry .getKey ()) : entry .getKey ();
194
+ String v = v1Request .getRequestSource () == RequestSource .ALB ? decodeValueIfEncoded (entry .getValue ()) : entry .getValue ();
195
+ httpRequest .setParameter (k , v );
196
+ }
197
+ }
198
+ }
199
+
200
+ private static void populateMultiValueQueryStringParametersV1 (AwsProxyRequest v1Request , ServerlessHttpServletRequest httpRequest ) {
201
+ if (v1Request .getMultiValueQueryStringParameters () != null ) {
202
+ MultiValueMapAdapter <String , String > queryStringParameters = new MultiValueMapAdapter <>(v1Request .getMultiValueQueryStringParameters ());
203
+ queryStringParameters .forEach ((k , v ) -> {
204
+ String key = v1Request .getRequestSource () == RequestSource .ALB
205
+ ? decodeValueIfEncoded (k )
206
+ : k ;
207
+ List <String > value = v1Request .getRequestSource () == RequestSource .ALB
208
+ ? getQueryParamValuesAsList (v1Request .getMultiValueQueryStringParameters (), k , false ).stream ()
209
+ .map (AwsHttpServletRequest ::decodeValueIfEncoded )
210
+ .toList ()
211
+ : v ;
212
+ httpRequest .setParameter (key , value .toArray (new String [0 ]));
213
+ });
214
+ }
215
+ }
187
216
188
217
private static <T > T readValue (String json , Class <T > clazz , ObjectMapper mapper ) {
189
218
try {
0 commit comments