Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Wilkins2013-02-01 07:22:04 +0000
committerGreg Wilkins2013-02-01 07:22:04 +0000
commite8de7bd905fb409c8cb1423a9713357e85867db1 (patch)
treedc70124372d01fe8a90cabda70277cc657aa3486 /jetty-util/src
parent64051768c5ec116ba4da1cd00ac9ab62e86a3ce9 (diff)
parent1610329d3eff744c99d3d1767f6e53e121ab310d (diff)
downloadorg.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')
-rw-r--r--jetty-util/src/main/java/org/eclipse/jetty/util/UrlEncoded.java52
-rw-r--r--jetty-util/src/main/java/org/eclipse/jetty/util/Utf8Appendable.java43
-rw-r--r--jetty-util/src/main/java/org/eclipse/jetty/util/Utf8StringBuffer.java6
-rw-r--r--jetty-util/src/main/java/org/eclipse/jetty/util/Utf8StringBuilder.java6
-rw-r--r--jetty-util/src/test/java/org/eclipse/jetty/util/URLEncodedTest.java33
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"));
}

Back to the top