forked from stripe/stripe-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHttpURLConnectionClient.java
More file actions
116 lines (97 loc) · 3.8 KB
/
HttpURLConnectionClient.java
File metadata and controls
116 lines (97 loc) · 3.8 KB
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
116
package com.stripe.net;
import com.stripe.Stripe;
import com.stripe.exception.ApiConnectionException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.PasswordAuthentication;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.Cleanup;
public class HttpURLConnectionClient extends HttpClient {
/** Initializes a new instance of the {@link HttpURLConnectionClient}. */
public HttpURLConnectionClient() {
super();
}
/**
* Sends the given request to Stripe's API.
*
* @param request the request
* @return the response
* @throws ApiConnectionException if an error occurs when sending or receiving
*/
@Override
public StripeResponseStream requestStream(StripeRequest request) throws ApiConnectionException {
try {
final HttpURLConnection conn = createStripeConnection(request);
// Calling `getResponseCode()` triggers the request.
final int responseCode = conn.getResponseCode();
final HttpHeaders headers = HttpHeaders.of(conn.getHeaderFields());
final InputStream responseStream =
(responseCode >= 200 && responseCode < 300)
? conn.getInputStream()
: conn.getErrorStream();
return new StripeResponseStream(responseCode, headers, responseStream);
} catch (IOException e) {
throw ApiConnectionException.create(Stripe.getApiBase(), e);
}
}
/**
* Sends the given request to Stripe's API, and returns a buffered response.
*
* @param request the request
* @return the response
* @throws ApiConnectionException if an error occurs when sending or receiving
*/
@Override
public StripeResponse request(StripeRequest request) throws ApiConnectionException {
final StripeResponseStream responseStream = requestStream(request);
try {
return responseStream.unstream();
} catch (IOException e) {
throw ApiConnectionException.create(Stripe.getApiBase(), e);
}
}
static HttpHeaders getHeaders(StripeRequest request) {
Map<String, List<String>> userAgentHeadersMap = new HashMap<>();
userAgentHeadersMap.put("User-Agent", Arrays.asList(buildUserAgentString(request)));
userAgentHeadersMap.put(
"X-Stripe-Client-User-Agent", Arrays.asList(buildXStripeClientUserAgentString()));
return request.headers().withAdditionalHeaders(userAgentHeadersMap);
}
private static HttpURLConnection createStripeConnection(StripeRequest request)
throws IOException, ApiConnectionException {
HttpURLConnection conn = null;
if (request.options().getConnectionProxy() != null) {
conn =
(HttpURLConnection) request.url().openConnection(request.options().getConnectionProxy());
Authenticator.setDefault(
new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return request.options().getProxyCredential();
}
});
} else {
conn = (HttpURLConnection) request.url().openConnection();
}
conn.setConnectTimeout(request.options().getConnectTimeout());
conn.setReadTimeout(request.options().getReadTimeout());
conn.setUseCaches(false);
for (Map.Entry<String, List<String>> entry : getHeaders(request).map().entrySet()) {
conn.setRequestProperty(entry.getKey(), String.join(",", entry.getValue()));
}
conn.setRequestMethod(request.method().name());
if (request.content() != null) {
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", request.content().contentType());
@Cleanup OutputStream output = conn.getOutputStream();
output.write(request.content().byteArrayContent());
}
return conn;
}
}