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);
+ }
+
+
+}