/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* 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 org.pentaho.di.core;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.auth.AuthenticationException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.pentaho.di.cluster.SlaveConnectionManager;
import org.pentaho.di.core.util.Utils;
/**
* HTTP
*
* This class contains HTTP protocol properties such as request headers. Response headers and other properties of the
* HTTP protocol can be added to this class.
*
* @author sflatley
*
*/
public class HTTPProtocol {
/*
* Array of HTTP request headers- this list is incomplete and more headers can be added as needed.
*/
private static final String[] requestHeaders = { "accept", "accept-charset", "cache-control", "content-type" };
/**
* @return array of HTTP request headers
*/
public static String[] getRequestHeaders() {
return requestHeaders;
}
/**
* Performs a get on urlAsString using username and password as credentials.
*
* If the status code returned not -1 and 401 then the contents are returned. If the status code is 401 an
* AuthenticationException is thrown.
*
* All other values of status code are not dealt with but logic can be added as needed.
*
* @param urlAsString
* @param username
* @param password
* @param encoding
* @return
* @throws MalformedURLException
* @throws IOException
*/
public String get( String urlAsString, String username, String password ) throws MalformedURLException,
IOException, AuthenticationException {
HttpClient httpClient = SlaveConnectionManager.getInstance().createHttpClient();
GetMethod getMethod = new GetMethod( urlAsString );
if ( !Utils.isEmpty( username ) ) {
httpClient.getParams().setAuthenticationPreemptive( true );
Credentials defaultcreds = new UsernamePasswordCredentials( username, password );
httpClient.getState().setCredentials( AuthScope.ANY, defaultcreds );
}
int statusCode = httpClient.executeMethod( getMethod );
StringBuilder bodyBuffer = new StringBuilder();
if ( statusCode != -1 ) {
if ( statusCode != 401 ) {
// the response
InputStreamReader inputStreamReader = new InputStreamReader( getMethod.getResponseBodyAsStream() );
int c;
while ( ( c = inputStreamReader.read() ) != -1 ) {
bodyBuffer.append( (char) c );
}
inputStreamReader.close();
} else {
throw new AuthenticationException();
}
}
// Display response
return bodyBuffer.toString();
}
}