/* * 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(); } }