/*******************************************************************************
* Copyright (c) 2007, 2014 Massimiliano Ziccardi
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package it.jnrpe.plugin.utils;
import it.jnrpe.utils.StreamManager;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map.Entry;
import java.util.Properties;
/**
* Utility class for various HTTP operations.
*
* @author Frederico Campos
*
*/
public class HttpUtils {
/**
* Do a http get request and return response
*
* @param url target url
* @param requestProps props to be requested
* @param timeout connection timeout
* @param includeHeaders whether to include headers or not
* @param ignoreBody whether to ignore body content or not
* @return server answer
* @throws Exception on any connection
*/
public static String doGET(final URL url, final Properties requestProps, final Integer timeout, boolean includeHeaders, boolean ignoreBody)
throws Exception {
return doRequest(url, requestProps, timeout, includeHeaders, ignoreBody, "GET");
}
/**
* Do a http head request and return response
*
* @param url target url
* @param requestProps props to be requested
* @param timeout connection timeout
* @param includeHeaders whether to include headers or not
* @param ignoreBody whether to ignore body content or not
* @return server answer
* @throws Exception on any connection
*/
public static String doHEAD(final URL url, final Properties requestProps, final Integer timeout, boolean includeHeaders, boolean ignoreBody)
throws Exception {
return doRequest(url, requestProps, timeout, includeHeaders, ignoreBody, "HEAD");
}
/**
* Do a http post request and return response
*
* @param url target url
* @param requestProps props to be requested
* @param timeout connection timeout
* @param includeHeaders whether to include headers or not
* @param ignoreBody whether to ignore body content or not
* @return server answer
* @throws IOException on any connection
*/
public static String doPOST(final URL url, final Properties requestProps, final Integer timeout, final String encodedData,
boolean includeHeaders, boolean ignoreBody) throws IOException {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
setRequestProperties(requestProps, conn, timeout);
sendPostData(conn, encodedData);
return parseHttpResponse(conn, includeHeaders, ignoreBody);
}
/**
* Submits http post data to an HttpURLConnection.
*
* @param conn teh connection
* @param encodedData the encoded data to be sent
* @throws IOException on any connection
*/
public static void sendPostData(HttpURLConnection conn, String encodedData) throws IOException {
StreamManager sm = new StreamManager();
try {
conn.setDoOutput(true);
conn.setRequestMethod("POST");
if (conn.getRequestProperty("Content-Type") == null) {
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
}
if (encodedData != null) {
if (conn.getRequestProperty("Content-Length") == null) {
conn.setRequestProperty("Content-Length", String.valueOf(encodedData.getBytes("UTF-8").length));
}
DataOutputStream out = new DataOutputStream(sm.handle(conn.getOutputStream()));
out.write(encodedData.getBytes());
out.close();
}
} finally {
sm.closeAll();
}
}
private static String doRequest(final URL url, final Properties requestProps, final Integer timeout, boolean includeHeaders, boolean ignoreBody,
String method) throws Exception {
if ("POST".equalsIgnoreCase(method)) {
throw new Exception("use it.jnrpe.plugin.utils.HttpUtils.doPOST instead.");
}
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
setRequestProperties(requestProps, conn, timeout);
conn.setRequestMethod("GET");
return parseHttpResponse(conn, includeHeaders, ignoreBody);
}
/**
* Sets request headers for an http connection
*
* @param props properties to be sent
* @param conn the connection
* @param timeout the connection timeout
*/
public static void setRequestProperties(final Properties props, HttpURLConnection conn, Integer timeout) {
if (props != null) {
if (props.get("User-Agent") == null) {
conn.setRequestProperty("User-Agent", "Java");
}
for (Entry entry : props.entrySet()) {
conn.setRequestProperty(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
}
}
if (timeout != null) {
conn.setConnectTimeout(timeout * 1000);
}
}
/**
* Parses an http request response
*
* @param conn the connection
* @param includeHeaders if include headers ot not
* @param ignoreBody if ignore body or not
* @return a string representing the received answer
* @throws IOException on any connection
*/
public static String parseHttpResponse(HttpURLConnection conn, boolean includeHeaders, boolean ignoreBody) throws IOException {
StringBuilder buff = new StringBuilder();
if (includeHeaders) {
buff.append(conn.getResponseCode()).append(' ').append(conn.getResponseMessage()).append('\n');
int idx = (conn.getHeaderFieldKey(0) == null) ? 1 : 0;
while (true) {
String key = conn.getHeaderFieldKey(idx);
if (key == null) {
break;
}
buff.append(key).append(": ").append(conn.getHeaderField(idx)).append('\n');
++idx;
}
}
StreamManager sm = new StreamManager();
try {
if (!ignoreBody) {
BufferedReader in = (BufferedReader) sm.handle(new BufferedReader(new InputStreamReader(conn.getInputStream())));
String inputLine;
while ((inputLine = in.readLine()) != null) {
buff.append(inputLine);
}
in.close();
}
} finally {
sm.closeAll();
}
return buff.toString();
}
}