package com.grendelscan.commons.http.factories;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.grendelscan.commons.http.URIStringUtils;
public class UriFactory
{
private static Pattern cleanupUriPattern = Pattern.compile("^(\\w+://)?+(.+)$");
private static void checkUriValidity(final String uriString) throws URISyntaxException
{
if (uriString == null || uriString.equals(""))
{
throw new URISyntaxException("", "The string is null or empty.");
}
if (uriString.length() > 11 && uriString.trim().substring(0, 11).toLowerCase().equals("javascript:"))
{
throw new URISyntaxException(uriString, "The string is a JavaScript command, not a URI.");
}
}
private static String cleanupUri(final String uri)
{
String newUri = uri;
Matcher m = cleanupUriPattern.matcher(uri);
if (m.matches())
{
String method = m.group(1);
if (method == null)
{
method = "";
}
String rest = m.group(2);
if (rest == null)
{
rest = "";
}
newUri = method + rest.replace("//", "/");
}
if (newUri.length() > 8)
{
String lower = newUri.substring(0, 8).toLowerCase();
if ((lower.subSequence(0, 7).equals("http://") || lower.equals("https://")) && newUri.lastIndexOf('/') <= 7)
{
newUri += "/";
}
}
// if (!newUri.equals(uri))
// {
// System.out.print("changed");
// }
return newUri;
}
public static URI makeAbsoluteUri(final String uriString, final String baseUri) throws URISyntaxException
{
return makeAbsoluteUri(uriString, new URI(URIStringUtils.escapeUri(baseUri)));
}
public static URI makeAbsoluteUri(final String uriString, final URI baseUri) throws URISyntaxException
{
checkUriValidity(uriString);
URI uri = new URI(URIStringUtils.escapeUri(cleanupUri(uriString)));
if (!uri.isAbsolute())
{
if (baseUri.getPath().equals("") && !uriString.substring(0, 1).equals("/"))
{
uri = baseUri.resolve("/" + uri.toASCIIString());
}
else
{
uri = baseUri.resolve(uri);
}
}
return uri.normalize();
}
/**
* Tries to prevent problems by intelligently escaping a URL.
*
* @param uriString
* @return
*/
public static URI makeUri(final String uriString, final boolean requireAbsolute) throws URISyntaxException
{
checkUriValidity(uriString);
String newUri = URIStringUtils.escapeUri(cleanupUri(uriString));
// if (!newUri.equals(uriString))
// {
// System.out.print("changed");
// }
URI uri = new URI(newUri);
if (requireAbsolute && !uri.isAbsolute())
{
throw new URISyntaxException(uriString, "The URI was required to be absolute.");
}
return uri.normalize();
}
}