Skip to content

Commit c9c573f

Browse files
author
Dennis Kieselhorst
authored
Merge pull request #512 from kerkhofsd/gh-511
gh-511 Support Accept-Language header values containing country subtag
2 parents 0210a77 + be3a7dd commit c9c573f

File tree

4 files changed

+63
-70
lines changed

4 files changed

+63
-70
lines changed

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -408,31 +408,13 @@ public String getRemoteHost() {
408408

409409
@Override
410410
public Locale getLocale() {
411-
// Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
412-
List<HeaderValue> values = this.parseHeaderValue(
413-
headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";"
414-
);
415-
if (values.size() == 0) {
416-
return Locale.getDefault();
417-
}
418-
return new Locale(values.get(0).getValue());
411+
List<Locale> locales = parseAcceptLanguageHeader(headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE));
412+
return locales.size() == 0 ? Locale.getDefault() : locales.get(0);
419413
}
420414

421415
@Override
422416
public Enumeration<Locale> getLocales() {
423-
List<HeaderValue> values = this.parseHeaderValue(
424-
headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";"
425-
);
426-
427-
List<Locale> locales = new ArrayList<>();
428-
if (values.size() == 0) {
429-
locales.add(Locale.getDefault());
430-
} else {
431-
for (HeaderValue locale : values) {
432-
locales.add(new Locale(locale.getValue()));
433-
}
434-
}
435-
417+
List<Locale> locales = parseAcceptLanguageHeader(headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE));
436418
return Collections.enumeration(locales);
437419
}
438420

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
1717
import com.amazonaws.serverless.proxy.internal.SecurityUtils;
1818
import com.amazonaws.serverless.proxy.internal.testutils.Timer;
19-
import com.amazonaws.serverless.proxy.model.*;
19+
import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext;
20+
import com.amazonaws.serverless.proxy.model.ContainerConfig;
21+
import com.amazonaws.serverless.proxy.model.Headers;
22+
import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap;
2023
import com.amazonaws.services.lambda.runtime.Context;
21-
2224
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2325
import org.apache.commons.fileupload.FileItem;
2426
import org.apache.commons.fileupload.FileUploadException;
@@ -30,10 +32,15 @@
3032
import org.slf4j.Logger;
3133
import org.slf4j.LoggerFactory;
3234

33-
import javax.servlet.*;
34-
import javax.servlet.http.*;
35+
import javax.servlet.DispatcherType;
36+
import javax.servlet.ServletContext;
37+
import javax.servlet.ServletException;
38+
import javax.servlet.ServletInputStream;
39+
import javax.servlet.http.Cookie;
40+
import javax.servlet.http.HttpServletRequest;
41+
import javax.servlet.http.HttpSession;
42+
import javax.servlet.http.Part;
3543
import javax.ws.rs.core.MediaType;
36-
3744
import java.io.ByteArrayInputStream;
3845
import java.io.IOException;
3946
import java.io.UnsupportedEncodingException;
@@ -697,6 +704,40 @@ protected List<HeaderValue> parseHeaderValue(String headerValue, String valueSep
697704
return values;
698705
}
699706

