1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright 2001-2004 The Apache Software Foundation. 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Licensed under the Apache License, Version 2.0 (the "License"); 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * you may not use this file except in compliance with the License. 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * You may obtain a copy of the License at 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * http://www.apache.org/licenses/LICENSE-2.0 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Unless required by applicable law or agreed to in writing, software 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * distributed under the License is distributed on an "AS IS" BASIS, 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * See the License for the specific language governing permissions and 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * limitations under the License. 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.apache.commons.codec.net; 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.UnsupportedEncodingException; 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.apache.commons.codec.DecoderException; 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.apache.commons.codec.EncoderException; 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.apache.commons.codec.StringDecoder; 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.apache.commons.codec.StringEncoder; 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.apache.commons.codec.binary.Base64; 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <p> 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Identical to the Base64 encoding defined by <a href="http://www.ietf.org/rfc/rfc1521.txt">RFC 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1521</a> and allows a character set to be specified. 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </p> 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <p> 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <a href="http://www.ietf.org/rfc/rfc1522.txt">RFC 1522</a> describes techniques to allow the encoding of non-ASCII 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * text in various portions of a RFC 822 [2] message header, in a manner which is unlikely to confuse existing message 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * handling software. 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </p> 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @see <a href="http://www.ietf.org/rfc/rfc1522.txt">MIME (Multipurpose Internet Mail Extensions) Part Two: Message 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Header Extensions for Non-ASCII Text</a> 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @author Apache Software Foundation 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @since 1.3 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @version $Id: BCodec.java,v 1.5 2004/04/13 22:46:37 ggregory Exp $ 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @deprecated Please use {@link java.net.URL#openConnection} instead. 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a> 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for further details. 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@Deprecated 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class BCodec extends RFC1522Codec implements StringEncoder, StringDecoder { 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The default charset used for string decoding and encoding. 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private String charset = StringEncodings.UTF8; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Default constructor. 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public BCodec() { 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver super(); 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Constructor which allows for the selection of a default charset 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param charset 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the default string charset to use. 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @see <a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/package-summary.html#charenc">JRE character 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * encoding names</a> 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public BCodec(final String charset) { 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver super(); 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.charset = charset; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected String getEncoding() { 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return "B"; 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected byte[] doEncoding(byte[] bytes) throws EncoderException { 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (bytes == null) { 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return Base64.encodeBase64(bytes); 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected byte[] doDecoding(byte[] bytes) throws DecoderException { 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (bytes == null) { 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return Base64.decodeBase64(bytes); 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Encodes a string into its Base64 form using the specified charset. Unsafe characters are escaped. 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param value 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * string to convert to Base64 form 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param charset 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the charset for pString 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return Base64 string 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @throws EncoderException 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * thrown if a failure condition is encountered during the encoding process. 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String encode(final String value, final String charset) throws EncoderException { 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (value == null) { 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return encodeText(value, charset); 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } catch (UnsupportedEncodingException e) { 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new EncoderException(e.getMessage()); 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Encodes a string into its Base64 form using the default charset. Unsafe characters are escaped. 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param value 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * string to convert to Base64 form 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return Base64 string 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @throws EncoderException 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * thrown if a failure condition is encountered during the encoding process. 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String encode(String value) throws EncoderException { 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (value == null) { 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return encode(value, getDefaultCharset()); 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Decodes a Base64 string into its original form. Escaped characters are converted back to their original 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * representation. 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param value 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Base64 string to convert into its original form 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return original string 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @throws DecoderException 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * A decoder exception is thrown if a failure condition is encountered during the decode process. 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String decode(String value) throws DecoderException { 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (value == null) { 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return decodeText(value); 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } catch (UnsupportedEncodingException e) { 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new DecoderException(e.getMessage()); 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Encodes an object into its Base64 form using the default charset. Unsafe characters are escaped. 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param value 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * object to convert to Base64 form 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return Base64 object 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @throws EncoderException 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * thrown if a failure condition is encountered during the encoding process. 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public Object encode(Object value) throws EncoderException { 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (value == null) { 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else if (value instanceof String) { 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return encode((String) value); 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new EncoderException("Objects of type " 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + value.getClass().getName() 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + " cannot be encoded using BCodec"); 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Decodes a Base64 object into its original form. Escaped characters are converted back to their original 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * representation. 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param value 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Base64 object to convert into its original form 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return original object 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @throws DecoderException 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * A decoder exception is thrown if a failure condition is encountered during the decode process. 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public Object decode(Object value) throws DecoderException { 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (value == null) { 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else if (value instanceof String) { 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return decode((String) value); 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new DecoderException("Objects of type " 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + value.getClass().getName() 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + " cannot be decoded using BCodec"); 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The default charset used for string decoding and encoding. 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @return the default string charset. 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getDefaultCharset() { 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.charset; 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver