Skip to content

Commit 09a0f29

Browse files
committed
Increase the number of maximum connections to the API host
1 parent d0865e4 commit 09a0f29

4 files changed

Lines changed: 72 additions & 48 deletions

File tree

src/main/java/com/soundcloud/api/ApiWrapper.java

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
import org.apache.http.client.protocol.ClientContext;
2323
import org.apache.http.conn.ClientConnectionManager;
2424
import org.apache.http.conn.ConnectionKeepAliveStrategy;
25+
import org.apache.http.conn.params.ConnManagerPNames;
26+
import org.apache.http.conn.params.ConnManagerParams;
27+
import org.apache.http.conn.params.ConnPerRoute;
28+
import org.apache.http.conn.params.ConnPerRouteBean;
29+
import org.apache.http.conn.routing.HttpRoute;
2530
import org.apache.http.conn.routing.HttpRoutePlanner;
2631
import org.apache.http.conn.scheme.PlainSocketFactory;
2732
import org.apache.http.conn.scheme.Scheme;
@@ -32,6 +37,8 @@
3237
import org.apache.http.impl.client.DefaultRequestDirector;
3338
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
3439
import org.apache.http.message.BasicHeader;
40+
import org.apache.http.params.BasicHttpParams;
41+
import org.apache.http.params.HttpConnectionParams;
3542
import org.apache.http.params.HttpParams;
3643
import org.apache.http.params.HttpProtocolParams;
3744
import org.apache.http.protocol.BasicHttpProcessor;
@@ -83,11 +90,18 @@ public class ApiWrapper implements CloudAPI, Serializable {
8390
transient private HttpClient httpClient;
8491
transient private TokenListener listener;
8592

86-
/** debug request details to stderr */
87-
public boolean debugRequests;
93+
private String mDefaultContentType;
8894

95+
public static final int BUFFER_SIZE = 8192;
96+
/** Connection timeout */
97+
public static final int TIMEOUT = 20 * 1000;
98+
/** Keepalive timeout */
99+
public static final long KEEPALIVE_TIMEOUT = 20 * 1000;
100+
/* maximum number of connections allowed */
101+
public static final int MAX_TOTAL_CONNECTIONS = 20;
89102

90-
private String mDefaultContentType;
103+
/** debug request details to stderr */
104+
public boolean debugRequests;
91105

92106
/**
93107
* Constructs a new ApiWrapper instance.
@@ -251,13 +265,36 @@ protected Token requestToken(Request request) throws IOException {
251265
}
252266
}
253267

254-
255-
256268
/**
257-
* @return parameters used by the underlying HttpClient
269+
* @return the default HttpParams
270+
* @see <a href="http://developer.android.com/reference/android/net/http/AndroidHttpClient.html#newInstance(java.lang.String, android.content.Context)">
271+
* android.net.http.AndroidHttpClient#newInstance(String, Context)</a>
258272
*/
259273
protected HttpParams getParams() {
260-
return Http.defaultParams();
274+
final HttpParams params = new BasicHttpParams();
275+
HttpConnectionParams.setConnectionTimeout(params, TIMEOUT);
276+
HttpConnectionParams.setSoTimeout(params, TIMEOUT);
277+
HttpConnectionParams.setSocketBufferSize(params, BUFFER_SIZE);
278+
ConnManagerParams.setMaxTotalConnections(params, MAX_TOTAL_CONNECTIONS);
279+
280+
// Turn off stale checking. Our connections break all the time anyway,
281+
// and it's not worth it to pay the penalty of checking every time.
282+
HttpConnectionParams.setStaleCheckingEnabled(params, false);
283+
284+
// fix contributed by Bjorn Roche XXX check if still needed
285+
params.setBooleanParameter("http.protocol.expect-continue", false);
286+
params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRoute() {
287+
@Override
288+
public int getMaxForRoute(HttpRoute httpRoute) {
289+
if (env.isApiHost(httpRoute.getTargetHost())) {
290+
// there will be a lot of concurrent request to the API host
291+
return MAX_TOTAL_CONNECTIONS;
292+
} else {
293+
return ConnPerRouteBean.DEFAULT_MAX_CONNECTIONS_PER_ROUTE;
294+
}
295+
}
296+
});
297+
return params;
261298
}
262299

