Skip to content

Commit bf66be4

Browse files
committed
Extract HTTP client logic to HttpClient and JavaHttpClient. Make HttpClient configurable.
1 parent 8267154 commit bf66be4

File tree

7 files changed

+427
-303
lines changed

7 files changed

+427
-303
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
# Changelog
2+
## Unreleased
3+
* Extract HTTP client logic to `HttpClient` and `JavaHttpClient`
4+
* Make `HttpClient` configurable.
5+
26
## 3.40.0
37
* Add prepaid_reloadable from bin data in credit card responses
48
* Add support for `PayPalPaymentResource` requests

src/main/java/com/braintreegateway/Configuration.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import com.braintreegateway.exceptions.ConfigurationException;
44
import com.braintreegateway.util.ClientLibraryProperties;
5+
import com.braintreegateway.util.HttpClient;
6+
import com.braintreegateway.util.JavaHttpClient;
7+
58
import java.net.InetSocketAddress;
69
import java.net.Proxy;
710
import java.util.logging.Level;
@@ -18,6 +21,7 @@ public class Configuration {
1821
private String merchantId;
1922
private String privateKey;
2023
private String publicKey;
24+
private HttpClient httpClient;
2125
private static Logger logger;
2226

2327
static {
@@ -155,4 +159,16 @@ public int getConnectTimeout() {
155159
public void setConnectTimeout(Integer timeout) {
156160
this.connectTimeout = timeout;
157161
}
162+
163+
public HttpClient getHttpClient() {
164+
if (httpClient == null) {
165+
this.httpClient = new JavaHttpClient(this);
166+
}
167+
168+
return httpClient;
169+
}
170+
171+
public void setHttpClient(HttpClient httpClient) {
172+
this.httpClient = httpClient;
173+
}
158174
}

src/main/java/com/braintreegateway/ThreeDSecureGateway.java

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33
import com.braintreegateway.exceptions.BraintreeException;
44
import com.braintreegateway.exceptions.UnexpectedException;
55
import com.braintreegateway.util.Http;
6-
import com.braintreegateway.util.StringUtils;
6+
import com.braintreegateway.util.HttpClient;
77
import com.fasterxml.jackson.jr.ob.JSON;
8+
89
import java.io.IOException;
9-
import java.io.InputStream;
10-
import java.net.HttpURLConnection;
11-
import java.net.URL;
12-
import java.nio.charset.StandardCharsets;
10+
import java.util.HashMap;
1311
import java.util.Map;
14-
import java.util.zip.GZIPInputStream;
12+
13+
import static com.braintreegateway.util.HttpClient.HttpResponse;
14+
import static com.braintreegateway.util.HttpClient.Payload;
15+
import static com.braintreegateway.util.HttpClient.RequestMethod;
1516

1617
public class ThreeDSecureGateway {
1718
private final Configuration configuration;
@@ -28,27 +29,19 @@ public Result<ThreeDSecureLookupResponse> lookup(ThreeDSecureLookupRequest reque
2829
}
2930

3031
try {
31-
URL url = new URL(configuration.getBaseURL() + configuration.getMerchantPath() +
32-
"/client_api/v1/payment_methods/" + request.getNonce() + "/three_d_secure/lookup");
33-
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
34-
connection.setRequestMethod("POST");
35-
connection.addRequestProperty("X-ApiVersion", Configuration.apiVersion());
36-
connection.addRequestProperty("Content-Type", "application/json");
37-
connection.setDoOutput(true);
38-
connection.getOutputStream().write(request.toJSON().getBytes(StandardCharsets.UTF_8));
39-
connection.getOutputStream().close();
32+
Map<String, String> headers = new HashMap<>();
33+
headers.put("X-ApiVersion", Configuration.apiVersion());
4034

41-
boolean isError = connection.getResponseCode() != 201;
42-
InputStream responseStream = isError ? connection.getErrorStream() : connection.getInputStream();
43-
if ("gzip".equalsIgnoreCase(connection.getContentEncoding())) {
44-
responseStream = new GZIPInputStream(responseStream);
45-
}
35+
String url = configuration.getBaseURL() + configuration.getMerchantPath() + "/client_api/v1/payment_methods/" + request.getNonce()
36+
+ "/three_d_secure/lookup";
4637

47-
String rawResponse = StringUtils.inputStreamToString(responseStream);
48-
responseStream.close();
38+
HttpClient httpClient = configuration.getHttpClient();
39+
HttpResponse httpResponse = httpClient.request(RequestMethod.POST, url, Payload.json(headers, request.toJSON()));
4940

50-
if (isError) {
51-
Http.throwExceptionIfErrorStatusCode(connection.getResponseCode(), rawResponse);
41+
int responseCode = httpResponse.getResponseCode();
42+
String rawResponse = httpResponse.getResponseBody();
43+
if (responseCode != 201) {
44+
Http.throwExceptionIfErrorStatusCode(responseCode, rawResponse);
5245
}
5346

5447
Map<String, Object> jsonResponse = JSON.std.mapFrom(rawResponse);

src/main/java/com/braintreegateway/util/GraphQLClient.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
import com.braintreegateway.exceptions.UpgradeRequiredException;
1616
import com.fasterxml.jackson.jr.ob.JSON;
1717
import java.io.IOException;
18-
import java.net.HttpURLConnection;
1918
import java.util.HashMap;
2019
import java.util.List;
2120
import java.util.Map;
2221
import java.util.TreeMap;
2322

23+
import static com.braintreegateway.util.HttpClient.Payload;
24+
import static com.braintreegateway.util.HttpClient.RequestMethod;
25+
2426
public class GraphQLClient extends Http {
2527
private Configuration configuration;
2628
public enum ErrorClass {
@@ -52,22 +54,14 @@ public Map<String, Object> query(String definition) {
5254
// little difference to the consumer of the SDK, but should make developing
5355
// it a little easier
5456
public Map<String, Object> query(String definition, Map<String, Object> variables) {
55-
HttpURLConnection connection = null;
5657
Map<String, Object> jsonMap = null;
5758

5859
String requestString = formatGraphQLRequest(definition, variables);
59-
String contentType = "application/json";
6060

61-
Map<String, String> headers = constructHeaders(contentType, contentType);
61+
Map<String, String> headers = constructHeaders("application/json");
6262
headers.put("Braintree-Version", Configuration.GRAPHQL_API_VERSION);
6363

64-
try {
65-
connection = buildConnection(Http.RequestMethod.POST, configuration.getGraphQLURL(), headers);
66-
} catch (IOException e) {
67-
throw new UnexpectedException(e.getMessage(), e);
68-
}
69-
70-
String jsonString = httpDo(Http.RequestMethod.POST, "/graphql", requestString, null, connection, headers, null);
64+
String jsonString = httpDo(RequestMethod.POST, configuration.getGraphQLURL(), "/graphql", Payload.json(headers, requestString));
7165

7266
try {
7367
jsonMap = JSON.std.mapFrom(jsonString);

0 commit comments

Comments
 (0)