diff options
author | Greg Wilkins | 2013-02-01 07:22:04 +0000 |
---|---|---|
committer | Greg Wilkins | 2013-02-01 07:22:04 +0000 |
commit | e8de7bd905fb409c8cb1423a9713357e85867db1 (patch) | |
tree | dc70124372d01fe8a90cabda70277cc657aa3486 /jetty-util/src | |
parent | 64051768c5ec116ba4da1cd00ac9ab62e86a3ce9 (diff) | |
parent | 1610329d3eff744c99d3d1767f6e53e121ab310d (diff) | |
download | org.eclipse.jetty.project-e8de7bd905fb409c8cb1423a9713357e85867db1.tar.gz org.eclipse.jetty.project-e8de7bd905fb409c8cb1423a9713357e85867db1.tar.xz org.eclipse.jetty.project-e8de7bd905fb409c8cb1423a9713357e85867db1.zip |
Merge remote-tracking branch 'origin/jetty-7' into jetty-8
Conflicts:
VERSION.txt
example-jetty-embedded/pom.xml
jetty-aggregate/jetty-all-server/pom.xml
jetty-aggregate/jetty-all/pom.xml
jetty-aggregate/jetty-client/pom.xml
jetty-aggregate/jetty-plus/pom.xml
jetty-aggregate/jetty-server/pom.xml
jetty-aggregate/jetty-servlet/pom.xml
jetty-aggregate/jetty-webapp/pom.xml
jetty-aggregate/jetty-websocket/pom.xml
jetty-aggregate/pom.xml
jetty-ajp/pom.xml
jetty-annotations/pom.xml
jetty-client/pom.xml
jetty-continuation/pom.xml
jetty-deploy/pom.xml
jetty-distribution/pom.xml
jetty-http-spi/pom.xml
jetty-http/pom.xml
jetty-io/pom.xml
jetty-jaspi/pom.xml
jetty-jmx/pom.xml
jetty-jndi/pom.xml
jetty-jsp/pom.xml
jetty-monitor/pom.xml
jetty-nested/pom.xml
jetty-nosql/pom.xml
jetty-osgi/jetty-osgi-boot-jsp/pom.xml
jetty-osgi/jetty-osgi-boot-logback/pom.xml
jetty-osgi/jetty-osgi-boot-warurl/pom.xml
jetty-osgi/jetty-osgi-boot/pom.xml
jetty-osgi/jetty-osgi-equinoxtools/pom.xml
jetty-osgi/jetty-osgi-httpservice/pom.xml
jetty-osgi/pom.xml
jetty-osgi/test-jetty-osgi-context/pom.xml
jetty-osgi/test-jetty-osgi-webapp/pom.xml
jetty-osgi/test-jetty-osgi/pom.xml
jetty-overlay-deployer/pom.xml
jetty-plus/pom.xml
jetty-policy/pom.xml
jetty-rewrite/pom.xml
jetty-security/pom.xml
jetty-server/pom.xml
jetty-servlet/pom.xml
jetty-servlets/pom.xml
jetty-spdy/pom.xml
jetty-spdy/spdy-core/pom.xml
jetty-spdy/spdy-jetty-http-webapp/pom.xml
jetty-spdy/spdy-jetty-http/pom.xml
jetty-spdy/spdy-jetty/pom.xml
jetty-start/pom.xml
jetty-util/pom.xml
jetty-webapp/pom.xml
jetty-websocket/pom.xml
jetty-xml/pom.xml
pom.xml
test-continuation/pom.xml
test-jetty-nested/pom.xml
test-jetty-servlet/pom.xml
test-jetty-webapp/pom.xml
tests/pom.xml
tests/test-integration/pom.xml
tests/test-loginservice/pom.xml
tests/test-sessions/pom.xml
tests/test-sessions/test-hash-sessions/pom.xml
tests/test-sessions/test-jdbc-sessions/pom.xml
tests/test-sessions/test-mongodb-sessions/pom.xml
tests/test-sessions/test-sessions-common/pom.xml
tests/test-webapps/pom.xml
tests/test-webapps/test-webapp-rfc2616/pom.xml
Diffstat (limited to 'jetty-util/src')
5 files changed, 115 insertions, 25 deletions
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 6824efcdd3..8460db2830 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 @@ -336,10 +336,20 @@ public class UrlEncoded extends MultiMap implements Cloneable i++; if (i+4<end) buffer.getStringBuilder().append(Character.toChars((convertHexDigit(raw[++i])<<12) +(convertHexDigit(raw[++i])<<8) + (convertHexDigit(raw[++i])<<4) +convertHexDigit(raw[++i]))); + else + { + buffer.getStringBuilder().append(Utf8Appendable.REPLACEMENT); + i=end; + } } else buffer.append((byte)((convertHexDigit(raw[++i])<<4) + convertHexDigit(raw[++i]))); } + else + { + buffer.getStringBuilder().append(Utf8Appendable.REPLACEMENT); + i=end; + } break; default: @@ -356,13 +366,13 @@ public class UrlEncoded extends MultiMap implements Cloneable if (key != null) { - value = buffer.length()==0?"":buffer.toString(); + value = buffer.length()==0?"":buffer.toReplacedString(); buffer.reset(); map.add(key,value); } else if (buffer.length()>0) { - map.add(buffer.toString(),""); + map.add(buffer.toReplacedString(),""); } } } @@ -763,7 +773,10 @@ public class UrlEncoded extends MultiMap implements Cloneable buffer.getStringBuffer().append(unicode); } else + { i=length; + buffer.getStringBuffer().append(Utf8Appendable.REPLACEMENT); + } } else { @@ -773,13 +786,22 @@ public class UrlEncoded extends MultiMap implements Cloneable buffer.append(b); } } + catch(NotUtf8Exception e) + { + LOG.warn(e.toString()); + LOG.debug(e); + } catch(NumberFormatException nfe) { + LOG.debug(nfe); buffer.getStringBuffer().append(Utf8Appendable.REPLACEMENT); } } else + { + buffer.getStringBuffer().append(Utf8Appendable.REPLACEMENT); i=length; + } } else if (buffer!=null) buffer.getStringBuffer().append(c); @@ -792,7 +814,7 @@ public class UrlEncoded extends MultiMap implements Cloneable return encoded.substring(offset,offset+length); } - return buffer.toString(); + return buffer.toReplacedString(); } else { @@ -843,12 +865,20 @@ public class UrlEncoded extends MultiMap implements Cloneable { if ('u'==encoded.charAt(offset+i+1)) { - int o=offset+i+2; - i+=6; - String unicode = new String(Character.toChars(TypeUtil.parseInt(encoded,o,4,16))); - byte[] reencoded = unicode.getBytes(charset); - System.arraycopy(reencoded,0,ba,n,reencoded.length); - n+=reencoded.length; + if (i+6<length) + { + int o=offset+i+2; + i+=6; + String unicode = new String(Character.toChars(TypeUtil.parseInt(encoded,o,4,16))); + byte[] reencoded = unicode.getBytes(charset); + System.arraycopy(reencoded,0,ba,n,reencoded.length); + n+=reencoded.length; + } + else + { + ba[n++] = (byte)'?'; + i=length; + } } else { @@ -866,8 +896,8 @@ public class UrlEncoded extends MultiMap implements Cloneable } else { - ba[n++] = (byte)'%'; - i++; + ba[n++] = (byte)'?'; + i=length; } } else if (c=='+') 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 94352e1afe..a78b19d8b2 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 @@ -20,6 +20,9 @@ package org.eclipse.jetty.util; import java.io.IOException; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; + /* ------------------------------------------------------------ */ /** * Utf8 Appendable abstract base class @@ -46,6 +49,7 @@ import java.io.IOException; **/ public abstract class Utf8Appendable { + protected static final Logger LOG = Log.getLogger(Utf8Appendable.class); public static final char REPLACEMENT = '\ufffd'; private static final int UTF8_ACCEPT = 0; private static final int UTF8_REJECT = 12; @@ -192,4 +196,43 @@ public abstract class Utf8Appendable super("Not valid UTF8! "+reason); } } + + protected void checkState() + { + if (!isUtf8SequenceComplete()) + { + _codep=0; + _state = UTF8_ACCEPT; + try + { + _appendable.append(REPLACEMENT); + } + catch(IOException e) + { + throw new RuntimeException(e); + } + throw new NotUtf8Exception("incomplete UTF8 sequence"); + } + } + + public String toReplacedString() + { + if (!isUtf8SequenceComplete()) + { + _codep=0; + _state = UTF8_ACCEPT; + try + { + _appendable.append(REPLACEMENT); + } + catch(IOException e) + { + throw new RuntimeException(e); + } + Throwable th= new NotUtf8Exception("incomplete UTF8 sequence"); + LOG.warn(th.toString()); + LOG.debug(th); + } + return _appendable.toString(); + } } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8StringBuffer.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8StringBuffer.java index 5dad5d80bd..5346820b55 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8StringBuffer.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8StringBuffer.java @@ -72,10 +72,4 @@ public class Utf8StringBuffer extends Utf8Appendable checkState(); return _buffer.toString(); } - - private void checkState() - { - if (!isUtf8SequenceComplete()) - throw new IllegalArgumentException("Tried to read incomplete UTF8 decoded String"); - } } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8StringBuilder.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8StringBuilder.java index 3c9ef86a50..12963f24a6 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8StringBuilder.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8StringBuilder.java @@ -74,9 +74,5 @@ public class Utf8StringBuilder extends Utf8Appendable return _buffer.toString(); } - private void checkState() - { - if (!isUtf8SequenceComplete()) - throw new IllegalArgumentException("Tried to read incomplete UTF8 decoded String"); - } + } 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 d9b69a85fb..eca656d330 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 @@ -159,11 +159,38 @@ public class URLEncodedTest public void testBadEncoding() throws UnsupportedEncodingException { UrlEncoded url_encoded = new UrlEncoded(); - url_encoded.decode("Name15=xx%zz", "UTF-8"); + url_encoded.decode("Name15=xx%zzyy", "UTF-8"); assertEquals("encoded param size",1, url_encoded.size()); - assertEquals("encoded get", "xx\ufffd", url_encoded.getString("Name15")); + assertEquals("encoded get", "xx\ufffdyy", url_encoded.getString("Name15")); + + byte[] bad="Name=%FF%FF%FF".getBytes("UTF-8"); + MultiMap<String> map = new MultiMap<String>(); + UrlEncoded.decodeUtf8To(bad,0,bad.length,map); + assertEquals("encoded param size",1, map.size()); + assertEquals("encoded get", "\ufffd\ufffd\ufffd", map.getString("Name")); + + url_encoded.clear(); + url_encoded.decode("Name=%FF%FF%FF", "UTF-8"); + assertEquals("encoded param size",1, url_encoded.size()); + assertEquals("encoded get", "\ufffd\ufffd\ufffd", url_encoded.getString("Name")); - assertEquals("xxx",UrlEncoded.decodeString("xxx%u123",0,5,"UTF-8")); + url_encoded.clear(); + url_encoded.decode("Name=%EF%EF%EF", "UTF-8"); + assertEquals("encoded param size",1, url_encoded.size()); + assertEquals("encoded get", "\ufffd\ufffd", url_encoded.getString("Name")); + + assertEquals("x",UrlEncoded.decodeString("x",0,1,"UTF-8")); + assertEquals("x\ufffd",UrlEncoded.decodeString("x%",0,2,"UTF-8")); + assertEquals("x\ufffd",UrlEncoded.decodeString("x%2",0,3,"UTF-8")); + assertEquals("x ",UrlEncoded.decodeString("x%20",0,4,"UTF-8")); + + assertEquals("xxx",UrlEncoded.decodeString("xxx",0,3,"UTF-8")); + assertEquals("xxx\ufffd",UrlEncoded.decodeString("xxx%",0,4,"UTF-8")); + assertEquals("xxx\ufffd",UrlEncoded.decodeString("xxx%u",0,5,"UTF-8")); + assertEquals("xxx\ufffd",UrlEncoded.decodeString("xxx%u1",0,6,"UTF-8")); + assertEquals("xxx\ufffd",UrlEncoded.decodeString("xxx%u12",0,7,"UTF-8")); + assertEquals("xxx\ufffd",UrlEncoded.decodeString("xxx%u123",0,8,"UTF-8")); + assertEquals("xxx\u1234",UrlEncoded.decodeString("xxx%u1234",0,9,"UTF-8")); } |