Repository: olingo-odata2 Updated Branches: refs/heads/master 86c4ddc42 -> 24119a786
[OLINGO-453] Batch request writer bug fix Signed-off-by: Christian Amend <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/24119a78 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/24119a78 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/24119a78 Branch: refs/heads/master Commit: 24119a786547f7b8a406b5147b3bb282b663bd6d Parents: 86c4ddc Author: Christian Holzer <[email protected]> Authored: Tue Oct 14 13:52:49 2014 +0200 Committer: Christian Amend <[email protected]> Committed: Tue Oct 14 14:01:56 2014 +0200 ---------------------------------------------------------------------- .../odata2/core/batch/BatchRequestWriter.java | 30 +++++------ .../odata2/core/batch/BatchRequestTest.java | 16 +----- .../core/batch/BatchRequestWriterTest.java | 52 +++++++++++++++++++- 3 files changed, 67 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/24119a78/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java index a7ddfa1..9ec21cd 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java @@ -37,7 +37,7 @@ public class BatchRequestWriter { private static final String COLON = ":"; private static final String SP = " "; - private static final String LF = "\r\n"; + private static final String CRLF = "\r\n"; public static final String BOUNDARY_PREAMBLE = "changeset"; public static final String HTTP_1_1 = "HTTP/1.1"; private String batchBoundary; @@ -50,7 +50,7 @@ public class BatchRequestWriter { throw new IllegalArgumentException(); } for (BatchPart batchPart : batchParts) { - writer.append("--").append(boundary).append(LF); + writer.append("--").append(boundary).append(CRLF); if (batchPart instanceof BatchChangeSet) { appendChangeSet((BatchChangeSet) batchPart); } else if (batchPart instanceof BatchQueryPart) { @@ -58,8 +58,10 @@ public class BatchRequestWriter { appendRequestBodyPart(request.getMethod(), request.getUri(), null, request.getHeaders(), request.getContentId()); } + + writer.append(CRLF); // CRLF belongs to the boundary delimiter or boundary closing delimiter } - writer.append(LF).append("--").append(boundary).append("--"); + writer.append("--").append(boundary).append("--"); InputStream batchRequestBody; batchRequestBody = new ByteArrayInputStream(BatchHelper.getBytes(writer.toString())); return batchRequestBody; @@ -71,41 +73,41 @@ public class BatchRequestWriter { boundary = BatchHelper.generateBoundary(BOUNDARY_PREAMBLE); } writer.append(HttpHeaders.CONTENT_TYPE).append(COLON).append(SP).append( - HttpContentType.MULTIPART_MIXED + "; boundary=" + boundary).append(LF); + HttpContentType.MULTIPART_MIXED + "; boundary=" + boundary).append(CRLF); for (BatchChangeSetPart request : batchChangeSet.getChangeSetParts()) { - writer.append(LF).append("--").append(boundary).append(LF); + writer.append(CRLF).append("--").append(boundary).append(CRLF); appendRequestBodyPart(request.getMethod(), request.getUri(), request.getBody(), request.getHeaders(), request .getContentId()); } - writer.append(LF).append("--").append(boundary).append("--").append(LF); + writer.append(CRLF).append("--").append(boundary).append("--").append(CRLF); } private void appendRequestBodyPart(final String method, final String uri, final String body, final Map<String, String> headers, final String contentId) { boolean isContentLengthPresent = false; writer.append(HttpHeaders.CONTENT_TYPE).append(COLON).append(SP).append(HttpContentType.APPLICATION_HTTP) - .append(LF); + .append(CRLF); writer.append(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING).append(COLON).append(SP) - .append(BatchHelper.BINARY_ENCODING).append(LF); + .append(BatchHelper.BINARY_ENCODING).append(CRLF); if (contentId != null) { - writer.append(BatchHelper.HTTP_CONTENT_ID).append(COLON).append(SP).append(contentId).append(LF); + writer.append(BatchHelper.HTTP_CONTENT_ID).append(COLON).append(SP).append(contentId).append(CRLF); } String contentLength = getHeaderValue(headers, HttpHeaders.CONTENT_LENGTH); if (contentLength != null && !contentLength.isEmpty()) { isContentLengthPresent = true; } - writer.append(LF); + writer.append(CRLF); writer.append(method).append(SP).append(uri).append(SP).append(HTTP_1_1); - writer.append(LF); + writer.append(CRLF); if (!isContentLengthPresent && body != null && !body.isEmpty()) { writer.append(HttpHeaders.CONTENT_LENGTH).append(COLON).append(SP).append(BatchHelper.getBytes(body).length) - .append(LF); + .append(CRLF); } appendHeader(headers); + writer.append(CRLF); if (body != null && !body.isEmpty()) { - writer.append(LF); writer.append(body); } } @@ -113,7 +115,7 @@ public class BatchRequestWriter { private void appendHeader(final Map<String, String> headers) { for (Map.Entry<String, String> headerMap : headers.entrySet()) { String name = headerMap.getKey(); - writer.append(name).append(COLON).append(SP).append(headerMap.getValue()).append(LF); + writer.append(name).append(COLON).append(SP).append(headerMap.getValue()).append(CRLF); } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/24119a78/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java index 116bfd7..f526920 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java @@ -41,7 +41,6 @@ import org.apache.olingo.odata2.api.ep.EntityProviderBatchProperties; import org.apache.olingo.odata2.core.PathInfoImpl; import org.apache.olingo.odata2.core.batch.v2.BatchParser; import org.apache.olingo.odata2.testutil.helper.StringHelper; -import org.junit.Ignore; import org.junit.Test; /** @@ -132,19 +131,6 @@ public class BatchRequestTest { } @Test - /* - * --batch_123 - * Content-Type: application/http - * Content-Transfer-Encoding: binary - * Content-Id: 000 - * - * GET Employees HTTP/1.1 - * Accept: application/json <- Missing CRLF => Even ABAP can`t understand this request - * --batch_123 - * ... - * .... - */ - @Ignore public void testBatchWithGetAndPost() throws BatchException, IOException { List<BatchPart> batch = new ArrayList<BatchPart>(); Map<String, String> headers = new HashMap<String, String>(); @@ -176,7 +162,7 @@ public class BatchRequestTest { assertTrue(requestBody.contains("GET Employees HTTP/1.1")); assertTrue(requestBody.contains("POST Employees HTTP/1.1")); assertTrue(requestBody.contains(body)); - assertEquals(23, batchRequestStream.linesCount()); + assertEquals(25, batchRequestStream.linesCount()); String contentType = "multipart/mixed; boundary=" + BOUNDARY; BatchParser parser = new BatchParser(contentType, parseProperties, true); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/24119a78/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java index 051e1da..e8f7cd4 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -34,6 +35,8 @@ import org.apache.olingo.odata2.api.client.batch.BatchChangeSet; import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart; import org.apache.olingo.odata2.api.client.batch.BatchPart; import org.apache.olingo.odata2.api.client.batch.BatchQueryPart; +import org.apache.olingo.odata2.core.batch.v2.BufferedReaderIncludingLineEndings; +import org.apache.olingo.odata2.core.batch.v2.BufferedReaderIncludingLineEndings.Line; import org.apache.olingo.odata2.testutil.helper.StringHelper; import org.junit.Test; @@ -43,6 +46,7 @@ public class BatchRequestWriterTest { private static final String GET = "GET"; private static final String PUT = "PUT"; private static final String BOUNDARY = "batch_123"; + private static final Object CRLF = "\r\n"; private void checkMimeHeaders(final String requestBody) { assertTrue(requestBody.contains("Content-Type: application/http")); @@ -67,7 +71,7 @@ public class BatchRequestWriterTest { assertTrue(requestBody.contains("--batch_")); assertTrue(requestBody.contains("GET Employees HTTP/1.1")); checkHeaders(headers, requestBody); - assertEquals(8, StringHelper.countLines(requestBody)); + assertEquals(9, StringHelper.countLines(requestBody)); } @Test @@ -122,7 +126,7 @@ public class BatchRequestWriterTest { BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); - String requestBody = StringHelper.inputStreamToString(batchRequest); + String requestBody = StringHelper.inputStreamToString(batchRequest, true); assertNotNull(batchRequest); checkMimeHeaders(requestBody); @@ -134,6 +138,50 @@ public class BatchRequestWriterTest { } @Test + public void testGetRequest() throws IOException { + List<BatchPart> batch = new ArrayList<BatchPart>(); + + Map<String, String> headers = new HashMap<String, String>(); + headers.put("Accept", "application/json"); + BatchPart request = BatchQueryPart.method(GET).uri("Employees").headers(headers).contentId("123").build(); + + batch.add(request); + batch.add(request); + + BatchRequestWriter writer = new BatchRequestWriter(); + InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); + + BufferedReaderIncludingLineEndings reader = + new BufferedReaderIncludingLineEndings(new InputStreamReader(batchRequest)); + List<Line> lines = reader.toList(); + reader.close(); + + int line = 0; + assertEquals("--" + BOUNDARY + CRLF, lines.get(line++).toString()); + assertEquals("Content-Type: application/http" + CRLF, lines.get(line++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(line++).toString()); + assertEquals("Content-Id: 123" + CRLF, lines.get(line++).toString()); + assertEquals(CRLF, lines.get(line++).toString()); + assertEquals("GET Employees HTTP/1.1" + CRLF, lines.get(line++).toString()); + assertEquals("Accept: application/json" + CRLF, lines.get(line++).toString()); + assertEquals(CRLF, lines.get(line++).toString()); // Belongs to the GET request [OData Protocol - 2.2.7.2.1] + + assertEquals(CRLF, lines.get(line++).toString()); // Belongs conceptually to the boundary [RFC 2046 - 5.1.1] + assertEquals("--" + BOUNDARY + CRLF, lines.get(line++).toString()); + assertEquals("Content-Type: application/http" + CRLF, lines.get(line++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(line++).toString()); + assertEquals("Content-Id: 123" + CRLF, lines.get(line++).toString()); + assertEquals(CRLF, lines.get(line++).toString()); + assertEquals("GET Employees HTTP/1.1" + CRLF, lines.get(line++).toString()); + assertEquals("Accept: application/json" + CRLF, lines.get(line++).toString()); + assertEquals(CRLF, lines.get(line++).toString()); // Belongs to the GET request [OData Protocol - 2.2.7.2.1] + + assertEquals(CRLF, lines.get(line++).toString()); // Belongs conceptually to the boundary [RFC 2046 - 5.1.1] + assertEquals("--" + BOUNDARY + "--", lines.get(line++).toString()); + assertEquals(19, lines.size()); + } + + @Test public void testChangeSetWithContentIdReferencing() throws BatchException, IOException { List<BatchPart> batch = new ArrayList<BatchPart>();
