From 303c4e869f2bce30694504ca767b89838e95c536 Mon Sep 17 00:00:00 2001 From: Christian Holzer Date: Thu, 5 Nov 2015 14:30:51 +0100 Subject: [PATCH] [OLINGO-818] All verbs are allowed for individual requests in batch requests --- .../batch/BatchDeserializerException.java | 2 - .../batch/HttpRequestStatusLine.java | 15 +---- .../server-core-exceptions-i18n.properties | 1 - .../batch/BatchRequestParserTest.java | 61 +++++++++++++++++-- 4 files changed, 59 insertions(+), 20 deletions(-) diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/batch/BatchDeserializerException.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/batch/BatchDeserializerException.java index cff3b259b..e7a81da73 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/batch/BatchDeserializerException.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/batch/BatchDeserializerException.java @@ -43,8 +43,6 @@ public class BatchDeserializerException extends DeserializerException { /** parameter: line */ INVALID_METHOD, /** parameter: line */ - INVALID_QUERY_OPERATION_METHOD, - /** parameter: line */ INVALID_STATUS_LINE, /** parameter: line */ INVALID_URI, diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLine.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLine.java index efe1ce1c7..f2d006a99 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLine.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLine.java @@ -33,7 +33,6 @@ import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerExceptio public class HttpRequestStatusLine { private static final Pattern PATTERN_RELATIVE_URI = Pattern.compile("([^/][^?]*)(?:\\?(.*))?"); - private static final Set HTTP_BATCH_METHODS = new HashSet(Arrays.asList(new String[] { "GET" })); private static final Set HTTP_CHANGE_SET_METHODS = new HashSet(Arrays.asList(new String[] { "POST", "PUT", "DELETE", "PATCH" })); private static final String HTTP_VERSION = "HTTP/1.1"; @@ -144,17 +143,9 @@ public class HttpRequestStatusLine { } public void validateHttpMethod(final boolean isChangeSet) throws BatchDeserializerException { - Set validMethods = (isChangeSet) ? HTTP_CHANGE_SET_METHODS : HTTP_BATCH_METHODS; - - if (!validMethods.contains(getMethod().toString())) { - if (isChangeSet) { - throw new BatchDeserializerException("Invalid change set method", MessageKeys.INVALID_CHANGESET_METHOD, - Integer.toString(statusLine.getLineNumber())); - } else { - throw new BatchDeserializerException("Invalid query operation method", - MessageKeys.INVALID_QUERY_OPERATION_METHOD, - Integer.toString(statusLine.getLineNumber())); - } + if(isChangeSet && !HTTP_CHANGE_SET_METHODS.contains(getMethod().toString())) { + throw new BatchDeserializerException("Invalid change set method", MessageKeys.INVALID_CHANGESET_METHOD, + Integer.toString(statusLine.getLineNumber())); } } diff --git a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties index 08e9eb8e0..046edfdd5 100644 --- a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties +++ b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties @@ -142,7 +142,6 @@ BatchDeserializerException.UNEXPECTED_CONTENT_TYPE=Content-Type at line '%1$s' s BatchDeserializerException.INVALID_CONTENT_ID=Invalid Content-ID HTTP header at line '%1$s'. BatchDeserializerException.INVALID_HTTP_VERSION=The HTTP version must be HTTP/1.1 at line '%1$s'. BatchDeserializerException.INVALID_METHOD=Invalid HTTP method at line '%1$s'. -BatchDeserializerException.INVALID_QUERY_OPERATION_METHOD=The query operation at line '%1$s' can only contain retrieve requests. BatchDeserializerException.INVALID_STATUS_LINE=Invalid HTTP status line at line '%1$s'. BatchDeserializerException.INVALID_URI=Invalid URI at line '%1$s'. BatchDeserializerException.FORBIDDEN_HEADER=Forbidden header at line '%1$s'. diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestParserTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestParserTest.java index 155c6788e..008fdbe79 100644 --- a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestParserTest.java +++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestParserTest.java @@ -33,9 +33,9 @@ import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpMethod; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException; +import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException.MessageKeys; import org.apache.olingo.server.api.deserializer.batch.BatchOptions; import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart; -import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException.MessageKeys; import org.junit.Test; public class BatchRequestParserTest { @@ -437,16 +437,67 @@ public class BatchRequestParserTest { } @Test - public void testInvalidMethodForBatch() throws Exception { + public void testMethodsForIndividualRequests() throws Exception { final String batch = "--batch_8194-cf13-1f56" + CRLF + MIME_HEADERS + CRLF - + "POST Employees('1')/EmployeeName HTTP/1.1" + CRLF + + "POST Employees HTTP/1.1" + CRLF + + "Content-Type: application/json" + CRLF + + CRLF + + "{ \"Name\": \"Foo\" }" + + CRLF + + "--batch_8194-cf13-1f56" + CRLF + + MIME_HEADERS + + CRLF + + "DELETE Employees('1') HTTP/1.1" + CRLF + + CRLF + + CRLF + + "--batch_8194-cf13-1f56" + CRLF + + MIME_HEADERS + + CRLF + + "PATCH Employees('1') HTTP/1.1" + CRLF + + "Content-Type: application/json" + CRLF + + CRLF + + "{ \"Name\": \"Foo\" }" + CRLF + + "--batch_8194-cf13-1f56" + CRLF + + MIME_HEADERS + + CRLF + + "PUT Employees('1') HTTP/1.1" + CRLF + + "Content-Type: application/json" + CRLF + + CRLF + + "{ \"Name\": \"Foo\" }" + CRLF + + "--batch_8194-cf13-1f56" + CRLF + + MIME_HEADERS + + CRLF + + "GET Employees('1') HTTP/1.1" + CRLF + + "Accept: application/json" + CRLF + CRLF + CRLF + "--batch_8194-cf13-1f56--"; - - parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_QUERY_OPERATION_METHOD); + + List requests = parse(batch); + assertEquals(HttpMethod.POST, requests.get(0).getRequests().get(0).getMethod()); + assertEquals("/Employees", requests.get(0).getRequests().get(0).getRawODataPath()); + assertEquals("{ \"Name\": \"Foo\" }", IOUtils.toString(requests.get(0).getRequests().get(0).getBody())); + + requests = parse(batch); + assertEquals(HttpMethod.DELETE, requests.get(1).getRequests().get(0).getMethod()); + assertEquals("/Employees('1')", requests.get(1).getRequests().get(0).getRawODataPath()); + + requests = parse(batch); + assertEquals(HttpMethod.PATCH, requests.get(2).getRequests().get(0).getMethod()); + assertEquals("{ \"Name\": \"Foo\" }", IOUtils.toString(requests.get(0).getRequests().get(0).getBody())); + assertEquals("/Employees('1')", requests.get(2).getRequests().get(0).getRawODataPath()); + + requests = parse(batch); + assertEquals(HttpMethod.PUT, requests.get(3).getRequests().get(0).getMethod()); + assertEquals("{ \"Name\": \"Foo\" }", IOUtils.toString(requests.get(0).getRequests().get(0).getBody())); + assertEquals("/Employees('1')", requests.get(3).getRequests().get(0).getRawODataPath()); + + requests = parse(batch); + assertEquals(HttpMethod.GET, requests.get(4).getRequests().get(0).getMethod()); + assertEquals("/Employees('1')", requests.get(4).getRequests().get(0).getRawODataPath()); + } @Test