diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/SslBytesServerTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/SslBytesServerTest.java
index 0d0f44d3da6..be41f47bb96 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/SslBytesServerTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/SslBytesServerTest.java
@@ -1,5 +1,7 @@
package org.eclipse.jetty.client;
+import static org.hamcrest.Matchers.*;
+
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.File;
@@ -19,6 +21,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLSocket;
@@ -51,11 +54,6 @@ import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.lessThan;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.not;
-
public class SslBytesServerTest extends SslBytesTest
{
private final AtomicInteger sslHandles = new AtomicInteger();
@@ -624,7 +622,9 @@ public class SslBytesServerTest extends SslBytesTest
TimeUnit.MILLISECONDS.sleep(1000);
Assert.assertThat(sslHandles.get(), lessThan(750));
Assert.assertThat(sslFlushes.get(), lessThan(750));
- Assert.assertThat(httpParses.get(), lessThan(1000));
+ // An average of 958 httpParses is seen in standard Oracle JDK's
+ // An average of 1183 httpParses is seen in OpenJDK JVMs.
+ Assert.assertThat(httpParses.get(), lessThan(1500));
client.close();
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/nio/SelectChannelEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/nio/SelectChannelEndPoint.java
index ffbcc163e12..9428a483a00 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/nio/SelectChannelEndPoint.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/nio/SelectChannelEndPoint.java
@@ -323,9 +323,8 @@ public class SelectChannelEndPoint extends ChannelEndPoint implements AsyncEndPo
{
synchronized (this)
{
- _writable=false;
- if (!_dispatched)
- updateKey();
+ if (_dispatched)
+ _writable=false;
}
}
else if (l>0)
@@ -349,9 +348,8 @@ public class SelectChannelEndPoint extends ChannelEndPoint implements AsyncEndPo
{
synchronized (this)
{
- _writable=false;
- if (!_dispatched)
- updateKey();
+ if (_dispatched)
+ _writable=false;
}
}
else if (l>0)
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java
index 09e1970c3e9..607c271abe7 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java
@@ -188,20 +188,6 @@ public class HttpServerTestFixture
}
}
- // Create a trust manager that does not validate certificate chains
- public final static TrustManager[] __trustAllCerts = new TrustManager[] {
- new X509TrustManager(){
- public java.security.cert.X509Certificate[] getAcceptedIssuers() {
- return null;
- }
- public void checkClientTrusted(
- java.security.cert.X509Certificate[] certs, String authType) {
- }
- public void checkServerTrusted(
- java.security.cert.X509Certificate[] certs, String authType) {
- }
- }
- };
public final static HostnameVerifier __hostnameverifier = new HostnameVerifier()
{
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLEngineTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLEngineTest.java
index c0d39e2bf22..2fcb497d05f 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLEngineTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLEngineTest.java
@@ -20,7 +20,8 @@ package org.eclipse.jetty.server.ssl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.Matchers.greaterThan;
import java.io.BufferedReader;
import java.io.IOException;
@@ -37,8 +38,6 @@ import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
@@ -81,25 +80,6 @@ public class SSLEngineTest
private static final int BODY_SIZE=300;
- private static final TrustManager[] s_dummyTrustManagers=new TrustManager[]
- {
- new X509TrustManager()
- {
- public java.security.cert.X509Certificate[] getAcceptedIssuers()
- {
- return null;
- }
-
- public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
- {
- }
-
- public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
- {
- }
- }
- };
-
private static Server server;
private static SslSelectChannelConnector connector;
@@ -134,7 +114,7 @@ public class SSLEngineTest
public void testBigResponse() throws Exception
{
SSLContext ctx=SSLContext.getInstance("TLS");
- ctx.init(null,s_dummyTrustManagers,new java.security.SecureRandom());
+ ctx.init(null,SslContextFactory.TRUST_ALL_CERTS,new java.security.SecureRandom());
int port=connector.getLocalPort();
@@ -152,7 +132,7 @@ public class SSLEngineTest
String response = IO.toString(client.getInputStream());
- assertTrue(response.length()>102400);
+ assertThat(response.length(),greaterThan(102400));
}
@Test
@@ -164,7 +144,7 @@ public class SSLEngineTest
Socket[] client=new Socket[numConns];
SSLContext ctx=SSLContext.getInstance("SSLv3");
- ctx.init(null,s_dummyTrustManagers,new java.security.SecureRandom());
+ ctx.init(null,SslContextFactory.TRUST_ALL_CERTS,new java.security.SecureRandom());
int port=connector.getLocalPort();
@@ -231,7 +211,7 @@ public class SSLEngineTest
server.start();
SSLContext context = SSLContext.getInstance("SSL");
- context.init(null,s_dummyTrustManagers,new java.security.SecureRandom());
+ context.init(null,SslContextFactory.TRUST_ALL_CERTS,new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
URL url = new URL("https://localhost:"+connector.getLocalPort()+"/test");
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java
index a7424b99497..2c219cc0f89 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java
@@ -73,7 +73,7 @@ public class SelectChannelServerSslTest extends HttpServerTestBase
{
HttpsURLConnection.setDefaultHostnameVerifier(__hostnameverifier);
SSLContext sc = SSLContext.getInstance("TLS");
- sc.init(null, __trustAllCerts, new java.security.SecureRandom());
+ sc.init(null, SslContextFactory.TRUST_ALL_CERTS, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
catch(Exception e)
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslRenegotiateTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslRenegotiateTest.java
index 69a96818d45..a38967f164c 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslRenegotiateTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslRenegotiateTest.java
@@ -37,22 +37,6 @@ public class SslRenegotiateTest
{
private static final Logger LOG = Log.getLogger(SslRenegotiateTest.class);
- private static final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager()
- {
- public java.security.cert.X509Certificate[] getAcceptedIssuers()
- {
- return null;
- }
-
- public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType )
- {
- }
-
- public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType )
- {
- }
- } };
-
private ByteBuffer _outAppB;
private ByteBuffer _outPacketB;
private ByteBuffer _inAppB;
@@ -110,7 +94,7 @@ public class SslRenegotiateTest
_socket.configureBlocking(true);
SSLContext context=SSLContext.getInstance("SSL");
- context.init( null, trustAllCerts, new java.security.SecureRandom() );
+ context.init( null, SslContextFactory.TRUST_ALL_CERTS, new java.security.SecureRandom() );
_engine = context.createSSLEngine();
_engine.setUseClientMode(true);
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 9fcfa2c2cc8..7d622d115e6 100644
--- a/jetty-start/pom.xml
+++ b/jetty-start/pom.xml
@@ -34,8 +34,8 @@
- junit
- junit
+ org.eclipse.jetty.toolchain
+ jetty-test-helper
test
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java
index 69112f8f319..a221c34eb60 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java
@@ -663,18 +663,19 @@ public class Main
{
StringBuilder cmd = new StringBuilder();
cmd.append(findJavaBin());
- for (String x : _jvmArgs)
- cmd.append(' ').append(x);
- cmd.append(" -Djetty.home=").append(_jettyHome);
+ for (String x : _jvmArgs) {
+ cmd.append(x);
+ }
+ cmd.append(" -Djetty.home=").append(escapeSpaces(_jettyHome));
for (String p : _sysProps)
{
- cmd.append(" -D").append(p);
+ cmd.append(" -D").append(p);
String v = System.getProperty(p);
if (v != null && v.length() > 0)
- cmd.append('=').append(v);
+ cmd.append("=").append(escapeSpaces(v));
}
- cmd.append(" -cp ").append(classpath.toString());
- cmd.append(" ").append(_config.getMainClassname());
+ cmd.append(" -cp ").append(classpath.toString());
+ cmd.append(" ").append(_config.getMainClassname());
// Check if we need to pass properties as a file
Properties properties = Config.getProperties();
@@ -684,16 +685,19 @@ public class Main
if (!_dryRun)
prop_file.deleteOnExit();
properties.store(new FileOutputStream(prop_file),"start.jar properties");
- cmd.append(" ").append(prop_file.getAbsolutePath());
+ cmd.append(" ").append(escapeSpaces(prop_file.getAbsolutePath()));
}
for (String xml : xmls)
- {
- cmd.append(' ').append(xml);
- }
+ cmd.append(" ").append(escapeSpaces(xml));
return cmd.toString();
}
+
+ private static String escapeSpaces(String s)
+ {
+ return s.replace(" ","\\ ");
+ }
private String findJavaBin()
{
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/MainTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/MainTest.java
index 8e2f1f071bb..63143c7c377 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/MainTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/MainTest.java
@@ -13,12 +13,13 @@
package org.eclipse.jetty.start;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
+import java.io.File;
import java.io.IOException;
-import java.net.URL;
import java.util.List;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.junit.Before;
import org.junit.Test;
@@ -34,18 +35,13 @@ public class MainTest
@Before
public void setUp() throws Exception
{
- System.setProperty("jetty.home",this.getClass().getResource("/jetty.home").getFile());
+ File testJettyHome = MavenTestingUtils.getTestResourceDir("jetty.home");
+ System.setProperty("jetty.home",testJettyHome.getAbsolutePath());
}
- /**
- * Test method for {@link org.eclipse.jetty.start.StartIniParser#loadStartIni(java.lang.String)}.
- * @throws IOException
- */
@Test
public void testLoadStartIni() throws IOException
{
- URL startIni = this.getClass().getResource("/jetty.home/");
- System.setProperty("jetty.home",startIni.getFile());
Main main = new Main();
List args = main.parseStartIniFiles();
assertEquals("Expected 5 uncommented lines in start.ini",9,args.size());
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/main/java/org/eclipse/jetty/util/log/StdErrLog.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java
index 4e628333566..10ff80a4e91 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java
@@ -37,7 +37,7 @@ public class StdErrLog extends AbstractLogger
{
private static final String EOL = System.getProperty("line.separator");
private static DateCache _dateCache;
- private static Properties __props = Log.__props;
+ private static final Properties __props = new Properties();
private final static boolean __source = Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.SOURCE",
Log.__props.getProperty("org.eclipse.jetty.util.log.stderr.SOURCE","false")));
@@ -45,6 +45,8 @@ public class StdErrLog extends AbstractLogger
static
{
+ __props.putAll(Log.__props);
+
String deprecatedProperties[] =
{ "DEBUG", "org.eclipse.jetty.util.log.DEBUG", "org.eclipse.jetty.util.log.stderr.DEBUG" };
@@ -97,7 +99,8 @@ public class StdErrLog extends AbstractLogger
public StdErrLog(String name, Properties props)
{
- __props = props;
+ if (props!=null)
+ __props.putAll(props);
this._name = name == null?"":name;
this._abbrevname = condensePackageString(this._name);
this._level = getLoggingLevel(props,this._name);
@@ -603,7 +606,8 @@ public class StdErrLog extends AbstractLogger
public static void setProperties(Properties props)
{
- __props = props;
+ __props.clear();
+ __props.putAll(props);
}
public void ignore(Throwable ignored)
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java
index 94c0d93cf65..9ad2cb0dd49 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java
@@ -71,6 +71,22 @@ import org.eclipse.jetty.util.security.Password;
*/
public class SslContextFactory extends AbstractLifeCycle
{
+ public final static TrustManager[] TRUST_ALL_CERTS = new X509TrustManager[]{new X509TrustManager()
+ {
+ public java.security.cert.X509Certificate[] getAcceptedIssuers()
+ {
+ return new java.security.cert.X509Certificate[]{};
+ }
+
+ public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
+ {
+ }
+
+ public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
+ {
+ }
+ }};
+
private static final Logger LOG = Log.getLogger(SslContextFactory.class);
public static final String DEFAULT_KEYMANAGERFACTORY_ALGORITHM =
@@ -229,22 +245,7 @@ public class SslContextFactory extends AbstractLifeCycle
{
LOG.debug("No keystore or trust store configured. ACCEPTING UNTRUSTED CERTIFICATES!!!!!");
// Create a trust manager that does not validate certificate chains
- TrustManager trustAllCerts = new X509TrustManager()
- {
- public java.security.cert.X509Certificate[] getAcceptedIssuers()
- {
- return null;
- }
-
- public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
- {
- }
-
- public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
- {
- }
- };
- trust_managers = new TrustManager[] { trustAllCerts };
+ trust_managers = TRUST_ALL_CERTS;
}
SecureRandom secureRandom = (_secureRandomAlgorithm == null)?null:SecureRandom.getInstance(_secureRandomAlgorithm);
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/DateCacheTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/DateCacheTest.java
index 15284fd2493..76a061dbe1c 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/DateCacheTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/DateCacheTest.java
@@ -15,6 +15,7 @@ package org.eclipse.jetty.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
import java.util.Locale;
import java.util.TimeZone;
@@ -69,12 +70,26 @@ public class DateCacheTest
// Test string is cached
dc = new DateCache();
- String s1=dc.format(System.currentTimeMillis());
- dc.format(1);
- String s2=dc.format(System.currentTimeMillis());
- dc.format(System.currentTimeMillis()+10*60*60);
- String s3=dc.format(System.currentTimeMillis());
- assertTrue(s1==s2 || s2==s3);
+ long now = 1000L*(System.currentTimeMillis()%1000L)+123;
+ // format a time for now
+ String s1=dc.format(now);
+
+ // format a time in the past (this should not reset cached date)
+ dc.format(now-2000);
+
+ // format a time a little later than now
+ String s2=dc.format(now+10);
+
+ // format a time in future (this should reset cached data)
+ dc.format(now+2000);
+
+ // format time a little later than now
+ String s3=dc.format(now+20);
+
+ assertEquals(s1,s2);
+ assertEquals(s2,s3);
+ assertTrue(s1==s2);
+ assertFalse(s2==s3);
}
}
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/src/main/config/etc/webdefault.xml b/jetty-webapp/src/main/config/etc/webdefault.xml
index 99ee5feda99..213138b35fe 100644
--- a/jetty-webapp/src/main/config/etc/webdefault.xml
+++ b/jetty-webapp/src/main/config/etc/webdefault.xml
@@ -157,10 +157,12 @@
useFileMappedBuffer
true
+