You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2017/03/25 07:54:53 UTC

olingo-odata2 git commit: [OLINGO-1097] Failure while parsing HTTP header fields joined by multiple whitespaces

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 <mi...@apache.org>


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 <dt...@gmail.com>
Authored: Wed Mar 22 16:28:01 2017 +0300
Committer: mibo <mi...@apache.org>
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