Skip to content

Commit a9cbce6

Browse files
committed
don't fail on bad Accept-Language header fix #374
1 parent 5d747ce commit a9cbce6

3 files changed

Lines changed: 42 additions & 3 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.jooby.issues;
2+
3+
import org.jooby.test.ServerFeature;
4+
import org.junit.Test;
5+
6+
import com.typesafe.config.ConfigFactory;
7+
import com.typesafe.config.ConfigValueFactory;
8+
9+
public class Issue374 extends ServerFeature {
10+
11+
{
12+
use(ConfigFactory.empty()
13+
.withValue("application.lang", ConfigValueFactory.fromAnyRef("en-us, es-ar")));
14+
15+
get("/374", req -> req.locale().toString().toLowerCase());
16+
}
17+
18+
@Test
19+
public void shouldRestoreIllFormed() throws Exception {
20+
request()
21+
.get("/374")
22+
.header("Accept-Language", "es-ar;")
23+
.expect("es_ar");
24+
}
25+
26+
@Test
27+
public void dontFailOnBadAcceptLanguage() throws Exception {
28+
29+
request()
30+
.get("/374")
31+
.header("Accept-Language", "xx^x")
32+
.expect("en_us");
33+
}
34+
35+
}

jooby/src/main/java/org/jooby/internal/LocaleUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ public static Locale parseOne(final String value) {
5050
}
5151

5252
public static List<Locale.LanguageRange> range(final String value) {
53-
List<Locale.LanguageRange> range = Locale.LanguageRange.parse(value);
53+
// replace ';' by ',' well-formed vs ill-formed
54+
List<Locale.LanguageRange> range = Locale.LanguageRange.parse(value.replace(';', ','));
5455
return range.stream()
5556
.sorted(Comparator.comparing(Locale.LanguageRange::getWeight).reversed())
5657
.collect(Collectors.toList());

jooby/src/main/java/org/jooby/internal/RequestImpl.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.Optional;
3535
import java.util.Set;
3636
import java.util.function.BiFunction;
37+
import java.util.function.Supplier;
3738
import java.util.stream.Collectors;
3839

3940
import org.jooby.Cookie;
@@ -285,8 +286,10 @@ public List<Locale> locales(
285286

286287
@Override
287288
public Locale locale(final BiFunction<List<LanguageRange>, List<Locale>, Locale> filter) {
288-
return lang.map(h -> filter.apply(LocaleUtils.range(h), locales))
289-
.orElseGet(() -> filter.apply(ImmutableList.of(), locales));
289+
Supplier<Locale> def = () -> filter.apply(ImmutableList.of(), locales);
290+
// don't fail on bad Accept-Language header, just fallback to default locale.
291+
return lang.map(h -> Try.of(() -> filter.apply(LocaleUtils.range(h), locales)).getOrElse(def))
292+
.orElseGet(def);
290293
}
291294

292295
@Override

0 commit comments

Comments
 (0)