You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by sk...@apache.org on 2013/10/17 16:00:26 UTC

git commit: [OLINGO-34] fix port caching issue

Updated Branches:
  refs/heads/master c3714148f -> a54a8302e


[OLINGO-34] fix port caching issue


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

Branch: refs/heads/master
Commit: a54a8302e7cbc608fe1e04fe4225458bab0e74b6
Parents: c371414
Author: Stephan Klevenz <sk...@apache.org>
Authored: Fri Oct 11 15:36:28 2013 +0200
Committer: Stephan Klevenz <sk...@apache.org>
Committed: Thu Oct 17 15:59:44 2013 +0200

----------------------------------------------------------------------
 .../olingo/odata2/core/rest/RestUtil.java       | 31 +++++++++++++----
 .../odata2/fit/basic/issues/TestIssue105.java   | 36 ++++++++++++++++++++
 .../testutil/fit/FitStaticServiceFactory.java   |  8 +++++
 3 files changed, 68 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/a54a8302/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/RestUtil.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/RestUtil.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/RestUtil.java
index 410e261..37703e7 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/RestUtil.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/RestUtil.java
@@ -37,7 +37,6 @@ import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
 import javax.ws.rs.core.UriBuilder;
-import javax.ws.rs.core.UriInfo;
 
 import org.apache.olingo.odata2.api.commons.HttpHeaders;
 import org.apache.olingo.odata2.api.exception.ODataBadRequestException;
@@ -169,10 +168,10 @@ public class RestUtil {
   }
 
   public static PathInfoImpl buildODataPathInfo(final SubLocatorParameter param) throws ODataException {
-    final UriInfo uriInfo = param.getUriInfo();
     PathInfoImpl pathInfo = splitPath(param);
-    pathInfo.setServiceRoot(buildBaseUri(param.getServletRequest(), uriInfo, pathInfo.getPrecedingSegments()));
-    pathInfo.setRequestUri(uriInfo.getRequestUri());
+
+    pathInfo.setServiceRoot(buildBaseUri(param.getServletRequest(), pathInfo.getPrecedingSegments()));
+    pathInfo.setRequestUri(buildRequestUri(param.getServletRequest()));
 
     return pathInfo;
   }
@@ -215,10 +214,10 @@ public class RestUtil {
     return pathInfo;
   }
 
-  private static URI buildBaseUri(final HttpServletRequest request, final javax.ws.rs.core.UriInfo uriInfo,
+  private static URI buildBaseUri(final HttpServletRequest request,
       final List<PathSegment> precedingPathSegments) throws ODataException {
     try {
-      UriBuilder uriBuilder = uriInfo.getBaseUriBuilder();
+      UriBuilder uriBuilder = UriBuilder.fromUri(request.getServletPath());
       for (final PathSegment ps : precedingPathSegments) {
         uriBuilder = uriBuilder.path(ps.getPath());
         for (final String key : ps.getMatrixParameters().keySet()) {
@@ -230,7 +229,8 @@ public class RestUtil {
       /*
        * workaround because of host name is cached by uriInfo
        */
-      uriBuilder.host(request.getServerName());
+      uriBuilder.host(request.getServerName()).port(request.getServerPort());
+      uriBuilder.scheme(request.getScheme());
 
       String uriString = uriBuilder.build().toString();
       if (!uriString.endsWith("/")) {
@@ -243,6 +243,23 @@ public class RestUtil {
     }
   }
 
+  private static URI buildRequestUri(HttpServletRequest servletRequest) {
+    URI requestUri;
+
+    StringBuffer buf = servletRequest.getRequestURL();
+    String queryString = servletRequest.getQueryString();
+
+    if (queryString != null) {
+      buf.append("?");
+      buf.append(queryString);
+    }
+
+    String requestUriString = buf.toString();
+
+    requestUri = URI.create(requestUriString);
+    return requestUri;
+  }
+
   private static List<PathSegment> convertPathSegmentList(final List<javax.ws.rs.core.PathSegment> pathSegments) {
     ArrayList<PathSegment> converted = new ArrayList<PathSegment>();
     for (final javax.ws.rs.core.PathSegment pathSegment : pathSegments) {

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/a54a8302/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/issues/TestIssue105.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/issues/TestIssue105.java b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/issues/TestIssue105.java
index 219a334..48db095 100644
--- a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/issues/TestIssue105.java
+++ b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/issues/TestIssue105.java
@@ -38,6 +38,7 @@ import org.apache.olingo.odata2.api.processor.ODataSingleProcessor;
 import org.apache.olingo.odata2.api.processor.part.MetadataProcessor;
 import org.apache.olingo.odata2.api.uri.info.GetMetadataUriInfo;
 import org.apache.olingo.odata2.fit.basic.AbstractBasicTest;
+import org.apache.olingo.odata2.testutil.fit.FitStaticServiceFactory;
 import org.junit.Test;
 
 /**
@@ -79,4 +80,39 @@ public class TestIssue105 extends AbstractBasicTest {
     assertEquals(uri2.getHost(), serviceRoot2.getHost());
   }
 
+  @Test
+  public void checkContextForDifferentWithHostHeader() throws ClientProtocolException, IOException,
+      ODataException, URISyntaxException {
+    try {
+      FitStaticServiceFactory.bindService("123", getService());
+
+      // 1st request: cache uri
+      URI uri = URI.create(getEndpoint().toString() + "$metadata");
+      HttpGet get1 = new HttpGet(uri);
+      HttpResponse response1 = getHttpClient().execute(get1);
+      assertNotNull(response1);
+
+      URI serviceRoot1 = getService().getProcessor().getContext().getPathInfo().getServiceRoot();
+      assertEquals(uri.getHost(), serviceRoot1.getHost());
+
+      get1.reset();
+
+      HttpGet get2 = new HttpGet(uri);
+      get2.addHeader("Host", "bla:123");
+      HttpResponse response2 = getHttpClient().execute(get2);
+      assertNotNull(response2);
+
+      URI serviceRoot2 = getService().getProcessor().getContext().getPathInfo().getServiceRoot();
+      assertEquals("bla", serviceRoot2.getHost());
+      assertEquals(123, serviceRoot2.getPort());
+
+      URI requestUri = getService().getProcessor().getContext().getPathInfo().getRequestUri();
+      assertEquals("bla", requestUri.getHost());
+      assertEquals(123, requestUri.getPort());
+
+    } finally {
+      FitStaticServiceFactory.unbindService("123");
+    }
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/a54a8302/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/fit/FitStaticServiceFactory.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/fit/FitStaticServiceFactory.java b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/fit/FitStaticServiceFactory.java
index b484661..8b34c49 100644
--- a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/fit/FitStaticServiceFactory.java
+++ b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/fit/FitStaticServiceFactory.java
@@ -51,6 +51,14 @@ public class FitStaticServiceFactory extends ODataServiceFactory {
   private static Map<String, ODataService> PORT_2_SERVICE = Collections
       .synchronizedMap(new HashMap<String, ODataService>());
 
+  public static void bindService(String key, final ODataService service) {
+    PORT_2_SERVICE.put(key, service);
+  }
+
+  public static void unbindService(String key) {
+    PORT_2_SERVICE.remove(key);
+  }
+
   public static void bindService(final TestServer server, final ODataService service) {
     PORT_2_SERVICE.put(createId(server), service);
   }