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 2022/08/08 18:06:47 UTC

[olingo-odata4] branch OLINGO-1571 created (now 4d257412f)

This is an automated email from the ASF dual-hosted git repository.

mibo pushed a change to branch OLINGO-1571
in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git


      at 4d257412f [OLINGO-1571] Fixed special chars for

This branch includes the following new commits:

     new 4d257412f [OLINGO-1571] Fixed special chars for

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[olingo-odata4] 01/01: [OLINGO-1571] Fixed special chars for

Posted by mi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mibo pushed a commit to branch OLINGO-1571
in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git

commit 4d257412f530ecd946a14d605a1d90b7bfa49901
Author: mibo <mi...@apache.org>
AuthorDate: Mon Aug 8 20:06:20 2022 +0200

    [OLINGO-1571] Fixed special chars for
---
 .../core/uri/parser/search/SearchTokenizer.java    | 44 +++-------------------
 .../uri/parser/search/SearchTokenizerTest.java     | 13 +++++--
 2 files changed, 15 insertions(+), 42 deletions(-)

diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java
index 6f7e01e70..ae89f9798 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java
@@ -166,41 +166,7 @@ public class SearchTokenizer {
      * @return true if character is allowed for a phrase
      */
     static boolean isAllowedPhrase(final char character) {
-      // the '%' is allowed because it is assumed that it was percent encoded and is now decoded
-      return isQCharUnescaped(character) 
-    		  || character == '%' 
-    		  || Character.isUnicodeIdentifierStart(character);
-    }
-
-    /**
-     * qchar-unescaped = unreserved / pct-encoded-unescaped / other-delims / ":" / "@" / "/" / "?" / "$" / "'" / "="
-     * @param character which is checked
-     * @return true if character is allowed
-     */
-    private static boolean isQCharUnescaped(final char character) {
-      return isUnreserved(character)
-          || isOtherDelims(character)
-          || character == ':'
-          || character == '@'
-          || character == '/'
-          || character == '$'
-          || character == '\''
-          || character == '=';
-    }
-
-    /**
-     * other-delims = "!" / "(" / ")" / "*" / "+" / "," / ";"
-     * @param character which is checked
-     * @return true if character is allowed
-     */
-    private static boolean isOtherDelims(final char character) {
-      return character == '!'
-          || character == '('
-          || character == ')'
-          || character == '*'
-          || character == '+'
-          || character == ','
-          || character == ';';
+      return character != '"';
     }
 
     /**
@@ -234,7 +200,7 @@ public class SearchTokenizer {
           || character == '<'
           || character == '`';
     }
-    
+
     /**
      * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
      * @param character which is checked
@@ -355,11 +321,11 @@ public class SearchTokenizer {
   }
 
   /**
-   * 
-   * As per the updated abnf 
+   *
+   * As per the updated abnf
    * https://github.com/oasis-tcs/odata-abnf/blob/master/abnf/odata-abnf-construction-rules.txt#L332-L356.
    * searchWord   = 1*( ALPHA / DIGIT / COMMA / "." / "-" / pct-encoded )
-   * This includes Unicode characters of categories 
+   * This includes Unicode characters of categories
    * L or N using UTF-8 and percent-encoding.
    */
   private class SearchWordState extends LiteralState {
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerTest.java
index d8c6a7cc7..cea6d3012 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerTest.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License. You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -107,6 +107,13 @@ public class SearchTokenizerTest {
     assertQuery("abc or \"xyz\"").resultsIn(WORD, WORD, PHRASE);
   }
 
+  @Test
+  public void parsePhrase_decoded() throws Exception {
+    assertQuery("\"a & b\"").resultsIn(PHRASE);
+    assertQuery("\" ! # $ % & ' ( ) * + , / : ; = ? @ [ ] \"").resultsIn(PHRASE);
+    assertQuery("\" - . < > ^ _ ` { | } ~ \"").resultsIn(PHRASE);
+  }
+
   @Test
   public void parseNot() throws Exception {
     assertQuery("NOT").resultsIn(NOT);
@@ -401,4 +408,4 @@ public class SearchTokenizerTest {
       }
     }
   }
-}
\ No newline at end of file
+}