Merge branch 'master' of ssh://git.eclipse.org/gitroot/jetty/org.eclipse.jetty.project
This commit is contained in:
commit
b2b8cf5dd5
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>example-jetty-embedded</artifactId>
|
||||
|
|
|
@ -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("<h1>DumpServlet</h1><pre>");
|
||||
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("</pre>");
|
||||
}
|
||||
}
|
|
@ -40,7 +40,6 @@ public class HelloServlet extends HttpServlet
|
|||
{
|
||||
response.setContentType("text/html");
|
||||
response.setStatus(HttpServletResponse.SC_OK);
|
||||
response.getWriter().println("<h1>" + greeting + " SimpleServlet</h1>");
|
||||
response.getWriter().println("session=" + request.getSession(true).getId());
|
||||
response.getWriter().println("<h1>" + greeting + " from HelloServlet</h1>");
|
||||
}
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.aggregate</groupId>
|
||||
<artifactId>jetty-aggregate-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-all-server</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.aggregate</groupId>
|
||||
<artifactId>jetty-aggregate-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-all</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.aggregate</groupId>
|
||||
<artifactId>jetty-aggregate-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-client</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.aggregate</groupId>
|
||||
<artifactId>jetty-aggregate-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-plus</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.aggregate</groupId>
|
||||
<artifactId>jetty-aggregate-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-server</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.aggregate</groupId>
|
||||
<artifactId>jetty-aggregate-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-servlet</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.aggregate</groupId>
|
||||
<artifactId>jetty-aggregate-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-webapp</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.aggregate</groupId>
|
||||
<artifactId>jetty-aggregate-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-websocket</artifactId>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<groupId>org.eclipse.jetty.aggregate</groupId>
|
||||
<artifactId>jetty-aggregate-project</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-ajp</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-annotations</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-continuation</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-deploy</artifactId>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>jetty-distribution</artifactId>
|
||||
<name>Jetty :: Distribution Assemblies</name>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-http-spi</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-http</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-io</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-jaspi</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-jmx</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-jndi</artifactId>
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-monitor</artifactId>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>jetty-nested</artifactId>
|
||||
<name>Jetty :: Nested</name>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-nosql</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.osgi</groupId>
|
||||
<artifactId>jetty-osgi-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.osgi</groupId>
|
||||
<artifactId>jetty-osgi-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.osgi</groupId>
|
||||
<artifactId>jetty-osgi-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.osgi</groupId>
|
||||
<artifactId>jetty-osgi-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.osgi</groupId>
|
||||
<artifactId>jetty-osgi-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.osgi</groupId>
|
||||
<artifactId>jetty-osgi-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<groupId>org.eclipse.jetty.osgi</groupId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.osgi</groupId>
|
||||
<artifactId>jetty-osgi-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-overlay-deployer</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-plus</artifactId>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>jetty-policy</artifactId>
|
||||
<name>Jetty :: Policy Tool</name>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-rewrite</artifactId>
|
||||
|
|
|
@ -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.
|
||||
* <p>
|
||||
* 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)}.
|
||||
* <p>
|
||||
* 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<RegexTargetHandler.RegexMapping> _patterns = new CopyOnWriteArrayList<RegexTargetHandler.RegexMapping>();
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** 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()));
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-security</artifactId>
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-server</artifactId>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<parent>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-servlet</artifactId>
|
||||
|
|
|
@ -81,7 +81,17 @@ public class ServletHolder extends Holder<Servlet> 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<Servlet> 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)
|
||||
{
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<parent>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-servlets</artifactId>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-start</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-util</artifactId>
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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<String> map = new MultiMap<String>();
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-webapp</artifactId>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<parent>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jetty-xml</artifactId>
|
||||
|
|
2
pom.xml
2
pom.xml
|
@ -6,7 +6,7 @@
|
|||
<version>19</version>
|
||||
</parent>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
<name>Jetty :: Project</name>
|
||||
<url>${jetty.url}</url>
|
||||
<packaging>pom</packaging>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>test-continuation</artifactId>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>test-jetty-nested</artifactId>
|
||||
<name>Jetty :: Nested Test</name>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>test-jetty-servlet</artifactId>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>test-jetty-webapp</artifactId>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-project</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<groupId>org.eclipse.jetty.tests</groupId>
|
||||
<artifactId>tests-parent</artifactId>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.tests</groupId>
|
||||
<artifactId>tests-parent</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>test-integration</artifactId>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.tests</groupId>
|
||||
<artifactId>tests-parent</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>test-loginservice</artifactId>
|
||||
<name>Jetty Tests :: Login Service</name>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.tests</groupId>
|
||||
<artifactId>tests-parent</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>test-sessions-parent</artifactId>
|
||||
<name>Jetty Tests :: Sessions :: Parent</name>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.tests</groupId>
|
||||
<artifactId>test-sessions-parent</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>test-hash-sessions</artifactId>
|
||||
<name>Jetty Tests :: Sessions :: Hash</name>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.tests</groupId>
|
||||
<artifactId>test-sessions-parent</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>test-jdbc-sessions</artifactId>
|
||||
<name>Jetty Tests :: Sessions :: JDBC</name>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.tests</groupId>
|
||||
<artifactId>test-sessions-parent</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>test-sessions-common</artifactId>
|
||||
<name>Jetty Tests :: Sessions :: Common</name>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.tests</groupId>
|
||||
<artifactId>tests-parent</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>test-webapps-parent</artifactId>
|
||||
<name>Jetty Tests :: WebApps :: Parent</name>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<parent>
|
||||
<groupId>org.eclipse.jetty.tests</groupId>
|
||||
<artifactId>test-webapps-parent</artifactId>
|
||||
<version>7.6.0-SNAPSHOT</version>
|
||||
<version>7.6.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>test-webapp-rfc2616</artifactId>
|
||||
<name>Jetty Tests :: WebApp :: RFC2616</name>
|
||||
|
|
Loading…
Reference in New Issue