forked from google/google-authenticator-android
/
HttpClientFactory.java
115 lines (99 loc) · 4.32 KB
/
HttpClientFactory.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
* Copyright 2011 Google Inc. All Rights Reserved.
*
* 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 com.google.android.apps.authenticator.testability;
import android.content.Context;
import android.os.Build;
import org.apache.http.client.HttpClient;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Factory that creates an {@link HttpClient}.
*
* @author klyubin@google.com (Alex Klyubin)
*/
final class HttpClientFactory {
/** Timeout (ms) for establishing a connection.*/
// @VisibleForTesting
static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 20 * 1000;
/** Timeout (ms) for read operations on connections. */
// @VisibleForTesting
static final int DEFAULT_READ_TIMEOUT_MILLIS = 20 * 1000;
/** Timeout (ms) for obtaining a connection from the connection pool.*/
// @VisibleForTesting
static final int DEFAULT_GET_CONNECTION_FROM_POOL_TIMEOUT_MILLIS = 20 * 1000;
/** Hidden constructor to prevent instantiation. */
private HttpClientFactory() {}
/**
* Creates a new {@link HttpClient}.
*
* @param context context for reusing SSL sessions.
*/
static HttpClient createHttpClient(Context context) {
HttpClient client;
// TODO(klyubin): Remove this complicated code once the minimum target is Froyo.
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ECLAIR_MR1) {
try {
client = createHttpClientForFroyoAndHigher(context);
} catch (Exception e) {
throw new RuntimeException("Failed to create HttpClient", e);
}
} else {
client = createHttpClientForEclair();
}
configureHttpClient(client);
return client;
}
private static void configureHttpClient(HttpClient httpClient) {
HttpParams params = httpClient.getParams();
HttpConnectionParams.setStaleCheckingEnabled(params, false);
HttpConnectionParams.setConnectionTimeout(params, DEFAULT_CONNECT_TIMEOUT_MILLIS);
HttpConnectionParams.setSoTimeout(params, DEFAULT_READ_TIMEOUT_MILLIS);
HttpConnectionParams.setSocketBufferSize(params, 8192);
ConnManagerParams.setTimeout(params, DEFAULT_GET_CONNECTION_FROM_POOL_TIMEOUT_MILLIS);
// Don't handle redirects automatically
HttpClientParams.setRedirecting(params, false);
// Don't handle authentication automatically
HttpClientParams.setAuthenticating(params, false);
}
private static HttpClient createHttpClientForFroyoAndHigher(Context context)
throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException,
InvocationTargetException {
// IMPLEMENTATION NOTE: We create the instance via Reflection API to avoid raising the
// target SDK version to 8 because that will cause Eclipse to complain for no good reason.
// The code below invokes:
// AndroidHttpClient.newInstance(null, getContext())
Class<?> androidHttpClientClass =
context.getClassLoader().loadClass("android.net.http.AndroidHttpClient");
Method newInstanceMethod =
androidHttpClientClass.getMethod("newInstance", String.class, Context.class);
return (HttpClient) newInstanceMethod.invoke(null, null, context);
}
/**
* Creates a new instance of {@code HttpClient} for Eclair where we can't use
* {@code android.net.http.AndroidHttpClient}.
*/
private static HttpClient createHttpClientForEclair() {
// IMPLEMENTATION NOTE: Since AndroidHttpClient is not available on Eclair, we create a
// DefaultHttpClient with a configuration similar to that of AndroidHttpClient.
return new DefaultHttpClient(new BasicHttpParams());
}
}