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 <[email protected]> Authored: Thu Jun 5 08:59:12 2014 +0200 Committer: Michael Bolz <[email protected]> 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); + } + + +}
