package de.skuzzle.polly.tools.io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
public final class WebUtils {
public final static String DEFAULT_CHARSET = "UTF-8";
public static String makeUrlQueryPart(Map<String, ? extends Object> parameters) {
return makeUrlQueryPart(parameters, DEFAULT_CHARSET);
}
public static String makeUrlQueryPart(Map<String, ? extends Object> parameters,
String targetCharset) {
final StringBuilder b = new StringBuilder();
appendParameters(b, "?", parameters, targetCharset);
return b.toString();
}
public static String appendUrlQueryPart(String url, Map<String, ? extends Object> parameters,
String targetCharset) {
final StringBuilder b = new StringBuilder(url);
final String delimiter = url.indexOf("?") == -1 ? "?" : "&";
appendParameters(b, delimiter, parameters, targetCharset);
return b.toString();
}
private static void appendParameters(StringBuilder b, String initialDelimiter,
Map<String, ? extends Object> parameters, String targetCharset) {
try {
Charset.forName(targetCharset);
} catch (Exception e) {
e.printStackTrace();
targetCharset = Charset.defaultCharset().name();
}
try {
String delimiter = initialDelimiter;
for (final Entry<String, ? extends Object> e : parameters.entrySet()) {
b.append(delimiter);
delimiter = "&";
b.append(URLEncoder.encode(e.getKey(), targetCharset));
b.append("=");
b.append(URLEncoder.encode(e.getValue().toString(), targetCharset));
}
} catch (UnsupportedEncodingException e) {
// not reachable
assert false;
}
}
public static void getString(String targetUrl, Map<String, ? extends Object> parameters, String targetCharset, Appendable redirect, int timeout) throws IOException {
final String surl = appendUrlQueryPart(targetUrl, parameters, targetCharset);
final URL url = new URL(surl);
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(timeout);
connection.connect();
String cs = connection.getContentEncoding();
if (cs == null) {
cs = DEFAULT_CHARSET;
}
try (final BufferedReader r = new BufferedReader(
new InputStreamReader(connection.getInputStream(), cs))) {
String line = null;
while ((line = r.readLine()) != null) {
redirect.append(line);
redirect.append(System.lineSeparator());
}
} finally {
connection.disconnect();
}
}
public static StringBuilder getString(String targetUrl, Map<String, ? extends Object> parameters,
String targetCharset, int timeout) throws IOException {
final StringBuilder b = new StringBuilder();
getString(targetUrl, parameters, targetCharset, b, timeout);
return b;
}
public static StringBuilder getString(String targetUrl, int timeout) throws IOException {
final String cs = DEFAULT_CHARSET;
final Map<String, ? extends Object> m = Collections.emptyMap();
return getString(targetUrl, m, cs, timeout);
}
public static StringBuilder getString(String targetUrl) throws IOException {
final String cs = DEFAULT_CHARSET;
final Map<String, ? extends Object> m = Collections.emptyMap();
return getString(targetUrl, m, cs, Integer.MAX_VALUE);
}
private WebUtils() {}
}