/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright 2005 - 2008 Pentaho Corporation. All rights reserved.
*
* @created Apr 20, 2005
* @author James Dixon
*
*/
package org.pentaho.platform.util.web;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.SimpleHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.pentaho.platform.util.logging.Logger;
import org.pentaho.platform.util.messages.Messages;
public class HttpUtil {
public static HttpClient getClient() {
int connectionTimeout = 3000;
int pageTimeout = 7000;
HttpConnectionManager connectionManager = new SimpleHttpConnectionManager();
HttpConnectionManagerParams connectionParams = connectionManager.getParams();
connectionParams.setConnectionTimeout(connectionTimeout);
connectionParams.setSoTimeout(pageTimeout);
HttpClient httpClient = null;
if (connectionManager != null) {
httpClient = new HttpClient(connectionManager);
}
return httpClient;
}
public static boolean getURLContent(final String url, final StringBuffer content) throws MalformedURLException,
IOException {
HttpClient httpClient = HttpUtil.getClient();
try {
GetMethod call = new GetMethod(url);
int status = httpClient.executeMethod(call);
if (status == 200) {
InputStream response = call.getResponseBodyAsStream();
try {
byte buffer[] = new byte[2048];
int size = response.read(buffer);
while (size > 0) {
for (int idx = 0; idx < size; idx++) {
content.append((char) buffer[idx]);
}
size = response.read(buffer);
}
} catch (Exception e) {
// we can ignore this because the content comparison will fail
}
}
} catch (Throwable e) {
StringWriter writer = new StringWriter();
PrintWriter writer2 = new PrintWriter(writer);
e.printStackTrace(writer2);
content.append(writer.getBuffer());
return false;
}
return true;
}
public static void getURLContent_old(final String uri, final StringBuffer content) throws MalformedURLException,
IOException {
URL url = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
byte buffer[] = new byte[300];
int n = buffer.length;
while (n > 0) {
n = in.read(buffer);
for (int i = 0; i < n; i++) {
content.append((char) buffer[i]);
}
}
n = in.read(buffer);
}
public static String getURLContent(final String uri) {
try {
StringBuffer content = new StringBuffer();
HttpUtil.getURLContent(uri, content);
return content.toString();
} catch (Exception e) {
// TODO: handle this error
Logger
.error(
"org.pentaho.platform.util.web.HttpUtil", Messages.getInstance().getErrorString("HttpUtil.ERROR_0001_URL_ERROR", e.getMessage()), e); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
}
public static InputStream getURLInputStream(final String uri) {
try {
URL url = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
return in;
} catch (Exception e) {
// TODO: handle this error
Logger
.error(
"org.pentaho.platform.util.web.HttpUtil", Messages.getInstance().getErrorString("HttpUtil.ERROR_0001_URL_ERROR", e.getMessage()), e); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
}
public static Reader getURLReader(final String uri) {
try {
URL url = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
return new InputStreamReader(in);
} catch (Exception e) {
// TODO: handle this error
Logger.error(HttpUtil.class.getName(),
Messages.getInstance().getErrorString("HttpUtil.ERROR_0001_URL_ERROR", e.getMessage()), e); //$NON-NLS-1$
return null;
}
}
//
// The code in the next two methods is based on the code in HttpUtils.java
// from
// javax.servlet.http. HttpUtils is deprecated - so I updated the methods to
// be a bit smarter
// and use Map instead of Hashtable
//
public static Map parseQueryString(final String s) {
String valArray[] = null;
if (s == null) {
throw new IllegalArgumentException();
}
Map<String,String[]> rtn = new HashMap<String,String[]>();
StringBuffer sb = new StringBuffer();
String key;
for (StringTokenizer st = new StringTokenizer(s, "&"); st.hasMoreTokens(); rtn.put(key, valArray)) { //$NON-NLS-1$
String pair = st.nextToken();
int pos = pair.indexOf('=');
if (pos == -1) {
throw new IllegalArgumentException();
}
key = HttpUtil.parseName(pair.substring(0, pos), sb);
String val = HttpUtil.parseName(pair.substring(pos + 1, pair.length()), sb);
if (rtn.containsKey(key)) {
String oldVals[] = rtn.get(key);
valArray = new String[oldVals.length + 1];
System.arraycopy(oldVals, 0, valArray, 0, oldVals.length);
valArray[oldVals.length] = val;
} else {
valArray = new String[1];
valArray[0] = val;
}
}
return rtn;
}
private static String parseName(final String s, final StringBuffer sb) {
sb.setLength(0);
char c;
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
switch (c) {
case 43: { // '+'
sb.append(' ');
break;
}
case 37: { // '%'
try {
sb.append((char) Integer.parseInt(s.substring(i + 1, i + 3), 16));
i += 2;
break;
} catch (NumberFormatException numberformatexception) {
throw new IllegalArgumentException();
} catch (StringIndexOutOfBoundsException oob) {
String rest = s.substring(i);
sb.append(rest);
if (rest.length() == 2) {
i++;
}
}
break;
}
default: {
sb.append(c);
break;
}
}
}
return sb.toString();
}
}