Open Source Repository

Home /jodd/jodd-3.3.2 | Repository Home



jodd/servlet/URLDecoder.java
// Copyright (c) 2003-2012, Jodd Team (jodd.org). All Rights Reserved.

package jodd.servlet;

import jodd.JoddDefault;
import jodd.util.MathUtil;
import jodd.util.StringPool;

import java.io.UnsupportedEncodingException;

/**
 * URL decoder.
 */
public class URLDecoder {

  /**
   * Decodes URL elements.
   */
  public static String decode(String url) {
    return decode(url, JoddDefault.encoding);
  }

  /**
   * Decodes URL elements.
   */
  public static String decode(String url, String encoding) {

    int queryIndex = url.indexOf('?');
    if (queryIndex != -1) {
      url = url.substring(0, queryIndex+ url.substring(queryIndex).replace('+'' ');
    }

    int ndx = url.indexOf('%');
    if (ndx == -1) {
      return url;
    }

    StringBuilder result = new StringBuilder(url.length());

    int lastIndex = 0;
    int len = url.length();
    while (ndx != -1) {
      result.append(url.substring(lastIndex, ndx));
      ndx++;
      if (ndx + <= len) {
        int value = MathUtil.parseDigit(url.charAt(ndx));
        value <<= 4;
        value += MathUtil.parseDigit(url.charAt(ndx + 1));

        result.append((charvalue);
        lastIndex = ndx + 2;
      }
      ndx = url.indexOf('%', lastIndex);
    }
    result.append(url.substring(lastIndex));

    try {
      return new String(result.toString().getBytes(StringPool.ISO_8859_1), encoding);
    catch (UnsupportedEncodingException ignore) {
      return null;
    }
  }

}