You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/11/19 18:00:53 UTC
svn commit: r1715214 - in /felix/trunk/http:
base/src/main/java/org/apache/felix/http/base/internal/registry/
base/src/test/java/org/apache/felix/http/base/internal/registry/
itest/src/test/java/org/apache/felix/http/itest/
Author: cziegeler
Date: Thu Nov 19 17:00:53 2015
New Revision: 1715214
URL: http://svn.apache.org/viewvc?rev=1715214&view=rev
Log:
FELIX-5109 : Wrong path matching for http whiteboard service
Modified:
felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/PathResolverFactoryTest.java
felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java
felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/ServletPatternTest.java
Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java?rev=1715214&r1=1715213&r2=1715214&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java Thu Nov 19 17:00:53 2015
@@ -22,6 +22,7 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import org.apache.felix.http.base.internal.handler.ServletHandler;
+import org.apache.felix.http.base.internal.service.HttpServiceFactory;
/**
* The path resolver factory creates a path resolver for a pattern.
@@ -55,7 +56,11 @@ public abstract class PathResolverFactor
{
return new PathMatcher(handler, pattern);
}
- return new ExactAndPathMatcher(handler, pattern);
+ else if ( handler != null && handler.getContextServiceId() == HttpServiceFactory.HTTP_SERVICE_CONTEXT_SERVICE_ID )
+ {
+ return new ExactAndPathMatcher(handler, pattern);
+ }
+ return new ExactMatcher(handler, pattern);
}
public static @Nonnull PathResolver createRegexMatcher(@Nonnull final String regex)
@@ -184,7 +189,7 @@ public abstract class PathResolverFactor
public ExactAndPathMatcher(final ServletHandler handler, final String pattern)
{
- super(handler, pattern, 4);
+ super(handler, pattern, 5);
this.path = pattern;
this.prefix = pattern.concat("/");
}
@@ -221,18 +226,63 @@ public abstract class PathResolverFactor
}
}
+ public static final class ExactMatcher extends AbstractMatcher
+ {
+ private final String path;
+
+ public ExactMatcher(final ServletHandler handler, final String pattern)
+ {
+ super(handler, pattern, 5);
+ this.path = pattern;
+ }
+
+ @Override
+ public PathResolution resolve(final String uri) {
+ if ( uri.equals(this.path) )
+ {
+ final PathResolution pr = new PathResolution();
+ pr.servletPath = uri;
+ pr.pathInfo = null;
+ pr.requestURI = uri;
+ pr.handler = this.getServletHandler();
+
+ return pr;
+ }
+ return null;
+ }
+
+ @Override
+ public int getOrdering()
+ {
+ return this.path.length();
+ }
+ }
+
public static final class PathMatcher extends AbstractMatcher
{
private final String prefix;
+ private final String path;
+
public PathMatcher(final ServletHandler handler, final String pattern)
{
super(handler, pattern, 4);
this.prefix = pattern.substring(0, pattern.length() - 1);
+ this.path = pattern.substring(0, pattern.length() - 2);
}
@Override
public PathResolution resolve(final String uri) {
+ if ( uri.equals(this.path) )
+ {
+ final PathResolution pr = new PathResolution();
+ pr.servletPath = this.path;
+ pr.pathInfo = null;
+ pr.requestURI = uri;
+ pr.handler = this.getServletHandler();
+
+ return pr;
+ }
if ( uri.startsWith(this.prefix) )
{
final PathResolution pr = new PathResolution();
Modified: felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/PathResolverFactoryTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/PathResolverFactoryTest.java?rev=1715214&r1=1715213&r2=1715214&view=diff
==============================================================================
--- felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/PathResolverFactoryTest.java (original)
+++ felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/PathResolverFactoryTest.java Thu Nov 19 17:00:53 2015
@@ -62,4 +62,17 @@ public class PathResolverFactoryTest {
assertResult(pr, "/foo/bar", "/foo/bar", null);
assertResult(pr, "/foo", "/foo", null);
}
+
+ @Test public void testPathMatcher()
+ {
+ final PathResolver pr = PathResolverFactory.createPatternMatcher(null, "/*");
+ assertNotNull(pr);
+
+ assertResult(pr, "/foo", "", "/foo");
+ assertResult(pr, "/foo/bar", "", "/foo/bar");
+
+ assertResult(pr, "/", "", "/");
+
+ assertResult(pr, "", "", null);
+ }
}
Modified: felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java?rev=1715214&r1=1715213&r2=1715214&view=diff
==============================================================================
--- felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java (original)
+++ felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java Thu Nov 19 17:00:53 2015
@@ -26,6 +26,10 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
@@ -171,6 +175,20 @@ public class ServletRegistryTest {
assertEmpty(dto, holder);
}
+ @Test public void testMatcherOrdering() throws InvalidSyntaxException
+ {
+ final ServletHandler h1 = createServletHandler(1L, 0, "/foo");
+ final ServletHandler h2 = createServletHandler(2L, 0, "/foo/*");
+
+ final List<PathResolver> resolvers = new ArrayList<PathResolver>();
+ resolvers.add(PathResolverFactory.createPatternMatcher(h1, "/foo"));
+ resolvers.add(PathResolverFactory.createPatternMatcher(h2, "/foo/*"));
+
+ Collections.sort(resolvers);
+ assertEquals("/foo", resolvers.get(0).getPattern());
+ assertEquals("/foo/*", resolvers.get(1).getPattern());
+ }
+
@Test public void testServletOrdering() throws InvalidSyntaxException
{
final ServletHandler h1 = createServletHandler(1L, 0, "/foo");
@@ -195,16 +213,16 @@ public class ServletRegistryTest {
assertNull(pr);
pr = reg.resolve("/foo/bar");
- assertEquals("/foo/*", pr.patterns[0]);
- assertEquals(h2, pr.handler);
+ assertEquals("/foo", pr.patterns[0]);
+ assertEquals(h1, pr.handler);
pr = reg.resolve("/foo/rsrc");
assertEquals("/foo/rsrc", pr.patterns[0]);
assertEquals(h3, pr.handler);
pr = reg.resolve("/foo/rsrc/some");
- assertEquals("/foo/rsrc/*", pr.patterns[0]);
- assertEquals(h4, pr.handler);
+ assertEquals("/foo/rsrc", pr.patterns[0]);
+ assertEquals(h3, pr.handler);
pr = reg.resolve("/other");
assertEquals("/other", pr.patterns[0]);
Modified: felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/ServletPatternTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/ServletPatternTest.java?rev=1715214&r1=1715213&r2=1715214&view=diff
==============================================================================
--- felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/ServletPatternTest.java (original)
+++ felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/ServletPatternTest.java Thu Nov 19 17:00:53 2015
@@ -257,4 +257,18 @@ public class ServletPatternTest extends
assertTrue(initLatch.await(5, TimeUnit.SECONDS));
assertContent("servlet2", createURL("/a/b/test/servlet"));
}
+
+ @Test
+ public void pathMatchingTest() throws Exception
+ {
+ setupLatches(1);
+
+ setupContext("contextA", "/a");
+
+ setupServlet("servlet1", new String[]{ "/servlet/*" }, 1, "contextA");
+
+ assertTrue(initLatch.await(5, TimeUnit.SECONDS));
+ assertContent("servlet1", createURL("/a/servlet/foo"));
+ assertContent("servlet1", createURL("/a/servlet"));
+ }
}