Skip to content

Commit be3a7dd

Browse files
committed
gh-511 Support country part in Accept-Language language tags
1 parent 47b2598 commit be3a7dd

File tree

3 files changed

+53
-60
lines changed

3 files changed

+53
-60
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();

0 commit comments

Comments
 (0)