blob: b52dff3ba0ee039c8f266554da47fd7ac357294b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1999, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.http;
import java.io.UnsupportedEncodingException;
public class URI {
/**
* Takes an encoded string and decodes it
* @param input encoded String
* @param charset The charset to use convert escaped characters
* @return Decoded String.
*/
public static String decode(String input, String charset) {
if (input == null) {
return null;
}
return decode(input, 0, input.length(), charset);
}
/**
* Takes an encoded string and decodes it
* @param input encoded String (must not be null)
* @param begin the beginning index, inclusive.
* @param end the ending index, exclusive.
* @param charset The charset to use convert escaped characters
* @return Decoded String.
*/
public static String decode(String input, int begin, int end, String charset) {
if (input == null) {
return (null);
}
int index = input.indexOf('%', begin);
if ((index == -1) || (index >= end)) {
return input.substring(begin, end).replace('+', ' ');
}
int size = end - begin;
StringBuffer result = new StringBuffer(size);
byte[] bytes = new byte[size];
int length = 0;
for (int i = begin; i < end; i++) {
char c = input.charAt(i);
if (c == '%') {
if (i + 2 >= end) {
throw new IllegalArgumentException();
}
i++;
int digit = Character.digit(input.charAt(i), 16);
if (digit == -1) {
throw new IllegalArgumentException();
}
int value = (digit << 4);
i++;
digit = Character.digit(input.charAt(i), 16);
if (digit == -1) {
throw new IllegalArgumentException();
}
value |= digit;
bytes[length] = (byte) value;
length++;
} else {
if (length > 0) {
result.append(convert(bytes, 0, length, charset));
length = 0;
}
if (c == '+') {
c = ' ';
}
result.append(c);
}
}
if (length > 0) {
result.append(convert(bytes, 0, length, charset));
length = 0;
}
return result.toString();
}
/**
* Convert bytes to a String using the supplied charset.
* @param input Array of bytes to convert.
* @param offset the beginning index, inclusive.
* @param length number of bytes to convert.
* @param charset The charset to use convert the bytes.
* @return String containing converted bytes.
*/
public static String convert(byte[] input, int offset, int length, String charset) {
if (charset != null) {
try {
return new String(input, offset, length, charset);
} catch (UnsupportedEncodingException e) {
/* if the supplied charset is invalid,
* fall through to use 8859_1.
*/
}
}
try {
return new String(input, offset, length, "ISO-8859-1"); //$NON-NLS-1$
} catch (UnsupportedEncodingException e) {
/* in the unlikely event 8859_1 is not present */
return new String(input, offset, length);
}
}
}