diff --git a/.gitignore b/.gitignore
index cd084872657..12ab1b6945c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@
# maven
target/
*/src/main/java/META-INF/
+*.versionsBackup
# common junk
*.log
@@ -34,3 +35,6 @@ target/
# merge tooling
*.orig
+
+#maven
+*.versionsBackup
diff --git a/VERSION.txt b/VERSION.txt
index 359eb30f510..4192fb682c6 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1,4 +1,10 @@
-jetty-7.6.0-SNAPSHOT
+jetty-7.6.1-SNAPSHOT
+
+jetty-7.6.0.v20120127 - 27 January 2012
+ + 368773 allow authentication to be set by non securityHandler handlers
+ + 368992 avoid update key while flushing during a write
+ + 369216 turned off the shared resource cache
+ + 369349 replace quotes with a space escape method
jetty-7.6.0.RC5 - 20 January 2012
+ 359329 Prevent reinvocation of LoginModule.login with jaspi for already
diff --git a/example-jetty-embedded/pom.xml b/example-jetty-embedded/pom.xml
index 3eb95b0ea27..63a378157e9 100644
--- a/example-jetty-embedded/pom.xml
+++ b/example-jetty-embedded/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
example-jetty-embedded
diff --git a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/DumpServlet.java b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/DumpServlet.java
new file mode 100644
index 00000000000..25a0985a59c
--- /dev/null
+++ b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/DumpServlet.java
@@ -0,0 +1,44 @@
+// ========================================================================
+// Copyright (c) 2009-2009 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+
+
+package org.eclipse.jetty.embedded;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@SuppressWarnings("serial")
+public class DumpServlet extends HttpServlet
+{
+ public DumpServlet()
+ {
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ response.setContentType("text/html");
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.getWriter().println("
DumpServlet
");
+ response.getWriter().println("requestURI=" + request.getRequestURI());
+ response.getWriter().println("contextPath=" + request.getContextPath());
+ response.getWriter().println("servletPath=" + request.getServletPath());
+ response.getWriter().println("pathInfo=" + request.getPathInfo());
+ response.getWriter().println("session=" + request.getSession(true).getId());
+ response.getWriter().println("
");
+ }
+}
\ No newline at end of file
diff --git a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/HelloServlet.java b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/HelloServlet.java
index 76b201e82ed..53c02f57874 100644
--- a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/HelloServlet.java
+++ b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/HelloServlet.java
@@ -40,7 +40,6 @@ public class HelloServlet extends HttpServlet
{
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
- response.getWriter().println("" + greeting + " SimpleServlet
");
- response.getWriter().println("session=" + request.getSession(true).getId());
+ response.getWriter().println("" + greeting + " from HelloServlet
");
}
}
\ No newline at end of file
diff --git a/jetty-aggregate/jetty-all-server/pom.xml b/jetty-aggregate/jetty-all-server/pom.xml
index 072ff23321e..441fe8c0435 100644
--- a/jetty-aggregate/jetty-all-server/pom.xml
+++ b/jetty-aggregate/jetty-all-server/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.aggregate
jetty-aggregate-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-all-server
diff --git a/jetty-aggregate/jetty-all/pom.xml b/jetty-aggregate/jetty-all/pom.xml
index 3a6eee3ac51..4b55a5c9f38 100644
--- a/jetty-aggregate/jetty-all/pom.xml
+++ b/jetty-aggregate/jetty-all/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.aggregate
jetty-aggregate-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-all
diff --git a/jetty-aggregate/jetty-client/pom.xml b/jetty-aggregate/jetty-client/pom.xml
index e30ee5b160a..4b6a1f5af70 100644
--- a/jetty-aggregate/jetty-client/pom.xml
+++ b/jetty-aggregate/jetty-client/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.aggregate
jetty-aggregate-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-client
diff --git a/jetty-aggregate/jetty-plus/pom.xml b/jetty-aggregate/jetty-plus/pom.xml
index ff9bf1f74c9..6b2dc68292e 100644
--- a/jetty-aggregate/jetty-plus/pom.xml
+++ b/jetty-aggregate/jetty-plus/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.aggregate
jetty-aggregate-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-plus
diff --git a/jetty-aggregate/jetty-server/pom.xml b/jetty-aggregate/jetty-server/pom.xml
index 8d3cdddcb2f..4c6b9559b3d 100644
--- a/jetty-aggregate/jetty-server/pom.xml
+++ b/jetty-aggregate/jetty-server/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.aggregate
jetty-aggregate-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-server
diff --git a/jetty-aggregate/jetty-servlet/pom.xml b/jetty-aggregate/jetty-servlet/pom.xml
index 2e4f9bd47ee..b84dfefaafc 100644
--- a/jetty-aggregate/jetty-servlet/pom.xml
+++ b/jetty-aggregate/jetty-servlet/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.aggregate
jetty-aggregate-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-servlet
diff --git a/jetty-aggregate/jetty-webapp/pom.xml b/jetty-aggregate/jetty-webapp/pom.xml
index 47090b07d8f..b01f1aae5b1 100644
--- a/jetty-aggregate/jetty-webapp/pom.xml
+++ b/jetty-aggregate/jetty-webapp/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.aggregate
jetty-aggregate-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-webapp
diff --git a/jetty-aggregate/jetty-websocket/pom.xml b/jetty-aggregate/jetty-websocket/pom.xml
index c650ef55103..982d2884229 100644
--- a/jetty-aggregate/jetty-websocket/pom.xml
+++ b/jetty-aggregate/jetty-websocket/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.aggregate
jetty-aggregate-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-websocket
diff --git a/jetty-aggregate/pom.xml b/jetty-aggregate/pom.xml
index 7de1ac8d379..9cda62492f4 100644
--- a/jetty-aggregate/pom.xml
+++ b/jetty-aggregate/pom.xml
@@ -4,7 +4,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
org.eclipse.jetty.aggregate
jetty-aggregate-project
diff --git a/jetty-ajp/pom.xml b/jetty-ajp/pom.xml
index c02155bea81..7ebc0f51cbf 100644
--- a/jetty-ajp/pom.xml
+++ b/jetty-ajp/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-ajp
diff --git a/jetty-annotations/pom.xml b/jetty-annotations/pom.xml
index a4b6c219f44..2e804956dd7 100644
--- a/jetty-annotations/pom.xml
+++ b/jetty-annotations/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-annotations
diff --git a/jetty-client/pom.xml b/jetty-client/pom.xml
index 02a0320bdd9..a273af541a7 100644
--- a/jetty-client/pom.xml
+++ b/jetty-client/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
diff --git a/jetty-continuation/pom.xml b/jetty-continuation/pom.xml
index 6c4c47b893a..2ce99f97153 100644
--- a/jetty-continuation/pom.xml
+++ b/jetty-continuation/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-continuation
diff --git a/jetty-deploy/pom.xml b/jetty-deploy/pom.xml
index 528e7ce46c0..f8e1e59c5b7 100644
--- a/jetty-deploy/pom.xml
+++ b/jetty-deploy/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-deploy
diff --git a/jetty-distribution/pom.xml b/jetty-distribution/pom.xml
index 173d546d426..9a86af25c46 100644
--- a/jetty-distribution/pom.xml
+++ b/jetty-distribution/pom.xml
@@ -3,7 +3,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
jetty-distribution
Jetty :: Distribution Assemblies
diff --git a/jetty-http-spi/pom.xml b/jetty-http-spi/pom.xml
index cf4900757c7..0ce5763e4a7 100644
--- a/jetty-http-spi/pom.xml
+++ b/jetty-http-spi/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-http-spi
diff --git a/jetty-http/pom.xml b/jetty-http/pom.xml
index 48de7f48335..e6674c7abb9 100644
--- a/jetty-http/pom.xml
+++ b/jetty-http/pom.xml
@@ -2,7 +2,7 @@
jetty-project
org.eclipse.jetty
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-http
diff --git a/jetty-io/pom.xml b/jetty-io/pom.xml
index 548bab2f30a..4787cd47913 100644
--- a/jetty-io/pom.xml
+++ b/jetty-io/pom.xml
@@ -2,7 +2,7 @@
jetty-project
org.eclipse.jetty
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-io
diff --git a/jetty-jaspi/pom.xml b/jetty-jaspi/pom.xml
index f06938ce0f8..483f5858e6b 100644
--- a/jetty-jaspi/pom.xml
+++ b/jetty-jaspi/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-jaspi
diff --git a/jetty-jmx/pom.xml b/jetty-jmx/pom.xml
index 4b9a0dc2a9d..97429c3d95b 100644
--- a/jetty-jmx/pom.xml
+++ b/jetty-jmx/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-jmx
diff --git a/jetty-jndi/pom.xml b/jetty-jndi/pom.xml
index 2a37fb7f390..d8c9b642534 100644
--- a/jetty-jndi/pom.xml
+++ b/jetty-jndi/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-jndi
diff --git a/jetty-monitor/pom.xml b/jetty-monitor/pom.xml
index bfff477df54..d291d3cc4d4 100644
--- a/jetty-monitor/pom.xml
+++ b/jetty-monitor/pom.xml
@@ -19,7 +19,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-monitor
diff --git a/jetty-nested/pom.xml b/jetty-nested/pom.xml
index 40da79b3cfe..9f69eb645bd 100644
--- a/jetty-nested/pom.xml
+++ b/jetty-nested/pom.xml
@@ -4,7 +4,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
jetty-nested
Jetty :: Nested
diff --git a/jetty-nosql/pom.xml b/jetty-nosql/pom.xml
index 43b99da8fe2..7e747ab3f8f 100644
--- a/jetty-nosql/pom.xml
+++ b/jetty-nosql/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-nosql
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
index aed5c0202e0..010a41204d4 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.osgi
jetty-osgi-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/jetty-osgi/jetty-osgi-boot-logback/pom.xml b/jetty-osgi/jetty-osgi-boot-logback/pom.xml
index 98a73a0ce47..7084874f75d 100644
--- a/jetty-osgi/jetty-osgi-boot-logback/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot-logback/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.osgi
jetty-osgi-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml
index 24e2cc919fa..ae393ea6ea5 100644
--- a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.osgi
jetty-osgi-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/jetty-osgi/jetty-osgi-boot/pom.xml b/jetty-osgi/jetty-osgi-boot/pom.xml
index 43ce529208f..c47b02c0db4 100644
--- a/jetty-osgi/jetty-osgi-boot/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.osgi
jetty-osgi-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/pom.xml b/jetty-osgi/jetty-osgi-equinoxtools/pom.xml
index 665b3af9679..b59c40c8d45 100644
--- a/jetty-osgi/jetty-osgi-equinoxtools/pom.xml
+++ b/jetty-osgi/jetty-osgi-equinoxtools/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.osgi
jetty-osgi-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/jetty-osgi/jetty-osgi-httpservice/pom.xml b/jetty-osgi/jetty-osgi-httpservice/pom.xml
index cb8f9d76281..f3cf6877ee8 100644
--- a/jetty-osgi/jetty-osgi-httpservice/pom.xml
+++ b/jetty-osgi/jetty-osgi-httpservice/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.osgi
jetty-osgi-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/jetty-osgi/pom.xml b/jetty-osgi/pom.xml
index ae30fdd313e..99ae8c07307 100644
--- a/jetty-osgi/pom.xml
+++ b/jetty-osgi/pom.xml
@@ -3,7 +3,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
../pom.xml
org.eclipse.jetty.osgi
diff --git a/jetty-osgi/test-jetty-osgi/pom.xml b/jetty-osgi/test-jetty-osgi/pom.xml
index a7f02120f2e..fdc943e7f13 100644
--- a/jetty-osgi/test-jetty-osgi/pom.xml
+++ b/jetty-osgi/test-jetty-osgi/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty.osgi
jetty-osgi-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/jetty-overlay-deployer/pom.xml b/jetty-overlay-deployer/pom.xml
index 75b8349308e..3f1330f3571 100644
--- a/jetty-overlay-deployer/pom.xml
+++ b/jetty-overlay-deployer/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-overlay-deployer
diff --git a/jetty-plus/pom.xml b/jetty-plus/pom.xml
index 391eb9691c7..a2a6f2c65ef 100644
--- a/jetty-plus/pom.xml
+++ b/jetty-plus/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-plus
diff --git a/jetty-policy/pom.xml b/jetty-policy/pom.xml
index 192234b2626..fc2930ec6f6 100644
--- a/jetty-policy/pom.xml
+++ b/jetty-policy/pom.xml
@@ -3,7 +3,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
jetty-policy
Jetty :: Policy Tool
diff --git a/jetty-rewrite/pom.xml b/jetty-rewrite/pom.xml
index cdfe6d1c5b0..8717dc55032 100644
--- a/jetty-rewrite/pom.xml
+++ b/jetty-rewrite/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-rewrite
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RegexTargetHandler.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RegexTargetHandler.java
new file mode 100644
index 00000000000..736f8245f9f
--- /dev/null
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RegexTargetHandler.java
@@ -0,0 +1,149 @@
+package org.eclipse.jetty.rewrite.handler;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.ContextHandler.Context;
+import org.eclipse.jetty.server.handler.ScopedHandler;
+import org.eclipse.jetty.util.component.AggregateLifeCycle;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+
+/* ------------------------------------------------------------ */
+/** A handle that uses regular expressions to select the target.
+ *
+ * This handler applies a list of regex to target name mappings to the URIs of requests.
+ * If the regex matches the URI, then the mapped target name is used in the nested
+ * call to {@link #doScope(String, Request, HttpServletRequest, HttpServletResponse)}.
+ *
+ * This handler should be installed as the first handler in a Context. It can be configured
+ * either with direct calls to {@link #addPatternTarget(String, String)} or by setting
+ * the context init parameters "org.eclipse.jetty.rewrite.handler.REGEX_MAPPINGS" to a comma
+ * separated list of strings in the format regex==target.
+ */
+public class RegexTargetHandler extends ScopedHandler
+{
+ private final static Logger LOG = Log.getLogger(RegexTargetHandler.class);
+ public final static String REGEX_MAPPINGS="org.eclipse.jetty.rewrite.handler.REGEX_MAPPINGS";
+ static class RegexMapping
+ {
+ RegexMapping(String regex,String target)
+ {
+ _pattern=Pattern.compile(regex);
+ _target=target;
+ }
+ final Pattern _pattern;
+ final String _target;
+
+ public String toString()
+ {
+ return _pattern+"=="+_target;
+ }
+ }
+
+ final private List _patterns = new CopyOnWriteArrayList();
+
+ /* ------------------------------------------------------------ */
+ /** Add a pattern to target mapping.
+ * @param pattern The regular expression pattern to match.
+ * @param target The target (normally servlet name) to handle the request
+ */
+ public void addPatternTarget(String pattern,String target)
+ {
+ _patterns.add(new RegexMapping(pattern,target));
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ protected void doStart() throws Exception
+ {
+ super.doStart();
+
+ Context context = ContextHandler.getCurrentContext();
+ if (context!=null)
+ {
+ String config=context.getInitParameter(REGEX_MAPPINGS);
+ LOG.debug("{}={}",REGEX_MAPPINGS,config);
+ String[] mappings=config.split("\\s*,\\s*");
+ for (String mapping : mappings)
+ {
+ mapping=mapping.trim();
+ String[] parts=mapping.split("\\s*==\\s*");
+ if (parts.length==2)
+ {
+ String pattern=parts[0];
+ String target=parts[1];
+ addPatternTarget(pattern,target);
+ }
+ else
+ LOG.warn("Bad regex mapping: "+mapping);
+ }
+ }
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public void doScope(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+ {
+ for (RegexTargetHandler.RegexMapping rm : _patterns)
+ {
+ Matcher m=rm._pattern.matcher(target);
+ if (m.matches())
+ {
+ String new_target = rm._target;
+ final String sp;
+ final String pi;
+
+ if (m.groupCount()==1&&target.endsWith(m.group(1)))
+ {
+ pi=m.group(1);
+ sp=target.substring(0,target.length()-pi.length());
+ }
+ else
+ {
+ sp=target;
+ pi=null;
+ }
+ baseRequest.setServletPath(sp);
+ baseRequest.setPathInfo(pi);
+ baseRequest.setAttribute("org.eclipse.jetty.servlet.REGEX_PATH",target);
+ super.nextScope(new_target,baseRequest,request,response);
+ return;
+ }
+ }
+ super.nextScope(target,baseRequest,request,response);
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public void doHandle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+ {
+ String path=(String)baseRequest.getAttribute("org.eclipse.jetty.servlet.REGEX_PATH");
+ if (path==null)
+ path=target;
+ else
+ baseRequest.setAttribute("org.eclipse.jetty.servlet.REGEX_PATH",null);
+
+ super.nextHandle(path,baseRequest,request,response);
+ }
+
+ /* ------------------------------------------------------------ */
+ public void dump(Appendable out, String indent) throws IOException
+ {
+ AggregateLifeCycle.dumpObject(out,this);
+ AggregateLifeCycle.dump(out,indent,_patterns,Collections.singletonList(getHandler()));
+ }
+
+
+}
\ No newline at end of file
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRule.java
index ce5700155f0..6c57e29bdf6 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRule.java
@@ -23,10 +23,13 @@ import org.eclipse.jetty.server.Request;
/**
* Rewrite the URI by matching with a regular expression.
* The replacement string may use $n" to replace the nth capture group.
+ * If the replacement string contains ? character, then it is split into a path
+ * and query string component. The returned target contains only the path.
*/
public class RewriteRegexRule extends RegexRule implements Rule.ApplyURI
{
private String _replacement;
+ private String _query;
/* ------------------------------------------------------------ */
public RewriteRegexRule()
@@ -43,7 +46,9 @@ public class RewriteRegexRule extends RegexRule implements Rule.ApplyURI
*/
public void setReplacement(String replacement)
{
- _replacement = replacement;
+ String[] split=replacement.split("\\?",2);
+ _replacement = split[0];
+ _query=split.length==2?split[1]:null;
}
@@ -54,32 +59,36 @@ public class RewriteRegexRule extends RegexRule implements Rule.ApplyURI
public String apply(String target, HttpServletRequest request, HttpServletResponse response, Matcher matcher) throws IOException
{
target=_replacement;
+ String query=_query;
for (int g=1;g<=matcher.groupCount();g++)
{
- String group = Matcher.quoteReplacement(matcher.group(g));
+ String group=matcher.group(g);
+ if (group==null)
+ group="";
+ else
+ group = Matcher.quoteReplacement(group);
target=target.replaceAll("\\$"+g,group);
+ if (query!=null)
+ query=query.replaceAll("\\$"+g,group);
}
+ if (query!=null)
+ request.setAttribute("org.eclipse.jetty.rewrite.handler.RewriteRegexRule.Q",query);
return target;
}
/* ------------------------------------------------------------ */
public void applyURI(Request request, String oldTarget, String newTarget) throws IOException
{
- Matcher matcher=_regex.matcher(request.getRequestURI());
- boolean matches = matcher.matches();
- if (matches)
+ request.setRequestURI(newTarget);
+ if (_query!=null)
{
- String uri=_replacement;
- for (int g=1;g<=matcher.groupCount();g++)
- {
- String group = Matcher.quoteReplacement(matcher.group(g));
- uri=uri.replaceAll("\\$"+g,group);
- }
- request.setRequestURI(uri);
+ String query=(String)request.getAttribute("org.eclipse.jetty.rewrite.handler.RewriteRegexRule.Q");
+ if (request.getQueryString()==null)
+ request.setQueryString(query);
+ else
+ request.setQueryString(request.getQueryString()+"&"+query);
}
- else
- request.setRequestURI(newTarget);
}
/* ------------------------------------------------------------ */
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RegexTargetHandlerTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RegexTargetHandlerTest.java
new file mode 100644
index 00000000000..c47937621df
--- /dev/null
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RegexTargetHandlerTest.java
@@ -0,0 +1,214 @@
+// ========================================================================
+// Copyright (c) 2006-2009 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+
+package org.eclipse.jetty.rewrite.handler;
+
+import static junit.framework.Assert.assertEquals;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.net.Socket;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequestWrapper;
+import javax.servlet.ServletResponseWrapper;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+import junit.framework.Assert;
+
+import org.eclipse.jetty.rewrite.handler.RegexTargetHandler;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class RegexTargetHandlerTest
+{
+ private static Server __server = new Server(0);
+ private static int __port;
+
+ @BeforeClass
+ public static void setup() throws Exception
+ {
+
+ ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+ context.setContextPath("/");
+ __server.setHandler(context);
+
+ // Serve some hello world servlets
+ context.addServlet(DispatchServletServlet.class,"/dispatch/*");
+ context.addServlet(new ServletHolder("HelloAll",new HelloServlet("Hello World")),"/*");
+ context.addServlet(new ServletHolder("Italian",new HelloServlet("Buongiorno Mondo")),"/it/*");
+ context.addServlet(new ServletHolder("French", new HelloServlet("Bonjour le Monde")),"/fr/*");
+
+ RegexTargetHandler regexHandler=new RegexTargetHandler();
+ regexHandler.setHandler(context.getHandler());
+ context.setHandler(regexHandler);
+
+ context.getInitParams().put(RegexTargetHandler.REGEX_MAPPINGS,
+ " .*\\.fr==French, \n"+
+ "/ciao(/.*)$==Italian");
+
+ __server.start();
+
+ __port=__server.getConnectors()[0].getLocalPort();
+ }
+
+ @AfterClass
+ public static void shutdown() throws Exception
+ {
+ __server.stop();
+ }
+
+
+ @Test
+ public void testNormal() throws Exception
+ {
+ String[] response=getResponse("/normal");
+ assertEquals("HTTP/1.1 200 OK",response[0]);
+ assertEquals("Hello World",response[1]);
+ assertEquals("",response[2]);
+ assertEquals("/normal",response[3]);
+
+ response=getResponse("/it/info");
+ assertEquals("HTTP/1.1 200 OK",response[0]);
+ assertEquals("Buongiorno Mondo",response[1]);
+ assertEquals("/it",response[2]);
+ assertEquals("/info",response[3]);
+ }
+
+ @Test
+ public void testFullMatch() throws Exception
+ {
+ String[] response=getResponse("/some/thing.fr");
+ assertEquals("HTTP/1.1 200 OK",response[0]);
+ assertEquals("Bonjour le Monde",response[1]);
+ assertEquals("/some/thing.fr",response[2]);
+ assertEquals("null",response[3]);
+ }
+
+ @Test
+ public void testCaptureMatch() throws Exception
+ {
+ String[] response=getResponse("/ciao/info");
+ assertEquals("HTTP/1.1 200 OK",response[0]);
+ assertEquals("Buongiorno Mondo",response[1]);
+ assertEquals("/ciao",response[2]);
+ assertEquals("/info",response[3]);
+ }
+
+ @Test
+ public void testDispatchFullMatch() throws Exception
+ {
+ String[] response=getResponse("/dispatch/xxx?forward=/some/thing.fr");
+ assertEquals("HTTP/1.1 200 OK",response[0]);
+ assertEquals("Bonjour le Monde",response[1]);
+ assertEquals("/some/thing.fr",response[2]);
+ assertEquals("null",response[3]);
+ }
+
+ @Test
+ public void testDispatchCaptureMatch() throws Exception
+ {
+ String[] response=getResponse("/dispatch/xxx?forward=/ciao/info");
+ assertEquals("HTTP/1.1 200 OK",response[0]);
+ assertEquals("Buongiorno Mondo",response[1]);
+ assertEquals("/ciao",response[2]);
+ assertEquals("/info",response[3]);
+ }
+
+
+ private String[] getResponse(String uri) throws Exception
+ {
+ Socket socket = new Socket("127.0.0.1",__port);
+
+ PrintWriter out = new PrintWriter(socket.getOutputStream());
+ out.print("GET "+uri+" HTTP/1.0\r\n\r\n");
+ out.flush();
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+
+ String[] response=new String[4];
+ response[0]=in.readLine();
+ //System.err.println(response[0]);
+
+ String line=in.readLine();
+ while(line.length()>0)
+ line=in.readLine();
+
+ response[1]=in.readLine();
+ //System.err.println(response[1]);
+ response[2]=in.readLine();
+ //System.err.println(response[2]);
+ response[3]=in.readLine();
+ //System.err.println(response[3]);
+
+ socket.close();
+ return response;
+ }
+
+
+ public static class HelloServlet extends HttpServlet implements Servlet
+ {
+ final String _hello;
+
+ public HelloServlet(String hello)
+ {
+ _hello=hello;
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ response.setStatus(200);
+ response.getWriter().println(_hello);
+ response.getWriter().println(request.getServletPath());
+ response.getWriter().println(request.getPathInfo());
+ }
+ }
+
+
+ public static class DispatchServletServlet extends HttpServlet implements Servlet
+ {
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ RequestDispatcher dispatcher = null;
+
+ if(request.getParameter("include")!=null)
+ {
+ dispatcher = getServletContext().getRequestDispatcher(request.getParameter("include"));
+ dispatcher.include(new HttpServletRequestWrapper(request), new HttpServletResponseWrapper(response));
+ }
+ else if(request.getParameter("forward")!=null)
+ {
+ dispatcher = getServletContext().getRequestDispatcher(request.getParameter("forward"));
+ dispatcher.forward(new HttpServletRequestWrapper(request), new HttpServletResponseWrapper(response));
+ }
+
+ }
+ }
+}
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRuleTest.java
index 35bb5f4ba0a..1464f67ab9c 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRuleTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRuleTest.java
@@ -23,11 +23,13 @@ public class RewriteRegexRuleTest extends AbstractRuleTestCase
{
private String[][] _tests=
{
- {"/foo/bar",".*","/replace","/replace"},
- {"/foo/bar","/xxx.*","/replace",null},
- {"/foo/bar","/(.*)/(.*)","/$2/$1/xxx","/bar/foo/xxx"},
- {"/foo/$bar",".*","/$replace","/$replace"},
- {"/foo/$bar","/foo/(.*)","/$1/replace","/$bar/replace"},
+ {"/foo/bar",".*","/replace","/replace",null},
+ {"/foo/bar","/xxx.*","/replace",null,null},
+ {"/foo/bar","/(.*)/(.*)","/$2/$1/xxx","/bar/foo/xxx",null},
+ {"/foo/bar","/(foo)/(.*)(bar)","/$3/$1/xxx$2","/bar/foo/xxx",null},
+ {"/foo/$bar",".*","/$replace","/$replace",null},
+ {"/foo/$bar","/foo/(.*)","/$1/replace","/$bar/replace",null},
+ {"/foo/bar/info","/foo/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2","/info/other","p1=bar"},
};
private RewriteRegexRule _rule;
@@ -47,6 +49,13 @@ public class RewriteRegexRuleTest extends AbstractRuleTestCase
_rule.setReplacement(test[2]);
String result = _rule.matchAndApply(test[0], _request, _response);
assertEquals(test[1], test[3], result);
+
+ _request.setRequestURI(test[0]);
+ _request.setQueryString(null);
+ _rule.applyURI(_request,test[0],result);
+
+ assertEquals(test[3], _request.getRequestURI());
+ assertEquals(test[4], _request.getQueryString());
}
}
}
diff --git a/jetty-security/pom.xml b/jetty-security/pom.xml
index 397991f6299..5a09732e232 100644
--- a/jetty-security/pom.xml
+++ b/jetty-security/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-security
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/SecurityHandler.java b/jetty-security/src/main/java/org/eclipse/jetty/security/SecurityHandler.java
index da34f2d6337..f6af0978805 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/SecurityHandler.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/SecurityHandler.java
@@ -469,7 +469,8 @@ public abstract class SecurityHandler extends HandlerWrapper implements Authenti
{
Authentication.User userAuth = (Authentication.User)authentication;
baseRequest.setAuthentication(authentication);
- previousIdentity = _identityService.associate(userAuth.getUserIdentity());
+ if (_identityService!=null)
+ previousIdentity = _identityService.associate(userAuth.getUserIdentity());
if (isAuthMandatory)
{
@@ -483,7 +484,8 @@ public abstract class SecurityHandler extends HandlerWrapper implements Authenti
}
handler.handle(pathInContext, baseRequest, request, response);
- authenticator.secureResponse(request, response, isAuthMandatory, userAuth);
+ if (authenticator!=null)
+ authenticator.secureResponse(request, response, isAuthMandatory, userAuth);
}
else if (authentication instanceof Authentication.Deferred)
{
diff --git a/jetty-server/pom.xml b/jetty-server/pom.xml
index 2b0dfa41526..03273f40bfe 100644
--- a/jetty-server/pom.xml
+++ b/jetty-server/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-server
diff --git a/jetty-servlet/pom.xml b/jetty-servlet/pom.xml
index 70ab5daf8a3..609a94dc28f 100644
--- a/jetty-servlet/pom.xml
+++ b/jetty-servlet/pom.xml
@@ -3,7 +3,7 @@
jetty-project
org.eclipse.jetty
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-servlet
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java
index 59299c608c4..2448ad29cf6 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java
@@ -81,7 +81,17 @@ public class ServletHolder extends Holder implements UserIdentity.Scope
public ServletHolder()
{
}
+
+ /* ---------------------------------------------------------------- */
+ /** Constructor for existing servlet.
+ */
+ public ServletHolder(String name,Servlet servlet)
+ {
+ setName(name);
+ setServlet(servlet);
+ }
+
/* ---------------------------------------------------------------- */
/** Constructor for existing servlet.
@@ -92,7 +102,16 @@ public class ServletHolder extends Holder implements UserIdentity.Scope
}
/* ---------------------------------------------------------------- */
- /** Constructor for existing servlet.
+ /** Constructor for servlet class.
+ */
+ public ServletHolder(String name,Class extends Servlet> servlet)
+ {
+ setName(name);
+ setHeldClass(servlet);
+ }
+
+ /* ---------------------------------------------------------------- */
+ /** Constructor for servlet class.
*/
public ServletHolder(Class extends Servlet> servlet)
{
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherTest.java
index b17796f0d4d..6aede63657e 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherTest.java
@@ -344,11 +344,16 @@ public class DispatcherTest
RequestDispatcher dispatcher = null;
if(request.getParameter("include")!=null)
+ {
dispatcher = getServletContext().getRequestDispatcher(request.getParameter("include"));
+ dispatcher.include(new ServletRequestWrapper(request), new ServletResponseWrapper(response));
+ }
else if(request.getParameter("forward")!=null)
+ {
dispatcher = getServletContext().getRequestDispatcher(request.getParameter("forward"));
+ dispatcher.forward(new ServletRequestWrapper(request), new ServletResponseWrapper(response));
+ }
- dispatcher.forward(new ServletRequestWrapper(request), new ServletResponseWrapper(response));
}
}
diff --git a/jetty-servlets/pom.xml b/jetty-servlets/pom.xml
index 9e112abff9e..3e2982199c3 100644
--- a/jetty-servlets/pom.xml
+++ b/jetty-servlets/pom.xml
@@ -3,7 +3,7 @@
jetty-project
org.eclipse.jetty
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-servlets
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CrossOriginFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CrossOriginFilter.java
index 67c6e7c5fbd..bb57608c4b4 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CrossOriginFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CrossOriginFilter.java
@@ -17,6 +17,7 @@ package org.eclipse.jetty.servlets;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Enumeration;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -215,10 +216,18 @@ public class CrossOriginFilter implements Filter
{
// WebSocket clients such as Chrome 5 implement a version of the WebSocket
// protocol that does not accept extra response headers on the upgrade response
- if ("Upgrade".equalsIgnoreCase(request.getHeader("Connection")) &&
- "WebSocket".equalsIgnoreCase(request.getHeader("Upgrade")))
+ for (Enumeration connections = request.getHeaders("Connection"); connections.hasMoreElements();)
{
- return false;
+ String connection = (String)connections.nextElement();
+ if ("Upgrade".equalsIgnoreCase(connection))
+ {
+ for (Enumeration upgrades = request.getHeaders("Upgrade"); upgrades.hasMoreElements();)
+ {
+ String upgrade = (String)upgrades.nextElement();
+ if ("WebSocket".equalsIgnoreCase(upgrade))
+ return false;
+ }
+ }
}
return true;
}
diff --git a/jetty-start/pom.xml b/jetty-start/pom.xml
index 7d622d115e6..52964c5b6b4 100644
--- a/jetty-start/pom.xml
+++ b/jetty-start/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-start
diff --git a/jetty-util/pom.xml b/jetty-util/pom.xml
index 9e5dc45445a..496c5863221 100644
--- a/jetty-util/pom.xml
+++ b/jetty-util/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-util
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/UrlEncoded.java b/jetty-util/src/main/java/org/eclipse/jetty/util/UrlEncoded.java
index 06741c0a130..87b2f2e4a28 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/UrlEncoded.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/UrlEncoded.java
@@ -462,52 +462,60 @@ public class UrlEncoded extends MultiMap implements Cloneable
int totalLength=0;
while ((b=in.read())>=0)
{
- switch ((char) b)
+ try
{
- case '&':
- value = buffer.length()==0?"":buffer.toString();
- buffer.reset();
- if (key != null)
- {
- map.add(key,value);
- }
- else if (value!=null&&value.length()>0)
- {
- map.add(value,"");
- }
- key = null;
- value=null;
- if (maxKeys>0 && map.size()>maxKeys)
- {
- LOG.warn("maxFormKeys limit exceeded keys>{}",maxKeys);
- return;
- }
- break;
-
- case '=':
- if (key!=null)
- {
+ switch ((char) b)
+ {
+ case '&':
+ value = buffer.length()==0?"":buffer.toString();
+ buffer.reset();
+ if (key != null)
+ {
+ map.add(key,value);
+ }
+ else if (value!=null&&value.length()>0)
+ {
+ map.add(value,"");
+ }
+ key = null;
+ value=null;
+ if (maxKeys>0 && map.size()>maxKeys)
+ {
+ LOG.warn("maxFormKeys limit exceeded keys>{}",maxKeys);
+ return;
+ }
+ break;
+
+ case '=':
+ if (key!=null)
+ {
+ buffer.append((byte)b);
+ break;
+ }
+ key = buffer.toString();
+ buffer.reset();
+ break;
+
+ case '+':
+ buffer.append((byte)' ');
+ break;
+
+ case '%':
+ int dh=in.read();
+ int dl=in.read();
+ if (dh<0||dl<0)
+ break;
+ buffer.append((byte)((TypeUtil.convertHexDigit((byte)dh)<<4) + TypeUtil.convertHexDigit((byte)dl)));
+ break;
+ default:
buffer.append((byte)b);
break;
- }
- key = buffer.toString();
- buffer.reset();
- break;
-
- case '+':
- buffer.append((byte)' ');
- break;
-
- case '%':
- int dh=in.read();
- int dl=in.read();
- if (dh<0||dl<0)
- break;
- buffer.append((byte)((TypeUtil.convertHexDigit((byte)dh)<<4) + TypeUtil.convertHexDigit((byte)dl)));
- break;
- default:
- buffer.append((byte)b);
- break;
+ }
+ }
+ catch(NotUtf8Exception e)
+ {
+ LOG.warn(e.toString());
+ LOG.debug(e);
}
if (maxLength>=0 && (++totalLength > maxLength))
throw new IllegalStateException("Form too large");
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8Appendable.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8Appendable.java
index 8fe840c1b88..de02cc4e3f4 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8Appendable.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8Appendable.java
@@ -40,7 +40,7 @@ import java.io.IOException;
**/
public abstract class Utf8Appendable
{
- private final char REPLACEMENT = '\ufffd';
+ public static final char REPLACEMENT = '\ufffd';
private static final int UTF8_ACCEPT = 0;
private static final int UTF8_REJECT = 12;
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/URLEncodedTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/URLEncodedTest.java
index 42bba2b05bc..1678338df77 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/URLEncodedTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/URLEncodedTest.java
@@ -220,7 +220,6 @@ public class URLEncodedTest
*/
}
-
/* -------------------------------------------------------------- */
@Test
public void testUtf8()
@@ -236,4 +235,21 @@ public class URLEncodedTest
String expected = new String(TypeUtil.fromHexString(hex),"utf-8");
assertEquals(expected,url_encoded.get("text"));
}
+
+ /* -------------------------------------------------------------- */
+ @Test
+ public void testNotUtf8() throws Exception
+ {
+ String query="name=X%c0%afZ";
+
+ MultiMap map = new MultiMap();
+
+ UrlEncoded.decodeUtf8To(query.getBytes(StringUtil.__ISO_8859_1),0,query.length(),map);
+ assertEquals("X"+Utf8Appendable.REPLACEMENT+Utf8Appendable.REPLACEMENT+"Z",map.getValue("name",0));
+
+ map.clear();
+
+ UrlEncoded.decodeUtf8To(new ByteArrayInputStream(query.getBytes(StringUtil.__ISO_8859_1)),map,100,2);
+ assertEquals("X"+Utf8Appendable.REPLACEMENT+Utf8Appendable.REPLACEMENT+"Z",map.getValue("name",0));
+ }
}
diff --git a/jetty-webapp/pom.xml b/jetty-webapp/pom.xml
index eb1971c5043..fe53e3d3ede 100644
--- a/jetty-webapp/pom.xml
+++ b/jetty-webapp/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-webapp
diff --git a/jetty-websocket/pom.xml b/jetty-websocket/pom.xml
index cfb4b91e581..a4bb91a3781 100644
--- a/jetty-websocket/pom.xml
+++ b/jetty-websocket/pom.xml
@@ -3,7 +3,7 @@
jetty-project
org.eclipse.jetty
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
diff --git a/jetty-xml/pom.xml b/jetty-xml/pom.xml
index b2a39954309..ac7e26faf70 100644
--- a/jetty-xml/pom.xml
+++ b/jetty-xml/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
jetty-xml
diff --git a/pom.xml b/pom.xml
index 63315d4c21c..2b3c38f75c8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
19
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
Jetty :: Project
${jetty.url}
pom
diff --git a/test-continuation/pom.xml b/test-continuation/pom.xml
index 498bf751457..8ea3c705b0c 100644
--- a/test-continuation/pom.xml
+++ b/test-continuation/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
test-continuation
diff --git a/test-jetty-nested/pom.xml b/test-jetty-nested/pom.xml
index 2f5b334f991..f69edcd1124 100644
--- a/test-jetty-nested/pom.xml
+++ b/test-jetty-nested/pom.xml
@@ -4,7 +4,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
test-jetty-nested
Jetty :: Nested Test
diff --git a/test-jetty-servlet/pom.xml b/test-jetty-servlet/pom.xml
index 65f98aa0f62..1d04833257f 100644
--- a/test-jetty-servlet/pom.xml
+++ b/test-jetty-servlet/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
test-jetty-servlet
diff --git a/test-jetty-webapp/pom.xml b/test-jetty-webapp/pom.xml
index 4162b96e66e..b9806477a55 100644
--- a/test-jetty-webapp/pom.xml
+++ b/test-jetty-webapp/pom.xml
@@ -2,7 +2,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
test-jetty-webapp
diff --git a/tests/pom.xml b/tests/pom.xml
index 28cee13d78b..a2aa610a515 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -21,7 +21,7 @@
org.eclipse.jetty
jetty-project
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
org.eclipse.jetty.tests
tests-parent
diff --git a/tests/test-integration/pom.xml b/tests/test-integration/pom.xml
index 90bc814ddd0..1f2b2f8d381 100644
--- a/tests/test-integration/pom.xml
+++ b/tests/test-integration/pom.xml
@@ -20,7 +20,7 @@
org.eclipse.jetty.tests
tests-parent
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
4.0.0
test-integration
diff --git a/tests/test-loginservice/pom.xml b/tests/test-loginservice/pom.xml
index a5e08c91017..89716a6272f 100644
--- a/tests/test-loginservice/pom.xml
+++ b/tests/test-loginservice/pom.xml
@@ -21,7 +21,7 @@
org.eclipse.jetty.tests
tests-parent
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
test-loginservice
Jetty Tests :: Login Service
diff --git a/tests/test-sessions/pom.xml b/tests/test-sessions/pom.xml
index 8c829fa6935..d3db7956f0a 100644
--- a/tests/test-sessions/pom.xml
+++ b/tests/test-sessions/pom.xml
@@ -21,7 +21,7 @@
org.eclipse.jetty.tests
tests-parent
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
test-sessions-parent
Jetty Tests :: Sessions :: Parent
diff --git a/tests/test-sessions/test-hash-sessions/pom.xml b/tests/test-sessions/test-hash-sessions/pom.xml
index 1152f8a40e2..98c15fd029c 100644
--- a/tests/test-sessions/test-hash-sessions/pom.xml
+++ b/tests/test-sessions/test-hash-sessions/pom.xml
@@ -21,7 +21,7 @@
org.eclipse.jetty.tests
test-sessions-parent
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
test-hash-sessions
Jetty Tests :: Sessions :: Hash
diff --git a/tests/test-sessions/test-jdbc-sessions/pom.xml b/tests/test-sessions/test-jdbc-sessions/pom.xml
index 567cfad6daa..ad0f5aeb5f1 100644
--- a/tests/test-sessions/test-jdbc-sessions/pom.xml
+++ b/tests/test-sessions/test-jdbc-sessions/pom.xml
@@ -21,7 +21,7 @@
org.eclipse.jetty.tests
test-sessions-parent
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
test-jdbc-sessions
Jetty Tests :: Sessions :: JDBC
diff --git a/tests/test-sessions/test-sessions-common/pom.xml b/tests/test-sessions/test-sessions-common/pom.xml
index 2979f679288..7d5b892e93d 100644
--- a/tests/test-sessions/test-sessions-common/pom.xml
+++ b/tests/test-sessions/test-sessions-common/pom.xml
@@ -21,7 +21,7 @@
org.eclipse.jetty.tests
test-sessions-parent
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
test-sessions-common
Jetty Tests :: Sessions :: Common
diff --git a/tests/test-webapps/pom.xml b/tests/test-webapps/pom.xml
index c34dda4cdc9..26f83f052ce 100644
--- a/tests/test-webapps/pom.xml
+++ b/tests/test-webapps/pom.xml
@@ -21,7 +21,7 @@
org.eclipse.jetty.tests
tests-parent
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
test-webapps-parent
Jetty Tests :: WebApps :: Parent
diff --git a/tests/test-webapps/test-webapp-rfc2616/pom.xml b/tests/test-webapps/test-webapp-rfc2616/pom.xml
index b46690368a6..38c683a2ade 100644
--- a/tests/test-webapps/test-webapp-rfc2616/pom.xml
+++ b/tests/test-webapps/test-webapp-rfc2616/pom.xml
@@ -21,7 +21,7 @@
org.eclipse.jetty.tests
test-webapps-parent
- 7.6.0-SNAPSHOT
+ 7.6.1-SNAPSHOT
test-webapp-rfc2616
Jetty Tests :: WebApp :: RFC2616