Repository: olingo-odata2
Updated Branches:
  refs/heads/master c6631df2b -> 4facec58b


[OLINGO-839] Prevent wrong status code for invalid URL encoding


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/4facec58
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/4facec58
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/4facec58

Branch: refs/heads/master
Commit: 4facec58b7f536501d0078908877979113874568
Parents: c6631df
Author: Christian Amend <[email protected]>
Authored: Thu Dec 17 15:28:00 2015 +0100
Committer: Christian Amend <[email protected]>
Committed: Thu Dec 17 15:28:00 2015 +0100

----------------------------------------------------------------------
 .../api/exception/ODataBadRequestException.java |  5 +++-
 .../odata2/api/processor/ODataErrorContext.java |  2 +-
 .../odata2/core/rest/ODataExceptionWrapper.java | 30 +++++++++++++++-----
 .../core/servlet/ODataExceptionWrapper.java     | 13 ++++++---
 .../odata2/core/servlet/ODataServlet.java       | 23 +++++++++------
 .../src/main/resources/i18n.properties          |  1 +
 .../odata2/fit/basic/AbstractBasicTest.java     |  2 +-
 .../odata2/fit/basic/ErrorResponseTest.java     |  2 +-
 .../fit/basic/HttpExceptionResponseTest.java    |  2 +-
 9 files changed, 55 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4facec58/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/exception/ODataBadRequestException.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/exception/ODataBadRequestException.java
 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/exception/ODataBadRequestException.java
index 9cb0503..9933b5c 100644
--- 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/exception/ODataBadRequestException.java
+++ 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/exception/ODataBadRequestException.java
@@ -45,7 +45,10 @@ public class ODataBadRequestException extends 
ODataHttpException {
       "INVALID_HEADER");
   /** INVALID_SYNTAX requires NO content values */
   public static final MessageReference INVALID_SYNTAX = 
