This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/felix-dev.git
The following commit(s) were added to refs/heads/master by this push:
new d3bc7fd FELIX-6498 : Support servlet api 4.0
d3bc7fd is described below
commit d3bc7fdbdf9695d7283984649159f35c4809ca6f
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Mon Jan 3 15:21:14 2022 +0100
FELIX-6498 : Support servlet api 4.0
---
.../http/base/internal/dispatch/Dispatcher.java | 3 +-
.../http/base/internal/dispatch/RequestInfo.java | 35 ++++++++--------
.../internal/dispatch/ServletResponseWrapper.java | 7 +++-
.../base/internal/registry/PathResolution.java | 6 +++
.../internal/registry/PathResolverFactory.java | 48 +++++++++++++++++++++-
.../base/internal/service/ServletContextImpl.java | 13 ++++--
.../whiteboard/SharedServletContextImpl.java | 7 +++-
7 files changed, 93 insertions(+), 26 deletions(-)
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 47efa9b..bcf5d76 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
@@ -134,7 +134,8 @@ public final class Dispatcher
}
final ExtServletContext servletContext =
pr.handler.getContext();
- final RequestInfo requestInfo = new
RequestInfo(pr.servletPath, pr.pathInfo, null, req.getRequestURI(),
pr.handler.getName(), pr.matchedPattern, false);
+ final RequestInfo requestInfo = new
RequestInfo(pr.servletPath, pr.pathInfo, null, req.getRequestURI(),
+ pr.handler.getName(), pr.matchedPattern,
pr.matchValue, pr.match, false);
final HttpServletRequest wrappedRequest = new
ServletRequestWrapper(req, servletContext, requestInfo, null,
pr.handler.getServletInfo().isAsyncSupported(),
pr.handler.getMultipartConfig(),
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 1b63f4f..ce52453 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
@@ -28,8 +28,9 @@ public final class RequestInfo implements HttpServletMapping
final String pathInfo;
final String queryString;
final String requestURI;
- private final String servletName;
- private final String servletPattern;
+ private final String matchServletName;
+ private final String matchPattern;
+ private final String matchValue;
private final MappingMatch match;
final boolean nameMatch;
@@ -39,46 +40,46 @@ public final class RequestInfo implements HttpServletMapping
* @param pathInfo The path info
* @param queryString The query string
* @param requestURI The request uri
- * @param servletName The servlet name
- * @param servletPattern The servlet pattern
+ * @param matchServletName The servlet name
+ * @param matchPattern The servlet pattern
+ * @param matchValue The value matching
+ * @param match The match type
* @param nameMatch Is named dispatcher
*/
public RequestInfo(final String servletPath,
final String pathInfo,
final String queryString,
final String requestURI,
- final String servletName,
- final String servletPattern,
+ final String matchServletName,
+ final String matchPattern,
+ final String matchValue,
+ final MappingMatch match,
final boolean nameMatch)
{
this.servletPath = servletPath;
this.pathInfo = pathInfo;
this.queryString = queryString;
this.requestURI = requestURI;
- this.servletName = servletName;
- this.servletPattern = servletPattern;
- if ( "".equals(servletPattern) ) {
- this.match = MappingMatch.DEFAULT;
- } else {
- this.match = MappingMatch.PATH;
- }
+ this.matchServletName = matchServletName;
+ this.matchPattern = matchPattern;
+ this.matchValue = matchValue;
+ this.match = match;
this.nameMatch = nameMatch;
}
@Override
public String getMatchValue() {
- // TODO - this is wrong
- return this.servletPattern;
+ return this.matchValue;
}
@Override
public String getPattern() {
- return this.servletPattern;
+ return this.matchPattern;
}
@Override
public String getServletName() {
- return this.servletName;
+ return this.matchServletName;
}
@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 28e9071..e0a2615 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,12 @@ final class ServletResponseWrapper extends
HttpServletResponseWrapper
final String pathInfo = request.getRequestURI();
final String queryString = null; // XXX
- final RequestInfo requestInfo = new
RequestInfo(servletPath, pathInfo, queryString, pathInfo,
request.getHttpServletMapping().getServletName(),
request.getHttpServletMapping().getPattern(), false);
+ final RequestInfo requestInfo = new
RequestInfo(servletPath, pathInfo, queryString, pathInfo,
+
request.getHttpServletMapping().getServletName(),
+ request.getHttpServletMapping().getPattern(),
+
request.getHttpServletMapping().getMatchValue(),
+
request.getHttpServletMapping().getMappingMatch(),
+ false);
final FilterHandler[] filterHandlers =
errorRegistry.getFilterHandlers(errorResolution, DispatcherType.ERROR,
request.getRequestURI());
diff --git
a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolution.java
b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolution.java
index 696c931..3b210cd 100644
---
a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolution.java
+++
b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolution.java
@@ -16,6 +16,8 @@
*/
package org.apache.felix.http.base.internal.registry;
+import javax.servlet.http.MappingMatch;
+
/**
* Resolution of a servlet based on the path
*/
@@ -30,4 +32,8 @@ public class PathResolution extends ServletResolution {
public String[] patterns;
public String matchedPattern;
+
+ public MappingMatch match;
+
+ public String matchValue;
}
diff --git
a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
index d3a9ec4..94be252 100644
---
a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
+++
b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
@@ -18,11 +18,12 @@ package org.apache.felix.http.base.internal.registry;
import java.util.regex.Pattern;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
+import javax.servlet.http.MappingMatch;
import org.apache.felix.http.base.internal.handler.ServletHandler;
import org.apache.felix.http.base.internal.service.HttpServiceFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* The path resolver factory creates a path resolver for a pattern.
@@ -156,6 +157,10 @@ public abstract class PathResolverFactory {
pr.requestURI = uri;
pr.handler = this.getServletHandler();
+ pr.matchedPattern = this.getPattern();
+ pr.match = MappingMatch.CONTEXT_ROOT;
+ pr.matchValue = this.getPattern();
+
return pr;
}
return null;
@@ -177,6 +182,10 @@ public abstract class PathResolverFactory {
pr.requestURI = uri;
pr.handler = this.getServletHandler();
+ pr.matchedPattern = this.getPattern();
+ pr.match = MappingMatch.DEFAULT;
+ pr.matchValue = "";
+
return pr;
}
}
@@ -204,6 +213,11 @@ public abstract class PathResolverFactory {
pr.requestURI = uri;
pr.handler = this.getServletHandler();
+ pr.matchedPattern = this.getPattern();
+ pr.match = MappingMatch.EXACT;
+ final int pos = uri.lastIndexOf("/");
+ pr.matchValue = uri.substring(pos + 1, uri.length());
+
return pr;
}
else if ( uri.startsWith(prefix) )
@@ -214,6 +228,11 @@ public abstract class PathResolverFactory {
pr.requestURI = uri;
pr.handler = this.getServletHandler();
+ pr.matchedPattern = this.getPattern();
+ pr.match = MappingMatch.PATH;
+ final int pos = uri.lastIndexOf("/");
+ pr.matchValue = uri.substring(pos + 1, uri.length());
+
return pr;
}
return null;
@@ -246,6 +265,11 @@ public abstract class PathResolverFactory {
pr.requestURI = uri;
pr.handler = this.getServletHandler();
+ pr.matchedPattern = this.getPattern();
+ pr.match = MappingMatch.EXACT;
+ final int pos = uri.lastIndexOf("/");
+ pr.matchValue = uri.substring(pos + 1, uri.length());
+
return pr;
}
return null;
@@ -281,6 +305,11 @@ public abstract class PathResolverFactory {
pr.requestURI = uri;
pr.handler = this.getServletHandler();
+ pr.matchedPattern = this.getPattern();
+ pr.match = MappingMatch.EXACT;
+ final int pos = uri.lastIndexOf("/");
+ pr.matchValue = uri.substring(pos + 1, uri.length());
+
return pr;
}
if ( uri.startsWith(this.prefix) )
@@ -291,6 +320,11 @@ public abstract class PathResolverFactory {
pr.requestURI = uri;
pr.handler = this.getServletHandler();
+ pr.matchedPattern = this.getPattern();
+ pr.match = MappingMatch.PATH;
+ final int pos = uri.lastIndexOf("/");
+ pr.matchValue = uri.substring(pos + 1, uri.length());
+
return pr;
}
return null;
@@ -323,6 +357,11 @@ public abstract class PathResolverFactory {
pr.requestURI = uri;
pr.handler = this.getServletHandler();
+ pr.matchedPattern = this.getPattern();
+ pr.match = MappingMatch.EXTENSION;
+ final int pos = uri.lastIndexOf("/");
+ pr.matchValue = uri.substring(pos + 1, uri.length() -
this.extension.length());
+
return pr;
}
return null;
@@ -354,6 +393,11 @@ public abstract class PathResolverFactory {
pr.servletPath = uri;
pr.requestURI = uri;
+ // regex is not supported by servlet spec, we use PATH matching
+ pr.matchedPattern = this.getPattern();
+ pr.match = MappingMatch.PATH;
+ pr.matchValue = uri;
+
return pr;
}
return null;
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 fddff41..536ee9d 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
@@ -48,6 +48,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionListener;
+import javax.servlet.http.MappingMatch;
import org.apache.felix.http.base.internal.HttpConfig;
import org.apache.felix.http.base.internal.context.ExtServletContext;
@@ -509,7 +510,8 @@ public class ServletContextImpl implements ExtServletContext
resolution.handler = servletHandler;
resolution.handlerRegistry = this.handlerRegistry;
// TODO - what is the path of a named servlet?
- final RequestInfo requestInfo = new RequestInfo("", null, null,
null, null, "", true);
+ final RequestInfo requestInfo = new RequestInfo("", null, null,
null, name,
+ "", "", MappingMatch.EXACT, true);
dispatcher = new RequestDispatcherImpl(resolution, requestInfo);
}
else
@@ -544,8 +546,13 @@ public class ServletContextImpl implements
ExtServletContext
if ( pathResolution != null )
{
pathResolution.handlerRegistry = this.handlerRegistry;
- final RequestInfo requestInfo = new
RequestInfo(pathResolution.servletPath, pathResolution.pathInfo, query,
UriUtils.concat(this.getContextPath(), encodedRequestURI),
- pathResolution.handler.getName(),
pathResolution.matchedPattern, false);
+ final RequestInfo requestInfo = new
RequestInfo(pathResolution.servletPath,
+ pathResolution.pathInfo,
+ query,
+ UriUtils.concat(this.getContextPath(), encodedRequestURI),
+ pathResolution.handler.getName(),
+ pathResolution.matchedPattern,
+ pathResolution.matchValue, pathResolution.match, false);
dispatcher = new RequestDispatcherImpl(pathResolution,
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 5f74092..13132af 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
@@ -42,6 +42,7 @@ import javax.servlet.ServletRegistration.Dynamic;
import javax.servlet.SessionCookieConfig;
import javax.servlet.SessionTrackingMode;
import javax.servlet.descriptor.JspConfigDescriptor;
+import javax.servlet.http.MappingMatch;
import org.apache.felix.http.base.internal.dispatch.RequestDispatcherImpl;
import org.apache.felix.http.base.internal.dispatch.RequestInfo;
@@ -320,7 +321,7 @@ public class SharedServletContextImpl implements
ServletContext
resolution.handler = servletHandler;
resolution.handlerRegistry = this.registry;
// TODO - what is the path of a named servlet?
- final RequestInfo requestInfo = new RequestInfo("", null, null,
null, null, "", true);
+ final RequestInfo requestInfo = new RequestInfo("", null, null,
null, name, "", "", MappingMatch.EXACT, true);
dispatcher = new RequestDispatcherImpl(resolution, requestInfo);
}
else
@@ -357,7 +358,9 @@ public class SharedServletContextImpl implements
ServletContext
pathResolution.handlerRegistry = this.registry;
final RequestInfo requestInfo = new
RequestInfo(pathResolution.servletPath, pathResolution.pathInfo, query,
UriUtils.concat(this.contextPath, encodedRequestURI),
- pathResolution.handler.getName(),
pathResolution.matchedPattern, false);
+ pathResolution.handler.getName(),
pathResolution.matchedPattern,
+ pathResolution.matchValue, pathResolution.match,
+ false);
dispatcher = new RequestDispatcherImpl(pathResolution,
requestInfo);
}
else