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 2014/06/05 08:59:45 UTC

git commit: [OLINGO-307] Fixed location header for redirect

Repository: olingo-odata2
Updated Branches:
  refs/heads/master f99f8a359 -> 01db5f1ed


[OLINGO-307] Fixed location header for redirect


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

Branch: refs/heads/master
Commit: 01db5f1ede706f0fc21f287bbe663fa51141621b
Parents: f99f8a3
Author: Michael Bolz <mi...@apache.org>
Authored: Thu Jun 5 08:59:12 2014 +0200
Committer: Michael Bolz <mi...@apache.org>
Committed: Thu Jun 5 08:59:12 2014 +0200

----------------------------------------------------------------------
 .../odata2/core/servlet/ODataServlet.java       |  19 +++-
 .../odata2/core/servlet/ODataServletTest.java   | 114 +++++++++++++++++++
 2 files changed, 130 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/01db5f1e/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 ef5be4f..a5bedab 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
@@ -154,8 +154,7 @@ public class ODataServlet extends HttpServlet {
     return true;
   }
 
-  private void
-      handleRequest(final HttpServletRequest req, final ODataHttpMethod method, final HttpServletResponse resp)
+  private void handleRequest(final HttpServletRequest req, final ODataHttpMethod method, final HttpServletResponse resp)
           throws IOException {
     try {
       if (req.getHeader(HttpHeaders.ACCEPT) != null && req.getHeader(HttpHeaders.ACCEPT).isEmpty()) {
@@ -197,7 +196,7 @@ public class ODataServlet extends HttpServlet {
         HTTP_METHOD_HEAD.equals(method) ||
         HTTP_METHOD_OPTIONS.equals(method)) {
       ODataResponse odataResponse = ODataResponse.status(HttpStatusCodes.TEMPORARY_REDIRECT)
-          .header(HttpHeaders.LOCATION, "/")
+          .header(HttpHeaders.LOCATION, createLocation(req))
           .build();
       createResponse(resp, odataResponse);
     } else {
@@ -206,6 +205,20 @@ public class ODataServlet extends HttpServlet {
 
   }
 
+  private String createLocation(HttpServletRequest req) {
+    StringBuilder location = new StringBuilder();
+    String contextPath = req.getContextPath();
+    if(contextPath != null) {
+      location.append(contextPath);
+    }
+    String servletPath = req.getServletPath();
+    if(servletPath != null) {
+      location.append(servletPath);
+    }
+    location.append("/");
+    return location.toString();
+  }
+
   private void createResponse(final HttpServletResponse resp, final ODataResponse response) throws IOException {
     resp.setStatus(response.getStatus().getStatusCode());
     resp.setContentType(response.getContentHeader());

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/01db5f1e/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
new file mode 100644
index 0000000..4a6327e
--- /dev/null
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/servlet/ODataServletTest.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.odata2.core.servlet;
+
+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.core.rest.ODataServiceFactoryImpl;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import javax.servlet.GenericServlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Field;
+
+/**
+ *
+ */
+public class ODataServletTest {
+
+  private HttpServletRequest reqMock;
+  private HttpServletResponse respMock;
+  private ServletConfig configMock;
+
+  public ODataServletTest() {
+    this.reqMock = Mockito.mock(HttpServletRequest.class);
+    this.respMock = Mockito.mock(HttpServletResponse.class);
+    this.configMock = Mockito.mock(ServletConfig.class);
+  }
+
+  @Test
+  public void handleRedirect() throws Exception {
+    ODataServlet servlet = new ODataServlet();
+    prepareServlet(servlet);
+    prepareRequest(reqMock);
+    servlet.service(reqMock, respMock);
+
+    Mockito.verify(respMock).setStatus(HttpStatusCodes.TEMPORARY_REDIRECT.getStatusCode());
+    Mockito.verify(respMock).setHeader(HttpHeaders.LOCATION, "/context-path/servlet-path/");
+  }
+
+  @Test
+  public void handleRedirectWoServletPath() throws Exception {
+    ODataServlet servlet = new ODataServlet();
+    prepareServlet(servlet);
+    prepareRequest(reqMock, "/context-path", null);
+    servlet.service(reqMock, respMock);
+
+    Mockito.verify(respMock).setStatus(HttpStatusCodes.TEMPORARY_REDIRECT.getStatusCode());
+    Mockito.verify(respMock).setHeader(HttpHeaders.LOCATION, "/context-path/");
+  }
+
+  @Test
+  public void handleRedirectWoContextPath() throws Exception {
+    ODataServlet servlet = new ODataServlet();
+    prepareServlet(servlet);
+    prepareRequest(reqMock, null, "/servlet-path");
+    servlet.service(reqMock, respMock);
+
+    Mockito.verify(respMock).setStatus(HttpStatusCodes.TEMPORARY_REDIRECT.getStatusCode());
+    Mockito.verify(respMock).setHeader(HttpHeaders.LOCATION, "/servlet-path/");
+  }
+
+  @Test
+  public void handleRedirectWoPath() throws Exception {
+    ODataServlet servlet = new ODataServlet();
+    prepareServlet(servlet);
+    prepareRequest(reqMock, null, null);
+    servlet.service(reqMock, respMock);
+
+    Mockito.verify(respMock).setStatus(HttpStatusCodes.TEMPORARY_REDIRECT.getStatusCode());
+    Mockito.verify(respMock).setHeader(HttpHeaders.LOCATION, "/");
+  }
+
+  private void prepareRequest(HttpServletRequest req, String contextPath, String servletPath) {
+    Mockito.when(req.getMethod()).thenReturn("GET");
+    Mockito.when(req.getContextPath()).thenReturn(contextPath);
+    Mockito.when(req.getServletPath()).thenReturn(servletPath);
+  }
+
+  private void prepareRequest(HttpServletRequest req) {
+    prepareRequest(req, "/context-path", "/servlet-path");
+  }
+
+  private void prepareServlet(GenericServlet servlet) throws Exception {
+    //    private transient ServletConfig config;
+    Field configField = GenericServlet.class.getDeclaredField("config");
+    configField.setAccessible(true);
+    configField.set(servlet, configMock);
+
+    String factoryClassName = ODataServiceFactoryImpl.class.getName();
+    Mockito.when(configMock.getInitParameter(ODataServiceFactory.FACTORY_LABEL)).thenReturn(factoryClassName);
+  }
+
+
+}