package kr.kdev.dg1s.biowiki.util; import android.net.Uri; import android.webkit.MimeTypeMap; import android.webkit.URLUtil; import java.io.UnsupportedEncodingException; import java.net.IDN; import java.net.URI; import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.Charset; /** * Created by nbradbury on 9/7/13. */ public class UrlUtils { public static String urlEncode(final String text) { try { return URLEncoder.encode(text, "UTF-8"); } catch (UnsupportedEncodingException e) { return text; } } public static String urlDecode(final String text) { try { return URLDecoder.decode(text, "UTF-8"); } catch (UnsupportedEncodingException e) { return text; } } public static String getDomainFromUrl(final String urlString) { if (urlString == null) { return ""; } Uri uri = Uri.parse(urlString); return uri.getHost(); } // Convert IDN names to punycode if necessary public static String convertUrlToPunycodeIfNeeded(String url) { if (!Charset.forName("US-ASCII").newEncoder().canEncode(url)) { if (url.toLowerCase().startsWith("http://")) { url = "http://" + IDN.toASCII(url.substring(7)); } else if (url.toLowerCase().startsWith("https://")) { url = "https://" + IDN.toASCII(url.substring(8)); } else { url = IDN.toASCII(url); } } return url; } public static String addHttpProcolIfNeeded(String url, boolean isHTTPS) { if (url == null) { return null; } if (!URLUtil.isValidUrl(url)) { if (!(url.toLowerCase().startsWith("http://")) && !(url.toLowerCase().startsWith("https://"))) { url = (isHTTPS ? "https" : "http") + "://" + url; } } return url; } /* * normalizes a URL, primarily for comparison purposes, for example so that * normalizeUrl("http://google.com/") = normalizeUrl("http://google.com") */ public static String normalizeUrl(final String urlString) { if (urlString == null) return null; // this routine is called from some performance-critical code and creating a URI from a string // is slow, so skip it when possible - if we know it's not a relative path (and 99.9% of the // time it won't be for our purposes) then we can normalize it without java.net.URI.normalize() if (urlString.startsWith("http") && !urlString.contains("..")) { // return without a trailing slash if (urlString.endsWith("/")) return urlString.substring(0, urlString.length() - 1); return urlString; } // url is relative, so fall back to using slower java.net.URI normalization try { URI uri = URI.create(urlString); return uri.normalize().toString(); } catch (IllegalArgumentException e) { return urlString; } } /* * returns the passed url without the query parameters */ public static String removeQuery(final String urlString) { if (urlString == null) return null; int pos = urlString.indexOf("?"); if (pos == -1) return urlString; return urlString.substring(0, pos); } /* * returns true if passed url is https: */ public static boolean isHttps(final String urlString) { return (urlString != null && urlString.startsWith("https:")); } /* * returns https: version of passed http: url */ public static String makeHttps(final String urlString) { if (urlString == null || !urlString.startsWith("http:")) return urlString; return "https:" + urlString.substring(5, urlString.length()); } /* * see http://stackoverflow.com/a/8591230/1673548 */ public static String getUrlMimeType(final String urlString) { if (urlString == null) return null; String extension = MimeTypeMap.getFileExtensionFromUrl(urlString); if (extension == null) return null; MimeTypeMap mime = MimeTypeMap.getSingleton(); String mimeType = mime.getMimeTypeFromExtension(extension); if (mimeType == null) return null; return mimeType; } }