FELIX-5093 : HttpServletRequest.getRequestURI is broken for escaped char in URL since 3.1.0
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1716611 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
index 4d46872..db787ca 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
@@ -81,7 +81,7 @@
}
}
- // get full path
+ // get full decoded path for dispatching
// we can't use req.getRequestURI() or req.getRequestURL() as these are returning the encoded path
String path = req.getServletPath();
if ( path == null )
@@ -107,7 +107,7 @@
}
final ExtServletContext servletContext = pr.handler.getContext();
- final RequestInfo requestInfo = new RequestInfo(pr.servletPath, pr.pathInfo, null);
+ final RequestInfo requestInfo = new RequestInfo(pr.servletPath, pr.pathInfo, null, req.getRequestURI());
final HttpServletRequest wrappedRequest = new ServletRequestWrapper(req, servletContext, requestInfo, null,
pr.handler.getContextServiceId(),
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/RequestInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/RequestInfo.java
index c7a082f..c9112dc 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/RequestInfo.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/RequestInfo.java
@@ -16,10 +16,6 @@
*/
package org.apache.felix.http.base.internal.dispatch;
-import static org.apache.felix.http.base.internal.util.UriUtils.concat;
-
-import org.apache.felix.http.base.internal.util.UriUtils;
-
public final class RequestInfo
{
final String servletPath;
@@ -27,12 +23,15 @@
final String queryString;
final String requestURI;
- public RequestInfo(String servletPath, String pathInfo, String queryString)
+ public RequestInfo(final String servletPath,
+ final String pathInfo,
+ final String queryString,
+ final String requestURI)
{
this.servletPath = servletPath;
this.pathInfo = pathInfo;
this.queryString = queryString;
- this.requestURI = UriUtils.compactPath(concat(servletPath, pathInfo));
+ this.requestURI = requestURI;
}
@Override
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletRequestWrapper.java b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletRequestWrapper.java
index d2d2519..ebc9b67 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletRequestWrapper.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletRequestWrapper.java
@@ -51,12 +51,12 @@
private final ExtServletContext servletContext;
private final long contextId;
private final boolean asyncSupported;
-
- public ServletRequestWrapper(HttpServletRequest req,
- ExtServletContext servletContext,
+
+ public ServletRequestWrapper(HttpServletRequest req,
+ ExtServletContext servletContext,
RequestInfo requestInfo,
- DispatcherType type,
- final Long contextId,
+ DispatcherType type,
+ final Long contextId,
final boolean asyncSupported)
{
super(req);
@@ -78,7 +78,7 @@
// meaning that the request information comes from the *original* request...
if (INCLUDE_REQUEST_URI.equals(name))
{
- return concat(request.getContextPath(), this.requestInfo.requestURI);
+ return this.requestInfo.requestURI;
}
else if (INCLUDE_CONTEXT_PATH.equals(name))
{
@@ -202,7 +202,7 @@
{
return super.getRequestURI();
}
- return concat(getContextPath(), this.requestInfo.requestURI);
+ return this.requestInfo.requestURI;
}
@Override
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletResponseWrapper.java b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletResponseWrapper.java
index e12764e..f607cee 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletResponseWrapper.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletResponseWrapper.java
@@ -101,7 +101,7 @@
final String pathInfo = request.getRequestURI();
final String queryString = null; // XXX
- final RequestInfo requestInfo = new RequestInfo(servletPath, pathInfo, queryString);
+ final RequestInfo requestInfo = new RequestInfo(servletPath, pathInfo, queryString, pathInfo);
final FilterHandler[] filterHandlers = errorRegistry.getFilterHandlers(errorResolution, DispatcherType.ERROR, request.getRequestURI());
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java b/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java
index d28b01c..4b2c6e9 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java
@@ -58,6 +58,7 @@
import org.apache.felix.http.base.internal.registry.PerContextHandlerRegistry;
import org.apache.felix.http.base.internal.registry.ServletResolution;
import org.apache.felix.http.base.internal.util.MimeTypes;
+import org.apache.felix.http.base.internal.util.UriUtils;
import org.osgi.framework.Bundle;
import org.osgi.service.http.HttpContext;
@@ -517,7 +518,7 @@
resolution.handler = servletHandler;
resolution.handlerRegistry = this.handlerRegistry;
// TODO - what is the path of a named servlet?
- final RequestInfo requestInfo = new RequestInfo("", null, null);
+ final RequestInfo requestInfo = new RequestInfo("", null, null, null);
dispatcher = new RequestDispatcherImpl(resolution, requestInfo);
}
else
@@ -544,11 +545,8 @@
path = path.substring(0, q);
}
// TODO remove path parameters...
- String requestURI = decodePath(removeDotSegments(path));
- if ( requestURI == null )
- {
- requestURI = "";
- }
+ final String encodedRequestURI = path == null ? "" : removeDotSegments(path);
+ final String requestURI = decodePath(encodedRequestURI);
final RequestDispatcher dispatcher;
final PathResolution pathResolution = this.handlerRegistry.resolve(requestURI);
@@ -557,7 +555,7 @@
final ServletResolution resolution = new ServletResolution();
resolution.handler = pathResolution.handler;
resolution.handlerRegistry = this.handlerRegistry;
- final RequestInfo requestInfo = new RequestInfo(pathResolution.servletPath, pathResolution.pathInfo, query);
+ final RequestInfo requestInfo = new RequestInfo(pathResolution.servletPath, pathResolution.pathInfo, query, UriUtils.concat(this.getContextPath(), encodedRequestURI));
dispatcher = new RequestDispatcherImpl(resolution, requestInfo);
}
else
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java
index 339a1f8..e497573 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java
@@ -49,6 +49,7 @@
import org.apache.felix.http.base.internal.registry.PathResolution;
import org.apache.felix.http.base.internal.registry.PerContextHandlerRegistry;
import org.apache.felix.http.base.internal.registry.ServletResolution;
+import org.apache.felix.http.base.internal.util.UriUtils;
/**
* This servlet context implementation represents the shared
@@ -318,7 +319,7 @@
resolution.handler = servletHandler;
resolution.handlerRegistry = this.registry;
// TODO - what is the path of a named servlet?
- final RequestInfo requestInfo = new RequestInfo("", null, null);
+ final RequestInfo requestInfo = new RequestInfo("", null, null, null);
dispatcher = new RequestDispatcherImpl(resolution, requestInfo);
}
else
@@ -345,11 +346,8 @@
path = path.substring(0, q);
}
// TODO remove path parameters...
- String requestURI = decodePath(removeDotSegments(path));
- if ( requestURI == null )
- {
- requestURI = "";
- }
+ final String encodedRequestURI = path == null ? "" : removeDotSegments(path);
+ final String requestURI = decodePath(encodedRequestURI);
final RequestDispatcher dispatcher;
final PathResolution pathResolution = this.registry.resolve(requestURI);
@@ -358,7 +356,8 @@
final ServletResolution resolution = new ServletResolution();
resolution.handler = pathResolution.handler;
resolution.handlerRegistry = this.registry;
- final RequestInfo requestInfo = new RequestInfo(pathResolution.servletPath, pathResolution.pathInfo, query);
+ final RequestInfo requestInfo = new RequestInfo(pathResolution.servletPath, pathResolution.pathInfo, query,
+ UriUtils.concat(this.contextPath, encodedRequestURI));
dispatcher = new RequestDispatcherImpl(resolution, requestInfo);
}
else
@@ -426,6 +425,7 @@
return this.context.getSessionCookieConfig();
}
+ @SuppressWarnings("deprecation")
@Override
public void log(final Exception cause, final String message)
{