/**
* $URL: https://source.sakaiproject.org/svn/basiclti/trunk/basiclti-common/src/java/org/sakaiproject/basiclti/UrlUtility.java $
* $Id: UrlUtility.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $
*
* Copyright (c) 2010 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sakaiproject.basiclti;
import org.apache.commons.codec.binary.Base64;
/**
* Utility class implementing the Base64 modified Base64 for URL variant. See:
* <a href="http://en.wikipedia.org/wiki/Base64">http://en.wikipedia.org/wiki/
* Base64</a>.
*/
public class UrlUtility {
private UrlUtility() {
// non-instantiable, no setup needed
}
/**
* Encode a URL to be embedded as a query parameter.
*
* @param url
* Plaintext URL to encode
* @return Properly encoded String, ready to be embedded as a query parmeter
*/
public static String encodeUrl(String url) {
return cleanUrl(rawEncodeUrl(url));
}
/**
* Decode a URL encoded by this class, typically from a query parameter.
*
* @param encodedUrl
* Encoded URL as processed by this class
* @return Decoded String, in its original form
*/
public static String decodeUrl(String encodedUrl) {
return rawDecodeUrl(repairUrl(encodedUrl));
}
/**
* Utility method to do non-URL safe encoding. This method provides the base
* encoding, while cleanUrl scrubs it for URL safety. You will not generally
* be concerned with this method.
*
* @param url
* Plaintext URL to encode
* @return Encoded String, not guaranteed to be URL-safe
*/
public static String rawEncodeUrl(String url) {
return new String(Base64.encodeBase64(url.getBytes()));
}
/**
* Utility method to do non-URL safe decoding. As with rawEncodeUrl, you
* will generally not be concerned with this method.
*
* @param encodedUrl
* Raw encoded URL to decode
* @return Decoded String URL
*/
public static String rawDecodeUrl(String encodedUrl) {
return new String(Base64.decodeBase64(encodedUrl.getBytes()));
}
/**
* Clean an encoded string so it may be embedded as a query parameter.
*
* @param encodedUrl
* Encoded String to clean
* @return Processed URL that is safe to embed as a query parameter. It will
* not contain any characters that will interfere with other
* parameters.
*/
public static String cleanUrl(String encodedUrl) {
return encodedUrl.replaceAll("\\+", "-").replaceAll("/", "_").replaceAll(
"=", "");
}
/**
* Repair a URL cleaned by this class, so the raw encode/decode methods will
* operate.
*
* @param cleanedUrl
* Cleaned, encoded URL to repair
* @return Encoded URL, ready for native encoding and decoding.
*
*/
public static String repairUrl(String cleanedUrl) {
int padLength = (4 - (cleanedUrl.length() % 4)) % 4;
String padding = "";
for (int i = 0; i < padLength; i++)
padding += "=";
return cleanedUrl.replaceAll("-", "+").replaceAll("_", "/") + padding;
}
public static void main(String[] args) {
String sample = "12345:/sites/foo/bar !@#$%^&*()_+|}{\":?><[]\';/.,'����������Э��ҹ������ό�ĩ����ɾֳ���ÍŽ";
String encoded = encodeUrl(sample);
String decoded = decodeUrl(encoded);
boolean same = sample.equals(decoded);
System.out.println("encoded=" + encoded);
System.out.println(" sample=" + sample);
System.out.println("decoded=" + decoded);
System.out.println("sample.equals(decoded)=" + same);
}
}