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

org.jabsorb.client.HTTPSession Maven / Gradle / Ivy

There is a newer version: 6.0.86
Show newest version
/*
 * jabsorb - a Java to JavaScript Advanced Object Request Broker
 * http://www.jabsorb.org
 *
 * Copyright 2007-2009 The jabsorb team
 *
 * based on original code from
 * JSON-RPC-Client, a Java client extension to JSON-RPC-Java
 * (C) Copyright CodeBistro 2007, Sasha Ovsankin 
 *
 * 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.jabsorb.client;

import java.io.IOException;
import java.net.URI;

import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.jabsorb.client.TransportRegistry.SessionFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Transport session straightforwardly implemented in HTTP. As compared to the built-in 
 * URLConnectionSession, it allows more control over HTTP transport parameters, for
 * example, proxies and the support for HTTPS.
 * 
 * 

To use this transport you need to first register it in the TransportRegistry, for example:

* * HTTPSession.register(TransportRegistry.i()); * */ public class HTTPSession implements Session { private final static Logger log = LoggerFactory.getLogger(HTTPSession.class); protected HttpClient client; protected HttpState state; protected URI uri; public HTTPSession(URI uri) { this.uri = uri; } /** * An option to set state from the outside. for example, to provide existing * session parameters. */ public void setState(HttpState state) { this.state = state; } /** * As per JSON-RPC Working Draft * http://json-rpc.org/wd/JSON-RPC-1-1-WD-20060807.html#RequestHeaders */ static final String JSON_CONTENT_TYPE = "application/json"; public JSONObject sendAndReceive(JSONObject message) { try { if (log.isDebugEnabled()) { log.debug("Sending: " + message.toString(2)); } PostMethod postMethod = new PostMethod(uri.toString()); postMethod.setRequestHeader("Content-Type", "text/plain"); RequestEntity requestEntity = new StringRequestEntity(message.toString(), JSON_CONTENT_TYPE, null); postMethod.setRequestEntity(requestEntity); // http().getHostConfiguration().setProxy(proxyHost, proxyPort); http().executeMethod(null, postMethod, state); int statusCode = postMethod.getStatusCode(); if (statusCode != HttpStatus.SC_OK) throw new ClientError("HTTP Status - " + HttpStatus.getStatusText(statusCode) + " (" + statusCode + ")"); JSONTokener tokener = new JSONTokener(postMethod .getResponseBodyAsString()); Object rawResponseMessage = tokener.nextValue(); JSONObject responseMessage = (JSONObject) rawResponseMessage; if (responseMessage == null) throw new ClientError("Invalid response type - " + rawResponseMessage.getClass()); return responseMessage; } catch (HttpException e) { throw new ClientError(e); } catch (IOException e) { throw new ClientError(e); } catch (JSONException e) { throw new ClientError(e); } } /** * Expose commons-httpclient host configuration, for * setting configuration parameters like proxy. * * @return host configuration of the current HttpClient object */ public HostConfiguration getHostConfiguration() { return http().getHostConfiguration(); } HttpClient http() { if (client == null) { client = new HttpClient(); if (state == null) { state = new HttpState(); } client.setState(state); } return client; } public void close() { state.clear(); state = null; } static class Factory implements SessionFactory { public Session newSession(URI uri) { return new HTTPSession(uri); } } /** * Register this transport in 'registry' */ public static void register(TransportRegistry registry) { registry.registerTransport("http", new Factory()); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy