Repository: olingo-odata2 Updated Branches: refs/heads/master 2d07b9fa9 -> 456f4c641
[OLINGO-1097] Failure while parsing HTTP header fields joined by multiple whitespaces Signed-off-by: mibo <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/456f4c64 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/456f4c64 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/456f4c64 Branch: refs/heads/master Commit: 456f4c6416d7621cf8f0edbefffc51c3f7ffc07f Parents: 2d07b9f Author: Dmitry.Tretyakov <[email protected]> Authored: Wed Mar 22 16:28:01 2017 +0300 Committer: mibo <[email protected]> Committed: Sat Mar 25 08:54:27 2017 +0100 ---------------------------------------------------------------------- .../olingo/odata2/core/servlet/RestUtil.java | 8 ++++--- .../odata2/core/servlet/RestUtilTest.java | 25 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/456f4c64/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java index 1bdb1dd..3ee30d0 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java @@ -48,7 +48,9 @@ import org.apache.olingo.odata2.core.commons.ContentType; import org.apache.olingo.odata2.core.commons.Decoder; public class RestUtil { - private static final String REG_EX_OPTIONAL_WHITESPACE = "\\s?"; + // RFC 2616, 4.2: linear white space + private static final String REG_EX_OPTIONAL_WHITESPACE = "\\s*"; + private static final String REG_EX_FIELD_VALUE_SEPARATOR = "," + REG_EX_OPTIONAL_WHITESPACE; // RFC 2616, 3.9: qvalue = ("0"["." 0*3DIGIT]) | ("1"["." 0*3("0")]) private static final String REG_EX_QVALUE = "q=((?:1(?:\\.0{0,3})?)|(?:0(?:\\.[0-9]{0,3})?))"; @@ -145,7 +147,7 @@ public class RestUtil { List<Locale> acceptLanguages = new ArrayList<Locale>(); TreeSet<Accept> acceptTree = getAcceptTree(); if (acceptableLanguageHeader != null && !acceptableLanguageHeader.isEmpty()) { - List<String> list = Arrays.asList(acceptableLanguageHeader.split(",\\s?")); + List<String> list = Arrays.asList(acceptableLanguageHeader.split(REG_EX_FIELD_VALUE_SEPARATOR)); for (String acceptLanguage : list) { Matcher matcher = REG_EX_ACCEPT_LANGUAGES_WITH_Q_FACTOR.matcher(acceptLanguage); if (matcher.find()) { @@ -180,7 +182,7 @@ public class RestUtil { TreeSet<Accept> acceptTree = getAcceptTree(); List<String> acceptHeaders = new ArrayList<String>(); if (acceptHeader != null && !acceptHeader.isEmpty()) { - List<String> list = Arrays.asList(acceptHeader.split(",\\s?")); + List<String> list = Arrays.asList(acceptHeader.split(REG_EX_FIELD_VALUE_SEPARATOR)); for (String accept : list) { Matcher matcher = REG_EX_ACCEPT_WITH_Q_FACTOR.matcher(accept); if (matcher.find()) { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/456f4c64/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/RestUtilTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/RestUtilTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/RestUtilTest.java index 233cba6..dae2d3a 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/RestUtilTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/RestUtilTest.java @@ -56,4 +56,29 @@ public class RestUtilTest { Assert.assertEquals("v2", result.get("some").get(1)); Assert.assertEquals("v", result.get("another").get(0)); } + + @Test + public void testExtractAcceptHeaders() throws Exception { + // NuGet 4.0 client under .NET + List<String> result = RestUtil.extractAcceptHeaders("application/atom+xml, application/xml"); + Assert.assertEquals(2, result.size()); + Assert.assertEquals("application/atom+xml", result.get(0)); + Assert.assertEquals("application/xml", result.get(1)); + + // NuGet 4.0 client under Mono + result = RestUtil.extractAcceptHeaders("application/atom+xml, application/xml"); + Assert.assertEquals(2, result.size()); + Assert.assertEquals("application/atom+xml", result.get(0)); + Assert.assertEquals("application/xml", result.get(1)); + + // Chrome 56 + result = RestUtil.extractAcceptHeaders( + "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); + Assert.assertEquals(5, result.size()); + Assert.assertEquals("text/html", result.get(0)); + Assert.assertEquals("application/xhtml+xml", result.get(1)); + Assert.assertEquals("application/xml", result.get(2)); + Assert.assertEquals("image/webp", result.get(3)); + Assert.assertEquals("*/*", result.get(4)); + } } \ No newline at end of file
