Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/** Licensed to the Apache Software Foundation (ASF) under one* or more contributor license agreements. See the NOTICE file* distributed with this work for additional information* regarding copyright ownership. The ASF licenses this file* to you 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.apache.thrift.transport;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.io.IOException;import java.net.URL;import java.net.HttpURLConnection;import java.util.HashMap;import java.util.Map;/*** HTTP implementation of the TTransport interface. Used for working with a* Thrift web services implementation.**/public class THttpClient extends TTransport {private URL url_ = null;private final ByteArrayOutputStream requestBuffer_ =new ByteArrayOutputStream();private InputStream inputStream_ = null;private int connectTimeout_ = 0;private int readTimeout_ = 0;private Map<String,String> customHeaders_ = null;public THttpClient(String url) throws TTransportException {try {url_ = new URL(url);} catch (IOException iox) {throw new TTransportException(iox);}}public void setConnectTimeout(int timeout) {connectTimeout_ = timeout;}public void setReadTimeout(int timeout) {readTimeout_ = timeout;}public void setCustomHeaders(Map<String,String> headers) {customHeaders_ = headers;}public void setCustomHeader(String key, String value) {if (customHeaders_ == null) {customHeaders_ = new HashMap<String, String>();}customHeaders_.put(key, value);}public void open() {}public void close() {if (null != inputStream_) {try {inputStream_.close();} catch (IOException ioe) {;}inputStream_ = null;}}public boolean isOpen() {return true;}public int read(byte[] buf, int off, int len) throws TTransportException {if (inputStream_ == null) {throw new TTransportException("Response buffer is empty, no request.");}try {int ret = inputStream_.read(buf, off, len);if (ret == -1) {throw new TTransportException("No more data available.");}return ret;} catch (IOException iox) {throw new TTransportException(iox);}}public void write(byte[] buf, int off, int len) {requestBuffer_.write(buf, off, len);}public void flush() throws TTransportException {// Extract request and reset bufferbyte[] data = requestBuffer_.toByteArray();requestBuffer_.reset();try {// Create connection objectHttpURLConnection connection = (HttpURLConnection)url_.openConnection();// Timeouts, only if explicitly setif (connectTimeout_ > 0) {connection.setConnectTimeout(connectTimeout_);}if (readTimeout_ > 0) {connection.setReadTimeout(readTimeout_);}// Make the requestconnection.setRequestMethod("POST");connection.setRequestProperty("Content-Type", "application/x-thrift");connection.setRequestProperty("Accept", "application/x-thrift");connection.setRequestProperty("User-Agent", "Java/THttpClient");if (customHeaders_ != null) {for (Map.Entry<String, String> header : customHeaders_.entrySet()) {connection.setRequestProperty(header.getKey(), header.getValue());}}connection.setDoOutput(true);connection.connect();connection.getOutputStream().write(data);int responseCode = connection.getResponseCode();if (responseCode != HttpURLConnection.HTTP_OK) {throw new TTransportException("HTTP Response code: " + responseCode);}// Read the responsesinputStream_ = connection.getInputStream();} catch (IOException iox) {throw new TTransportException(iox);}}}