summaryrefslogtreecommitdiff
path: root/core/src/main/java/net/oauth/client/httpclient4/HttpClient4.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/java/net/oauth/client/httpclient4/HttpClient4.java')
-rwxr-xr-xcore/src/main/java/net/oauth/client/httpclient4/HttpClient4.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/core/src/main/java/net/oauth/client/httpclient4/HttpClient4.java b/core/src/main/java/net/oauth/client/httpclient4/HttpClient4.java
new file mode 100755
index 0000000..3376cc8
--- /dev/null
+++ b/core/src/main/java/net/oauth/client/httpclient4/HttpClient4.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2008 Sean Sullivan
+ *
+ * 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 net.oauth.client.httpclient4;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Map;
+import net.oauth.client.ExcerptInputStream;
+import net.oauth.http.HttpMessage;
+import net.oauth.http.HttpResponseMessage;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.params.ClientPNames;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.entity.InputStreamEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
+import org.apache.http.params.HttpParams;
+
+/**
+ * Utility methods for an OAuth client based on the <a
+ * href="http://hc.apache.org">Apache HttpClient</a>.
+ *
+ * @author Sean Sullivan
+ * @hide
+ */
+public class HttpClient4 implements net.oauth.http.HttpClient {
+
+ public HttpClient4() {
+ this(SHARED_CLIENT);
+ }
+
+ public HttpClient4(HttpClientPool clientPool) {
+ this.clientPool = clientPool;
+ }
+
+ private final HttpClientPool clientPool;
+
+ public HttpResponseMessage execute(HttpMessage request) throws IOException {
+ final String method = request.method;
+ final String url = request.url.toExternalForm();
+ final InputStream body = request.getBody();
+ final boolean isDelete = DELETE.equalsIgnoreCase(method);
+ final boolean isPost = POST.equalsIgnoreCase(method);
+ final boolean isPut = PUT.equalsIgnoreCase(method);
+ byte[] excerpt = null;
+ HttpRequestBase httpRequest;
+ if (isPost || isPut) {
+ HttpEntityEnclosingRequestBase entityEnclosingMethod =
+ isPost ? new HttpPost(url) : new HttpPut(url);
+ if (body != null) {
+ ExcerptInputStream e = new ExcerptInputStream(body);
+ excerpt = e.getExcerpt();
+ String length = request.removeHeaders(HttpMessage.CONTENT_LENGTH);
+ entityEnclosingMethod.setEntity(new InputStreamEntity(e,
+ (length == null) ? -1 : Long.parseLong(length)));
+ }
+ httpRequest = entityEnclosingMethod;
+ } else if (isDelete) {
+ httpRequest = new HttpDelete(url);
+ } else {
+ httpRequest = new HttpGet(url);
+ }
+ for (Map.Entry<String, String> header : request.headers) {
+ httpRequest.addHeader(header.getKey(), header.getValue());
+ }
+ HttpClient client = clientPool.getHttpClient(new URL(httpRequest.getURI().toString()));
+ client.getParams().setBooleanParameter(ClientPNames.HANDLE_REDIRECTS, false);
+ HttpResponse httpResponse = client.execute(httpRequest);
+ return new HttpMethodResponse(httpRequest, httpResponse, excerpt, request.getContentCharset());
+ }
+
+ private static final HttpClientPool SHARED_CLIENT = new SingleClient();
+
+ /**
+ * A pool that simply shares a single HttpClient. An HttpClient owns a pool
+ * of TCP connections. So, callers that share an HttpClient will share
+ * connections. Sharing improves performance (by avoiding the overhead of
+ * creating connections) and uses fewer resources in the client and its
+ * servers.
+ */
+ private static class SingleClient implements HttpClientPool
+ {
+ SingleClient()
+ {
+ HttpClient client = new DefaultHttpClient();
+ ClientConnectionManager mgr = client.getConnectionManager();
+ if (!(mgr instanceof ThreadSafeClientConnManager)) {
+ HttpParams params = client.getParams();
+ client = new DefaultHttpClient(new ThreadSafeClientConnManager(params,
+ mgr.getSchemeRegistry()), params);
+ }
+ this.client = client;
+ }
+
+ private final HttpClient client;
+
+ public HttpClient getHttpClient(URL server)
+ {
+ return client;
+ }
+ }
+
+}