diff --git a/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpHeader.java b/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpHeader.java index 8d95de7fb..8318b7467 100644 --- a/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpHeader.java +++ b/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpHeader.java @@ -80,13 +80,28 @@ public synchronized boolean contains(String value) { if (valuesLC == null) { valuesLC = new HashSet<>(); for (String v : getValues()) { - valuesLC.add(v.toLowerCase(Locale.ROOT)); + String[] parts = v.split(";"); + if (hasZeroQuality(parts)) continue; + valuesLC.add(parts[0].trim().toLowerCase(Locale.ROOT)); } } return valuesLC.contains(value); } + private static boolean hasZeroQuality(String[] parts) { + for (int i = 1; i < parts.length; i++) { + String param = parts[i].trim(); + if (!param.regionMatches(true, 0, "q=", 0, 2)) continue; + try { + return Double.parseDouble(param.substring(2)) == 0; + } catch (NumberFormatException ignore) { + return false; + } + } + return false; + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/common/src/test/java/de/bluecolored/bluemap/common/web/http/HttpHeaderTest.java b/common/src/test/java/de/bluecolored/bluemap/common/web/http/HttpHeaderTest.java new file mode 100644 index 000000000..d3a7ef964 --- /dev/null +++ b/common/src/test/java/de/bluecolored/bluemap/common/web/http/HttpHeaderTest.java @@ -0,0 +1,73 @@ +/* + * This file is part of BlueMap, licensed under the MIT License (MIT). + * + * Copyright (c) Blue (Lukas Rieger) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package de.bluecolored.bluemap.common.web.http; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class HttpHeaderTest { + + @Test + public void testContainsPlainValues() { + HttpHeader header = new HttpHeader("Accept-Encoding", "gzip, deflate, br"); + assertTrue(header.contains("gzip")); + assertTrue(header.contains("br")); + assertFalse(header.contains("zstd")); + } + + @Test + public void testContainsIgnoresParameters() { + HttpHeader header = new HttpHeader("Accept-Encoding", "gzip;q=1.0, deflate ; q=0.5, br;q=0.8"); + assertTrue(header.contains("gzip")); + assertTrue(header.contains("deflate")); + assertTrue(header.contains("br")); + } + + @Test + public void testContainsExcludesZeroQuality() { + HttpHeader header = new HttpHeader("Accept-Encoding", "gzip;q=0, zstd;Q=0.000, br;q=0.001, identity;q=abc"); + assertFalse(header.contains("gzip")); + assertFalse(header.contains("zstd")); + assertTrue(header.contains("br")); + assertTrue(header.contains("identity")); + } + + @Test + public void testContainsIsCaseInsensitive() { + HttpHeader header = new HttpHeader("Transfer-Encoding", "Chunked"); + assertTrue(header.contains("chunked")); + } + + @Test + public void testContainsAfterAdd() { + HttpHeader header = new HttpHeader("Accept-Encoding", "deflate"); + assertFalse(header.contains("gzip")); + header.add("gzip;q=0.9"); + assertTrue(header.contains("gzip")); + } + +}