You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2015/01/13 12:51:25 UTC

olingo-odata2 git commit: [OLINGO-531] Fix: ODataServlet response contains content-length header

Repository: olingo-odata2
Updated Branches:
  refs/heads/master b2b42b1e4 -> 297c39492


[OLINGO-531] Fix: ODataServlet response contains content-length header

Signed-off-by: Christian Amend <ch...@apache.org>


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

Branch: refs/heads/master
Commit: 297c3949222e50de4a6c266e4a221564ad2d9b08
Parents: b2b42b1
Author: Christian Holzer <c....@sap.com>
Authored: Tue Jan 13 09:31:52 2015 +0100
Committer: Christian Amend <ch...@apache.org>
Committed: Tue Jan 13 12:50:58 2015 +0100

----------------------------------------------------------------------
 .../odata2/core/servlet/ODataServlet.java       | 17 +++-
 .../odata2/core/servlet/ODataServletTest.java   | 82 ++++++++++++++++++++
 2 files changed, 98 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/297c3949/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 0973f33..e1faeae 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
@@ -245,16 +245,31 @@ public class ODataServlet extends HttpServlet {
     if (entity != null) {
       ServletOutputStream out = resp.getOutputStream();
       int curByte;
+      int contentLength = 0;
+
       if (entity instanceof InputStream) {
         while ((curByte = ((InputStream) entity).read()) != -1) {
+          contentLength++;
           out.write((char) curByte);
         }
         ((InputStream) entity).close();
       } else if (entity instanceof String) {
         String body = (String) entity;
-        out.write(body.getBytes("utf-8"));
+        final byte[] entityBytes = body.getBytes("utf-8");
+        out.write(entityBytes);
+        contentLength = entityBytes.length;
+      }
+
+      if (response.getHeader(HttpHeaders.CONTENT_LENGTH) != null) {
+        // Override content length
+        try {
+          contentLength = Integer.parseInt(response.getHeader(HttpHeaders.CONTENT_LENGTH));
+        } catch (NumberFormatException e) {
+          // Ignore
+        }
       }
 
+      resp.setContentLength(contentLength);
       out.flush();
       out.close();
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/297c3949/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java
index 2f877d2..883ab96 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java
@@ -18,16 +18,22 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.core.servlet;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletConfig;
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.olingo.odata2.api.ODataServiceFactory;
 import org.apache.olingo.odata2.api.commons.HttpHeaders;
 import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
+import org.apache.olingo.odata2.api.processor.ODataResponse;
+import org.apache.olingo.odata2.core.ODataResponseImpl;
 import org.apache.olingo.odata2.core.rest.ODataServiceFactoryImpl;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -91,6 +97,82 @@ public class ODataServletTest {
     Mockito.verify(respMock).setHeader(HttpHeaders.LOCATION, "/");
   }
 
+  @Test
+  public void contentLengthCalculatedString() throws Exception {
+    final Method createResponse =
+        ODataServlet.class.getDeclaredMethod("createResponse", HttpServletResponse.class, ODataResponse.class);
+    createResponse.setAccessible(true);
+
+    final ODataServlet servlet = new ODataServlet();
+    final String content = "Test\r\n";
+    final ODataResponse response = ODataResponseImpl.status(HttpStatusCodes.OK).entity(content).build();
+    prepareResponseMockToWrite(respMock);
+    prepareServlet(servlet);
+
+    createResponse.invoke(servlet, respMock, response);
+    Mockito.verify(respMock).setContentLength(content.getBytes("utf-8").length);
+  }
+
+  @Test
+  public void contentLengthCalculatedStream() throws Exception {
+    final Method createResponse =
+        ODataServlet.class.getDeclaredMethod("createResponse", HttpServletResponse.class, ODataResponse.class);
+    createResponse.setAccessible(true);
+
+    final ODataServlet servlet = new ODataServlet();
+    final String content = "Test\r\n";
+
+    final ODataResponse response =
+        ODataResponseImpl.status(HttpStatusCodes.OK).entity(new ByteArrayInputStream(content.getBytes("utf-8")))
+            .build();
+    prepareResponseMockToWrite(respMock);
+    prepareServlet(servlet);
+
+    createResponse.invoke(servlet, respMock, response);
+    Mockito.verify(respMock).setContentLength(content.getBytes("utf-8").length);
+  }
+
+  @Test
+  public void contentLengthHeader() throws Exception {
+    final Method createResponse =
+        ODataServlet.class.getDeclaredMethod("createResponse", HttpServletResponse.class, ODataResponse.class);
+    createResponse.setAccessible(true);
+    final ODataServlet servlet = new ODataServlet();
+    final ODataResponse response =
+        ODataResponseImpl.status(HttpStatusCodes.OK).header(HttpHeaders.CONTENT_LENGTH, "15").entity("").build();
+    prepareResponseMockToWrite(respMock);
+    prepareServlet(servlet);
+
+    createResponse.invoke(servlet, respMock, response);
+
+    Mockito.verify(respMock).setHeader(HttpHeaders.CONTENT_LENGTH, "15");
+    Mockito.verify(respMock).setContentLength(15);
+  }
+
+  @Test
+  public void contentLengthHeaderInvalid() throws Exception {
+    final Method createResponse =
+        ODataServlet.class.getDeclaredMethod("createResponse", HttpServletResponse.class, ODataResponse.class);
+    createResponse.setAccessible(true);
+    final ODataServlet servlet = new ODataServlet();
+    final ODataResponse response =
+        ODataResponseImpl.status(HttpStatusCodes.OK).header(HttpHeaders.CONTENT_LENGTH, "ab").entity("Test").build();
+    prepareResponseMockToWrite(respMock);
+    prepareServlet(servlet);
+
+    createResponse.invoke(servlet, respMock, response);
+
+    Mockito.verify(respMock).setHeader(HttpHeaders.CONTENT_LENGTH, "ab");
+    Mockito.verify(respMock).setContentLength(4); // ||"Test"|| = 4
+  }
+
+  private void prepareResponseMockToWrite(final HttpServletResponse response) throws IOException {
+    Mockito.when(response.getOutputStream()).thenReturn(new ServletOutputStream() {
+      @Override
+      public void write(int b) throws IOException {}
+    });
+  }
+
   private void prepareRequest(final HttpServletRequest req, final String contextPath, final String servletPath) {
     Mockito.when(req.getMethod()).thenReturn("GET");
     Mockito.when(req.getContextPath()).thenReturn(contextPath);