org.openhab.binding.ihc.ws.IhcHttpsClient.java Source code

Java tutorial

Introduction

Here is the source code for org.openhab.binding.ihc.ws.IhcHttpsClient.java

Source

/**
 * Copyright (c) 2010-2016 by the respective copyright holders.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 */
package org.openhab.binding.ihc.ws;

import java.io.IOException;
import java.net.SocketTimeoutException;

import org.apache.http.HttpResponse;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Simple HTTP Client for IHC / ELKO LS Controller connection purposes.
 *
 * @author Pauli Anttila
 * @since 1.1.0
 */
public abstract class IhcHttpsClient {

    private static final Logger logger = LoggerFactory.getLogger(IhcHttpsClient.class);

    final int DEF_CONNECT_TIMEOUT = 10000;

    private int connectTimeout = DEF_CONNECT_TIMEOUT;

    private HttpClient client = null;
    private HttpPost postReq = null;

    /**
     * @return the timeout in milliseconds
     * 
     */
    public int getConnectTimeout() {
        return connectTimeout;
    }

    /**
     * @param timeout
     *            the timeout in milliseconds
     */
    public void setConnectTimeout(int timeout) {
        connectTimeout = timeout;
    }

    /**
     * Open HTTP connection.
     * 
     * @param url
     *            Url to connect.
     */
    protected void openConnection(String url) throws IhcExecption {

        if (client == null) {
            client = IhcConnectionPool.getInstance().getHttpClient();
        }

        postReq = new HttpPost(url);
    }

    protected void closeConnection() {
    }

    /**
     * Send HTTP request and wait response from the server.
     * 
     * @param query
     *            Data to send.
     * @param timeout
     *            the timeout to set in milliseconds
     * @return Response from server.
     */
    protected String sendQuery(String query, int timeout) throws IhcExecption {
        try {
            return sendQ(query, timeout);
        } catch (NoHttpResponseException e) {
            try {
                logger.debug("No response received, resend query");
                return sendQ(query, timeout);
            } catch (IOException ee) {
                throw new IhcExecption(ee);
            }
        } catch (SocketTimeoutException e) {
            try {
                logger.debug("Timeout received, resend query");
                return sendQ(query, timeout);
            } catch (IOException ee) {
                throw new IhcExecption(ee);
            }
        } catch (IOException e) {
            throw new IhcExecption(e);
        }
    }

    private String sendQ(String query, int timeout)
            throws ClientProtocolException, IOException, NoHttpResponseException {
        logger.trace("Send query (timeout={}): {}", timeout, query);

        postReq.setEntity(new StringEntity(query, "UTF-8"));
        postReq.addHeader("content-type", "text/xml");

        final RequestConfig params = RequestConfig.custom().setConnectTimeout(connectTimeout)
                .setSocketTimeout(timeout).build();
        postReq.setConfig(params);

        // Execute POST
        HttpResponse response = client.execute(postReq, IhcConnectionPool.getInstance().getHttpContext());

        String resp = EntityUtils.toString(response.getEntity());
        logger.trace("Received response: {}", resp);
        return resp;
    }

    /**
     * Set request property.
     * 
     * @param key
     *            property key.
     * @param value
     *            property value.
     */
    public void setRequestProperty(String key, String value) {

        postReq.setHeader(key, value);
    }
}