Skip to content

Commit a9eec41

Browse files
committed
Merge pull request adjust#139 from adjust/http
Replace HttpClient with HttpURLConnection
2 parents c5238c6 + 53d8439 commit a9eec41

20 files changed

+620
-347
lines changed

Adjust/adjust/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ android {
88
minSdkVersion 9
99
targetSdkVersion 21
1010
versionCode 1
11-
versionName "4.1.1"
11+
versionName "4.1.2"
1212
}
1313
}
1414

Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ private void finishedTrackingActivityInternal(JSONObject jsonResponse) {
566566

567567
private void sendReferrerInternal(String referrer, long clickTime) {
568568
ActivityPackage clickPackage = buildQueryStringClickPackage(referrer,
569-
"reftag",
569+
Constants.REFTAG,
570570
clickTime);
571571
if (clickPackage == null) {
572572
return;
@@ -610,13 +610,17 @@ private ActivityPackage buildQueryStringClickPackage(String queryString, String
610610
return null;
611611
}
612612

613-
String reftag = queryStringParameters.remove("reftag");
613+
String reftag = queryStringParameters.remove(Constants.REFTAG);
614614

615615
long now = System.currentTimeMillis();
616616
PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState, now);
617617
builder.extraParameters = queryStringParameters;
618618
builder.attribution = queryStringAttribution;
619619
builder.reftag = reftag;
620+
if (source == Constants.REFTAG) {
621+
builder.referrer = queryString;
622+
}
623+
620624
ActivityPackage clickPackage = builder.buildClickPackage(source, clickTime);
621625
return clickPackage;
622626
}

Adjust/adjust/src/main/java/com/adjust/sdk/AdjustFactory.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@
22

33
import android.content.Context;
44

5-
import org.apache.http.client.HttpClient;
6-
import org.apache.http.impl.client.DefaultHttpClient;
7-
import org.apache.http.params.HttpParams;
5+
import java.io.IOException;
6+
import java.net.URL;
7+
8+
import javax.net.ssl.HttpsURLConnection;
89

910
public class AdjustFactory {
1011
private static IPackageHandler packageHandler = null;
1112
private static IRequestHandler requestHandler = null;
1213
private static IAttributionHandler attributionHandler = null;
1314
private static IActivityHandler activityHandler = null;
1415
private static ILogger logger = null;
15-
private static HttpClient httpClient = null;
16+
private static HttpsURLConnection mockHttpsURLConnection = null;
1617

1718
private static long timerInterval = -1;
1819
private static long timerStart = -1;
@@ -45,13 +46,6 @@ public static ILogger getLogger() {
4546
return logger;
4647
}
4748

48-
public static HttpClient getHttpClient(HttpParams params) {
49-
if (httpClient == null) {
50-
return new DefaultHttpClient(params);
51-
}
52-
return httpClient;
53-
}
54-
5549
public static long getTimerInterval() {
5650
if (timerInterval == -1) {
5751
return Constants.ONE_MINUTE;
@@ -99,6 +93,14 @@ public static IAttributionHandler getAttributionHandler(IActivityHandler activit
9993
return attributionHandler;
10094
}
10195

96+
public static HttpsURLConnection getHttpsURLConnection(URL url) throws IOException {
97+
if (AdjustFactory.mockHttpsURLConnection == null) {
98+
return (HttpsURLConnection)url.openConnection();
99+
}
100+
101+
return AdjustFactory.mockHttpsURLConnection;
102+
}
103+
102104
public static void setPackageHandler(IPackageHandler packageHandler) {
103105
AdjustFactory.packageHandler = packageHandler;
104106
}
@@ -111,10 +113,6 @@ public static void setLogger(ILogger logger) {
111113
AdjustFactory.logger = logger;
112114
}
113115

114-
public static void setHttpClient(HttpClient httpClient) {
115-
AdjustFactory.httpClient = httpClient;
116-
}
117-
118116
public static void setTimerInterval(long timerInterval) {
119117
AdjustFactory.timerInterval = timerInterval;
120118
}
@@ -139,4 +137,7 @@ public static void setAttributionHandler(IAttributionHandler attributionHandler)
139137
AdjustFactory.attributionHandler = attributionHandler;
140138
}
141139

140+
public static void setMockHttpsURLConnection(HttpsURLConnection mockHttpsURLConnection) {
141+
AdjustFactory.mockHttpsURLConnection = mockHttpsURLConnection;
142+
}
142143
}

Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java

Lines changed: 28 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,13 @@
22

33
import android.net.Uri;
44

5-
import org.apache.http.HttpResponse;
6-
import org.apache.http.client.HttpClient;
7-
import org.apache.http.client.methods.HttpGet;
85
import org.json.JSONObject;
96

10-
import java.net.URI;
11-
import java.net.URISyntaxException;
127
import java.util.Map;
138
import java.util.concurrent.Executors;
149
import java.util.concurrent.ScheduledExecutorService;
15-
import java.util.concurrent.ScheduledFuture;
16-
import java.util.concurrent.TimeUnit;
10+
11+
import javax.net.ssl.HttpsURLConnection;
1712

1813
/**
1914
* Created by pfms on 07/11/14.
@@ -24,7 +19,7 @@ public class AttributionHandler implements IAttributionHandler {
2419
private ILogger logger;
2520
private ActivityPackage attributionPackage;
2621
private TimerOnce timer;
27-
private HttpClient httpClient;
22+
2823
private boolean paused;
2924
private boolean hasListener;
3025

@@ -34,13 +29,18 @@ public AttributionHandler(IActivityHandler activityHandler,
3429
boolean hasListener) {
3530
scheduler = Executors.newSingleThreadScheduledExecutor();
3631
logger = AdjustFactory.getLogger();
37-
httpClient = Util.getHttpClient();
38-
timer = new TimerOnce(scheduler, new Runnable() {
39-
@Override
40-
public void run() {
41-
getAttributionInternal();
42-
}
43-
});
32+
33+
if (this.scheduler != null) {
34+
timer = new TimerOnce(scheduler, new Runnable() {
35+
@Override
36+
public void run() {
37+
getAttributionInternal();
38+
}
39+
});
40+
} else {
41+
this.logger.error("Timer not initialized, attribution handler is disabled");
42+
}
43+
4444
init(activityHandler, attributionPackage, startPaused, hasListener);
4545
}
4646

@@ -120,46 +120,40 @@ private void getAttributionInternal() {
120120
if (!hasListener) {
121121
return;
122122
}
123+
123124
if (paused) {
124125
logger.debug("Attribution handler is paused");
125126
return;
126127
}
128+
127129
logger.verbose("%s", attributionPackage.getExtendedString());
128-
HttpResponse httpResponse = null;
130+
131+
JSONObject jsonResponse = null;
129132
try {
130-
HttpGet request = getRequest(attributionPackage);
131-
httpResponse = httpClient.execute(request);
133+
HttpsURLConnection connection = Util.createGETHttpsURLConnection(
134+
buildUri(attributionPackage.getPath(), attributionPackage.getParameters()).toString(),
135+
attributionPackage.getClientSdk());
136+
137+
jsonResponse = Util.readHttpResponse(connection);
132138
} catch (Exception e) {
133139
logger.error("Failed to get attribution (%s)", e.getMessage());
134140
return;
135141
}
136142

137-
JSONObject jsonResponse = Util.parseJsonResponse(httpResponse);
138-
139143
checkAttributionInternal(jsonResponse);
140144
}
141145

142-
private Uri buildUri(ActivityPackage attributionPackage) {
146+
private Uri buildUri(String path, Map<String, String> parameters) {
143147
Uri.Builder uriBuilder = new Uri.Builder();
144148

145149
uriBuilder.scheme(Constants.SCHEME);
146150
uriBuilder.authority(Constants.AUTHORITY);
147-
uriBuilder.appendPath(attributionPackage.getPath());
151+
uriBuilder.appendPath(path);
148152

149-
for (Map.Entry<String, String> entry : attributionPackage.getParameters().entrySet()) {
153+
for (Map.Entry<String, String> entry : parameters.entrySet()) {
150154
uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue());
151155
}
152156

153157
return uriBuilder.build();
154158
}
155-
156-
private HttpGet getRequest(ActivityPackage attributionPackage) throws URISyntaxException {
157-
HttpGet request = new HttpGet();
158-
Uri uri = buildUri(attributionPackage);
159-
request.setURI(new URI(uri.toString()));
160-
161-
request.addHeader("Client-SDK", attributionPackage.getClientSdk());
162-
163-
return request;
164-
}
165-
}
159+
}

Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ public interface Constants {
2727
String BASE_URL = "https://app.adjust.com";
2828
String SCHEME = "https";
2929
String AUTHORITY = "app.adjust.com";
30-
String CLIENT_SDK = "android4.1.1";
30+
String CLIENT_SDK = "android4.1.2";
3131
String LOGTAG = "Adjust";
32+
String REFTAG = "reftag";
3233

3334
String ACTIVITY_STATE_FILENAME = "AdjustIoActivityState";
3435
String ATTRIBUTION_FILENAME = "AdjustAttribution";

Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class PackageBuilder {
2727
Map<String, String> extraParameters;
2828
AdjustAttribution attribution;
2929
String reftag;
30+
String referrer;
3031

3132
private static ILogger logger = AdjustFactory.getLogger();
3233

@@ -77,6 +78,7 @@ public ActivityPackage buildClickPackage(String source, long clickTime) {
7778
addDate(parameters, "click_time", clickTime);
7879
addString(parameters, "reftag", reftag);
7980
addMapJson(parameters, "params", extraParameters);
81+
addString(parameters, "referrer", referrer);
8082
injectAttribution(parameters);
8183

8284
ActivityPackage clickPackage = getDefaultActivityPackage(ActivityKind.CLICK);

Adjust/adjust/src/main/java/com/adjust/sdk/RequestHandler.java

Lines changed: 16 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,21 @@
1414
import android.os.Looper;
1515
import android.os.Message;
1616

17-
import org.apache.http.HttpResponse;
18-
import org.apache.http.NameValuePair;
19-
import org.apache.http.client.ClientProtocolException;
20-
import org.apache.http.client.HttpClient;
21-
import org.apache.http.client.entity.UrlEncodedFormEntity;
22-
import org.apache.http.client.methods.HttpPost;
23-
import org.apache.http.client.methods.HttpUriRequest;
24-
import org.apache.http.client.utils.URLEncodedUtils;
25-
import org.apache.http.message.BasicNameValuePair;
17+
import org.json.JSONException;
2618
import org.json.JSONObject;
2719

2820
import java.io.IOException;
2921
import java.io.UnsupportedEncodingException;
3022
import java.lang.ref.WeakReference;
3123
import java.net.SocketTimeoutException;
32-
import java.util.ArrayList;
33-
import java.util.List;
24+
import java.net.URL;
3425
import java.util.Locale;
35-
import java.util.Map;
26+
27+
import javax.net.ssl.HttpsURLConnection;
3628

3729
public class RequestHandler extends HandlerThread implements IRequestHandler {
3830
private InternalHandler internalHandler;
3931
private IPackageHandler packageHandler;
40-
private HttpClient httpClient;
4132
private ILogger logger;
4233

4334
public RequestHandler(IPackageHandler packageHandler) {
@@ -48,10 +39,6 @@ public RequestHandler(IPackageHandler packageHandler) {
4839
this.logger = AdjustFactory.getLogger();
4940
this.internalHandler = new InternalHandler(getLooper(), this);
5041
init(packageHandler);
51-
52-
Message message = Message.obtain();
53-
message.arg1 = InternalHandler.INIT;
54-
internalHandler.sendMessage(message);
5542
}
5643

5744
@Override
@@ -68,7 +55,6 @@ public void sendPackage(ActivityPackage pack) {
6855
}
6956

7057
private static final class InternalHandler extends Handler {
71-
private static final int INIT = 72401;
7258
private static final int SEND = 72400;
7359

7460
private final WeakReference<RequestHandler> requestHandlerReference;
@@ -88,9 +74,6 @@ public void handleMessage(Message message) {
8874
}
8975

9076
switch (message.arg1) {
91-
case INIT:
92-
requestHandler.initInternal();
93-
break;
9477
case SEND:
9578
ActivityPackage activityPackage = (ActivityPackage) message.obj;
9679
requestHandler.sendInternal(activityPackage);
@@ -99,19 +82,21 @@ public void handleMessage(Message message) {
9982
}
10083
}
10184

102-
private void initInternal() {
103-
httpClient = Util.getHttpClient();
104-
}
105-
10685
private void sendInternal(ActivityPackage activityPackage) {
86+
URL url;
87+
String targetURL = Constants.BASE_URL + activityPackage.getPath();
88+
10789
try {
108-
HttpUriRequest request = getRequest(activityPackage);
109-
HttpResponse response = httpClient.execute(request);
110-
requestFinished(response);
90+
HttpsURLConnection connection = Util.createPOSTHttpsURLConnection(
91+
targetURL,
92+
activityPackage.getClientSdk(),
93+
activityPackage.getParameters());
94+
95+
JSONObject jsonResponse = Util.readHttpResponse(connection);
96+
97+
requestFinished(jsonResponse);
11198
} catch (UnsupportedEncodingException e) {
11299
sendNextPackage(activityPackage, "Failed to encode parameters", e);
113-
} catch (ClientProtocolException e) {
114-
closePackage(activityPackage, "Client protocol error", e);
115100
} catch (SocketTimeoutException e) {
116101
closePackage(activityPackage, "Request timed out", e);
117102
} catch (IOException e) {
@@ -121,9 +106,7 @@ private void sendInternal(ActivityPackage activityPackage) {
121106
}
122107
}
123108

124-
private void requestFinished(HttpResponse response) {
125-
JSONObject jsonResponse = Util.parseJsonResponse(response);
126-
109+
private void requestFinished(JSONObject jsonResponse) throws JSONException {
127110
if (jsonResponse == null) {
128111
packageHandler.closeFirstPackage();
129112
return;
@@ -158,30 +141,4 @@ private String getReasonString(String message, Throwable throwable) {
158141
return String.format(Locale.US, "%s", message);
159142
}
160143
}
161-
162-
private HttpUriRequest getRequest(ActivityPackage activityPackage) throws UnsupportedEncodingException {
163-
String url = Constants.BASE_URL + activityPackage.getPath();
164-
HttpPost request = new HttpPost(url);
165-
166-
String language = Locale.getDefault().getLanguage();
167-
request.addHeader("Client-SDK", activityPackage.getClientSdk());
168-
request.addHeader("Accept-Language", language);
169-
170-
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
171-
for (Map.Entry<String, String> entry : activityPackage.getParameters().entrySet()) {
172-
NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue());
173-
pairs.add(pair);
174-
}
175-
176-
long now = System.currentTimeMillis();
177-
String dateString = Util.dateFormat(now);
178-
NameValuePair sentAtPair = new BasicNameValuePair("sent_at", dateString);
179-
pairs.add(sentAtPair);
180-
181-
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs);
182-
entity.setContentType(URLEncodedUtils.CONTENT_TYPE);
183-
request.setEntity(entity);
184-
185-
return request;
186-
}
187144
}

0 commit comments

Comments
 (0)