diff --git a/termux-shared/src/main/java/com/termux/shared/net/UrlUtils.java b/termux-shared/src/main/java/com/termux/shared/net/UrlUtils.java new file mode 100644 index 00000000..0e9101f3 --- /dev/null +++ b/termux-shared/src/main/java/com/termux/shared/net/UrlUtils.java @@ -0,0 +1,113 @@ +package com.termux.shared.net; + +import androidx.annotation.Nullable; + +import com.termux.shared.data.DataUtils; +import com.termux.shared.logger.Logger; + +import java.net.MalformedURLException; +import java.net.URL; + +public class UrlUtils { + + /** The parts of a {@link URL}. */ + public enum UrlPart { + AUTHORITY, + FILE, + HOST, + REF, + FRAGMENT, + PATH, + PORT, + PROTOCOL, + QUERY, + USER_INFO + } + + private static final String LOG_TAG = "UrlUtils"; + + /** + * Join a url base and destination. + * + * @param base The base url to open. + * @param destination The destination url to open. + * @param logError If an error message should be logged. + * @return Returns the joined {@link String} Url, otherwise {@code null}. + */ + @Nullable + public static String joinUrl(final String base, String destination, boolean logError) { + if (DataUtils.isNullOrEmpty(base)) return null; + try { + return new URL(new URL(base), destination).toString(); + } catch (MalformedURLException e) { + if (logError) + Logger.logError(LOG_TAG, "Failed to join url base \"" + base + "\" and destination \"" + destination + "\": " + e.getMessage()); + return null; + } + } + + /** + * Get {@link URL} from url string. + * + * @param urlString The urlString string. + * @return Returns the {@link URL} if a valid urlString, otherwise {@code null}. + */ + @Nullable + public static URL getUrl(String urlString) { + if (DataUtils.isNullOrEmpty(urlString)) return null; + try { + return new URL(urlString); + } catch (MalformedURLException e) { + return null; + } + } + + /** + * Get a {@link URL} part from url string. + * + * @param urlString The urlString string. + * @param urlPart The part to get. + * @return Returns the {@link URL} part if a valid urlString and part, otherwise {@code null}. + */ + @Nullable + public static String getUrlPart(String urlString, UrlPart urlPart) { + URL url = getUrl(urlString); + if (url == null) return null; + switch (urlPart) { + case AUTHORITY: + return url.getAuthority(); + case FILE: + return url.getFile(); + case HOST: + return url.getHost(); + case REF: + case FRAGMENT: + return url.getRef(); + case PATH: + return url.getPath(); + case PORT: + return String.valueOf(url.getPort()); + case PROTOCOL: + return url.getProtocol(); + case QUERY: + return url.getQuery(); + case USER_INFO: + return url.getUserInfo(); + default: + return null; + } + } + + /** Remove "https://www.", "https://", "www.", etc */ + public static String removeProtocol(String urlString) { + if (urlString == null) return null; + return urlString.replaceFirst("^(http[s]?://www\\.|http[s]?://|www\\.)",""); + } + + public static boolean areUrlsEqual(String url1, String url2) { + if (url1 == null && url2 == null) return true; + if (url1 == null || url2 == null) return false; + return UrlUtils.removeProtocol(url1).replaceAll("/+$", "").equals(UrlUtils.removeProtocol(url2).replaceAll("/+$", "")); + } + +}