/*! * 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 (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.platform.util.web; import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpConnectionManager; import org.apache.commons.httpclient.SimpleHttpConnectionManager; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.params.HttpConnectionManagerParams; import org.apache.commons.lang.StringUtils; import org.pentaho.platform.util.logging.Logger; import org.pentaho.platform.util.messages.Messages; 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; 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 { HostConfiguration hostConfig = null; if ( StringUtils.isNotEmpty( System.getProperty( "http.proxyHost" ) ) ) { hostConfig = new HostConfiguration() { @Override public synchronized String getProxyHost() { return System.getProperty( "http.proxyHost" ); } @Override public synchronized int getProxyPort() { return Integer.parseInt( System.getProperty( "http.proxyPort" ) ); } }; httpClient.setHostConfiguration( hostConfig ); if ( System.getProperty( "http.proxyUser" ) != null && System.getProperty( "http.proxyUser" ).trim().length() > 0 ) { httpClient.getState().setProxyCredentials( new AuthScope( System.getProperty( "http.proxyHost" ), Integer.parseInt( System.getProperty( "http.proxyPort" ) ) ), new UsernamePasswordCredentials( System.getProperty( "http.proxyUser" ), System.getProperty( "http.proxyPassword" ) ) ); } } GetMethod call = new GetMethod( url ); int status = httpClient.executeMethod( hostConfig, 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(); } }