aboutsummaryrefslogtreecommitdiff
path: root/extensions
diff options
context:
space:
mode:
authorBruno Bieth <biethb@gmail.com>2014-10-17 14:19:44 +0200
committerBruno Bieth <biethb@gmail.com>2014-10-18 16:20:07 +0200
commit3d494420fcc4fd4e4fdf3e688375b4a5df04b99b (patch)
treeb34e13077dde5d978811ee9129dbcfd34dde8f76 /extensions
parentc040e3797e30f4b52df1a10637259b2e08f1c0de (diff)
downloadguice-3d494420fcc4fd4e4fdf3e688375b4a5df04b99b.tar.gz
Fix RequestDispatcherRequestWrapper inconsistency between `getRequestURI` and `getRequestURL`
Diffstat (limited to 'extensions')
-rw-r--r--extensions/servlet/src/com/google/inject/servlet/ManagedServletPipeline.java32
-rw-r--r--extensions/servlet/test/com/google/inject/servlet/ServletPipelineRequestDispatcherTest.java44
2 files changed, 73 insertions, 3 deletions
diff --git a/extensions/servlet/src/com/google/inject/servlet/ManagedServletPipeline.java b/extensions/servlet/src/com/google/inject/servlet/ManagedServletPipeline.java
index 4ca0f2ee..455551a4 100644
--- a/extensions/servlet/src/com/google/inject/servlet/ManagedServletPipeline.java
+++ b/extensions/servlet/src/com/google/inject/servlet/ManagedServletPipeline.java
@@ -128,7 +128,7 @@ class ManagedServletPipeline {
ServletRequest requestToProcess;
if (servletRequest instanceof HttpServletRequest) {
- requestToProcess = new RequestDispatcherRequestWrapper(servletRequest, newRequestUri);
+ requestToProcess = wrapRequest((HttpServletRequest)servletRequest, newRequestUri);
} else {
// This should never happen, but instead of throwing an exception
// we will allow a happy case pass thru for maximum tolerance to
@@ -164,6 +164,11 @@ class ManagedServletPipeline {
return null;
}
+ // visible for testing
+ static HttpServletRequest wrapRequest(HttpServletRequest request, String newUri) {
+ return new RequestDispatcherRequestWrapper(request, newUri);
+ }
+
/**
* A Marker constant attribute that when present in the request indicates to Guice servlet that
* this request has been generated by a request dispatcher rather than the servlet pipeline.
@@ -174,8 +179,8 @@ class ManagedServletPipeline {
private static class RequestDispatcherRequestWrapper extends HttpServletRequestWrapper {
private final String newRequestUri;
- public RequestDispatcherRequestWrapper(ServletRequest servletRequest, String newRequestUri) {
- super((HttpServletRequest) servletRequest);
+ public RequestDispatcherRequestWrapper(HttpServletRequest servletRequest, String newRequestUri) {
+ super(servletRequest);
this.newRequestUri = newRequestUri;
}
@@ -183,5 +188,26 @@ class ManagedServletPipeline {
public String getRequestURI() {
return newRequestUri;
}
+
+ @Override
+ public StringBuffer getRequestURL() {
+ StringBuffer url = new StringBuffer();
+ String scheme = getScheme();
+ int port = getServerPort();
+
+ url.append(scheme);
+ url.append("://");
+ url.append(getServerName());
+ // port might be -1 in some cases (see java.net.URL.getPort)
+ if (port > 0 &&
+ (("http".equals(scheme) && (port != 80)) ||
+ ("https".equals(scheme) && (port != 443)))) {
+ url.append(':');
+ url.append(port);
+ }
+ url.append(getRequestURI());
+
+ return (url);
+ }
}
}
diff --git a/extensions/servlet/test/com/google/inject/servlet/ServletPipelineRequestDispatcherTest.java b/extensions/servlet/test/com/google/inject/servlet/ServletPipelineRequestDispatcherTest.java
index 6343ac55..91abe9cd 100644
--- a/extensions/servlet/test/com/google/inject/servlet/ServletPipelineRequestDispatcherTest.java
+++ b/extensions/servlet/test/com/google/inject/servlet/ServletPipelineRequestDispatcherTest.java
@@ -266,6 +266,50 @@ public class ServletPipelineRequestDispatcherTest extends TestCase {
finally {
verify(injector, mockRequest, mockResponse, mockBinding);
}
+ }
+
+ public final void testWrappedRequestUriAndUrlConsistency() {
+ final HttpServletRequest mockRequest = createMock(HttpServletRequest.class);
+ expect(mockRequest.getScheme()).andReturn("http");
+ expect(mockRequest.getServerName()).andReturn("the.server");
+ expect(mockRequest.getServerPort()).andReturn(12345);
+ replay(mockRequest);
+ HttpServletRequest wrappedRequest = ManagedServletPipeline.wrapRequest(mockRequest, "/new-uri");
+ assertEquals("/new-uri", wrappedRequest.getRequestURI());
+ assertEquals("http://the.server:12345/new-uri", wrappedRequest.getRequestURL().toString());
+ }
+
+ public final void testWrappedRequestUrlNegativePort() {
+ final HttpServletRequest mockRequest = createMock(HttpServletRequest.class);
+ expect(mockRequest.getScheme()).andReturn("http");
+ expect(mockRequest.getServerName()).andReturn("the.server");
+ expect(mockRequest.getServerPort()).andReturn(-1);
+ replay(mockRequest);
+ HttpServletRequest wrappedRequest = ManagedServletPipeline.wrapRequest(mockRequest, "/new-uri");
+ assertEquals("/new-uri", wrappedRequest.getRequestURI());
+ assertEquals("http://the.server/new-uri", wrappedRequest.getRequestURL().toString());
+ }
+
+ public final void testWrappedRequestUrlDefaultPort() {
+ final HttpServletRequest mockRequest = createMock(HttpServletRequest.class);
+ expect(mockRequest.getScheme()).andReturn("http");
+ expect(mockRequest.getServerName()).andReturn("the.server");
+ expect(mockRequest.getServerPort()).andReturn(80);
+ replay(mockRequest);
+ HttpServletRequest wrappedRequest = ManagedServletPipeline.wrapRequest(mockRequest, "/new-uri");
+ assertEquals("/new-uri", wrappedRequest.getRequestURI());
+ assertEquals("http://the.server/new-uri", wrappedRequest.getRequestURL().toString());
+ }
+
+ public final void testWrappedRequestUrlDefaultHttpsPort() {
+ final HttpServletRequest mockRequest = createMock(HttpServletRequest.class);
+ expect(mockRequest.getScheme()).andReturn("https");
+ expect(mockRequest.getServerName()).andReturn("the.server");
+ expect(mockRequest.getServerPort()).andReturn(443);
+ replay(mockRequest);
+ HttpServletRequest wrappedRequest = ManagedServletPipeline.wrapRequest(mockRequest, "/new-uri");
+ assertEquals("/new-uri", wrappedRequest.getRequestURI());
+ assertEquals("https://the.server/new-uri", wrappedRequest.getRequestURL().toString());
}
}