707+
protected List<Locale> parseAcceptLanguageHeader(String headerValue) {
708+
// Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
709+
List<HeaderValue> values = this.parseHeaderValue(
710+
headerValue, ",", ";"
711+
);
712+
713+
List<Locale> locales = new ArrayList<>();
714+
if (values.size() == 0) {
715+
locales.add(Locale.getDefault());
716+
} else {
717+
for (HeaderValue locale : values) {
718+
locales.add(parseLanguageTag(locale.getValue()));
719+
}
720+
}
721+
722+
return locales;
723+
}
724+
725+
protected Locale parseLanguageTag(String languageTag) {
726+
languageTag = languageTag.trim();
727+
String language;
728+
String country = "";
729+
730+
int indexDash = languageTag.indexOf('-');
731+
if (indexDash > -1) {
732+
country = languageTag.substring(indexDash + 1).trim();
733+
language = languageTag.substring(0, indexDash).trim();
734+
} else {
735+
language = languageTag;
736+
}
737+
738+
return new Locale(language, country);
739+
}
740+
700741
static String decodeRequestPath(String requestPath, ContainerConfig config) {
701742
try {
702743
return URLDecoder.decode(requestPath, config.getUriEncoding());

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import com.amazonaws.serverless.proxy.model.Headers;
2121
import com.amazonaws.serverless.proxy.model.RequestSource;
2222
import com.amazonaws.services.lambda.runtime.Context;
23-
2423
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2524
import org.slf4j.Logger;
2625
import org.slf4j.LoggerFactory;
@@ -29,7 +28,6 @@
2928
import javax.servlet.http.*;
3029
import javax.ws.rs.core.HttpHeaders;
3130
import javax.ws.rs.core.SecurityContext;
32-
3331
import java.io.BufferedReader;
3432
import java.io.IOException;
3533
import java.io.StringReader;
@@ -38,15 +36,7 @@
3836
import java.time.Instant;
3937
import java.time.ZonedDateTime;
4038
import java.time.format.DateTimeParseException;
41-
import java.util.ArrayList;
42-
import java.util.Arrays;
43-
import java.util.Collection;
44-
import java.util.Collections;
45-
import java.util.Enumeration;
46-
import java.util.List;
47-
import java.util.Locale;
48-
import java.util.Map;
49-
import java.util.Set;
39+
import java.util.*;
5040
import java.util.stream.Collectors;
5141
import java.util.stream.Stream;
5242

@@ -471,36 +461,16 @@ public String getRemoteHost() {
471461

472462
@Override
473463
public Locale getLocale() {
474-
// Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
475-
List<HeaderValue> values = this.parseHeaderValue(
476-
request.getMultiValueHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";"
477-
);
478-
if (values.size() == 0) {
479-
return Locale.getDefault();
480-
}
481-
return new Locale(values.get(0).getValue());
464+
List<Locale> locales = parseAcceptLanguageHeader(request.getMultiValueHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE));
465+
return locales.size() == 0 ? Locale.getDefault() : locales.get(0);
482466
}
483467

484-
485468
@Override
486469
public Enumeration<Locale> getLocales() {
487-
List<HeaderValue> values = this.parseHeaderValue(
488-
request.getMultiValueHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";"
489-
);
490-
491-
List<Locale> locales = new ArrayList<>();
492-
if (values.size() == 0) {
493-
locales.add(Locale.getDefault());
494-
} else {
495-
for (HeaderValue locale : values) {
496-
locales.add(new Locale(locale.getValue()));
497-
}
498-
}
499-
470+
List<Locale> locales = parseAcceptLanguageHeader(request.getMultiValueHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE));
500471
return Collections.enumeration(locales);
501472
}
502473

503-
504474
@Override
505475
public boolean isSecure() {
506476
return securityContext.isSecure();

aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ void getLocales_validAcceptHeader_expectSingleLocale(String type) {
501501
int localesNo = 0;
502502
while (locales.hasMoreElements()) {
503503
Locale defaultLocale = locales.nextElement();
504-
assertEquals(new Locale("fr-CH"), defaultLocale);
504+
assertEquals(new Locale("fr", "CH"), defaultLocale);
505505
localesNo++;
506506
}
507507
assertEquals(1, localesNo);
@@ -512,40 +512,40 @@ void getLocales_validAcceptHeader_expectSingleLocale(String type) {
512512
void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList(String type) {
513513
initAwsProxyHttpServletRequestTest(type);
514514
AwsProxyRequestBuilder req = getRequestWithHeaders();
515-
req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5");
515+
req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CA, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5");
516516
HttpServletRequest servletRequest = getRequest(req, null, null);
517517
Enumeration<Locale> locales = servletRequest.getLocales();
518518
List<Locale> localesList = new ArrayList<>();
519519
while (locales.hasMoreElements()) {
520520
localesList.add(locales.nextElement());
521521
}
522522
assertEquals(5, localesList.size());
523-
assertEquals(new Locale("fr-CH"), localesList.get(0));
524-
assertEquals(new Locale("fr"), localesList.get(1));
525-
assertEquals(new Locale("en"), localesList.get(2));
523+
assertEquals(Locale.CANADA_FRENCH, localesList.get(0));
524+
assertEquals(Locale.FRENCH, localesList.get(1));
525+
assertEquals(Locale.ENGLISH, localesList.get(2));
526526
assertEquals(new Locale("de"), localesList.get(3));
527527
assertEquals(new Locale("*"), localesList.get(4));
528528

529529
assertNotNull(servletRequest.getLocale());
530-
assertEquals(new Locale("fr-CH"), servletRequest.getLocale());
530+
assertEquals(Locale.CANADA_FRENCH, servletRequest.getLocale());
531531
}
532532

533533
@MethodSource("data")
534534
@ParameterizedTest
535535
void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrdered(String type) {
536536
initAwsProxyHttpServletRequestTest(type);
537537
AwsProxyRequestBuilder req = getRequestWithHeaders();
538-
req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9");
538+
req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CA, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9");
539539
HttpServletRequest servletRequest = getRequest(req, null, null);
540540
Enumeration<Locale> locales = servletRequest.getLocales();
541541
List<Locale> localesList = new ArrayList<>();
542542
while (locales.hasMoreElements()) {
543543
localesList.add(locales.nextElement());
544544
}
545545
assertEquals(5, localesList.size());
546-
assertEquals(new Locale("fr-CH"), localesList.get(0));
547-
assertEquals(new Locale("fr"), localesList.get(1));
548-
assertEquals(new Locale("en"), localesList.get(2));
546+
assertEquals(Locale.CANADA_FRENCH, localesList.get(0));
547+
assertEquals(Locale.FRENCH, localesList.get(1));
548+
assertEquals(Locale.ENGLISH, localesList.get(2));
549549
assertEquals(new Locale("de"), localesList.get(3));
550550
assertEquals(new Locale("*"), localesList.get(4));
551551
}

0 commit comments

Comments
 (0)