You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2013/03/19 21:30:50 UTC
svn commit: r1458499 - in /commons/proper/fileupload/trunk/src:
main/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoder.java
test/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoderTestCase.java
Author: sebb
Date: Tue Mar 19 20:30:49 2013
New Revision: 1458499
URL: http://svn.apache.org/r1458499
Log:
Simplify hex conversion by using Character.digit() method.
This also supports lower case hex, and rejects invalid hex digits and eliminates the table data.
Update the test cases.
Modified:
commons/proper/fileupload/trunk/src/main/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoder.java
commons/proper/fileupload/trunk/src/test/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoderTestCase.java
Modified: commons/proper/fileupload/trunk/src/main/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoder.java
URL: http://svn.apache.org/viewvc/commons/proper/fileupload/trunk/src/main/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoder.java?rev=1458499&r1=1458498&r2=1458499&view=diff
==============================================================================
--- commons/proper/fileupload/trunk/src/main/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoder.java (original)
+++ commons/proper/fileupload/trunk/src/main/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoder.java Tue Mar 19 20:30:49 2013
@@ -25,34 +25,12 @@ import java.io.OutputStream;
final class QuotedPrintableDecoder {
/**
- * Set up the encoding table.
- */
- private static final byte[] ENCODING_TABLE = {
- (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7',
- (byte) '8', (byte) '9', (byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F'
- };
-
- /**
* The shift value required to create the upper nibble
* from the first of 2 byte values converted from ascii hex.
*/
private static final int UPPER_NIBBLE_SHIFT = Byte.SIZE / 2;
/**
- * Set up the decoding table; this is indexed by a byte converted to an int,
- * so must be at least as large as the number of different byte values,
- * positive and negative and zero.
- */
- private static final byte[] DECODING_TABLE = new byte[Byte.MAX_VALUE - Byte.MIN_VALUE + 1];
-
- static {
- // initialize the decoding table
- for (int i = 0; i < ENCODING_TABLE.length; i++) {
- DECODING_TABLE[ENCODING_TABLE[i]] = (byte) i;
- }
- }
-
- /**
* Hidden constructor, this class must not be instantiated.
*/
private QuotedPrintableDecoder() {
@@ -99,8 +77,8 @@ final class QuotedPrintableDecoder {
// on decode.
} else {
// this is a hex pair we need to convert back to a single byte.
- byte c1 = DECODING_TABLE[b1];
- byte c2 = DECODING_TABLE[b2];
+ int c1 = hexToBinary(b1);
+ int c2 = hexToBinary(b2);
out.write((c1 << UPPER_NIBBLE_SHIFT) | c2);
// 3 bytes in, one byte out
bytesWritten++;
@@ -115,4 +93,20 @@ final class QuotedPrintableDecoder {
return bytesWritten;
}
+ /**
+ * Convert a hex digit to the binary value it represents.
+ *
+ * @param b the ascii hex byte to convert (0-0, A-F, a-f)
+ * @return the int value of the hex byte, 0-15
+ * @throws IOException if the byte is not a valid hex digit.
+ */
+ private static int hexToBinary(final byte b) throws IOException {
+ // CHECKSTYLE IGNORE MagicNumber FOR NEXT 1 LINE
+ final int i = Character.digit((char) b, 16);
+ if (i == -1) {
+ throw new IOException("Invalid quoted printable encoding: not a valid hex digit: " + b);
+ }
+ return i;
+ }
+
}
Modified: commons/proper/fileupload/trunk/src/test/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoderTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/fileupload/trunk/src/test/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoderTestCase.java?rev=1458499&r1=1458498&r2=1458499&view=diff
==============================================================================
--- commons/proper/fileupload/trunk/src/test/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoderTestCase.java (original)
+++ commons/proper/fileupload/trunk/src/test/java/org/apache/commons/fileupload/util/mime/QuotedPrintableDecoderTestCase.java Tue Mar 19 20:30:49 2013
@@ -48,6 +48,16 @@ public final class QuotedPrintableDecode
assertEncoded("=\r\n", "=3D=0D=0A");
}
+ @Test
+ public void unsafeDecodeLowerCase() throws Exception {
+ assertEncoded("=\r\n", "=3d=0d=0a");
+ }
+
+ @Test(expected = IOException.class)
+ public void invalidCharDecode() throws Exception {
+ assertEncoded("=\r\n", "=3D=XD=XA");
+ }
+
/**
* This is NOT supported by Commons-Codec, see CODEC-121.
*