createMessageReference(ODataBadRequestException.class,
-      "INVALID_SYNTAX");;
+      "INVALID_SYNTAX");
+  /** INVALID_REQUEST requires NO content values */
+  public static final MessageReference INVALID_REQUEST = 
createMessageReference(ODataBadRequestException.class,
+      "INVALID_REQUEST");
 
   public ODataBadRequestException(final MessageReference messageReference) {
     super(messageReference, HttpStatusCodes.BAD_REQUEST);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4facec58/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataErrorContext.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataErrorContext.java
 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataErrorContext.java
index 6ae011b..70527be 100644
--- 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataErrorContext.java
+++ 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataErrorContext.java
@@ -185,7 +185,7 @@ public class ODataErrorContext {
   }
 
   /**
-   * Get the request uri to be used in a error response.
+   * Get the request uri to be used in an error response. Might be null in 
case the URI was the cause of the exception.
    * @return a uri object
    */
   public URI getRequestUri() {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4facec58/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionWrapper.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionWrapper.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionWrapper.java
index 3eb8c98..30efb9c 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionWrapper.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionWrapper.java
@@ -62,12 +62,12 @@ public class ODataExceptionWrapper {
   private static final String DOLLAR_FORMAT_JSON = "json";
   private static final Locale DEFAULT_RESPONSE_LOCALE = Locale.ENGLISH;
 
-  private final String contentType;
+  private String contentType;
+  private URI requestUri;
   private final Locale messageLocale;
   private final Map<String, List<String>> httpRequestHeaders;
   private final ODataErrorCallback callback;
   private final ODataErrorContext errorContext = new ODataErrorContext();
-  private final URI requestUri;
 
   public ODataExceptionWrapper(final ODataContext context, final Map<String, 
String> queryParameters,
       final List<String> acceptHeaderContentTypes) {
@@ -85,10 +85,15 @@ public class ODataExceptionWrapper {
 
   public ODataExceptionWrapper(final UriInfo uriInfo, final HttpHeaders 
httpHeaders,
       final ODataErrorCallback errorCallback) {
-    contentType = getContentType(uriInfo, httpHeaders).toContentTypeString();
+    try {
+      contentType = getContentType(uriInfo, httpHeaders).toContentTypeString();
+      requestUri = uriInfo.getRequestUri();
+    } catch (IllegalArgumentException e) {
+      contentType = null;
+      requestUri = null;
+    }
     messageLocale = 
MessageService.getSupportedLocale(getLanguages(httpHeaders), 
DEFAULT_RESPONSE_LOCALE);
     httpRequestHeaders = httpHeaders.getRequestHeaders();
-    requestUri = uriInfo.getRequestUri();
     callback = errorCallback;
   }
 
@@ -168,13 +173,24 @@ public class ODataExceptionWrapper {
    * @param exception exception with values to be set on error context
    */
   private void fillErrorContext(final Exception exception) {
-    errorContext.setContentType(contentType);
+    if (contentType != null || requestUri != null) {
+      errorContext.setContentType(contentType);
+      errorContext.setRequestUri(requestUri);
+      errorContext.setHttpStatus(HttpStatusCodes.INTERNAL_SERVER_ERROR);
+    } else {
+      /*
+       * We have to add this here in case CXF decides that the URL is invalid. 
In this case we have to give the correct
+       * response code nonetheless. Since we get called without context we 
have to try and guess here.
+       * This should be the case when either the content type or the request 
URI are null.
+       */
+      
errorContext.setContentType(ContentType.APPLICATION_ATOM_XML.toContentTypeString());
+      errorContext.setRequestUri(null);
+      errorContext.setHttpStatus(HttpStatusCodes.BAD_REQUEST);
+    }
     errorContext.setException(exception);
-    errorContext.setHttpStatus(HttpStatusCodes.INTERNAL_SERVER_ERROR);
     errorContext.setErrorCode(null);
     errorContext.setMessage(exception.getMessage());
     errorContext.setLocale(DEFAULT_RESPONSE_LOCALE);
-    errorContext.setRequestUri(requestUri);
 
     if (httpRequestHeaders != null) {
       for (Entry<String, List<String>> entry : httpRequestHeaders.entrySet()) {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4facec58/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataExceptionWrapper.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataExceptionWrapper.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataExceptionWrapper.java
index e2069d4..9a87505 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataExceptionWrapper.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataExceptionWrapper.java
@@ -21,6 +21,7 @@ package org.apache.olingo.odata2.core.servlet;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -45,7 +46,6 @@ import org.apache.olingo.odata2.core.commons.ContentType;
 import org.apache.olingo.odata2.core.ep.ProviderFacadeImpl;
 import org.apache.olingo.odata2.core.exception.MessageService;
 import org.apache.olingo.odata2.core.exception.MessageService.Message;
-import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
 
 /**
  *  
@@ -58,18 +58,23 @@ public class ODataExceptionWrapper {
   private final ODataErrorContext errorContext = new ODataErrorContext();
   private final String contentType;
   private final Locale messageLocale;
-  private final URI requestUri;
   private final Map<String, List<String>> httpRequestHeaders;
   private final ODataErrorCallback callback;
+  private URI requestUri;
 
   public ODataExceptionWrapper(final HttpServletRequest req, 
ODataServiceFactory serviceFactory) {
     try {
       requestUri = new URI(req.getRequestURI());
     } catch (URISyntaxException e) {
-      throw new ODataRuntimeException(e);
+      requestUri = null;
     }
     httpRequestHeaders = RestUtil.extractHeaders(req);
-    Map<String, String> queryParameters = 
RestUtil.extractQueryParameters(req.getQueryString());
+    Map<String, String> queryParameters;
+    try {
+      queryParameters = RestUtil.extractQueryParameters(req.getQueryString());
+    } catch (Exception e) {
+      queryParameters = new HashMap<String, String>();
+    }
     List<Locale> acceptableLanguages = 
RestUtil.extractAcceptableLanguage(req.getHeader("Accept-Language"));
     List<String> acceptHeaders = 
RestUtil.extractAcceptHeaders(req.getHeader("Accept"));
     contentType = getContentType(queryParameters, 
acceptHeaders).toContentTypeString();

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4facec58/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
index e83f46f..764380b 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
@@ -181,15 +181,20 @@ public class ODataServlet extends HttpServlet {
         createNotAcceptableResponse(req, ODataNotAcceptableException.COMMON, 
resp, serviceFactory);
         return;
       }
-      ODataRequest odataRequest = ODataRequest.method(method)
-          
.contentType(RestUtil.extractRequestContentType(req.getContentType()).toContentTypeString())
-          
.acceptHeaders(RestUtil.extractAcceptHeaders(req.getHeader(HttpHeaders.ACCEPT)))
-          
.acceptableLanguages(RestUtil.extractAcceptableLanguage(req.getHeader(HttpHeaders.ACCEPT_LANGUAGE)))
-          .pathInfo(RestUtil.buildODataPathInfo(req, pathSplit))
-          
.allQueryParameters(RestUtil.extractAllQueryParameters(req.getQueryString()))
-          .requestHeaders(RestUtil.extractHeaders(req))
-          .body(req.getInputStream())
-          .build();
+      ODataRequest odataRequest = null;
+      try {
+        odataRequest = ODataRequest.method(method)
+        
.contentType(RestUtil.extractRequestContentType(req.getContentType()).toContentTypeString())
+        
.acceptHeaders(RestUtil.extractAcceptHeaders(req.getHeader(HttpHeaders.ACCEPT)))
+        
.acceptableLanguages(RestUtil.extractAcceptableLanguage(req.getHeader(HttpHeaders.ACCEPT_LANGUAGE)))
+        .pathInfo(RestUtil.buildODataPathInfo(req, pathSplit))
+        
.allQueryParameters(RestUtil.extractAllQueryParameters(req.getQueryString()))
+        .requestHeaders(RestUtil.extractHeaders(req))
+        .body(req.getInputStream())
+        .build();
+      } catch (IllegalArgumentException e) {
+        throw new 
ODataBadRequestException(ODataBadRequestException.INVALID_REQUEST, e);
+      }
 
       ODataContextImpl context = new ODataContextImpl(odataRequest, 
serviceFactory);
       context.setParameter(ODataContext.HTTP_SERVLET_REQUEST_OBJECT, req);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4facec58/odata2-lib/odata-core/src/main/resources/i18n.properties
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/resources/i18n.properties 
b/odata2-lib/odata-core/src/main/resources/i18n.properties
index 2adda81..ff227a9 100644
--- a/odata2-lib/odata-core/src/main/resources/i18n.properties
+++ b/odata2-lib/odata-core/src/main/resources/i18n.properties
@@ -154,6 +154,7 @@ 
org.apache.olingo.odata2.api.exception.ODataBadRequestException.COMMON=Bad Reque
 
org.apache.olingo.odata2.api.exception.ODataBadRequestException.NOTSUPPORTED=The
 request is not supported by the processor.
 
org.apache.olingo.odata2.api.exception.ODataBadRequestException.INVALID_HEADER=The
 request contains an invalid header parameter '%1$s' with value '%2$s'.
 
org.apache.olingo.odata2.api.exception.ODataBadRequestException.INVALID_SYNTAX=The
 Data Services Request could not be understood due to malformed syntax.
+org.apache.olingo.odata2.api.exception.ODataBadRequestException.INVALID_REQUEST=The
 Request can`t be parsed either because the URL HTTP syntax is incorrect or the 
body stream could not be read.
 
org.apache.olingo.odata2.api.exception.ODataBadRequestException.URLTOOSHORT=The 
URL is too short.
 
org.apache.olingo.odata2.api.exception.ODataBadRequestException.VERSIONERROR=The
 Data Services Request version '%1$s' is not supported for the request payload.
 
org.apache.olingo.odata2.api.exception.ODataBadRequestException.PARSEVERSIONERROR=The
 Data Services Request version '%1$s' cannot be parsed.

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4facec58/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/AbstractBasicTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/AbstractBasicTest.java
 
b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/AbstractBasicTest.java
index 4e96b84..d4dac10 100644
--- 
a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/AbstractBasicTest.java
+++ 
b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/AbstractBasicTest.java
@@ -77,7 +77,7 @@ public abstract class AbstractBasicTest extends 
AbstractFitTest {
     return new ODataSingleProcessorService(provider, processor) {};
   }
 
-  EdmProvider createEdmProvider() {
+  protected EdmProvider createEdmProvider() {
     return mock(EdmProvider.class);
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4facec58/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/ErrorResponseTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/ErrorResponseTest.java
 
b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/ErrorResponseTest.java
index c11b961..0739de8 100644
--- 
a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/ErrorResponseTest.java
+++ 
b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/ErrorResponseTest.java
@@ -61,7 +61,7 @@ public class ErrorResponseTest extends AbstractBasicTest {
 
     return processor;
   }
-
+  
   @Test
   public void test500RuntimeError() throws ClientProtocolException, 
IOException, ODataException {
     disableLogging();

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4facec58/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/HttpExceptionResponseTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/HttpExceptionResponseTest.java
 
b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/HttpExceptionResponseTest.java
index 1bb8f69..780d142 100644
--- 
a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/HttpExceptionResponseTest.java
+++ 
b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/HttpExceptionResponseTest.java
@@ -74,7 +74,7 @@ public class HttpExceptionResponseTest extends 
AbstractBasicTest {
   }
 
   @Override
-  EdmProvider createEdmProvider() {
+  protected EdmProvider createEdmProvider() {
     final EdmProvider provider = new ScenarioEdmProvider();
     return provider;
   }

Reply via email to