1
0
mirror of https://github.com/apache/olingo-odata4.git synced 2025-02-15 14:36:53 +00:00

[OLINGO-818] All verbs are allowed for individual requests in batch requests

This commit is contained in:
Christian Holzer 2015-11-05 14:30:51 +01:00
parent 734ea91988
commit 303c4e869f
4 changed files with 59 additions and 20 deletions
lib
server-api/src/main/java/org/apache/olingo/server/api/deserializer/batch
server-core/src
main
java/org/apache/olingo/server/core/deserializer/batch
resources
test/java/org/apache/olingo/server/core/deserializer/batch

@ -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,

@ -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<String> HTTP_BATCH_METHODS = new HashSet<String>(Arrays.asList(new String[] { "GET" }));
private static final Set<String> HTTP_CHANGE_SET_METHODS = new HashSet<String>(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<String> 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()));
}
}

@ -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'.

@ -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<BatchRequestPart> 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