/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2017 by Hitachi Vantara : 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.util;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * Utility class contained useful methods while working with {@link org.apache.http.client.HttpClient HttpClient}
 *
 * @author Yury_Bakhmutski
 * @since 06-27-2017
 *
 */
public class HttpClientUtil {

  /**
   *
   * @param response the httpresponse for processing
   * @return HttpEntity in String representation using "UTF-8" encoding
   * @throws IOException
   */
  public static String responseToString( HttpResponse response ) throws IOException {
    return responseToString( response, Charset.forName( StandardCharsets.UTF_8.name() ) );
  }

  /**
   *
   * @param response the httpresponse for processing
   * @param charset the charset used for getting HttpEntity
   * @return HttpEntity in decoded String representation using provided charset
   * @throws IOException
   */
  public static String responseToString( HttpResponse response, Charset charset ) throws IOException {
    return responseToString( response, charset, false );
  }

  /**
   *
   * @param response the httpresponse for processing
   * @param charset the charset used for getting HttpEntity
   * @param decode determines if the result should be decoded or not
   * @return HttpEntity in String representation using provided charset
   * @throws IOException
   */
  public static String responseToString( HttpResponse response, Charset charset, boolean decode ) throws IOException {
    HttpEntity entity = response.getEntity();
    String result = EntityUtils.toString( entity, charset );
    EntityUtils.consume( entity );
    if ( decode ) {
      result = URLDecoder.decode( result, StandardCharsets.UTF_8.name() );
    }
    return result;
  }

  public static InputStream responseToInputStream( HttpResponse response ) throws IOException {
    return response.getEntity().getContent();
  }

  public static byte[] responseToByteArray( HttpResponse response ) throws IOException {
    return EntityUtils.toByteArray( response.getEntity() );
  }

  /**
   * Returns context with AuthCache or null in case of any exception was thrown.
   *
   * @param host
   * @param port
   * @param user
   * @param password
   * @param schema
   * @return {@link org.apache.http.client.protocol.HttpClientContext HttpClientContext}
   */
  public static HttpClientContext createPreemptiveBasicAuthentication( String host, int port, String user,
                                                                       String password, String schema ) {
    HttpClientContext localContext = null;
    try {
      HttpHost target = new HttpHost( host, port, schema );
      CredentialsProvider credsProvider = new BasicCredentialsProvider();
      credsProvider.setCredentials(
        new AuthScope( target.getHostName(), target.getPort() ),
        new UsernamePasswordCredentials( user, password ) );

      // Create AuthCache instance
      AuthCache authCache = new BasicAuthCache();
      // Generate BASIC scheme object and add it to the local
      // auth cache
      BasicScheme basicAuth = new BasicScheme();
      authCache.put( target, basicAuth );

      // Add AuthCache to the execution context
      localContext = HttpClientContext.create();
      localContext.setAuthCache( authCache );
    } catch ( Exception e ) {
      return null;
    }
    return localContext;
  }

  /**
   * Returns context with AuthCache or null in case of any exception was thrown.
   * Use "http" schema.
   *
   * @param host
   * @param port
   * @param user
   * @param password
   * @return {@link org.apache.http.client.protocol.HttpClientContext HttpClientContext}
   */
  public static HttpClientContext createPreemptiveBasicAuthentication( String host, int port, String user,
                                                                       String password ) {
    return createPreemptiveBasicAuthentication( host, port, user, password, "http" );
  }

}

@@ -131,16 +131,21 @@
 (C) 2017
+-2019
  by Hita
@@ -3066,24 +3066,54 @@
 etEntity();%0A
+    if ( entity != null ) %7B%0A  
     String r
@@ -3157,24 +3157,26 @@
  charset );%0A
+  
     EntityUt
@@ -3198,24 +3198,26 @@
 tity );%0A    
+  
 if ( decode 
@@ -3216,24 +3216,26 @@
  decode ) %7B%0A
+  
       result
@@ -3297,26 +3297,30 @@
 me() );%0A    
-%7D%0A
+  %7D%0A  
     return r
@@ -3326,16 +3326,39 @@
 result;%0A
+    %7D%0A    return null;%0A
   %7D%0A%0A  p

Call endpoint step has null pointer exception in log even though the request was successful (#6618)