| // Copyright (c) 2006- Facebook |
| // Distributed under the Thrift Software License |
| // |
| // See accompanying file LICENSE or visit the Thrift site at: |
| // http://developers.facebook.com/thrift/ |
| |
| package com.facebook.thrift.transport; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.InputStream; |
| import java.io.IOException; |
| |
| import java.net.URL; |
| import java.net.HttpURLConnection; |
| |
| /** |
| * HTTP implementation of the TTransport interface. Used for working with a |
| * Thrift web services implementation. |
| * |
| * @author Mark Slee <mcslee@facebook.com> |
| */ |
| 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; |
| |
| 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 open() {} |
| |
| public void close() {} |
| |
| 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 buffer |
| byte[] data = requestBuffer_.toByteArray(); |
| requestBuffer_.reset(); |
| |
| try { |
| // Create connection object |
| HttpURLConnection connection = (HttpURLConnection)url_.openConnection(); |
| |
| // Timeouts, only if explicitly set |
| if (connectTimeout_ > 0) { |
| connection.setConnectTimeout(connectTimeout_); |
| } |
| if (readTimeout_ > 0) { |
| connection.setReadTimeout(readTimeout_); |
| } |
| |
| // Make the request |
| connection.setRequestMethod("POST"); |
| connection.setRequestProperty("Content-Type", "application/x-thrift"); |
| connection.setRequestProperty("Accept", "application/x-thrift"); |
| connection.setRequestProperty("User-Agent", "Java/THttpClient"); |
| 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 responses |
| inputStream_ = connection.getInputStream(); |
| |
| } catch (IOException iox) { |
| throw new TTransportException(iox); |
| } |
| } |
| } |