diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java
index c7d7d39f88a..0b4053c15e3 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java
@@ -260,7 +260,6 @@ public class HttpParser implements Parser
{
_state=STATE_END;
_handler.messageComplete(_contentPosition);
- returnBuffers();
return 1;
}
@@ -326,7 +325,6 @@ public class HttpParser implements Parser
if (!isComplete() && !isIdle())
throw new EofException();
- returnBuffers();
return -1;
}
length=_buffer.length();
@@ -440,7 +438,6 @@ public class HttpParser implements Parser
_state=STATE_SEEKING_EOF;
_handler.headerComplete();
_handler.messageComplete(_contentPosition);
- returnBuffers();
return 1;
}
break;
@@ -470,7 +467,6 @@ public class HttpParser implements Parser
_state=STATE_SEEKING_EOF;
_handler.headerComplete();
_handler.messageComplete(_contentPosition);
- returnBuffers();
return 1;
}
}
@@ -634,7 +630,6 @@ public class HttpParser implements Parser
_handler.headerComplete();
_state=_persistent||(_responseStatus>=100&&_responseStatus<200)?STATE_END:STATE_SEEKING_EOF;
_handler.messageComplete(_contentPosition);
- returnBuffers();
return 1;
default:
@@ -840,7 +835,6 @@ public class HttpParser implements Parser
{
_state=_persistent?STATE_END:STATE_SEEKING_EOF;
_handler.messageComplete(_contentPosition);
- returnBuffers();
return 1;
}
@@ -860,7 +854,6 @@ public class HttpParser implements Parser
{
_state=_persistent?STATE_END:STATE_SEEKING_EOF;
_handler.messageComplete(_contentPosition);
- returnBuffers();
}
// TODO adjust the _buffer to keep unconsumed content
return 1;
@@ -895,7 +888,6 @@ public class HttpParser implements Parser
_eol=_buffer.get();
_state=_persistent?STATE_END:STATE_SEEKING_EOF;
_handler.messageComplete(_contentPosition);
- returnBuffers();
return 1;
}
else
@@ -926,7 +918,6 @@ public class HttpParser implements Parser
_eol=_buffer.get();
_state=_persistent?STATE_END:STATE_SEEKING_EOF;
_handler.messageComplete(_contentPosition);
- returnBuffers();
return 1;
}
else
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
deleted file mode 100644
index 736f8245f9f..00000000000
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RegexTargetHandler.java
+++ /dev/null
@@ -1,149 +0,0 @@
-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 49a27dcee30..6fa22b52238 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
@@ -18,6 +18,7 @@ import java.util.regex.Matcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.server.Request;
/**
@@ -89,14 +90,20 @@ public class RewriteRegexRule extends RegexRule implements Rule.ApplyURI
/* ------------------------------------------------------------ */
public void applyURI(Request request, String oldTarget, String newTarget) throws IOException
{
- request.setRequestURI(newTarget);
- if (_query!=null)
+ if (_query==null)
+ {
+ request.setRequestURI(newTarget);
+ }
+ else
{
String query=(String)request.getAttribute("org.eclipse.jetty.rewrite.handler.RewriteRegexRule.Q");
- if (_queryGroup||request.getQueryString()==null)
- request.setQueryString(query);
- else
- request.setQueryString(request.getQueryString()+"&"+query);
+
+ if (!_queryGroup && request.getQueryString()!=null)
+ query=request.getQueryString()+"&"+query;
+ HttpURI uri=new HttpURI(newTarget+"?"+query);
+ request.setUri(uri);
+ request.setRequestURI(newTarget);
+ request.setQueryString(query);
}
}
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
deleted file mode 100644
index c47937621df..00000000000
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RegexTargetHandlerTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-// ========================================================================
-// 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 872bb6e5b85..adb8777f12f 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
@@ -14,6 +14,10 @@ package org.eclipse.jetty.rewrite.handler;
import java.io.IOException;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.util.MultiMap;
+import org.eclipse.jetty.util.StringUtil;
+import org.eclipse.jetty.util.UrlEncoded;
import org.junit.Before;
import org.junit.Test;
@@ -23,21 +27,21 @@ public class RewriteRegexRuleTest extends AbstractRuleTestCase
{
private String[][] _tests=
{
- {"/foo/bar",null,".*","/replace","/replace",null},
- {"/foo/bar","n=v",".*","/replace","/replace","n=v"},
- {"/foo/bar",null,"/xxx.*","/replace",null,null},
- {"/foo/bar",null,"/(.*)/(.*)","/$2/$1/xxx","/bar/foo/xxx",null},
- {"/foo/bar",null,"/(.*)/(.*)","/test?p2=$2&p1=$1","/test","p2=bar&p1=foo"},
- {"/foo/bar","n=v","/(.*)/(.*)","/test?p2=$2&p1=$1","/test","n=v&p2=bar&p1=foo"},
- {"/foo/bar",null,"/(.*)/(.*)","/foo/bar?p2=$2&p1=$1","/foo/bar","p2=bar&p1=foo"},
- {"/foo/bar","n=v","/(.*)/(.*)","/foo/bar?p2=$2&p1=$1","/foo/bar","n=v&p2=bar&p1=foo"},
- {"/foo/bar",null,"/(foo)/(.*)(bar)","/$3/$1/xxx$2","/bar/foo/xxx",null},
- {"/foo/$bar",null,".*","/$replace","/$replace",null},
- {"/foo/$bar",null,"/foo/(.*)","/$1/replace","/$bar/replace",null},
- {"/foo/bar/info",null,"/foo/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2","/info/other","p1=bar"},
- {"/foo/bar/info",null,"/foo/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2&$Q","/info/other","p1=bar&"},
- {"/foo/bar/info","n=v","/foo/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2&$Q","/info/other","p1=bar&n=v"},
- {"/foo/bar/info","n=v","/foo/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2","/info/other","n=v&p1=bar"},
+ {"/foo0/bar",null,".*","/replace","/replace",null},
+ {"/foo1/bar","n=v",".*","/replace","/replace","n=v"},
+ {"/foo2/bar",null,"/xxx.*","/replace",null,null},
+ {"/foo3/bar",null,"/(.*)/(.*)","/$2/$1/xxx","/bar/foo3/xxx",null},
+ {"/foo4/bar",null,"/(.*)/(.*)","/test?p2=$2&p1=$1","/test","p2=bar&p1=foo4"},
+ {"/foo5/bar","n=v","/(.*)/(.*)","/test?p2=$2&p1=$1","/test","n=v&p2=bar&p1=foo5"},
+ {"/foo6/bar",null,"/(.*)/(.*)","/foo6/bar?p2=$2&p1=$1","/foo6/bar","p2=bar&p1=foo6"},
+ {"/foo7/bar","n=v","/(.*)/(.*)","/foo7/bar?p2=$2&p1=$1","/foo7/bar","n=v&p2=bar&p1=foo7"},
+ {"/foo8/bar",null,"/(foo8)/(.*)(bar)","/$3/$1/xxx$2","/bar/foo8/xxx",null},
+ {"/foo9/$bar",null,".*","/$replace","/$replace",null},
+ {"/fooA/$bar",null,"/fooA/(.*)","/$1/replace","/$bar/replace",null},
+ {"/fooB/bar/info",null,"/fooB/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2","/info/other","p1=bar"},
+ {"/fooC/bar/info",null,"/fooC/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2&$Q","/info/other","p1=bar&"},
+ {"/fooD/bar/info","n=v","/fooD/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2&$Q","/info/other","p1=bar&n=v"},
+ {"/fooE/bar/info","n=v","/fooE/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2","/info/other","n=v&p1=bar"},
};
private RewriteRegexRule _rule;
@@ -53,20 +57,35 @@ public class RewriteRegexRuleTest extends AbstractRuleTestCase
{
for (String[] test : _tests)
{
+ reset();
+ _request.setRequestURI(null);
+
String t=test[0]+"?"+test[1]+">"+test[2]+"|"+test[3];
_rule.setRegex(test[2]);
_rule.setReplacement(test[3]);
- _request.setRequestURI(test[0]);
- _request.setQueryString(test[1]);
- _request.getAttributes().clearAttributes();
+ _request.setUri(new HttpURI(test[0]+(test[1]==null?"":("?"+test[1]))));
+ _request.getRequestURI();
+
String result = _rule.matchAndApply(test[0], _request, _response);
assertEquals(t, test[4], result);
_rule.applyURI(_request,test[0],result);
- assertEquals(t,test[4], _request.getRequestURI());
- assertEquals(t,test[5], _request.getQueryString());
+ if (result!=null)
+ {
+ assertEquals(t,test[4], _request.getRequestURI());
+ assertEquals(t,test[5], _request.getQueryString());
+ }
+
+ if (test[5]!=null)
+ {
+ MultiMap params=new MultiMap();
+ UrlEncoded.decodeTo(test[5],params,StringUtil.__UTF8);
+
+ for (String n:params.keySet())
+ assertEquals(params.getString(n),_request.getParameter(n));
+ }
}
}
@@ -78,6 +97,7 @@ public class RewriteRegexRuleTest extends AbstractRuleTestCase
container.addRule(_rule);
for (String[] test : _tests)
{
+ reset();
String t=test[0]+"?"+test[1]+">"+test[2]+"|"+test[3];
_rule.setRegex(test[2]);
_rule.setReplacement(test[3]);
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
index b9e2c24e58f..76f360592ad 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
@@ -1233,7 +1233,7 @@ public class ServletHandler extends ScopedHandler
{
if(LOG.isDebugEnabled())
LOG.debug("Not Found "+request.getRequestURI());
- response.sendError(HttpServletResponse.SC_NOT_FOUND);
+ //Override to send an error back, eg with: response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
/* ------------------------------------------------------------ */
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java
index 61f9eeaec91..2d0840da004 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java
@@ -287,7 +287,25 @@ public class MultiMap implements ConcurrentMap, Serializable
*/
public Map toStringArrayMap()
{
- HashMap map = new HashMap(_map.size()*3/2);
+ HashMap map = new HashMap(_map.size()*3/2)
+ {
+ public String toString()
+ {
+ StringBuilder b=new StringBuilder();
+ b.append('{');
+ for (K k:keySet())
+ {
+ if(b.length()>1)
+ b.append(',');
+ b.append(k);
+ b.append('=');
+ b.append(Arrays.asList(get(k)));
+ }
+
+ b.append('}');
+ return b.toString();
+ }
+ };
for(Map.Entry entry: _map.entrySet())
{
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java
index d7748365c8e..fc9f3734c02 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java
@@ -305,7 +305,8 @@ public class WebInfConfiguration extends AbstractConfiguration
}
catch(IOException e)
{
- LOG.warn("tmpdir",e); System.exit(1);
+ tmpDir = null;
+ throw new IllegalStateException("Cannot create tmp dir in "+System.getProperty("java.io.tmpdir")+ " for context "+context,e);
}
}
}