From 3e3965a40efd028417c19846acc59a9785d77cb8 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Wed, 18 Oct 2023 16:24:06 -0700 Subject: [PATCH] remove helper class --- .../servlet/AwsAlbHttpServletRequest.java | 293 +++++++----- .../servlet/AwsHttpServletRequest.java | 6 +- .../servlet/AwsHttpServletRequestHelper.java | 449 ------------------ .../servlet/AwsProxyHttpServletRequest.java | 230 ++++++--- .../proxy/AwsProxyExceptionHandlerTest.java | 14 +- .../testutils/AwsProxyRequestBuilder.java | 11 +- .../proxy/jersey/JerseyAwsProxyTest.java | 18 +- .../proxy/jersey/JerseyParamEncodingTest.java | 8 +- .../proxy/spring/SpringAwsProxyTest.java | 10 +- .../spring/SpringServletContextTest.java | 12 +- .../proxy/spring/StaticAppProxyTest.java | 4 +- .../servletapp/LambdaStreamHandler.java | 2 - .../test/java/StreamLambdaHandlerTest.java | 4 +- .../test/java/StreamLambdaHandlerTest.java | 4 +- .../test/java/StreamLambdaHandlerTest.java | 4 +- 15 files changed, 367 insertions(+), 702 deletions(-) delete mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestHelper.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAlbHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAlbHttpServletRequest.java index 8319f58cb..6ec99a2cd 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAlbHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAlbHttpServletRequest.java @@ -8,10 +8,7 @@ import com.amazonaws.services.lambda.runtime.events.ApplicationLoadBalancerRequestEvent; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import jakarta.servlet.*; -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpUpgradeHandler; -import jakarta.servlet.http.Part; +import jakarta.servlet.http.*; import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.SecurityContext; import org.slf4j.Logger; @@ -19,9 +16,15 @@ import java.io.BufferedReader; import java.io.IOException; +import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.security.Principal; +import java.time.Instant; +import java.time.ZonedDateTime; +import java.time.format.DateTimeParseException; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class AwsAlbHttpServletRequest extends AwsHttpServletRequest { @@ -54,142 +57,165 @@ public String getAuthType() { return securityContext.getAuthenticationScheme(); } - @Override public Cookie[] getCookies() { - return AwsHttpServletRequestHelper.getCookies(request.getMultiValueHeaders()); + if (request.getMultiValueHeaders() == null) { + return new Cookie[0]; + } + String cookieHeader = getFirst(request.getMultiValueHeaders(), HttpHeaders.COOKIE); + if (cookieHeader == null) { + return new Cookie[0]; + } + return this.parseCookieHeaderValue(cookieHeader); } - @Override public long getDateHeader(String s) { - return AwsHttpServletRequestHelper.getDateHeader(request.getMultiValueHeaders(), s, log); + if (request.getMultiValueHeaders() == null) { + return -1L; + } + String dateString = getFirst(request.getMultiValueHeaders(), s); + if (dateString == null) { + return -1L; + } + try { + return Instant.from(ZonedDateTime.parse(dateString, dateFormatter)).toEpochMilli(); + } catch (DateTimeParseException e) { + log.warn("Invalid date header in request" + SecurityUtils.crlf(dateString)); + return -1L; + } } - @Override public String getHeader(String s) { - return AwsHttpServletRequestHelper.getHeader( - request.getMultiValueHeaders(), - null, - null, - s, - getHeaderValues(s) - ); + List values = getHeaderValues(s); + if (values == null || values.size() == 0) { + return null; + } + return values.get(0); } - @Override public Enumeration getHeaders(String s) { - return AwsHttpServletRequestHelper.getHeaders(request.getMultiValueHeaders(), s); + if (request.getMultiValueHeaders() == null || request.getMultiValueHeaders().get(s) == null) { + return Collections.emptyEnumeration(); + } + return Collections.enumeration(request.getMultiValueHeaders().get(s)); } @Override public Enumeration getHeaderNames() { - return AwsHttpServletRequestHelper.getHeaderNames(request.getMultiValueHeaders()); + if (request.getMultiValueHeaders() == null) { + return Collections.emptyEnumeration(); + } + return Collections.enumeration(request.getMultiValueHeaders().keySet()); } - @Override public int getIntHeader(String s) { - return AwsHttpServletRequestHelper.getIntHeader(request.getMultiValueHeaders(), s); - } + if (request.getMultiValueHeaders() == null) { + return -1; + } + String headerValue = getFirst(request.getMultiValueHeaders(), s); + if (headerValue == null) { + return -1; + } + return Integer.parseInt(headerValue); + } @Override public String getMethod() { return request.getHttpMethod(); } - @Override public String getPathInfo() { - return AwsHttpServletRequestHelper.getPathInfo(request.getPath()); + String pathInfo = cleanUri(request.getPath()); + return decodeRequestPath(pathInfo, LambdaContainerHandler.getContainerConfig()); } - @Override public String getPathTranslated() { - return AwsHttpServletRequestHelper.getPathTranslated(); + // Return null because it is an archive on a remote system + return null; } - @Override public String getContextPath() { - return AwsHttpServletRequestHelper.getContextPath(config, null, this); + return generateContextPath(config, null); } - @Override public String getQueryString() { - return AwsHttpServletRequestHelper.getQueryString(request.getMultiValueQueryStringParameters(), config, log, this); + try { + return this.generateQueryString( + request.getMultiValueQueryStringParameters(), + // ALB does not automatically decode parameters, so we don't want to re-encode them + true, + config.getUriEncoding()); + } catch (ServletException e) { + log.error("Could not generate query string", e); + return null; + } } - @Override public String getRemoteUser() { - return AwsHttpServletRequestHelper.getRemoteUser(securityContext); + return securityContext.getUserPrincipal().getName(); } - @Override public boolean isUserInRole(String s) { // TODO: Not supported? return false; } - @Override public Principal getUserPrincipal() { - return AwsHttpServletRequestHelper.getUserPrincipal(securityContext); + return securityContext.getUserPrincipal(); } - @Override - public String getRequestURI() { return AwsHttpServletRequestHelper.getRequestURI(request.getPath(), this);} - + public String getRequestURI() { + return cleanUri(getContextPath()) + cleanUri(request.getPath()); + } @Override public StringBuffer getRequestURL() { - return AwsHttpServletRequestHelper.getRequestURL(request.getPath(), this); + return generateRequestURL(request.getPath()); } - @Override public boolean authenticate(HttpServletResponse httpServletResponse) throws IOException, ServletException { throw new UnsupportedOperationException(); } - @Override public void login(String s, String s1) throws ServletException { throw new UnsupportedOperationException(); } - @Override public void logout() throws ServletException { throw new UnsupportedOperationException(); } - @Override public Collection getParts() throws IOException, ServletException { - return AwsHttpServletRequestHelper.getParts(this); + return getMultipartFormParametersMap().values(); } - @Override public Part getPart(String s) throws IOException, ServletException { - return AwsHttpServletRequestHelper.getPart(s, this); + return getMultipartFormParametersMap().get(s); } - @Override public T upgrade(Class aClass) throws IOException, ServletException { @@ -203,14 +229,12 @@ public T upgrade(Class aClass) @Override public String getCharacterEncoding() { - return AwsHttpServletRequestHelper.getCharacterEncoding( - request.getMultiValueHeaders(), - config, - this - ); + if (request.getMultiValueHeaders() == null) { + return config.getDefaultContentCharset(); + } + return parseCharacterEncoding(getFirst(request.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); } - @Override public void setCharacterEncoding(String s) throws UnsupportedEncodingException { @@ -227,105 +251,133 @@ public void setCharacterEncoding(String s) @Override public int getContentLength() { - return AwsHttpServletRequestHelper.getContentLength(request.getMultiValueHeaders()); + String headerValue = getFirst(request.getMultiValueHeaders(), HttpHeaders.CONTENT_LENGTH); + if (headerValue == null) { + return -1; + } + return Integer.parseInt(headerValue); } - @Override public long getContentLengthLong() { - return AwsHttpServletRequestHelper.getContentLengthLong(request.getMultiValueHeaders()); + String headerValue = getFirst(request.getMultiValueHeaders(), HttpHeaders.CONTENT_LENGTH); + if (headerValue == null) { + return -1; + } + return Long.parseLong(headerValue); } - @Override public String getContentType() { - return AwsHttpServletRequestHelper.getContentType(request.getMultiValueHeaders()); + String contentTypeHeader = getFirst(request.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE); + if (contentTypeHeader == null || "".equals(contentTypeHeader.trim())) { + return null; + } + + return contentTypeHeader; } @Override public String getParameter(String s) { - return AwsHttpServletRequestHelper.getParameter( - request.getMultiValueQueryStringParameters(), - s, - config, - this - ); - } + String queryStringParameter = getFirstQueryParamValue(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive()); + if (queryStringParameter != null) { + return queryStringParameter; + } + String[] bodyParams = getFormBodyParameterCaseInsensitive(s); + if (bodyParams.length == 0) { + return null; + } else { + return bodyParams[0]; + } + } @Override public Enumeration getParameterNames() { - return AwsHttpServletRequestHelper.getParameterNames( - request.getMultiValueQueryStringParameters(), - this - ); + Set formParameterNames = getFormUrlEncodedParametersMap().keySet(); + if (request.getMultiValueQueryStringParameters() == null) { + return Collections.enumeration(formParameterNames); + } + return Collections.enumeration(Stream.concat(formParameterNames.stream(), + request.getMultiValueQueryStringParameters().keySet().stream()).collect(Collectors.toSet())); } - @Override @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") // suppressing this as according to the specs we should be returning null here if we can't find params public String[] getParameterValues(String s) { - return AwsHttpServletRequestHelper.getParameterValues( - request.getMultiValueQueryStringParameters(), - s, - config, - this - ); - } + List values = new ArrayList<>(Arrays.asList(getQueryParamValues(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive()))); + + values.addAll(Arrays.asList(getFormBodyParameterCaseInsensitive(s))); + if (values.size() == 0) { + return null; + } else { + return values.toArray(new String[0]); + } + } @Override public Map getParameterMap() { - return AwsHttpServletRequestHelper.getParameterMap( - request.getMultiValueQueryStringParameters(), - config, - this - ); + return generateParameterMap(request.getMultiValueQueryStringParameters(), config); } - @Override public String getProtocol() { return ""; } - @Override public String getScheme() { - return AwsHttpServletRequestHelper.getScheme( - request.getMultiValueHeaders(), - this - ); + return getSchemeFromHeader(request.getMultiValueHeaders()); } @Override public String getServerName() { - return AwsHttpServletRequestHelper.getServerName( - request.getMultiValueHeaders(), - null - ); + String region = System.getenv("AWS_REGION"); + if (region == null) { + // this is not a critical failure, we just put a static region in the URI + region = "us-east-1"; + } + + if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().containsKey(HOST_HEADER_NAME)) { + String hostHeader = getFirst(request.getMultiValueHeaders(), HOST_HEADER_NAME); + if (SecurityUtils.isValidHost(hostHeader, "null", region)) { // ALB doesn't have apiId. + return hostHeader; + } + } + + return new StringBuilder().append("null") + .append(".execute-api.") + .append(region) + .append(".amazonaws.com").toString(); } @Override public int getServerPort() { - return AwsHttpServletRequestHelper.getServerPort(request.getMultiValueHeaders()); + if (request.getMultiValueHeaders() == null) { + return 443; + } + String port = getFirst(request.getMultiValueHeaders(), PORT_HEADER_NAME); + if (SecurityUtils.isValidPort(port)) { + return Integer.parseInt(port); + } else { + return 443; // default port + } } @Override public ServletInputStream getInputStream() throws IOException { - return AwsHttpServletRequestHelper.getInputStream( - requestInputStream, - request.getBody(), - request.getIsBase64Encoded(), - this - ); + if (requestInputStream == null) { + requestInputStream = new AwsServletInputStream(bodyStringToInputStream(request.getBody(), request.getIsBase64Encoded())); + } + return requestInputStream; } @Override public BufferedReader getReader() throws IOException { - return AwsHttpServletRequestHelper.getReader(request.getBody()); + return new BufferedReader(new StringReader(request.getBody())); } @@ -337,36 +389,30 @@ public String getRemoteAddr() { @Override public String getRemoteHost() { - return AwsHttpServletRequestHelper.getRemoteHost(request.getMultiValueHeaders()); + return getFirst(request.getMultiValueHeaders(), HttpHeaders.HOST); } - @Override public Locale getLocale() { - return AwsHttpServletRequestHelper.getLocale( - request.getMultiValueHeaders(), - this - ); + List locales = parseAcceptLanguageHeader(getFirst(request.getMultiValueHeaders(), HttpHeaders.ACCEPT_LANGUAGE)); + return locales.size() == 0 ? Locale.getDefault() : locales.get(0); } @Override public Enumeration getLocales() { - return AwsHttpServletRequestHelper.getLocales( - request.getMultiValueHeaders(), - this - ); + List locales = parseAcceptLanguageHeader(getFirst(request.getMultiValueHeaders(), HttpHeaders.ACCEPT_LANGUAGE)); + return Collections.enumeration(locales); } @Override public boolean isSecure() { - return AwsHttpServletRequestHelper.isSecure(securityContext); + return securityContext.isSecure(); } - @Override public RequestDispatcher getRequestDispatcher(String s) { - return AwsHttpServletRequestHelper.getRequestDispatcher(s, this); + return getServletContext().getRequestDispatcher(s); } @@ -406,22 +452,19 @@ public AsyncContext startAsync() @Override public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { - return AwsHttpServletRequestHelper.startAsync( - asyncContext, - request.getRequestContext().getElb().getTargetGroupArn(), - log, - servletRequest, - servletResponse, - containerHandler - ); + servletRequest.setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); + asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, containerHandler); + log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getElb().getTargetGroupArn())); + return asyncContext; } @Override public AsyncContext getAsyncContext() { - return AwsHttpServletRequestHelper.getAsyncContext( - asyncContext, - request.getRequestContext().getElb().getTargetGroupArn() - ); + if (asyncContext == null) { + throw new IllegalStateException("Request " + SecurityUtils.crlf(request.getRequestContext().getElb().getTargetGroupArn()) + + " is not in asynchronous mode. Call startAsync before attempting to get the async context."); + } + return asyncContext; } @Override diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index fc7646145..16762a3a7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -465,7 +465,7 @@ protected String[] getFormBodyParameterCaseInsensitive(String key) { } } - protected String getFirst(Map> map, String key) { + public static String getFirst(Map> map, String key) { List values = map.get(key); if (values == null || values.size() == 0) { return null; @@ -473,13 +473,13 @@ protected String getFirst(Map> map, String key) { return values.get(0); } - protected void putSingle(Map> map, String key, String value) { + public static void putSingle(Map> map, String key, String value) { List values = findKey(map, key); values.clear(); values.add(value); } - protected List findKey(Map> map, String key) { + public static List findKey(Map> map, String key) { List values = map.get(key); if (values == null) { values = new ArrayList<>(); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestHelper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestHelper.java deleted file mode 100644 index e5fdb123e..000000000 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestHelper.java +++ /dev/null @@ -1,449 +0,0 @@ -package com.amazonaws.serverless.proxy.internal.servlet; - -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.SecurityUtils; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest; -import com.amazonaws.serverless.proxy.model.ContainerConfig; -import com.amazonaws.serverless.proxy.model.Headers; -import jakarta.servlet.*; -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.Part; -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.SecurityContext; -import org.slf4j.Logger; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; -import java.io.UnsupportedEncodingException; -import java.security.Principal; -import java.time.Instant; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.cleanUri; -import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.decodeRequestPath; - -public class AwsHttpServletRequestHelper { - static final DateTimeFormatter dateFormatter = DateTimeFormatter.RFC_1123_DATE_TIME; - private static final String HEADER_KEY_VALUE_SEPARATOR = "="; - - public static Cookie[] getCookies(Map> headers) { - if (headers == null) { - return new Cookie[0]; - } - String cookieHeader = getFirst(headers, HttpHeaders.COOKIE); - if (cookieHeader == null) { - return new Cookie[0]; - } - return parseCookieHeaderValue(cookieHeader); - } - - public static long getDateHeader(Map> headers, String s, Logger log) { - if (headers == null) { - return -1L; - } - String dateString = getFirst(headers, s); - if (dateString == null) { - return -1L; - } - try { - return Instant.from(ZonedDateTime.parse(dateString, dateFormatter)).toEpochMilli(); - } catch (DateTimeParseException e) { - log.warn("Invalid date header in request" + SecurityUtils.crlf(dateString)); - return -1L; - - } - } - - public static String getHeader(Map> headers, String caller, String userAgent, String s, List headerValues) { - List values = headerValues; - if (values == null || values.size() == 0) { - return null; - } - return values.get(0); - } - - public static Enumeration getHeaders(Map> headers, String s) { - if (headers == null || headers.get(s) == null) { - return Collections.emptyEnumeration(); - } - return Collections.enumeration(headers.get(s)); - } - - public static Enumeration getHeaderNames(Map> headers) { - if (headers == null) { - return Collections.emptyEnumeration(); - } - return Collections.enumeration(headers.keySet()); - } - - public static int getIntHeader(Map> headers, String s) { - if (headers == null) { - return -1; - } - String headerValue = getFirst(headers, s); - if (headerValue == null) { - return -1; - } - - return Integer.parseInt(headerValue); - } - - public static String getPathInfo(String path) { - String pathInfo = cleanUri(path); - return decodeRequestPath(pathInfo, LambdaContainerHandler.getContainerConfig()); - } - - public static String getPathTranslated() { - // Return null because it is an archive on a remote system - return null; - } - - public static String getContextPath(ContainerConfig config, String stage, AwsHttpServletRequest servletRequest) { - return servletRequest.generateContextPath(config, stage); - } - - public static String getQueryString(Map> queryStrings, ContainerConfig config, Logger log, AwsHttpServletRequest servletRequest) { - try { - return servletRequest.generateQueryString( - queryStrings, - // ALB does not automatically decode parameters, so we don't want to re-encode them - true, - config.getUriEncoding()); - } catch (ServletException e) { - log.error("Could not generate query string", e); - return null; - } - } - - public static String getRemoteUser(SecurityContext securityContext) { - return securityContext.getUserPrincipal().getName(); - } - - public static Principal getUserPrincipal(SecurityContext securityContext) { - return securityContext.getUserPrincipal(); - } - - public static String getRequestURI(String path, AwsHttpServletRequest servletRequest) { - return cleanUri(servletRequest.getContextPath()) + cleanUri(path); - } - - public static StringBuffer getRequestURL(String path, AwsHttpServletRequest servletRequest) { - return servletRequest.generateRequestURL(path); - } - - public static Collection getParts(AwsHttpServletRequest servletRequest) - throws IOException, ServletException { - return servletRequest.getMultipartFormParametersMap().values(); - } - - public static Part getPart(String s, AwsHttpServletRequest servletRequest) - throws IOException, ServletException { - return servletRequest.getMultipartFormParametersMap().get(s); - } - - public static String getCharacterEncoding(Map> headers, ContainerConfig config, AwsHttpServletRequest servletRequest) { - if (headers == null) { - return config.getDefaultContentCharset(); - } - return servletRequest.parseCharacterEncoding(getFirst(headers, HttpHeaders.CONTENT_TYPE)); - } - - public static int getContentLength(Map> headers) { - String headerValue = getFirst(headers, HttpHeaders.CONTENT_LENGTH); - if (headerValue == null) { - return -1; - } - return Integer.parseInt(headerValue); - } - - public static long getContentLengthLong(Map> headers) { - String headerValue = getFirst(headers, HttpHeaders.CONTENT_LENGTH); - if (headerValue == null) { - return -1; - } - return Long.parseLong(headerValue); - } - - public static String getContentType(Map> headers) { - String contentTypeHeader = getFirst(headers, HttpHeaders.CONTENT_TYPE); - if (contentTypeHeader == null || "".equals(contentTypeHeader.trim())) { - return null; - } - - return contentTypeHeader; - } - - public static String getParameter(Map> queryStrings, String s, ContainerConfig config, AwsHttpServletRequest servletRequest) { - String queryStringParameter = servletRequest.getFirstQueryParamValue(queryStrings, s, config.isQueryStringCaseSensitive()); - if (queryStringParameter != null) { - return queryStringParameter; - } - - String[] bodyParams = servletRequest.getFormBodyParameterCaseInsensitive(s); - if (bodyParams.length == 0) { - return null; - } else { - return bodyParams[0]; - } - } - - public static Enumeration getParameterNames(Map> queryStrings, AwsHttpServletRequest servletRequest) { - Set formParameterNames = servletRequest.getFormUrlEncodedParametersMap().keySet(); - if (queryStrings == null) { - return Collections.enumeration(formParameterNames); - } - return Collections.enumeration(Stream.concat(formParameterNames.stream(), - queryStrings.keySet().stream()).collect(Collectors.toSet())); - } - - public static String[] getParameterValues(Map> queryStrings, String s, ContainerConfig config, AwsHttpServletRequest servletRequest) { - List values = new ArrayList<>(Arrays.asList(servletRequest.getQueryParamValues(queryStrings, s, config.isQueryStringCaseSensitive()))); - - values.addAll(Arrays.asList(servletRequest.getFormBodyParameterCaseInsensitive(s))); - - if (values.size() == 0) { - return null; - } else { - return values.toArray(new String[0]); - } - } - - public static Map getParameterMap(Map> queryStrings, ContainerConfig config, AwsHttpServletRequest servletRequest) { - return servletRequest.generateParameterMap(queryStrings, config); - } - - public static String getScheme(Map> headers, AwsHttpServletRequest servletRequest) { - return servletRequest.getSchemeFromHeader(headers); - } - - public static String getServerName(Map> headers, String apiId) { - String region = System.getenv("AWS_REGION"); - if (region == null) { - // this is not a critical failure, we just put a static region in the URI - region = "us-east-1"; - } - - if (headers != null && headers.containsKey(AwsHttpServletRequest.HOST_HEADER_NAME)) { - String hostHeader = getFirst(headers, AwsHttpServletRequest.HOST_HEADER_NAME); - if (SecurityUtils.isValidHost(hostHeader, apiId, region)) { - return hostHeader; - } - } - - return new StringBuilder().append(apiId) - .append(".execute-api.") - .append(region) - .append(".amazonaws.com").toString(); - } - - public static int getServerPort(Map> headers) { - if (headers == null) { - return 443; - } - String port = getFirst(headers, AwsHttpServletRequest.PORT_HEADER_NAME); - if (SecurityUtils.isValidPort(port)) { - return Integer.parseInt(port); - } else { - return 443; // default port - } - } - - public static ServletInputStream getInputStream(ServletInputStream requestInputStream, String body, boolean isBase64Encoded, AwsHttpServletRequest servletRequest) throws IOException { - if (requestInputStream == null) { - requestInputStream = new AwsServletInputStream(servletRequest.bodyStringToInputStream(body, isBase64Encoded)); - } - return requestInputStream; - } - - public static BufferedReader getReader(String body) - throws IOException { - return new BufferedReader(new StringReader(body)); - } - - public static String getRemoteHost(Map> headers) { - return getFirst(headers, HttpHeaders.HOST); - } - - public static Locale getLocale(Map> headers, AwsHttpServletRequest servletRequest) { - List locales = servletRequest.parseAcceptLanguageHeader(getFirst(headers, HttpHeaders.ACCEPT_LANGUAGE)); - return locales.size() == 0 ? Locale.getDefault() : locales.get(0); - } - - public static Enumeration getLocales(Map> headers, AwsHttpServletRequest servletRequest) { - List locales = servletRequest.parseAcceptLanguageHeader(getFirst(headers, HttpHeaders.ACCEPT_LANGUAGE)); - return Collections.enumeration(locales); - } - - public static boolean isSecure(SecurityContext securityContext) { - return securityContext.isSecure(); - } - - public static RequestDispatcher getRequestDispatcher(String s, AwsHttpServletRequest servletRequest) { - return servletRequest.getServletContext().getRequestDispatcher(s); - } - - public static boolean isAsyncStarted(AwsAsyncContext asyncContext) { - if (asyncContext == null) { - return false; - } - if (asyncContext.isCompleted() || asyncContext.isDispatched()) { - return false; - } - return true; - } - - public static AsyncContext startAsync(AwsAsyncContext asyncContext, String requestId, Logger log, AwsHttpServletResponse response, AwsLambdaServletContainerHandler containerHandler, AwsHttpServletRequest servletRequest) - throws IllegalStateException { - asyncContext = new AwsAsyncContext(servletRequest, response, containerHandler); - servletRequest.setAttribute(AwsHttpServletRequest.DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); - log.debug("Starting async context for request: " + SecurityUtils.crlf(requestId)); - return asyncContext; - } - - - public static AsyncContext startAsync(AwsAsyncContext asyncContext, String requestId, Logger log, ServletRequest servletRequest, ServletResponse servletResponse, AwsLambdaServletContainerHandler containerHandler) - throws IllegalStateException { - servletRequest.setAttribute(AwsHttpServletRequest.DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); - asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, containerHandler); - log.debug("Starting async context for request: " + SecurityUtils.crlf(requestId)); - return asyncContext; - } - - public static AsyncContext getAsyncContext(AwsAsyncContext asyncContext, String requestId) { - if (asyncContext == null) { - throw new IllegalStateException("Request " + SecurityUtils.crlf(requestId) - + " is not in asynchronous mode. Call startAsync before attempting to get the async context."); - } - return asyncContext; - } - - - - - public static String getFirst(Map> map, String key) { - List values = map.get(key); - if (values == null || values.size() == 0) { - return null; - } - return values.get(0); - } - - public static void putSingle(Map> map, String key, String value) { - List values = findKey(map, key); - values.clear(); - values.add(value); - } - - public static List findKey(Map> map, String key) { - List values = map.get(key); - if (values == null) { - values = new ArrayList<>(); - map.put(key, values); - } - return values; - } - - /** - * Given the Cookie header value, parses it and creates a Cookie object - * @param headerValue The string value of the HTTP Cookie header - * @return An array of Cookie objects from the header - */ - protected static Cookie[] parseCookieHeaderValue(String headerValue) { - List parsedHeaders = parseHeaderValue(headerValue, ";", ","); - - return parsedHeaders.stream() - .filter(e -> e.getKey() != null) - .map(e -> new Cookie(SecurityUtils.crlf(e.getKey()), SecurityUtils.crlf(e.getValue()))) - .toArray(Cookie[]::new); - } - - /** - * Generic method to parse an HTTP header value and split it into a list of key/values for all its components. - * When the property in the header does not specify a key the key field in the output pair is null and only the value - * is populated. For example, The header Accept: application/json; application/xml will contain two - * key value pairs with key null and the value set to application/json and application/xml respectively. - * - * @param headerValue The string value for the HTTP header - * @param valueSeparator The separator to be used for parsing header values - * @return A list of SimpleMapEntry objects with all of the possible values for the header. - */ - protected static List parseHeaderValue(String headerValue, String valueSeparator, String qualifierSeparator) { - // Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8 - // Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 - // Cookie: name=value; name2=value2; name3=value3 - // X-Custom-Header: YQ== - - List values = new ArrayList<>(); - if (headerValue == null) { - return values; - } - - for (String v : headerValue.split(valueSeparator)) { - String curValue = v; - float curPreference = 1.0f; - AwsHttpServletRequest.HeaderValue newValue = new AwsHttpServletRequest.HeaderValue(); - newValue.setRawValue(v); - - for (String q : curValue.split(qualifierSeparator)) { - - String[] kv = q.split(HEADER_KEY_VALUE_SEPARATOR, 2); - String key = null; - String val = null; - // no separator, set the value only - if (kv.length == 1) { - val = q.trim(); - } - // we have a separator - if (kv.length == 2) { - // if the length of the value is 0 we assume that we are looking at a - // base64 encoded value with padding so we just set the value. This is because - // we assume that empty values in a key/value pair will contain at least a white space - if (kv[1].length() == 0) { - val = q.trim(); - } - // this was a base64 string with an additional = for padding, set the value only - if ("=".equals(kv[1].trim())) { - val = q.trim(); - } else { // it's a proper key/value set both - key = kv[0].trim(); - val = ("".equals(kv[1].trim()) ? null : kv[1].trim()); - } - } - - if (newValue.getValue() == null) { - newValue.setKey(key); - newValue.setValue(val); - } else { - // special case for quality q= - if ("q".equals(key)) { - curPreference = Float.parseFloat(val); - } else { - newValue.addAttribute(key, val); - } - } - } - newValue.setPriority(curPreference); - values.add(newValue); - } - - // sort list by preference - values.sort((AwsHttpServletRequest.HeaderValue first, AwsHttpServletRequest.HeaderValue second) -> { - if ((first.getPriority() - second.getPriority()) < .001f) { - return 0; - } - if (first.getPriority() < second.getPriority()) { - return 1; - } - return -1; - }); - return values; - } -} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 7a59f9831..8a3db1741 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -33,6 +33,7 @@ import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.security.Principal; + import java.time.Instant; import java.time.ZonedDateTime; import java.time.format.DateTimeParseException; @@ -40,6 +41,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; + /** * Implementation of the HttpServletRequest interface that supports APIGatewayProxyRequestEvent object. * This object is initialized with an APIGatewayProxyRequestEvent event and a SecurityContext generated @@ -91,43 +93,73 @@ public String getAuthType() { @Override public Cookie[] getCookies() { - return AwsHttpServletRequestHelper.getCookies(request.getMultiValueHeaders()); + if (request.getMultiValueHeaders() == null) { + return new Cookie[0]; + } + String cookieHeader = getFirst(request.getMultiValueHeaders(), HttpHeaders.COOKIE); + if (cookieHeader == null) { + return new Cookie[0]; + } + return this.parseCookieHeaderValue(cookieHeader); } @Override public long getDateHeader(String s) { - return AwsHttpServletRequestHelper.getDateHeader(request.getMultiValueHeaders(), s, log); + if (request.getMultiValueHeaders() == null) { + return -1L; + } + String dateString = getFirst(request.getMultiValueHeaders(), s); + if (dateString == null) { + return -1L; + } + try { + return Instant.from(ZonedDateTime.parse(dateString, dateFormatter)).toEpochMilli(); + } catch (DateTimeParseException e) { + log.warn("Invalid date header in request" + SecurityUtils.crlf(dateString)); + return -1L; + } } - @Override public String getHeader(String s) { - return AwsHttpServletRequestHelper.getHeader( - request.getMultiValueHeaders(), - request.getRequestContext().getIdentity().getCaller(), - request.getRequestContext().getIdentity().getUserAgent(), - s, - getHeaderValues(s) - ); + List values = getHeaderValues(s); + if (values == null || values.size() == 0) { + return null; + } + return values.get(0); } @Override public Enumeration getHeaders(String s) { - return AwsHttpServletRequestHelper.getHeaders(request.getMultiValueHeaders(), s); + if (request.getMultiValueHeaders() == null || request.getMultiValueHeaders().get(s) == null) { + return Collections.emptyEnumeration(); + } + return Collections.enumeration(request.getMultiValueHeaders().get(s)); } @Override public Enumeration getHeaderNames() { - return AwsHttpServletRequestHelper.getHeaderNames(request.getMultiValueHeaders()); + if (request.getMultiValueHeaders() == null) { + return Collections.emptyEnumeration(); + } + return Collections.enumeration(request.getMultiValueHeaders().keySet()); } @Override public int getIntHeader(String s) { - return AwsHttpServletRequestHelper.getIntHeader(request.getMultiValueHeaders(), s); + if (request.getMultiValueHeaders() == null) { + return -1; + } + String headerValue = getFirst(request.getMultiValueHeaders(), s); + if (headerValue == null) { + return -1; + } + + return Integer.parseInt(headerValue); } @@ -139,31 +171,42 @@ public String getMethod() { @Override public String getPathInfo() { - return AwsHttpServletRequestHelper.getPathInfo(request.getPath()); + String pathInfo = cleanUri(request.getPath()); + return decodeRequestPath(pathInfo, LambdaContainerHandler.getContainerConfig()); } @Override public String getPathTranslated() { - return AwsHttpServletRequestHelper.getPathTranslated(); + // Return null because it is an archive on a remote system + return null; } @Override public String getContextPath() { - return AwsHttpServletRequestHelper.getContextPath(config, request.getRequestContext().getStage(), this); + return generateContextPath(config, request.getRequestContext().getStage()); } @Override public String getQueryString() { - return AwsHttpServletRequestHelper.getQueryString(request.getMultiValueQueryStringParameters(), config, log, this); + try { + return this.generateQueryString( + request.getMultiValueQueryStringParameters(), + // ALB does not automatically decode parameters, so we don't want to re-encode them + true, + config.getUriEncoding()); + } catch (ServletException e) { + log.error("Could not generate query string", e); + return null; + } } @Override public String getRemoteUser() { - return AwsHttpServletRequestHelper.getRemoteUser(securityContext); + return securityContext.getUserPrincipal().getName(); } @@ -176,19 +219,19 @@ public boolean isUserInRole(String s) { @Override public Principal getUserPrincipal() { - return AwsHttpServletRequestHelper.getUserPrincipal(securityContext); + return securityContext.getUserPrincipal(); } @Override public String getRequestURI() { - return AwsHttpServletRequestHelper.getRequestURI(request.getPath(), this); + return cleanUri(getContextPath()) + cleanUri(request.getPath()); } @Override public StringBuffer getRequestURL() { - return AwsHttpServletRequestHelper.getRequestURL(request.getPath(), this); + return generateRequestURL(request.getPath()); } @@ -216,7 +259,7 @@ public void logout() @Override public Collection getParts() throws IOException, ServletException { - return AwsHttpServletRequestHelper.getParts(this); + return getMultipartFormParametersMap().values(); } @@ -240,11 +283,10 @@ public T upgrade(Class aClass) @Override public String getCharacterEncoding() { - return AwsHttpServletRequestHelper.getCharacterEncoding( - request.getMultiValueHeaders(), - config, - this - ); + if (request.getMultiValueHeaders() == null) { + return config.getDefaultContentCharset(); + } + return parseCharacterEncoding(getFirst(request.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); } @@ -266,60 +308,78 @@ public void setCharacterEncoding(String s) @Override public int getContentLength() { - return AwsHttpServletRequestHelper.getContentLength(request.getMultiValueHeaders()); + String headerValue = getFirst(request.getMultiValueHeaders(), HttpHeaders.CONTENT_LENGTH); + if (headerValue == null) { + return -1; + } + return Integer.parseInt(headerValue); } - @Override public long getContentLengthLong() { - return AwsHttpServletRequestHelper.getContentLengthLong(request.getMultiValueHeaders()); + String headerValue = getFirst(request.getMultiValueHeaders(), HttpHeaders.CONTENT_LENGTH); + if (headerValue == null) { + return -1; + } + return Long.parseLong(headerValue); } @Override public String getContentType() { - return AwsHttpServletRequestHelper.getContentType(request.getMultiValueHeaders()); + String contentTypeHeader = getFirst(request.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE); + if (contentTypeHeader == null || "".equals(contentTypeHeader.trim())) { + return null; + } + + return contentTypeHeader; } @Override public String getParameter(String s) { - return AwsHttpServletRequestHelper.getParameter( - request.getMultiValueQueryStringParameters(), - s, - config, - this - ); + String queryStringParameter = getFirstQueryParamValue(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive()); + if (queryStringParameter != null) { + return queryStringParameter; + } + + String[] bodyParams = getFormBodyParameterCaseInsensitive(s); + if (bodyParams.length == 0) { + return null; + } else { + return bodyParams[0]; + } } @Override public Enumeration getParameterNames() { - return AwsHttpServletRequestHelper.getParameterNames( - request.getMultiValueQueryStringParameters(), - this - ); + Set formParameterNames = getFormUrlEncodedParametersMap().keySet(); + if (request.getMultiValueQueryStringParameters() == null) { + return Collections.enumeration(formParameterNames); + } + return Collections.enumeration(Stream.concat(formParameterNames.stream(), + request.getMultiValueQueryStringParameters().keySet().stream()).collect(Collectors.toSet())); } @Override @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") // suppressing this as according to the specs we should be returning null here if we can't find params public String[] getParameterValues(String s) { - return AwsHttpServletRequestHelper.getParameterValues( - request.getMultiValueQueryStringParameters(), - s, - config, - this - ); + List values = new ArrayList<>(Arrays.asList(getQueryParamValues(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive()))); + + values.addAll(Arrays.asList(getFormBodyParameterCaseInsensitive(s))); + + if (values.size() == 0) { + return null; + } else { + return values.toArray(new String[0]); + } } @Override public Map getParameterMap() { - return AwsHttpServletRequestHelper.getParameterMap( - request.getMultiValueQueryStringParameters(), - config, - this - ); + return generateParameterMap(request.getMultiValueQueryStringParameters(), config); } @@ -331,40 +391,56 @@ public String getProtocol() { @Override public String getScheme() { - return AwsHttpServletRequestHelper.getScheme( - request.getMultiValueHeaders(), - this - ); + return getSchemeFromHeader(request.getMultiValueHeaders()); } @Override public String getServerName() { - return AwsHttpServletRequestHelper.getServerName( - request.getMultiValueHeaders(), - request.getRequestContext().getApiId() - ); + String region = System.getenv("AWS_REGION"); + if (region == null) { + // this is not a critical failure, we just put a static region in the URI + region = "us-east-1"; + } + + if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().containsKey(HOST_HEADER_NAME)) { + String hostHeader = getFirst(request.getMultiValueHeaders(), HOST_HEADER_NAME); + if (SecurityUtils.isValidHost(hostHeader, request.getRequestContext().getApiId(), region)) { + return hostHeader; + } + } + + return new StringBuilder().append(request.getRequestContext().getApiId()) + .append(".execute-api.") + .append(region) + .append(".amazonaws.com").toString(); } @Override public int getServerPort() { - return AwsHttpServletRequestHelper.getServerPort(request.getMultiValueHeaders()); + if (request.getMultiValueHeaders() == null) { + return 443; + } + String port = getFirst(request.getMultiValueHeaders(), PORT_HEADER_NAME); + if (SecurityUtils.isValidPort(port)) { + return Integer.parseInt(port); + } else { + return 443; // default port + } } @Override public ServletInputStream getInputStream() throws IOException { - return AwsHttpServletRequestHelper.getInputStream( - requestInputStream, - request.getBody(), - request.getIsBase64Encoded(), - this - ); + if (requestInputStream == null) { + requestInputStream = new AwsServletInputStream(bodyStringToInputStream(request.getBody(), request.getIsBase64Encoded())); + } + return requestInputStream; } @Override public BufferedReader getReader() throws IOException { - return AwsHttpServletRequestHelper.getReader(request.getBody()); + return new BufferedReader(new StringReader(request.getBody())); } @@ -379,35 +455,31 @@ public String getRemoteAddr() { @Override public String getRemoteHost() { - return AwsHttpServletRequestHelper.getRemoteHost(request.getMultiValueHeaders()); + return getFirst(request.getMultiValueHeaders(), HttpHeaders.HOST); } @Override public Locale getLocale() { - return AwsHttpServletRequestHelper.getLocale( - request.getMultiValueHeaders(), - this - ); + List locales = parseAcceptLanguageHeader(getFirst(request.getMultiValueHeaders(), HttpHeaders.ACCEPT_LANGUAGE)); + return locales.size() == 0 ? Locale.getDefault() : locales.get(0); } @Override public Enumeration getLocales() { - return AwsHttpServletRequestHelper.getLocales( - request.getMultiValueHeaders(), - this - ); + List locales = parseAcceptLanguageHeader(getFirst(request.getMultiValueHeaders(), HttpHeaders.ACCEPT_LANGUAGE)); + return Collections.enumeration(locales); } @Override public boolean isSecure() { - return AwsHttpServletRequestHelper.isSecure(securityContext); + return securityContext.isSecure(); } @Override public RequestDispatcher getRequestDispatcher(String s) { - return AwsHttpServletRequestHelper.getRequestDispatcher(s, this); + return getServletContext().getRequestDispatcher(s); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java index 164fc93ba..00b8373e2 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java @@ -3,12 +3,12 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper; import com.amazonaws.serverless.proxy.model.ErrorModel; import com.amazonaws.services.lambda.runtime.events.AwsProxyResponseEvent; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getFirst; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; @@ -62,7 +62,7 @@ void typedHandle_InvalidRequestEventException_jsonContentTypeHeader() { assertNotNull(resp); assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, AwsHttpServletRequestHelper.getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); //resp.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); //resp.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); } @Test @@ -89,7 +89,7 @@ void typedHandle_InvalidResponseObjectException_jsonContentTypeHeader() { assertNotNull(resp); assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, AwsHttpServletRequestHelper.getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); } @Test @@ -127,7 +127,7 @@ void typedHandle_InternalServerErrorException_jsonContentTypeHeader() { assertNotNull(resp); assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, AwsHttpServletRequestHelper.getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); } @Test @@ -138,7 +138,7 @@ void typedHandle_NullPointerException_responseObject() assertNotNull(resp); assertEquals(502, resp.getStatusCode()); assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, AwsHttpServletRequestHelper.getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); String body = objectMapper.writeValueAsString(new ErrorModel(AwsProxyExceptionHandler.GATEWAY_TIMEOUT_ERROR)); assertEquals(body, resp.getBody()); } @@ -181,7 +181,7 @@ void streamHandle_InvalidRequestEventException_jsonContentTypeHeader() AwsProxyResponseEvent resp = objectMapper.readValue(new ByteArrayInputStream(respStream.toByteArray()), AwsProxyResponseEvent.class); assertNotNull(resp); assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, AwsHttpServletRequestHelper.getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); } @Test @@ -222,7 +222,7 @@ void streamHandle_InvalidResponseObjectException_jsonContentTypeHeader() AwsProxyResponseEvent resp = objectMapper.readValue(new ByteArrayInputStream(respStream.toByteArray()), AwsProxyResponseEvent.class); assertNotNull(resp); assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, AwsHttpServletRequestHelper.getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); } @Test diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 13d178ee1..a491f0650 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.internal.testutils; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest; import com.amazonaws.serverless.proxy.model.*; import com.amazonaws.services.lambda.runtime.events.ApplicationLoadBalancerRequestEvent; @@ -40,7 +41,7 @@ import java.nio.charset.StandardCharsets; import java.util.*; -import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper.*; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getFirst; /** @@ -330,7 +331,7 @@ public AwsProxyRequestBuilder cookie(String name, String value) { } cookies += (cookies.equals("")?"":"; ") + name + "=" + value; - putSingle(request.getMultiValueHeaders(), HttpHeaders.COOKIE, cookies); + AwsHttpServletRequest.putSingle(request.getMultiValueHeaders(), HttpHeaders.COOKIE, cookies); return this; } @@ -338,7 +339,7 @@ public AwsProxyRequestBuilder scheme(String scheme) { if (request.getMultiValueHeaders() == null) { request.setMultiValueHeaders(new Headers()); } - putSingle(request.getMultiValueHeaders(),"CloudFront-Forwarded-Proto", scheme); + AwsHttpServletRequest.putSingle(request.getMultiValueHeaders(),"CloudFront-Forwarded-Proto", scheme); return this; } @@ -346,7 +347,7 @@ public AwsProxyRequestBuilder serverName(String serverName) { if (request.getMultiValueHeaders() == null) { request.setMultiValueHeaders(new Headers()); } - putSingle(request.getMultiValueHeaders(), "Host", serverName); + AwsHttpServletRequest.putSingle(request.getMultiValueHeaders(), "Host", serverName); return this; } @@ -379,7 +380,7 @@ public AwsProxyRequestBuilder basicAuth(String username, String password) { // we remove the existing authorization strategy request.getMultiValueHeaders().remove(HttpHeaders.AUTHORIZATION); String authHeader = "Basic " + Base64.getMimeEncoder().encodeToString((username + ":" + password).getBytes(Charset.defaultCharset())); - List values = findKey(request.getMultiValueHeaders(), HttpHeaders.AUTHORIZATION); + List values = AwsHttpServletRequest.findKey(request.getMultiValueHeaders(), HttpHeaders.AUTHORIZATION); values.add(authHeader); return this; } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index bdecf23fc..4b432350e 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -14,7 +14,6 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; @@ -43,6 +42,7 @@ import java.util.Collection; import java.util.UUID; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getFirst; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -157,7 +157,7 @@ void headers_getHeaders_echo(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); validateMapResponseModel(output); } @@ -172,7 +172,7 @@ void headers_servletRequest_echo(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); validateMapResponseModel(output); } @@ -188,7 +188,7 @@ void headers_servletRequest_failedDependencyInjection_expectInternalServerError( .build(); AwsProxyResponseEvent output = handlerWithoutRegisteredDependencies.proxy(request, lambdaContext); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), output.getStatusCode()); } @@ -211,7 +211,7 @@ void context_serverInfo_correctContext(String reqType) { AwsProxyRequestBuilder request = getRequestBuilder("/echo/servlet-context", "GET"); AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); validateSingleValueModel(output, AwsServletContext.SERVER_INFO); } @@ -225,7 +225,7 @@ void requestScheme_valid_expectHttps(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); validateSingleValueModel(output, "https"); } @@ -239,7 +239,7 @@ void requestFilter_injectsServletRequest_expectCustomAttribute(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); validateSingleValueModel(output, ServletRequestFilter.FILTER_ATTRIBUTE_VALUE); } @@ -255,7 +255,7 @@ void authorizer_securityContext_customPrincipalSuccess(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); } @@ -272,7 +272,7 @@ void authorizer_securityContext_customAuthorizerContextSuccess(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); validateSingleValueModel(output, CUSTOM_HEADER_VALUE); } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index b367813bb..28f237ddf 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -2,7 +2,6 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; @@ -30,6 +29,7 @@ import java.util.Arrays; import java.util.Collection; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getFirst; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.fail; @@ -136,7 +136,7 @@ void queryString_uriInfo_echo(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); } @@ -151,7 +151,7 @@ void queryString_notEncoded_echo(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); } @@ -167,7 +167,7 @@ void queryString_encoded_echo(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type")); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type")); validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index db02dd52c..57c8da56e 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -2,7 +2,6 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper; import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletRegistration; import com.amazonaws.serverless.proxy.model.*; @@ -41,6 +40,7 @@ import java.util.EnumSet; import java.util.UUID; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getFirst; import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assumptions.assumeFalse; import static org.junit.jupiter.api.Assumptions.assumeTrue; @@ -153,7 +153,7 @@ void headers_getHeaders_echo(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); validateMapResponseModel(output); } @@ -167,7 +167,7 @@ void headers_servletRequest_echo(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); validateMapResponseModel(output); } @@ -182,7 +182,7 @@ void queryString_uriInfo_echo(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); validateMapResponseModel(output); } @@ -263,7 +263,7 @@ void authorizer_securityContext_customPrincipalSuccess(String reqType) { AwsProxyResponseEvent output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); + assertEquals("application/json", getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java index 8e2926cb6..b5bc6c1ab 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java @@ -2,7 +2,6 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; @@ -23,6 +22,7 @@ import java.util.EnumSet; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getFirst; import static org.junit.jupiter.api.Assertions.*; // we don't use the spring annotations to pretend we are running in the actual container @@ -58,7 +58,7 @@ void context_autowireValidContext_echoContext() { AwsProxyResponseEvent output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("text/plain", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); + assertEquals("text/plain", getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); assertEquals(STAGE, output.getBody()); } @@ -71,7 +71,7 @@ void context_contextAware_contextEcho() { AwsProxyResponseEvent output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("text/plain", AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); + assertEquals("text/plain", getFirst(output.getMultiValueHeaders(), "Content-Type").split(";")[0]); assertEquals(STAGE, output.getBody()); } @@ -86,7 +86,7 @@ void filter_customHeaderFilter_echoHeaders() { assertNotNull(output.getMultiValueHeaders()); assertTrue(output.getMultiValueHeaders().size() > 0); assertNotNull(output.getMultiValueHeaders().get(CustomHeaderFilter.HEADER_NAME)); - assertEquals(CustomHeaderFilter.HEADER_VALUE, AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), CustomHeaderFilter.HEADER_NAME)); + assertEquals(CustomHeaderFilter.HEADER_VALUE, getFirst(output.getMultiValueHeaders(), CustomHeaderFilter.HEADER_NAME)); } @Test @@ -128,8 +128,8 @@ void cookie_injectInResponse_expectCustomSetCookie() { assertEquals(200, output.getStatusCode()); assertTrue(output.getMultiValueHeaders().containsKey(HttpHeaders.SET_COOKIE)); - assertTrue(AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), HttpHeaders.SET_COOKIE).contains(ContextResource.COOKIE_NAME + "=" + ContextResource.COOKIE_VALUE)); - assertTrue(AwsHttpServletRequestHelper.getFirst(output.getMultiValueHeaders(), HttpHeaders.SET_COOKIE).contains(ContextResource.COOKIE_DOMAIN)); + assertTrue(getFirst(output.getMultiValueHeaders(), HttpHeaders.SET_COOKIE).contains(ContextResource.COOKIE_NAME + "=" + ContextResource.COOKIE_VALUE)); + assertTrue(getFirst(output.getMultiValueHeaders(), HttpHeaders.SET_COOKIE).contains(ContextResource.COOKIE_DOMAIN)); } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java index 7af021684..77e7dd5b3 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java @@ -2,7 +2,6 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.spring.staticapp.LambdaHandler; @@ -14,6 +13,7 @@ import jakarta.ws.rs.core.MediaType; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getFirst; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -32,6 +32,6 @@ void staticPage() { assertEquals(200, resp.getStatusCode()); assertTrue(resp.getBody().startsWith("")); assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.TEXT_HTML, AwsHttpServletRequestHelper.getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.TEXT_HTML, getFirst(resp.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE)); } } diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java index 60e97048e..04be93c7e 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java @@ -2,7 +2,6 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.InitializationWrapper; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; import com.amazonaws.services.lambda.runtime.Context; @@ -11,7 +10,6 @@ import com.amazonaws.services.lambda.runtime.events.AwsProxyResponseEvent; import com.amazonaws.services.lambda.runtime.events.apigateway.APIGatewayProxyRequestEvent; import com.amazonaws.services.lambda.runtime.events.apigateway.APIGatewayV2HTTPEvent; -import jakarta.ws.rs.core.HttpHeaders; import java.io.IOException; import java.io.InputStream; diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 2db904982..7ddaeff6e 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -2,7 +2,6 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.services.lambda.runtime.events.AwsProxyResponseEvent; @@ -20,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getFirst; import static org.junit.jupiter.api.Assertions.*; @@ -53,7 +53,7 @@ public void ping_streamRequest_respondsWithHello() { assertTrue(response.getBody().contains("Hello, World!")); assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(AwsHttpServletRequestHelper.getFirst(response.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + assertTrue(getFirst(response.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); } @Test diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 2db904982..7ddaeff6e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -2,7 +2,6 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.services.lambda.runtime.events.AwsProxyResponseEvent; @@ -20,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getFirst; import static org.junit.jupiter.api.Assertions.*; @@ -53,7 +53,7 @@ public void ping_streamRequest_respondsWithHello() { assertTrue(response.getBody().contains("Hello, World!")); assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(AwsHttpServletRequestHelper.getFirst(response.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + assertTrue(getFirst(response.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); } @Test diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index fed28632f..1fd4748b5 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -2,7 +2,6 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequestHelper; import com.amazonaws.services.lambda.runtime.events.AwsProxyResponseEvent; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; @@ -20,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getFirst; import static org.junit.jupiter.api.Assertions.*; public class StreamLambdaHandlerTest { @@ -52,7 +52,7 @@ public void ping_streamRequest_respondsWithHello() { assertTrue(response.getBody().contains("Hello, World!")); assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(AwsHttpServletRequestHelper.getFirst(response.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + assertTrue(getFirst(response.getMultiValueHeaders(), HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); } @Test