/**
 * Decodes a string from x-www-urlencoded format
 */
//2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678|
package com.limegroup.gnutella.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import com.limegroup.gnutella.ErrorService;

public class URLDecoder {

    /**
     * decodes a strong in x-www-urldecoded format and returns the 
     * the decoded string.
     */
    public static String decode(String s) throws IOException {
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<s.length(); i++) {
            char c = s.charAt(i);
            switch (c) {
                case '+':
                    sb.append(' ');
                    break;
                case '%':
                    if(i+3 > s.length()) {
                        throw new IOException("invalid url: "+s);
                    }
                    try {
                        sb.append((char)Integer.parseInt(
                            s.substring(i+1,i+3),16));
                    } catch (NumberFormatException e) {
                        throw new IOException("invalid url: "+s);
                    }
                    i += 2;
                    break;
                default:
                    sb.append(c);
                    break;
            }
        }
        // Undo conversion to external encoding
        String result = sb.toString();
        try {
            byte[] inputBytes = result.getBytes("8859_1");
            result = new String(inputBytes);
        } catch (UnsupportedEncodingException e) {
            // The system should always have 8859_1
            ErrorService.error(e);
        }
        return result;
    }
}