263300
/**
@@ -305,7 +342,7 @@ public HttpClient getHttpClient() {
305342
setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {
306343
@Override
307344
public long getKeepAliveDuration(HttpResponse httpResponse, HttpContext httpContext) {
308-
return 20 * 1000; // milliseconds
345+
return KEEPALIVE_TIMEOUT;
309346
}
310347
});
311348

src/main/java/com/soundcloud/api/Env.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public enum Env {
2222
Env(String resourceHost, String authResourceHost) {
2323
this.resourceHost = new HttpHost(resourceHost, -1, "http");
2424
sslResourceHost = new HttpHost(resourceHost, -1, "https");
25+
2526
this.authResourceHost = new HttpHost(authResourceHost, -1, "http");
2627
sslAuthResourceHost = new HttpHost(authResourceHost, -1, "https");
2728
}
@@ -33,4 +34,10 @@ public HttpHost getResourceHost(boolean secure) {
3334
public HttpHost getAuthResourceHost(boolean secure) {
3435
return secure ? sslAuthResourceHost : authResourceHost;
3536
}
37+
38+
public boolean isApiHost(HttpHost host) {
39+
return ("http".equals(host.getSchemeName()) ||
40+
"https".equals(host.getSchemeName())) &&
41+
resourceHost.getHostName().equals(host.getHostName());
42+
}
3643
}

src/main/java/com/soundcloud/api/Http.java

Lines changed: 3 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,6 @@
22

33
import org.apache.http.Header;
44
import org.apache.http.HttpResponse;
5-
import org.apache.http.conn.params.ConnManagerPNames;
6-
import org.apache.http.conn.params.ConnPerRoute;
7-
import org.apache.http.conn.params.ConnPerRouteBean;
8-
import org.apache.http.conn.routing.HttpRoute;
9-
import org.apache.http.params.BasicHttpParams;
10-
import org.apache.http.params.HttpConnectionParams;
11-
import org.apache.http.params.HttpParams;
125
import org.apache.http.protocol.HTTP;
136
import org.json.JSONException;
147
import org.json.JSONObject;
@@ -20,10 +13,6 @@
2013
* Helper class for various HTTP related functions.
2114
*/
2215
public class Http {
23-
public static final int BUFFER_SIZE = 8192;
24-
/** Connection timeout */
25-
public static final int TIMEOUT = 20 * 1000;
26-
2716
private Http() {
2817
}
2918

@@ -38,7 +27,7 @@ public static String getString(HttpResponse response) throws IOException {
3827
InputStream is = response.getEntity().getContent();
3928
if (is == null) return null;
4029

41-
int length = BUFFER_SIZE;
30+
int length = ApiWrapper.BUFFER_SIZE;
4231
Header contentLength = null;
4332
try {
4433
contentLength = response.getFirstHeader(HTTP.CONTENT_LEN);
@@ -54,13 +43,13 @@ public static String getString(HttpResponse response) throws IOException {
5443

5544
final StringBuilder sb = new StringBuilder(length);
5645
int n;
57-
byte[] buffer = new byte[BUFFER_SIZE];
46+
byte[] buffer = new byte[ApiWrapper.BUFFER_SIZE];
5847
while ((n = is.read(buffer)) != -1) sb.append(new String(buffer, 0, n));
5948
return sb.toString();
6049
}
6150

6251
public static JSONObject getJSON(HttpResponse response) throws IOException {
63-
final String json = Http.getString(response);
52+
final String json = getString(response);
6453
if (json == null || json.length() == 0) throw new IOException("JSON response is empty");
6554
try {
6655
return new JSONObject(json);
@@ -69,30 +58,4 @@ public static JSONObject getJSON(HttpResponse response) throws IOException {
6958
(json.length() > 80 ? (json.substring(0, 79) + "..." ) : json));
7059
}
7160
}
72-
73-
/**
74-
* @return the default HttpParams
75-
* @see <a href="http://developer.android.com/reference/android/net/http/AndroidHttpClient.html#newInstance(java.lang.String, android.content.Context)">
76-
* android.net.http.AndroidHttpClient#newInstance(String, Context)</a>
77-
*/
78-
public static HttpParams defaultParams() {
79-
final HttpParams params = new BasicHttpParams();
80-
HttpConnectionParams.setConnectionTimeout(params, TIMEOUT);
81-
HttpConnectionParams.setSoTimeout(params, TIMEOUT);
82-
HttpConnectionParams.setSocketBufferSize(params, 8192);
83-
84-
// Turn off stale checking. Our connections break all the time anyway,
85-
// and it's not worth it to pay the penalty of checking every time.
86-
HttpConnectionParams.setStaleCheckingEnabled(params, false);
87-
88-
// fix contributed by Bjorn Roche XXX check if still needed
89-
params.setBooleanParameter("http.protocol.expect-continue", false);
90-
params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRoute() {
91-
@Override
92-
public int getMaxForRoute(HttpRoute httpRoute) {
93-
return ConnPerRouteBean.DEFAULT_MAX_CONNECTIONS_PER_ROUTE * 3;
94-
}
95-
});
96-
return params;
97-
}
9861
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.soundcloud.api;
2+
3+
import static org.junit.Assert.assertFalse;
4+
import static org.junit.Assert.assertTrue;
5+
6+
import org.apache.http.HttpHost;
7+
import org.junit.Test;
8+
9+
10+
public class EnvTest {
11+
@Test
12+
public void testIsApiHost() throws Exception {
13+
assertTrue(Env.LIVE.isApiHost(new HttpHost("api.soundcloud.com", 80, "http")));
14+
assertTrue(Env.LIVE.isApiHost(new HttpHost("api.soundcloud.com", 443, "https")));
15+
assertFalse(Env.LIVE.isApiHost(new HttpHost("foo.soundcloud.com", 443, "https")));
16+
}
17+
}

0 commit comments

Comments
 (0)