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 2016/03/17 22:03:15 UTC
olingo-odata4 git commit: [OLINGO-903] Check for in uri parser error
cases
Repository: olingo-odata4
Updated Branches:
refs/heads/master 9c61e2237 -> 49b859943
[OLINGO-903] Check for in uri parser error cases
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/49b85994
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/49b85994
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/49b85994
Branch: refs/heads/master
Commit: 49b8599432a8ea48732283b914de60c9d4577d77
Parents: 9c61e22
Author: Michael Bolz <mi...@sap.com>
Authored: Thu Mar 17 21:59:48 2016 +0100
Committer: Michael Bolz <mi...@sap.com>
Committed: Thu Mar 17 22:02:49 2016 +0100
----------------------------------------------------------------------
.../olingo/server/core/ODataHandlerImpl.java | 41 ++++++++++++-
.../server/core/ODataHandlerImplTest.java | 61 ++++++++++++++++++++
2 files changed, 99 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/49b85994/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java
index 3c2a903..1d6a415 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java
@@ -18,6 +18,7 @@
*/
package org.apache.olingo.server.core;
+import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
@@ -45,11 +46,17 @@ import org.apache.olingo.server.api.serializer.CustomContentTypeSupport;
import org.apache.olingo.server.api.serializer.RepresentationType;
import org.apache.olingo.server.api.serializer.SerializerException;
import org.apache.olingo.server.api.uri.UriInfo;
+import org.apache.olingo.server.api.uri.queryoption.FormatOption;
+import org.apache.olingo.server.api.uri.queryoption.QueryOption;
+import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption;
+import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
import org.apache.olingo.server.core.debug.ServerCoreDebugger;
import org.apache.olingo.server.core.uri.parser.Parser;
+import org.apache.olingo.server.core.uri.parser.UriDecoder;
import org.apache.olingo.server.core.uri.parser.UriParserException;
import org.apache.olingo.server.core.uri.parser.UriParserSemanticException;
import org.apache.olingo.server.core.uri.parser.UriParserSyntaxException;
+import org.apache.olingo.server.core.uri.queryoption.FormatOptionImpl;
import org.apache.olingo.server.core.uri.validator.UriValidationException;
import org.apache.olingo.server.core.uri.validator.UriValidator;
@@ -174,9 +181,9 @@ public class ODataHandlerImpl implements ODataHandler {
}
ContentType requestedContentType;
try {
- requestedContentType = ContentNegotiator.doContentNegotiation(
- uriInfo == null ? null : uriInfo.getFormatOption(), request, getCustomContentTypeSupport(),
- RepresentationType.ERROR);
+ final FormatOption formatOption = getFormatOption(request, uriInfo);
+ requestedContentType = ContentNegotiator.doContentNegotiation(formatOption, request,
+ getCustomContentTypeSupport(), RepresentationType.ERROR);
} catch (final ContentNegotiatorException e) {
requestedContentType = ContentType.JSON;
}
@@ -186,6 +193,34 @@ public class ODataHandlerImpl implements ODataHandler {
debugger.stopRuntimeMeasurement(measurementHandle);
}
+ /**
+ * Extract format option from either <code>uriInfo</code> (if not <code>NULL</code>)
+ * or query from <code>request</code> (if not <code>NULL</code>).
+ * If both options are <code>NULL</code>, <code>NULL</code> is returned.
+ *
+ * @param request request which is checked
+ * @param uriInfo uriInfo which is checked
+ * @return the evaluated format option or <code>NULL</code>.
+ */
+ private FormatOption getFormatOption(final ODataRequest request, final UriInfo uriInfo) {
+ if(uriInfo == null) {
+ String query = request.getRawQueryPath();
+ if(query == null) {
+ return null;
+ }
+
+ final String formatOption = SystemQueryOptionKind.FORMAT.toString();
+ int index = query.indexOf(formatOption);
+ int endIndex = query.indexOf("&", index);
+ if(endIndex == -1) {
+ endIndex = query.length();
+ }
+ final String format = query.substring(index + formatOption.length(), endIndex);
+ return new FormatOptionImpl().setFormat(format);
+ }
+ return uriInfo.getFormatOption();
+ }
+
private void validateODataVersion(final ODataRequest request) throws ODataHandlerException {
final String maxVersion = request.getHeader(HttpHeader.ODATA_MAX_VERSION);
if (maxVersion != null && ODataServiceVersion.isBiggerThan(ODataServiceVersion.V40.toString(), maxVersion)) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/49b85994/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerImplTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerImplTest.java
index 7c26eb7..e1734c5 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerImplTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerImplTest.java
@@ -38,6 +38,7 @@ import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmProvider;
import org.apache.olingo.commons.api.edm.provider.CsdlEntitySet;
import org.apache.olingo.commons.api.ex.ODataException;
+import org.apache.olingo.commons.api.format.AcceptType;
import org.apache.olingo.commons.api.format.ContentType;
import org.apache.olingo.commons.api.http.HttpHeader;
import org.apache.olingo.commons.api.http.HttpMethod;
@@ -207,6 +208,66 @@ public class ODataHandlerImplTest {
assertEquals(HttpStatusCode.BAD_REQUEST.getStatusCode(), response.getStatusCode());
}
+
+ @Test
+ public void uriParserExceptionWithFormatQueryJson() throws Exception {
+ final ODataResponse response = dispatch(HttpMethod.GET, "ESAllPrims", "$format=json", "", "", null);
+ assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), response.getStatusCode());
+ assertEquals("application/json;odata.metadata=minimal",
+ response.getHeader(HttpHeader.CONTENT_TYPE));
+ }
+
+ @Test
+ public void uriParserExceptionWithFormatQueryJsonAndMore() throws Exception {
+ final ODataResponse response = dispatch(HttpMethod.GET, "ESAllPrims", "$format=json&$top=3", "", "", null);
+ assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), response.getStatusCode());
+ assertEquals("application/json;odata.metadata=minimal",
+ response.getHeader(HttpHeader.CONTENT_TYPE));
+ }
+
+
+ @Test
+ public void uriParserExceptionWithFormatJsonAcceptAtom() throws Exception {
+ final ODataResponse response = dispatch(HttpMethod.GET, "ESAllPrims", "$format=json",
+ HttpHeader.ACCEPT, ContentType.APPLICATION_ATOM_XML.toContentTypeString(), null);
+ assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), response.getStatusCode());
+ assertEquals("application/json;odata.metadata=minimal",
+ response.getHeader(HttpHeader.CONTENT_TYPE));
+ }
+
+ @Test
+ public void uriParserExceptionWithFormatQueryAtom() throws Exception {
+ final ODataResponse response = dispatch(HttpMethod.GET, "ESAllPrims", "$format=atom", "", "", null);
+ assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), response.getStatusCode());
+ assertEquals("application/json;odata.metadata=minimal",
+ response.getHeader(HttpHeader.CONTENT_TYPE));
+ }
+
+ @Test
+ public void uriParserExceptionWithFormatQueryAtomAndTop() throws Exception {
+ final ODataResponse response = dispatch(HttpMethod.GET, "ESAllPrims", "$format=atom&$top=19", "", "", null);
+ assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), response.getStatusCode());
+ assertEquals("application/json;odata.metadata=minimal",
+ response.getHeader(HttpHeader.CONTENT_TYPE));
+ }
+
+ @Test
+ public void uriParserExceptionWithFormatAtomAcceptJson() throws Exception {
+ final ODataResponse response = dispatch(HttpMethod.GET, "ESAllPrims", "$format=atom",
+ HttpHeader.ACCEPT, ContentType.APPLICATION_JSON.toContentTypeString(), null);
+ assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), response.getStatusCode());
+ assertEquals("application/json;odata.metadata=minimal",
+ response.getHeader(HttpHeader.CONTENT_TYPE));
+ }
+
+ @Test
+ public void uriParserExceptionWithFormatQueryInvali() throws Exception {
+ final ODataResponse response = dispatch(HttpMethod.GET, "ESAllPrims", "$format=somenotvalid", "", "", null);
+ assertEquals(HttpStatusCode.NOT_ACCEPTABLE.getStatusCode(), response.getStatusCode());
+ assertEquals("application/json;odata.metadata=minimal",
+ response.getHeader(HttpHeader.CONTENT_TYPE));
+ }
+
@Test
public void applicationExceptionInProcessor() throws Exception {
MetadataProcessor processor = mock(MetadataProcessor.class);