1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/* 2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Copyright 2001-2004 The Apache Software Foundation. 3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * you may not use this file except in compliance with the License. 6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * You may obtain a copy of the License at 7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * See the License for the specific language governing permissions and 14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * limitations under the License. 15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpackage org.apache.commons.codec.net; 18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.io.ByteArrayOutputStream; 20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.io.UnsupportedEncodingException; 21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.BitSet; 22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.BinaryDecoder; 24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.BinaryEncoder; 25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.DecoderException; 26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.EncoderException; 27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.StringDecoder; 28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.codec.StringEncoder; 29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/** 31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <p>Implements the 'www-form-urlencoded' encoding scheme, 32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * also misleadingly known as URL encoding.</p> 33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <p>For more detailed information please refer to 35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <a href="http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1"> 36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Chapter 17.13.4 'Form content types'</a> of the 37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <a href="http://www.w3.org/TR/html4/">HTML 4.01 Specification<a></p> 38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <p> 40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This codec is meant to be a replacement for standard Java classes 41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * {@link java.net.URLEncoder} and {@link java.net.URLDecoder} 42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * on older Java platforms, as these classes in Java versions below 43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 1.4 rely on the platform's default charset encoding. 44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * </p> 45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author Apache Software Foundation 47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @since 1.2 48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @version $Id: URLCodec.java,v 1.19 2004/03/29 07:59:00 ggregory Exp $ 49d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath * 50d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath * @deprecated Please use {@link java.net.URL#openConnection} instead. 51d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath * Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a> 52d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath * for further details. 53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 54d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath@Deprecated 55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic class URLCodec implements BinaryEncoder, BinaryDecoder, StringEncoder, StringDecoder { 56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The default charset used for string decoding and encoding. 59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project protected String charset = StringEncodings.UTF8; 61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project protected static byte ESCAPE_CHAR = '%'; 63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * BitSet of www-form-url safe characters. 65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project protected static final BitSet WWW_FORM_URL = new BitSet(256); 67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // Static initializer for www_form_url 69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project static { 70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // alpha characters 71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (int i = 'a'; i <= 'z'; i++) { 72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project WWW_FORM_URL.set(i); 73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (int i = 'A'; i <= 'Z'; i++) { 75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project WWW_FORM_URL.set(i); 76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // numeric characters 78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (int i = '0'; i <= '9'; i++) { 79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project WWW_FORM_URL.set(i); 80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // special chars 82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project WWW_FORM_URL.set('-'); 83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project WWW_FORM_URL.set('_'); 84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project WWW_FORM_URL.set('.'); 85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project WWW_FORM_URL.set('*'); 86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // blank to be replaced with + 87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project WWW_FORM_URL.set(' '); 88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Default constructor. 93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public URLCodec() { 95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project super(); 96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Constructor which allows for the selection of a default charset 100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param charset the default string charset to use. 102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public URLCodec(String charset) { 104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project super(); 105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.charset = charset; 106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Encodes an array of bytes into an array of URL safe 7-bit 110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * characters. Unsafe characters are escaped. 111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param urlsafe bitset of characters deemed URL safe 113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param bytes array of bytes to convert to URL safe characters 114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return array of bytes containing URL safe characters 115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public static final byte[] encodeUrl(BitSet urlsafe, byte[] bytes) 117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project { 118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (bytes == null) { 119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return null; 120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (urlsafe == null) { 122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project urlsafe = WWW_FORM_URL; 123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (int i = 0; i < bytes.length; i++) { 127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project int b = bytes[i]; 128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (b < 0) { 129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project b = 256 + b; 130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (urlsafe.get(b)) { 132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (b == ' ') { 133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project b = '+'; 134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.write(b); 136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else { 137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.write('%'); 138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project char hex1 = Character.toUpperCase( 139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project Character.forDigit((b >> 4) & 0xF, 16)); 140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project char hex2 = Character.toUpperCase( 141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project Character.forDigit(b & 0xF, 16)); 142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.write(hex1); 143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.write(hex2); 144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return buffer.toByteArray(); 147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Decodes an array of URL safe 7-bit characters into an array of 152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * original bytes. Escaped characters are converted back to their 153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * original representation. 154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param bytes array of URL safe characters 156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return array of original bytes 157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws DecoderException Thrown if URL decoding is unsuccessful 158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public static final byte[] decodeUrl(byte[] bytes) 160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throws DecoderException 161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project { 162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (bytes == null) { 163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return null; 164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (int i = 0; i < bytes.length; i++) { 167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project int b = bytes[i]; 168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (b == '+') { 169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.write(' '); 170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else if (b == '%') { 171069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project try { 172069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project int u = Character.digit((char)bytes[++i], 16); 173069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project int l = Character.digit((char)bytes[++i], 16); 174069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (u == -1 || l == -1) { 175069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new DecoderException("Invalid URL encoding"); 176069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 177069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.write((char)((u << 4) + l)); 178069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } catch(ArrayIndexOutOfBoundsException e) { 179069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new DecoderException("Invalid URL encoding"); 180069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 181069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else { 182069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.write(b); 183069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 184069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 185069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return buffer.toByteArray(); 186069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 187069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 188069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 189069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 190069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Encodes an array of bytes into an array of URL safe 7-bit 191069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * characters. Unsafe characters are escaped. 192069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 193069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param bytes array of bytes to convert to URL safe characters 194069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return array of bytes containing URL safe characters 195069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 196069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public byte[] encode(byte[] bytes) { 197069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return encodeUrl(WWW_FORM_URL, bytes); 198069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 199069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 200069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 201069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 202069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Decodes an array of URL safe 7-bit characters into an array of 203069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * original bytes. Escaped characters are converted back to their 204069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * original representation. 205069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 206069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param bytes array of URL safe characters 207069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return array of original bytes 208069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws DecoderException Thrown if URL decoding is unsuccessful 209069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 210069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public byte[] decode(byte[] bytes) throws DecoderException { 211069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return decodeUrl(bytes); 212069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 213069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 214069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 215069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 216069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Encodes a string into its URL safe form using the specified 217069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * string charset. Unsafe characters are escaped. 218069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 219069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param pString string to convert to a URL safe form 220069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param charset the charset for pString 221069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return URL safe string 222069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws UnsupportedEncodingException Thrown if charset is not 223069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * supported 224069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 225069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String encode(String pString, String charset) 226069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throws UnsupportedEncodingException 227069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project { 228069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (pString == null) { 229069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return null; 230069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 231069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return new String(encode(pString.getBytes(charset)), StringEncodings.US_ASCII); 232069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 233069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 234069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 235069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 236069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Encodes a string into its URL safe form using the default string 237069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * charset. Unsafe characters are escaped. 238069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 239069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param pString string to convert to a URL safe form 240069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return URL safe string 241069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws EncoderException Thrown if URL encoding is unsuccessful 242069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 243069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @see #getDefaultCharset() 244069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 245069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String encode(String pString) throws EncoderException { 246069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (pString == null) { 247069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return null; 248069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 249069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project try { 250069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return encode(pString, getDefaultCharset()); 251069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } catch(UnsupportedEncodingException e) { 252069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new EncoderException(e.getMessage()); 253069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 254069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 255069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 256069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 257069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 258069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Decodes a URL safe string into its original form using the 259069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * specified encoding. Escaped characters are converted back 260069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * to their original representation. 261069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 262069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param pString URL safe string to convert into its original form 263069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param charset the original string charset 264069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return original string 265069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws DecoderException Thrown if URL decoding is unsuccessful 266069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws UnsupportedEncodingException Thrown if charset is not 267069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * supported 268069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 269069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String decode(String pString, String charset) 270069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throws DecoderException, UnsupportedEncodingException 271069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project { 272069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (pString == null) { 273069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return null; 274069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 275069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return new String(decode(pString.getBytes(StringEncodings.US_ASCII)), charset); 276069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 277069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 278069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 279069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 280069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Decodes a URL safe string into its original form using the default 281069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * string charset. Escaped characters are converted back to their 282069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * original representation. 283069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 284069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param pString URL safe string to convert into its original form 285069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return original string 286069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws DecoderException Thrown if URL decoding is unsuccessful 287069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 288069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @see #getDefaultCharset() 289069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 290069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String decode(String pString) throws DecoderException { 291069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (pString == null) { 292069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return null; 293069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 294069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project try { 295069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return decode(pString, getDefaultCharset()); 296069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } catch(UnsupportedEncodingException e) { 297069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new DecoderException(e.getMessage()); 298069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 299069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 300069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 301069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 302069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Encodes an object into its URL safe form. Unsafe characters are 303069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * escaped. 304069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 305069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param pObject string to convert to a URL safe form 306069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return URL safe object 307069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws EncoderException Thrown if URL encoding is not 308069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * applicable to objects of this type or 309069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * if encoding is unsuccessful 310069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 311069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public Object encode(Object pObject) throws EncoderException { 312069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (pObject == null) { 313069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return null; 314069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else if (pObject instanceof byte[]) { 315069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return encode((byte[])pObject); 316069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else if (pObject instanceof String) { 317069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return encode((String)pObject); 318069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else { 319069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new EncoderException("Objects of type " + 320069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pObject.getClass().getName() + " cannot be URL encoded"); 321069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 322069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 323069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 324069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 325069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 326069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Decodes a URL safe object into its original form. Escaped 327069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * characters are converted back to their original representation. 328069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 329069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param pObject URL safe object to convert into its original form 330069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return original object 331069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws DecoderException Thrown if URL decoding is not 332069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * applicable to objects of this type 333069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * if decoding is unsuccessful 334069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 335069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public Object decode(Object pObject) throws DecoderException { 336069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (pObject == null) { 337069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return null; 338069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else if (pObject instanceof byte[]) { 339069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return decode((byte[])pObject); 340069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else if (pObject instanceof String) { 341069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return decode((String)pObject); 342069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else { 343069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new DecoderException("Objects of type " + 344069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pObject.getClass().getName() + " cannot be URL decoded"); 345069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 346069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 347069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 348069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 349069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 350069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The <code>String</code> encoding used for decoding and encoding. 351069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 352069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return Returns the encoding. 353069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 354069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @deprecated use #getDefaultCharset() 355069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 356069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String getEncoding() { 357069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.charset; 358069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 359069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 360069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 361069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The default charset used for string decoding and encoding. 362069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 363069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return the default string charset. 364069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 365069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String getDefaultCharset() { 366069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.charset; 367069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 368069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 369069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 370