All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.vmware.vim25.ws.ApacheHttpClient Maven / Gradle / Ivy

There is a newer version: 6.0.05
Show newest version
package com.vmware.vim25.ws;

import org.apache.http.Header;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.log4j.Logger;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.rmi.RemoteException;

/**
 * Created by Michael Rice on 8/12/14.
 * 

* Copyright 2014 Michael Rice *

* 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. */ public class ApacheHttpClient extends SoapClient { /** * What rolls down stairs alone or in pairs? * Its log log log! */ private static final Logger log = Logger.getLogger(ApacheHttpClient.class); /** * The XML serialization/de-serialization engine */ XmlGen xmlGen = new XmlGenDom(); /** * Trust all the ssl stuff no matter what!?! *

* We do true here because by default all the vsphere stuff * is self signed. */ private boolean trustAllSSL = true; /** * Primary constructor * * @param serverUrl String of the url to the vi server * @param ignoreCert boolean to check or ignore ssl. Default ignore * @throws MalformedURLException */ public ApacheHttpClient(String serverUrl, boolean ignoreCert) throws MalformedURLException { if (serverUrl.endsWith("/")) { serverUrl = serverUrl.substring(0, serverUrl.length() - 1); } trustAllSSL = ignoreCert; log.trace("Creating ApacheHttpClient to server URL: " + serverUrl); log.trace("Ignore ssl: " + ignoreCert); this.baseUrl = new URL(serverUrl); } /** * @param url * @throws MalformedURLException */ public ApacheHttpClient(String url) throws MalformedURLException { this(url, true); } /** * Invoke a given method with supplied {@link com.vmware.vim25.ws.Argument} on the remote vi server. * This method typically creates the payload needed to send to the vi server. For example you would * pass in RetrieveServiceContent for the methodName, next the params needed for the method. Next give * the returnType the parser should convert the response to in this case the string ServiceContent *

* Returns an {@link Object} of the given return type. Using the example above you would get * a {@link com.vmware.vim25.ServiceContent} Object. *

* * @param methodName Name of the method to execute * @param paras Array of Arguments aka params for the method * @param returnType String name of the return type * @return Object * @throws java.rmi.RemoteException */ @Override public Object invoke(String methodName, Argument[] paras, String returnType) throws RemoteException { log.trace("Invoking method: " + methodName); String soapMsg = marshall(methodName, paras); InputStream is = null; try { is = post(soapMsg); log.trace("Converting xml response from server to: " + returnType); return unMarshall(returnType, is); } catch (Exception e1) { log.error("Exception caught while invoking method.", e1); throw new RemoteException("VI SDK invoke exception:" + e1, e1); } finally { if (is != null) { try { is.close(); } catch (IOException ignored) { } } } } /** * Invoke a given method with supplied {@link com.vmware.vim25.ws.Argument} on the remote vi server. * Returns a {@link StringBuffer} This works the same as the above call except there is no * conversion done on the return data and instead you just get back the StringBuffer content. * * @param methodName Name of the method to execute * @param paras Array of Arguments aka params for the method * @return StringBuffer with the * @throws java.rmi.RemoteException */ @Override public StringBuffer invokeAsString(String methodName, Argument[] paras) throws RemoteException { String soapMsg = XmlGen.toXML(methodName, paras, this.vimNameSpace); try { InputStream is = post(soapMsg); return readStream(is); } catch (Exception e) { throw new RemoteException("VI SDK invoke exception:" + e); } } private InputStream post(String payload) throws IOException { CloseableHttpClient httpclient; RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(this.connectTimeout) .setSocketTimeout(this.readTimeout) .build(); if(trustAllSSL && trustManager != null) { log.warn("The option to ignore certs has been set along with a provided trust manager. This is not a valid scenario and the trust manager will be ignored."); } if (trustAllSSL) { httpclient = HttpClients.custom().setSSLSocketFactory(ApacheTrustSelfSigned.trust()).build(); } else if(trustManager != null) { LayeredConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(CustomSSLTrustContextCreator.getTrustContext(trustManager), new AllowAllHostnameVerifier()); httpclient = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build(); } else { httpclient = HttpClients.createDefault(); } HttpPost httpPost; StringEntity stringEntity; try { stringEntity = new StringEntity(payload); log.trace("Converted payload to String entity."); } catch (UnsupportedEncodingException e) { log.error("Failed to convert payload to StringEntity. Unsupported Encoding Exception caught. Payload: " + payload, e); return null; } try { httpPost = new HttpPost(this.baseUrl.toURI()); } catch (URISyntaxException e) { log.error("Malformed URI sent: " + this.baseUrl.toString(), e); return null; } httpPost.setConfig(requestConfig); httpPost.setHeader(SoapAction.SOAP_ACTION_HEADER.toString(), soapAction); httpPost.setHeader("Content-Type", "text/xml; charset=utf-8"); if (cookie != null) { log.trace("Setting Cookie."); httpPost.setHeader("Cookie", cookie); } httpPost.setEntity(stringEntity); CloseableHttpResponse response = httpclient.execute(httpPost); InputStream inputStream = response.getEntity().getContent(); if (cookie == null) { Header[] headers = response.getAllHeaders(); for (Header header : headers) { if (header.getName().equals("Set-Cookie")) { cookie = header.getValue(); break; } } } return inputStream; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy