/*
* Copyright (c) 2005 Aetrion LLC.
*/
package com.flickr4java.flickr.util;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
/**
* @author Anthony Eden
* @author Mike Chaberski
*/
public class UrlUtilities {
public static final String UTF8 = "UTF-8";
/**
* Build a request URL.
*
* @param host
* The host
* @param port
* The port
* @param path
* The path
* @param parameters
* The parameters
* @return The URL
* @throws MalformedURLException
* @deprecated use {@link #buildSecureUrl(java.lang.String, int, java.lang.String, java.util.Map) }
*/
@Deprecated
public static URL buildUrl(String host, int port, String path, Map<String, String> parameters) throws MalformedURLException {
return buildUrl("http", port, path, parameters);
}
/**
* Build a request URL using a given scheme.
*
* @param scheme the scheme, either {@code http} or {@code https}
* @param host
* The host
* @param port
* The port
* @param path
* The path
* @param parameters
* The parameters
* @return The URL
* @throws MalformedURLException
*/
public static URL buildUrl(String scheme, String host, int port, String path, Map<String, String> parameters) throws MalformedURLException {
checkSchemeAndPort(scheme, port);
StringBuilder buffer = new StringBuilder();
if (!host.startsWith(scheme + "://")) {
buffer.append(scheme).append("://");
}
buffer.append(host);
if (port > 0) {
buffer.append(':');
buffer.append(port);
}
if (path == null) {
path = "/";
}
buffer.append(path);
if (!parameters.isEmpty()) {
buffer.append('?');
}
int size = parameters.size();
for (Map.Entry<String, String> entry : parameters.entrySet()) {
buffer.append(entry.getKey());
buffer.append('=');
Object value = entry.getValue();
if (value != null) {
String string = value.toString();
try {
string = URLEncoder.encode(string, UTF8);
} catch (UnsupportedEncodingException e) {
// Should never happen, but just in case
}
buffer.append(string);
}
if (--size != 0) {
buffer.append('&');
}
}
/*
* RequestContext requestContext = RequestContext.getRequestContext(); Auth auth = requestContext.getAuth(); if (auth != null &&
* !ignoreMethod(getMethod(parameters))) { buffer.append("&api_sig="); buffer.append(AuthUtilities.getSignature(sharedSecret, parameters)); }
*/
return new URL(buffer.toString());
}
/**
* Build a request URL.
*
* @param host
* The host
* @param port
* The port
* @param path
* The path
* @param parameters
* The parameters
* @return The URL
* @throws MalformedURLException
*/
public static URL buildSecureUrl(String host, int port, String path, Map<String, String> parameters) throws MalformedURLException {
return buildUrl("https", host, port, path, parameters);
}
public static URL buildSecurePostUrl(String host, int port, String path) throws MalformedURLException {
return buildPostUrl("https", host, port, path);
}
private static void checkScheme(String scheme) {
if (scheme == null || !("http".equals(scheme) || "https".equals(scheme))) {
throw new IllegalArgumentException("scheme must be http or https");
}
}
private static void checkSchemeAndPort(String scheme, int port) {
checkScheme(scheme);
/*
* Be liberal about accepting non-default ports, but strict
* about mismatching scheme and default port.
*/
if ("http".equals(scheme) && port == 443) {
throw new IllegalArgumentException("port 443 is invalid with http scheme");
}
if ("https".equals(scheme) && port == 80) {
throw new IllegalArgumentException("port 80 is invalid with https scheme");
}
}
/**
* Build a POST URL with {@code http} scheme.
* @param host the host
* @param port the port
* @param path the path
* @return
* @throws MalformedURLException
*/
public static URL buildPostUrl(String host, int port, String path) throws MalformedURLException {
return buildPostUrl("http", host, port, path);
}
public static URL buildPostUrl(String scheme, String host, int port, String path) throws MalformedURLException {
checkSchemeAndPort(scheme, port);
StringBuilder buffer = new StringBuilder();
buffer.append(scheme).append("://");
buffer.append(host);
if (port > 0) {
buffer.append(':');
buffer.append(port);
}
if (path == null) {
path = "/";
}
buffer.append(path);
return new URL(buffer.toString());
}
/**
* Construct the BuddyIconUrl with {@code http} scheme.
* <p>
* If none available, return the <a href="http://www.flickr.com/images/buddyicon.jpg">default</a>, or an URL assembled from farm, iconserver and nsid.
*
* @see <a href="http://flickr.com/services/api/misc.buddyicons.html">Flickr Documentation</a>
* @param iconFarm
* @param iconServer
* @param id
* @return The BuddyIconUrl
* @deprecated use {@link #createSecureBuddyIconUrl(int, int, java.lang.String) }
*/
@Deprecated
public static String createBuddyIconUrl(int iconFarm, int iconServer, String id) {
return createBuddyIconUrl("http", iconFarm, iconServer, id);
}
/**
* Construct the BuddyIconUrl with {@code https} scheme.
* <p>
* If none available, return the <a href="https://www.flickr.com/images/buddyicon.jpg">default</a>, or an URL assembled from farm, iconserver and nsid.
*
* @see <a href="http://flickr.com/services/api/misc.buddyicons.html">Flickr Documentation</a>
* @param iconFarm
* @param iconServer
* @param id
* @return The BuddyIconUrl
*/
public static String createSecureBuddyIconUrl(int iconFarm, int iconServer, String id) {
return createBuddyIconUrl("https", iconFarm, iconServer, id);
}
public static String createBuddyIconUrl(String scheme, int iconFarm, int iconServer, String id) {
checkScheme(scheme);
/**
* The default-URL, if the iconServer equals 0.
*/
String iconUrl = scheme + "://www.flickr.com/images/buddyicon.jpg";
if (iconServer > 0) {
iconUrl = scheme + "://farm" + iconFarm + ".static.flickr.com/" + iconServer + "/buddyicons/" + id + ".jpg";
}
return iconUrl;
}
}