Wendy Tamm created OLINGO-547:
---------------------------------

             Summary: Ampersands in query parameter values cause 
ExpressionParserExceptions
                 Key: OLINGO-547
                 URL: https://issues.apache.org/jira/browse/OLINGO-547
             Project: Olingo
          Issue Type: Bug
          Components: odata2-core
    Affects Versions: V2 2.0.1
            Reporter: Wendy Tamm
            Priority: Minor


I believe there is a mistake in the handling of encoded ampersands in query 
parameter values in org.apache.olingo.odata2.core.servlet.RestUtil, both in 
extractQueryParameters() on line 95, and identically in 
extractAllQueryParameters() on line 113:
{code:title=RestUtil.java, lines 95 & 113|borderStyle=solid}
List<String> queryParameters = 
Arrays.asList(Decoder.decode(queryString).split("\\&"));
{code}
The query string is decoded before it is split, which causes any encoded 
ampersand in a parameter value to be split incorrectly. Not only does this 
simply risk losing important information, it also causes some system query 
options to not parse properly, like $filter.

For example, the value in the expression "$filter=Name eq 'Tom%26Jerry'" is 
split into "$filter=Name eq 'Tom" and "Jerry'", which causes the following 
exception:

{noformat}
org.apache.olingo.odata2.api.uri.expression.ExpressionParserException: 
Unterminated string literal at position 9 in "Name eq 'Tom".
        at 
org.apache.olingo.odata2.core.uri.expression.FilterParserExceptionImpl.createTOKEN_UNDETERMINATED_STRING(FilterParserExceptionImpl.java:226)
        at 
org.apache.olingo.odata2.core.uri.expression.Tokenizer.readLiteral(Tokenizer.java:317)
        at 
org.apache.olingo.odata2.core.uri.expression.Tokenizer.readLiteral(Tokenizer.java:277)
        at 
org.apache.olingo.odata2.core.uri.expression.Tokenizer.tokenize(Tokenizer.java:104)
        at 
org.apache.olingo.odata2.core.uri.expression.FilterParserImpl.parseFilterString(FilterParserImpl.java:87)
        at 
org.apache.olingo.odata2.core.uri.UriParserImpl.handleSystemQueryOptionFilter(UriParserImpl.java:627)
        ... 31 more
{noformat}

I am working around this by implementing my own query parameter extraction 
method:

{code:borderStyle=solid}
public static Map<String, List<String>> extractAllQueryParameters(final String 
queryString) {
    Map<String, List<String>> allQueryParameterMap = new HashMap<String, 
List<String>>();
    
    if (queryString != null && !queryString.isEmpty()) {
      // split the query string on ampersands (before decoding, to avoid 
problems with ampersands in values)
      String[] queryParameters = queryString.split("\\u0026");

      for (String param : queryParameters) {
        String decodedParam = Decoder.decode(param);
        ...
      }
    }
    
    return allQueryParameterMap;
  }
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to