commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jsde...@apache.org
Subject cvs commit: jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/util Base64.java
Date Tue, 03 Dec 2002 15:20:32 GMT
jsdever     2002/12/03 07:20:32

  Modified:    httpclient build.xml
               httpclient/src/java/org/apache/commons/httpclient
                        Authenticator.java HttpMethodBase.java NTLM.java
                        URIUtil.java
  Added:       httpclient/src/java/org/apache/commons/httpclient/util
                        Base64.java
  Log:
  Move Base64 class to util package.
  
  Base64.java was copied to the util package an depreceated in the root
  httpclient package.  The copy in the root package should be removed
  for the Beta 1 release.
  
  Turned on the deprecation flag in build.xml so we can clearly see
  which deprecated APIs we are using.
  
  Contributed by: Jeff Dever
  
  Revision  Changes    Path
  1.21      +2 -2      jakarta-commons/httpclient/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/httpclient/build.xml,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- build.xml	29 Oct 2002 06:08:20 -0000	1.20
  +++ build.xml	3 Dec 2002 15:20:31 -0000	1.21
  @@ -82,7 +82,7 @@
     <property name="compile.debug"           value="true"/>
   
     <!-- Should Java compilations set the 'deprecation' compiler option? -->
  -  <property name="compile.deprecation"     value="false"/>
  +  <property name="compile.deprecation"     value="true"/>
   
     <!-- Should Java compilations set the 'optimize' compiler option? -->
     <property name="compile.optimize"        value="true"/>
  
  
  
  1.35      +6 -4      jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/Authenticator.java
  
  Index: Authenticator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/Authenticator.java,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- Authenticator.java	29 Oct 2002 06:23:25 -0000	1.34
  +++ Authenticator.java	3 Dec 2002 15:20:31 -0000	1.35
  @@ -61,6 +61,8 @@
    */
   package org.apache.commons.httpclient;
   
  +import org.apache.commons.httpclient.util.Base64;
  +
   import java.security.MessageDigest;
   import java.util.Map;
   import java.util.Hashtable;
  
  
  
  1.82      +4 -6      jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java
  
  Index: HttpMethodBase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v
  retrieving revision 1.81
  retrieving revision 1.82
  diff -u -r1.81 -r1.82
  --- HttpMethodBase.java	3 Dec 2002 05:46:15 -0000	1.81
  +++ HttpMethodBase.java	3 Dec 2002 15:20:32 -0000	1.82
  @@ -503,7 +503,6 @@
        * Provide access to the status code.
        * 
        * @return the status code associated with the latest response.
  -     * @deprecated use getStatusLine().getStatusCode()
        */
       public int getStatusCode() {
           return statusLine.getStatusCode();
  @@ -665,7 +664,6 @@
        * 
        * @return the status text (or "reason phrase") associated with the latest
        *         response.
  -     * @deprecated use getStatusLine.getReasonPhrase()
        */
       public String getStatusText() {
           return statusLine.getReasonPhrase();
  
  
  
  1.6       +6 -4      jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/NTLM.java
  
  Index: NTLM.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/NTLM.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- NTLM.java	24 Oct 2002 08:27:08 -0000	1.5
  +++ NTLM.java	3 Dec 2002 15:20:32 -0000	1.6
  @@ -62,6 +62,8 @@
   
   package org.apache.commons.httpclient;
   
  +import org.apache.commons.httpclient.util.Base64;
  +
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
   
  
  
  
  1.15      +6 -4      jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/URIUtil.java
  
  Index: URIUtil.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/URIUtil.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- URIUtil.java	16 Oct 2002 16:58:26 -0000	1.14
  +++ URIUtil.java	3 Dec 2002 15:20:32 -0000	1.15
  @@ -90,6 +90,8 @@
    * @author Park, Sung-Gu
    * @author Rodney Waldhoff
    * @version $Revision$ $Date$
  + *
  + * @deprecated This class will be removed before 2.0 release.  Use util.URIUtil instead.
    */
   
   public final class URIUtil {
  
  
  
  1.1                  jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/util/Base64.java
  
  Index: Base64.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/util/Base64.java,v
1.1 2002/12/03 15:20:32 jsdever Exp $
   * $Revision: 1.1 $
   * $Date: 2002/12/03 15:20:32 $
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "HttpClient", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */
  
  package org.apache.commons.httpclient.util;
  
  /**
   * <p>Base64 encoder and decoder.</p>
   * <p>
   * This class provides encoding/decoding methods for
   * the Base64 encoding as defined by RFC 2045,
   * N. Freed and N. Borenstein.
   * RFC 2045: Multipurpose Internet Mail Extensions (MIME)
   * Part One: Format of Internet Message Bodies. Reference
   * 1996. Available at: 
   * <a href="http://www.ietf.org/rfc/rfc2045.txt">
   * http://www.ietf.org/rfc/rfc2045.txt</a>
   * </p>
   * 
   * @author Jeffrey Rodriguez
   * @version $Revision: 1.1 $ $Date: 2002/12/03 15:20:32 $
   * 
   */
  public final class Base64 {
      private static final int  BASELENGTH         = 255;
      private static final int  LOOKUPLENGTH       = 64;
      private static final int  TWENTYFOURBITGROUP = 24;
      private static final int  EIGHTBIT           = 8;
      private static final int  SIXTEENBIT         = 16;
      private static final int  SIXBIT             = 6;
      private static final int  FOURBYTE           = 4;
      private static final int  SIGN               = -128;
      private static final byte PAD                = (byte) '=';
      private static byte [] base64Alphabet       = new byte[BASELENGTH];
      private static byte [] lookUpBase64Alphabet = new byte[LOOKUPLENGTH];
  
      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) '/';
  
      }
  
  	private Base64()
  	{
  		// the constructor is intentionally private
  	}
  	
      public static boolean isBase64(String isValidString) {
          return isArrayByteBase64(isValidString.getBytes());
      }
  
  
      static boolean isBase64(byte octect) {
          // Should we ignore white space?
          return (octect == PAD || base64Alphabet[octect] != -1);
      }
  
  
      public static boolean isArrayByteBase64(byte[] arrayOctect) {
          int length = arrayOctect.length;
          if (length == 0) {
              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 binaryData
       * @return Base64-encoded array
       */
      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;
          byte l = 0;
          byte b1 = 0;
          byte b2 = 0;
          byte b3 = 0;
          int encodedIndex = 0;
          int dataIndex   = 0;
          int i           = 0;
          for (i = 0; i < numberTriplets; i++) {
  
              dataIndex = i * 3;
              b1 = binaryData[dataIndex];
              b2 = binaryData[dataIndex + 1];
              b3 = binaryData[dataIndex + 2];
  
              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];
              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);
              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 base64Data byte array containing Base64 data
       * @return Array containing decoded data.
       */
      public static byte[] decode(byte[] base64Data) {
          // Should we throw away anything not in 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;
  
          int encodedIndex = 0;
          int dataIndex    = 0;
          {
              // this block 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;
      }
  
  }
  
  
  

--
To unsubscribe, e-mail:   <mailto:commons-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@jakarta.apache.org>


Mime
View raw message