79 lines
2.8 KiB
Java
79 lines
2.8 KiB
Java
/******************************************************************************
|
|
* Copyright (c) 2002 - 2011 IBM Corporation.
|
|
* 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 com.ibm.wala.cast.js.html;
|
|
|
|
import java.net.MalformedURLException;
|
|
import java.net.URL;
|
|
|
|
public class UrlManipulator {
|
|
|
|
|
|
/**
|
|
* @param urlFound the link as appear
|
|
* @param context the URL in which the link appeared
|
|
* @return
|
|
* @throws MalformedURLException
|
|
*/
|
|
public static URL relativeToAbsoluteUrl(String urlFound, URL context) throws MalformedURLException {
|
|
urlFound = urlFound.replace("\\", "/").toLowerCase();
|
|
|
|
URL absoluteUrl;
|
|
if (!isAbsoluteUrl(urlFound)) {
|
|
if (urlFound.startsWith("//")) {
|
|
//create URL taking only the protocol from the context
|
|
String origHostAndPath = urlFound.substring(2);// removing "//"
|
|
String host;
|
|
String path;
|
|
int indexOf = origHostAndPath.indexOf("/");
|
|
if (indexOf > 0) {
|
|
host = origHostAndPath.substring(0, indexOf);
|
|
path = origHostAndPath.substring(indexOf);
|
|
} else {
|
|
host = origHostAndPath;
|
|
path = "";
|
|
}
|
|
absoluteUrl = new URL(context.getProtocol(), host, path);
|
|
} else if (urlFound.startsWith("/")) {
|
|
//create URL taking the protocol and the host from the context
|
|
absoluteUrl = new URL(context.getProtocol(), context.getHost(), urlFound);
|
|
} else {
|
|
//"concat" URL to context
|
|
int backDir = 0; // removing directories due to "../"
|
|
while(urlFound.startsWith("../")){
|
|
urlFound = urlFound.substring(3);
|
|
backDir++;
|
|
}
|
|
StringBuilder contextPath = new StringBuilder();
|
|
String path = context.getPath().replace("\\", "/");
|
|
boolean isContextDirectory = path.endsWith("/");
|
|
String[] split = path.split("/");
|
|
// we are also removing last element in case of a directory
|
|
int rightTrimFromPath = (isContextDirectory ? 0 : 1) + backDir;
|
|
|
|
for (int i = 0; i < split.length - rightTrimFromPath; i++) {
|
|
contextPath.append(split[i]);
|
|
contextPath.append("/");
|
|
}
|
|
absoluteUrl = new URL(context.getProtocol(), context.getHost(), contextPath.toString() + urlFound);
|
|
}
|
|
} else{
|
|
absoluteUrl = new URL(urlFound);
|
|
}
|
|
return absoluteUrl;
|
|
}
|
|
|
|
private static boolean isAbsoluteUrl(String orig) {
|
|
return orig.startsWith("http");
|
|
}
|
|
|
|
|
|
}
|