[freenet-cvs] r15776 - trunk/freenet/src/freenet/support
toad at freenetproject.org
toad at freenetproject.org
Tue Nov 13 20:13:00 UTC 2007
Author: toad
Date: 2007-11-13 20:12:59 +0000 (Tue, 13 Nov 2007)
New Revision: 15776
Modified:
trunk/freenet/src/freenet/support/URLDecoder.java
Log:
Revert 14684. Multi-byte UTF-8 sequences are not working, because we assume one %<code> = one character. Will re-investigate original bug.
Modified: trunk/freenet/src/freenet/support/URLDecoder.java
===================================================================
--- trunk/freenet/src/freenet/support/URLDecoder.java 2007-11-13 13:19:16 UTC (rev 15775)
+++ trunk/freenet/src/freenet/support/URLDecoder.java 2007-11-13 20:12:59 UTC (rev 15776)
@@ -3,8 +3,9 @@
* http://www.gnu.org/ for further details of the GPL. */
package freenet.support;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
/**
* Decode encoded URLs (or parts of URLs). @see URLEncoder.
@@ -40,13 +41,13 @@
if (s.length() == 0)
return "";
int len = s.length();
- StringWriter decoded = new StringWriter();
+ ByteArrayOutputStream decodedBytes = new ByteArrayOutputStream();
boolean hasDecodedSomething = false;
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (Character.isLetterOrDigit(c))
- decoded.write(c);
+ decodedBytes.write(c);
else if (c == '%') {
if (i >= len - 2) {
throw new URLEncodedFormatException(s);
@@ -61,25 +62,34 @@
long read = Fields.hexToLong(hexval);
if (read == 0)
throw new URLEncodedFormatException("Can't encode" + " 00");
- decoded.write((int) read);
+ decodedBytes.write((int) read);
hasDecodedSomething = true;
} catch (NumberFormatException nfe) {
// Not encoded?
if(tolerant && !hasDecodedSomething) {
- decoded.write('%');
- decoded.write(hexval);
- continue;
+ try {
+ byte[] buf = ('%'+hexval).getBytes("UTF-8");
+ decodedBytes.write(buf, 0, buf.length);
+ continue;
+ } catch (UnsupportedEncodingException e) {
+ throw new Error(e);
+ }
}
throw new URLEncodedFormatException("Not a two character hex % escape: "+hexval+" in "+s);
}
} else {
- decoded.write(c);
+ try {
+ byte[] encoded = (""+c).getBytes("UTF-8");
+ decodedBytes.write(encoded, 0, encoded.length);
+ } catch (UnsupportedEncodingException e) {
+ throw new Error(e);
+ }
}
}
try {
- decoded.close();
- return decoded.toString();
+ decodedBytes.close();
+ return new String(decodedBytes.toByteArray(), "utf-8");
} catch (IOException ioe1) {
/* if this throws something's wrong */
}
More information about the cvs
mailing list