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 +