FYI, your mail client line wrapped the patch, rendering it useless to patch. Hopefully this is cleared up later in this thread, but I don't see it checked in. You can create a Bugzilla attachment <http://nagoya.apache.org/bugzilla/>.
- Dan "John Wilson" <[EMAIL PROTECTED]> writes: > As the list seems to be eating attachments - here's the patch as a message: > > > > Index: src/java/org/apache/xmlrpc/Base64.java > =================================================================== > RCS file: /home/cvspublic/xml-rpc/src/java/org/apache/xmlrpc/Base64.java,v > retrieving revision 1.2 > diff -u -r1.2 Base64.java > --- src/java/org/apache/xmlrpc/Base64.java 19 Feb 2002 02:25:01 -0000 1.2 > +++ src/java/org/apache/xmlrpc/Base64.java 9 Mar 2002 21:57:12 -0000 > @@ -1,9 +1,9 @@ > package org.apache.xmlrpc; > > /* > - * $Header: > /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/Bas > e64.java,v 1.4 2001/09/04 21:49:55 craigmcc Exp $ > - * $Revision: 1.4 $ > - * $Date: 2001/09/04 21:49:55 $ > + * $Header: > /home/cvspublic/xml-rpc/src/java/org/apache/xmlrpc/Base64.java,v 1.2 > 2002/02/19 02:25:01 jon Exp $ > + * $Revision: 1.2 $ > + * $Date: 2002/02/19 02:25:01 $ > * > * ==================================================================== > * > @@ -70,253 +70,140 @@ > * Multipurpose Internet Mail Extensions (MIME) Part One: Format of > * Internet Message Bodies. Reference 1996 > * > - * @author Jeffrey Rodriguez > - * @version $Id: Base64.java,v 1.4 2001/09/04 21:49:55 craigmcc Exp $ > + * @author John Wilson ([EMAIL PROTECTED]) > + * @version $Id: Base64.java,v 1.2 2002/02/19 02:25:01 jon Exp $ > */ > -public final class Base64 > -{ > - static private final int BASELENGTH = 255; > - static private final int LOOKUPLENGTH = 64; > - static private final int TWENTYFOURBITGROUP = 24; > - static private final int EIGHTBIT = 8; > - static private final int SIXTEENBIT = 16; > - static private final int SIXBIT = 6; > - static private final int FOURBYTE = 4; > - static private final int SIGN = -128; > - static private final byte PAD = (byte) '='; > - static private byte [] base64Alphabet = new byte[BASELENGTH]; > - static private byte [] lookUpBase64Alphabet = new byte[LOOKUPLENGTH]; > - //static private final Log log = > LogSource.getInstance("org.apache.commons.util.Base64"); > - > - static > - { > - for (int i = 0; i < BASELENGTH; i++ ) > - { > - base64Alphabet[i] = -1; > - } > - for (int i = 'Z'; i >= 'A'; i--) > - { > - base64Alphabet[i] = (byte) (i - 'A'); > - } > - for (int i = 'z'; i>= 'a'; i--) > - { > - base64Alphabet[i] = (byte) (i - 'a' + 26); > - } > - for (int i = '9'; i >= '0'; i--) > - { > - base64Alphabet[i] = (byte) (i - '0' + 52); > - } > - > - base64Alphabet['+'] = 62; > - base64Alphabet['/'] = 63; > - > - for (int i = 0; i <= 25; i++ ) > - lookUpBase64Alphabet[i] = (byte) ('A' + i); > - > - for (int i = 26, j = 0; i <= 51; i++, j++ ) > - lookUpBase64Alphabet[i] = (byte) ('a'+ j); > - > - for (int i = 52, j = 0; i <= 61; i++, j++ ) > - lookUpBase64Alphabet[i] = (byte) ('0' + j); > - > - lookUpBase64Alphabet[62] = (byte) '+'; > - lookUpBase64Alphabet[63] = (byte) '/'; > - } > - > - public static boolean isBase64( String isValidString ) > - { > - return isArrayByteBase64(isValidString.getBytes()); > - } > - > - public static boolean isBase64( byte octect ) > - { > - //shall we ignore white space? JEFF?? > - return (octect == PAD || base64Alphabet[octect] != -1); > - } > - > - public static boolean isArrayByteBase64( byte[] arrayOctect ) > - { > - int length = arrayOctect.length; > - if (length == 0) > - { > - // shouldn't a 0 length array be valid base64 data? > - // return false; > - return true; > - } > - for (int i=0; i < length; i++) > - { > - if ( !Base64.isBase64(arrayOctect[i]) ) > - return false; > - } > - return true; > - } > - > - /** > - * Encodes hex octects into Base64. > - * > - * @param binaryData Array containing binary data to encode. > - * @return Base64-encoded data. > - */ > - public static byte[] encode( byte[] binaryData ) > - { > - int lengthDataBits = binaryData.length*EIGHTBIT; > - int fewerThan24bits = lengthDataBits%TWENTYFOURBITGROUP; > - int numberTriplets = lengthDataBits/TWENTYFOURBITGROUP; > - byte encodedData[] = null; > - > - > - if (fewerThan24bits != 0) > - { > - //data not divisible by 24 bit > - encodedData = new byte[ (numberTriplets + 1 ) * 4 ]; > - } > - else > - { > - // 16 or 8 bit > - encodedData = new byte[ numberTriplets * 4 ]; > - } > - > - byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; > - > - int encodedIndex = 0; > - int dataIndex = 0; > - int i = 0; > - //log.debug("number of triplets = " + numberTriplets); > - for ( i = 0; i<numberTriplets; i++ ) > - { > - dataIndex = i*3; > - b1 = binaryData[dataIndex]; > - b2 = binaryData[dataIndex + 1]; > - b3 = binaryData[dataIndex + 2]; > - > - //log.debug("b1= " + b1 +", b2= " + b2 + ", b3= " + b3); > - > - l = (byte)(b2 & 0x0f); > - k = (byte)(b1 & 0x03); > - > - encodedIndex = i * 4; > - byte val1 = ((b1 & > SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0); > - byte val2 = ((b2 & > SIGN)==0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0); > - byte val3 = ((b3 & > SIGN)==0)?(byte)(b3>>6):(byte)((b3)>>6^0xfc); > - > - encodedData[encodedIndex] = lookUpBase64Alphabet[ val1 ]; > - //log.debug( "val2 = " + val2 ); > - //log.debug( "k4 = " + (k<<4) ); > - //log.debug( "vak = " + (val2 | (k<<4)) ); > - encodedData[encodedIndex+1] = > - lookUpBase64Alphabet[ val2 | ( k<<4 )]; > - encodedData[encodedIndex+2] = > - lookUpBase64Alphabet[ (l <<2 ) | val3 ]; > - encodedData[encodedIndex+3] = lookUpBase64Alphabet[ b3 & > 0x3f ]; > - } > - > - // form integral number of 6-bit groups > - dataIndex = i*3; > - encodedIndex = i*4; > - if (fewerThan24bits == EIGHTBIT ) > - { > - b1 = binaryData[dataIndex]; > - k = (byte) ( b1 &0x03 ); > - //log.debug("b1=" + b1); > - //log.debug("b1<<2 = " + (b1>>2) ); > - byte val1 = ((b1 & > SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0); > - encodedData[encodedIndex] = lookUpBase64Alphabet[ val1 ]; > - encodedData[encodedIndex + 1] = lookUpBase64Alphabet[ k<<4 ]; > - encodedData[encodedIndex + 2] = PAD; > - encodedData[encodedIndex + 3] = PAD; > - } > - else if (fewerThan24bits == SIXTEENBIT) > - { > - > - b1 = binaryData[dataIndex]; > - b2 = binaryData[dataIndex +1 ]; > - l = (byte) (b2 & 0x0f); > - k = (byte) (b1 & 0x03); > - > - byte val1 = ((b1 & SIGN) == > 0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0); > - byte val2 = ((b2 & SIGN) == > 0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0); > - > - encodedData[encodedIndex] = lookUpBase64Alphabet[ val1 ]; > - encodedData[encodedIndex + 1] = > - lookUpBase64Alphabet[ val2 | ( k<<4 )]; > - encodedData[encodedIndex + 2] = lookUpBase64Alphabet[ l<<2 ]; > - encodedData[encodedIndex + 3] = PAD; > - } > - > - return encodedData; > - } > - > - /** > - * Decodes Base64 data into octects > - * > - * @param binaryData Byte array containing Base64 data > - * @return Array containing decoded data. > - */ > - public static byte[] decode( byte[] base64Data ) > - { > - // handle the edge case, so we don't have to worry about it later > - if(base64Data.length == 0) { return new byte[0]; } > - > - int numberQuadruple = base64Data.length/FOURBYTE; > - byte decodedData[] = null; > - byte b1=0,b2=0,b3=0, b4=0, marker0=0, marker1=0; > - > - // Throw away anything not in base64Data > - > - int encodedIndex = 0; > - int dataIndex = 0; > - { > - // this sizes the output array properly - rlw > - int lastData = base64Data.length; > - // ignore the '=' padding > - while (base64Data[lastData-1] == PAD) > - { > - if (--lastData == 0) > - { > - return new byte[0]; > - } > - } > - decodedData = new byte[ lastData - numberQuadruple ]; > - } > - > - for (int i = 0; i < numberQuadruple; i++) > - { > - dataIndex = i * 4; > - marker0 = base64Data[dataIndex + 2]; > - marker1 = base64Data[dataIndex + 3]; > - > - b1 = base64Alphabet[base64Data[dataIndex]]; > - b2 = base64Alphabet[base64Data[dataIndex +1]]; > - > - if (marker0 != PAD && marker1 != PAD) > - { > - //No PAD e.g 3cQl > - b3 = base64Alphabet[ marker0 ]; > - b4 = base64Alphabet[ marker1 ]; > - > - decodedData[encodedIndex] = (byte)( b1 <<2 | b2>>4 ) ; > - decodedData[encodedIndex + 1] = > - (byte)(((b2 & 0xf)<<4 ) |( (b3>>2) & 0xf) ); > - decodedData[encodedIndex + 2] = (byte)( b3<<6 | b4 ); > - } > - else if (marker0 == PAD) > - { > - //Two PAD e.g. 3c[Pad][Pad] > - decodedData[encodedIndex] = (byte)( b1 <<2 | b2>>4 ) ; > - } > - else if (marker1 == PAD) > - { > - //One PAD e.g. 3cQ[Pad] > - b3 = base64Alphabet[ marker0 ]; > - > - decodedData[encodedIndex] = (byte)( b1 <<2 | b2>>4 ); > - decodedData[encodedIndex + 1] = > - (byte)(((b2 & 0xf)<<4 ) |( (b3>>2) & 0xf) ); > - } > - encodedIndex += 3; > - } > - return decodedData; > - } > - > - > +public final class Base64 { > + private static final char[] tTable = > "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharAr > ray(); > + private static final byte[] translateTable = ( > + // > + > "\u0042\u0042\u0042\u0042\u0042\u0042\u0042\u0042" > + // \t \n > \r > + + > "\u0042\u0042\u0041\u0041\u0042\u0042\u0041\u0042" > + // > + + > "\u0042\u0042\u0042\u0042\u0042\u0042\u0042\u0042" > + // > + + > "\u0042\u0042\u0042\u0042\u0042\u0042\u0042\u0042" > + // sp ! " # > $ % & ' > + + > "\u0041\u0042\u0042\u0042\u0042\u0042\u0042\u0042" > + // ( ) * + > , - . / > + + > "\u0042\u0042\u0042\u003E\u0042\u0042\u0042\u003F" > + // 0 1 2 3 > 4 5 6 7 > + + > "\u0034\u0035\u0036\u0037\u0038\u0039\u003A\u003B" > + // 8 9 : ; > < = > ? > + + > "\u003C\u003D\u0042\u0042\u0042\u0040\u0042\u0042" > + // @ A B C > D E F G > + + > "\u0042\u0000\u0001\u0002\u0003\u0004\u0005\u0006" > + // H I J K L M > N O > + + > "\u0007\u0008\t\n\u000B\u000C\r\u000E" > + // P Q R S > T U V W > + + > "\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016" > + // X Y Z > [ \ ] ^ _ > + + > "\u0017\u0018\u0019\u0042\u0042\u0042\u0042\u0042" > + // ' a b c > d e f g > + + > "\u0042\u001A\u001B\u001C\u001D\u001E\u001F\u0020" > + // h i j k l > m n o p > + + > "\u0021\"\u0023\u0024\u0025\u0026\u0027\u0028" > + // p q r s > t u v w > + + > "\u0029\u002A\u002B\u002C\u002D\u002E\u002F\u0030" > + // x y z > + + > "\u0031\u0032\u0033").getBytes(); > + > + /** > + * Encodes hex octects into Base64. > + * > + * @param binaryData Array containing binary data to encode. > + * @return Base64-encoded data. > + */ > + public static char[] encode(final byte[] binaryData) { > + final int numChars = ((binaryData.length + 2) / 3) * 4; > + final int dLimit = (binaryData.length / 3) * 3; > + final char[] buf = new char[numChars + 2 + (binaryData.length / 54)]; > + int bIndex = 1; > + int byteCount = 0; > + > + buf[0] = '\n'; > + > + for (int dIndex = 0; dIndex != dLimit; dIndex += 3) { > + final int d = ((binaryData[dIndex] & 0XFF) << 16) | > + ((binaryData[dIndex + 1] & 0XFF) << 8) | > + (binaryData[dIndex + 2] & 0XFF); > + > + buf[bIndex++] = tTable[d >> 18]; > + buf[bIndex++] = tTable[(d >> 12) & 0X3F]; > + buf[bIndex++] = tTable[(d >> 6) & 0X3F]; > + buf[bIndex++] = tTable[d & 0X3F]; > + > + if (++byteCount == 18) { > + buf[bIndex++] = '\n'; > + byteCount = 0; > + } > + } > + > + if (dLimit != binaryData.length) { > + int d = (binaryData[dLimit] & 0XFF) << 16; > + > + if (dLimit + 1 != binaryData.length) { > + d |= (binaryData[dLimit + 1] & 0XFF) << 8; > + } > + > + buf[bIndex++] = tTable[d >> 18]; > + buf[bIndex++] = tTable[(d >> 12) & 0X3F]; > + buf[bIndex++] = (dLimit + 1 < binaryData.length) ? tTable[(d >> 6) & > 0X3F] : '='; > + buf[bIndex++] = '='; > + } > + > + buf[bIndex] = '\n'; > + > + return buf; > + } > + > + /** > + * Decodes Base64 binaryData into octects > + * > + * @param binarybinaryData Byte array containing Base64 binaryData > + * @return Array containing decoded binaryData. > + */ > + public static byte[] decode(final StringBuffer base64Data) { > + final byte[] bytes = new byte[((base64Data.length() + 3) / 4) * 3]; > + int bytesIndex = 0; > + int byteShift = 4; > + int tmp = 0; > + int sixBit = 0; > + boolean gotEquals = false; > + > + for (int i = 0; i != base64Data.length(); i++) { > + final char c = base64Data.charAt(i); > + > + sixBit = (c < translateTable.length) ? translateTable[c] : 66; > + > + if (sixBit < 64) { > + if (gotEquals) throw new Error("= character not at end of base64 > value"); > + > + tmp = (tmp << 6) | sixBit; > + > + if (byteShift-- != 4) > + bytes[bytesIndex++] = (byte)(tmp >> (byteShift * 2)); > + > + } else if (sixBit == 64) { > + byteShift--; > + gotEquals = true; > + > + } else if (sixBit == 66) { > + throw new Error("bad character \'" + c + "\' in base64 value"); > + } > + > + if (byteShift == 0) byteShift = 4; > + } > + > + if (byteShift != 4) throw new Error("wrong number of = characters at > end of base64 value"); > + > + if (bytes.length == bytesIndex) return bytes; > + > + final byte[] t = new byte[bytesIndex]; > + > + System.arraycopy(bytes, 0, t, 0, bytesIndex); > + > + return t; > + } > } > Index: src/java/org/apache/xmlrpc/WebServer.java > =================================================================== > RCS file: > /home/cvspublic/xml-rpc/src/java/org/apache/xmlrpc/WebServer.java,v > retrieving revision 1.9 > diff -u -r1.9 WebServer.java > --- src/java/org/apache/xmlrpc/WebServer.java 6 Mar 2002 15:52:56 -0000 1.9 > +++ src/java/org/apache/xmlrpc/WebServer.java 9 Mar 2002 21:57:15 -0000 > @@ -640,7 +640,7 @@ > try > { > byte[] c = > - Base64.decode (line.substring(21).getBytes()); > + Base64.decode(new > StringBuffer(line.substring(21))); > String str = new String (c); > int col = str.indexOf (':'); > user = str.substring (0, col); > Index: src/java/org/apache/xmlrpc/XmlRpc.java > =================================================================== > RCS file: /home/cvspublic/xml-rpc/src/java/org/apache/xmlrpc/XmlRpc.java,v > retrieving revision 1.21 > diff -u -r1.21 XmlRpc.java > --- src/java/org/apache/xmlrpc/XmlRpc.java 8 Mar 2002 05:19:29 -0000 1.21 > +++ src/java/org/apache/xmlrpc/XmlRpc.java 9 Mar 2002 21:57:18 -0000 > @@ -389,7 +389,7 @@ > // finalize character data, if appropriate > if (currentValue != null && readCdata) > { > - currentValue.characterData (cdata.toString ()); > + currentValue.characterData (cdata); > cdata.setLength (0); > readCdata = false; > } > @@ -587,39 +587,39 @@ > * Set the character data for the element and interpret it > * according to the element type. > */ > - public void characterData (String cdata) > + public void characterData (StringBuffer cdata) > { > switch (type) > { > case INTEGER: > - value = new Integer (cdata.trim ()); > + value = new Integer(cdata.toString().trim()); > break; > case BOOLEAN: > - value = ("1".equals (cdata.trim ()) ? > + value = ("1".equals(cdata.toString().trim()) ? > Boolean.TRUE : Boolean.FALSE); > break; > case DOUBLE: > - value = new Double (cdata.trim ()); > + value = new Double(cdata.toString().trim()); > break; > case DATE: > try > { > - value = dateformat.parse (cdata.trim ()); > + value = dateformat.parse(cdata.toString().trim()); > } > catch (ParseException p) > { > - throw new RuntimeException (p.getMessage ()); > + throw new RuntimeException(p.getMessage()); > } > break; > case BASE64: > - value = Base64.decode (cdata.getBytes()); > + value = Base64.decode(cdata); > break; > case STRING: > - value = cdata; > + value = cdata.toString(); > break; > case STRUCT: > // this is the name to use for the next member of this > struct > - nextMemberName = cdata; > + nextMemberName = cdata.toString(); > break; > } > } > Index: src/java/org/apache/xmlrpc/applet/SimpleXmlRpcClient.java > =================================================================== > RCS file: > /home/cvspublic/xml-rpc/src/java/org/apache/xmlrpc/applet/SimpleXmlRpcClient > .java,v > retrieving revision 1.3 > diff -u -r1.3 SimpleXmlRpcClient.java > --- src/java/org/apache/xmlrpc/applet/SimpleXmlRpcClient.java 8 Mar 2002 > 04:41:53 -0000 1.3 > +++ src/java/org/apache/xmlrpc/applet/SimpleXmlRpcClient.java 9 Mar 2002 > 21:57:22 -0000 > @@ -330,7 +330,7 @@ > // finalize character data, if appropriate > if (currentValue != null && readCdata) > { > - currentValue.characterData (cdata.toString ()); > + currentValue.characterData(cdata); > cdata.setLength (0); > readCdata = false; > } > @@ -518,39 +518,39 @@ > * Set the character data for the element and interpret it > according to the > * element type > */ > - public void characterData (String cdata) > + public void characterData (StringBuffer cdata) > { > switch (type) > { > case INTEGER: > - value = new Integer (cdata.trim ()); > + value = new Integer (cdata.toString().trim()); > break; > case BOOLEAN: > - value = new Boolean ("1".equals (cdata.trim ())); > + value = new Boolean ("1".equals > (cdata.toString().trim())); > break; > case DOUBLE: > - value = new Double (cdata.trim ()); > + value = new Double (cdata.toString().trim()); > break; > case DATE: > try > { > - value = format.parse (cdata.trim ()); > + value = format.parse (cdata.toString().trim()); > } > catch (ParseException p) > { > // System.err.println ("Exception while parsing > date: "+p); > - throw new RuntimeException (p.getMessage ()); > + throw new RuntimeException (p.getMessage()); > } > break; > case BASE64: > - value = Base64.decode(cdata.getBytes()); > + value = Base64.decode(cdata); > break; > case STRING: > - value = cdata; > + value = cdata.toString(); > break; > case STRUCT: > // this is the name to use for the next member of this > struct > - nextMemberName = cdata; > + nextMemberName = cdata.toString(); > break; > } > }