Skip to content

Commit a69f9de

Browse files
committed
introduce JDKHttpClient (default).
1 parent a75a695 commit a69f9de

File tree

10 files changed

+180
-107
lines changed

10 files changed

+180
-107
lines changed

scribejava-core/src/main/java/com/github/scribejava/core/httpclient/HttpClient.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
import java.util.concurrent.Future;
1212

1313
public interface HttpClient {
14+
String DEFAULT_CONTENT_TYPE = "application/x-www-form-urlencoded";
15+
String CONTENT_TYPE = "Content-Type";
16+
String CONTENT_LENGTH = "Content-Length";
1417

1518
void close() throws IOException;
1619

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package com.github.scribejava.core.httpclient.jdk;
2+
3+
import com.github.scribejava.core.exceptions.OAuthConnectionException;
4+
import com.github.scribejava.core.exceptions.OAuthException;
5+
import com.github.scribejava.core.httpclient.HttpClient;
6+
import com.github.scribejava.core.model.OAuthAsyncRequestCallback;
7+
import com.github.scribejava.core.model.OAuthConstants;
8+
import com.github.scribejava.core.model.OAuthRequest;
9+
import com.github.scribejava.core.model.OAuthRequestAsync;
10+
import com.github.scribejava.core.model.Response;
11+
import com.github.scribejava.core.model.Verb;
12+
import java.io.File;
13+
import java.io.IOException;
14+
import java.net.HttpURLConnection;
15+
import java.net.URL;
16+
import java.net.UnknownHostException;
17+
import java.util.HashMap;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.concurrent.ExecutionException;
21+
import java.util.concurrent.Future;
22+
23+
public class JDKHttpClient implements HttpClient {
24+
25+
private final JDKHttpClientConfig config;
26+
27+
public JDKHttpClient(JDKHttpClientConfig clientConfig) {
28+
config = clientConfig;
29+
}
30+
31+
@Override
32+
public void close() throws IOException {
33+
}
34+
35+
@Override
36+
public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
37+
byte[] bodyContents, OAuthAsyncRequestCallback<T> callback,
38+
OAuthRequestAsync.ResponseConverter<T> converter) {
39+
throw new UnsupportedOperationException("Not supported yet.");
40+
}
41+
42+
@Override
43+
public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
44+
String bodyContents, OAuthAsyncRequestCallback<T> callback,
45+
OAuthRequestAsync.ResponseConverter<T> converter) {
46+
throw new UnsupportedOperationException("Not supported yet.");
47+
}
48+
49+
@Override
50+
public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
51+
File bodyContents, OAuthAsyncRequestCallback<T> callback,
52+
OAuthRequestAsync.ResponseConverter<T> converter) {
53+
throw new UnsupportedOperationException("Not supported yet.");
54+
}
55+
56+
@Override
57+
public Response execute(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
58+
byte[] bodyContents) throws InterruptedException, ExecutionException, IOException {
59+
throw new UnsupportedOperationException("Not supported yet.");
60+
}
61+
62+
@Override
63+
public Response execute(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
64+
String bodyContents) throws InterruptedException, ExecutionException, IOException {
65+
throw new UnsupportedOperationException("Not supported yet.");
66+
}
67+
68+
@Override
69+
public Response execute(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
70+
File bodyContents) throws InterruptedException, ExecutionException, IOException {
71+
throw new UnsupportedOperationException("Not supported yet.");
72+
}
73+
74+
public Response send(String userAgent, OAuthRequest request) {
75+
try {
76+
return doSend(userAgent, request.getHeaders(), request.getVerb(), request.getCompleteUrl(), request);
77+
} catch (IOException | RuntimeException e) {
78+
throw new OAuthConnectionException(request.getCompleteUrl(), e);
79+
}
80+
}
81+
82+
private Response doSend(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
83+
OAuthRequest request) throws IOException {
84+
final HttpURLConnection connection = (HttpURLConnection) new URL(completeUrl).openConnection();
85+
connection.setInstanceFollowRedirects(config.isFollowRedirects());
86+
connection.setRequestMethod(httpVerb.name());
87+
if (config.getConnectTimeout() != null) {
88+
connection.setConnectTimeout(config.getConnectTimeout());
89+
}
90+
if (config.getReadTimeout() != null) {
91+
connection.setReadTimeout(config.getReadTimeout());
92+
}
93+
addHeaders(connection, headers, userAgent);
94+
if (httpVerb == Verb.POST || httpVerb == Verb.PUT || httpVerb == Verb.DELETE) {
95+
final File filePayload = request.getFilePayload();
96+
if (filePayload != null) {
97+
throw new UnsupportedOperationException("Sync Requests do not support File payload for the moment");
98+
} else if (request.getStringPayload() != null) {
99+
addBody(connection, request.getStringPayload().getBytes(request.getCharset()));
100+
} else {
101+
addBody(connection, request.getByteArrayPayload());
102+
}
103+
}
104+
105+
try {
106+
connection.connect();
107+
final int responseCode = connection.getResponseCode();
108+
return new Response(responseCode, connection.getResponseMessage(), parseHeaders(connection),
109+
responseCode >= 200 && responseCode < 400 ? connection.getInputStream()
110+
: connection.getErrorStream());
111+
} catch (UnknownHostException e) {
112+
throw new OAuthException("The IP address of a host could not be determined.", e);
113+
}
114+
}
115+
116+
private static Map<String, String> parseHeaders(HttpURLConnection conn) {
117+
final Map<String, String> headers = new HashMap<>();
118+
for (Map.Entry<String, List<String>> entry : conn.getHeaderFields().entrySet()) {
119+
final String key = entry.getKey();
120+
if ("Content-Encoding".equalsIgnoreCase(key)) {
121+
headers.put("Content-Encoding", entry.getValue().get(0));
122+
} else {
123+
headers.put(key, entry.getValue().get(0));
124+
}
125+
}
126+
return headers;
127+
}
128+
129+
private static void addHeaders(HttpURLConnection connection, Map<String, String> headers, String userAgent) {
130+
for (Map.Entry<String, String> entry : headers.entrySet()) {
131+
connection.setRequestProperty(entry.getKey(), entry.getValue());
132+
}
133+
if (userAgent != null) {
134+
connection.setRequestProperty(OAuthConstants.USER_AGENT_HEADER_NAME, userAgent);
135+
}
136+
}
137+
138+
private static void addBody(HttpURLConnection connection, byte[] content) throws IOException {
139+
connection.setRequestProperty(CONTENT_LENGTH, String.valueOf(content.length));
140+
141+
if (connection.getRequestProperty(CONTENT_TYPE) == null) {
142+
connection.setRequestProperty(CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
143+
}
144+
connection.setDoOutput(true);
145+
connection.getOutputStream().write(content);
146+
}
147+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.github.scribejava.core.httpclient.jdk;
2+
3+
import com.github.scribejava.core.httpclient.HttpClient;
4+
import com.github.scribejava.core.httpclient.HttpClientConfig;
5+
import com.github.scribejava.core.httpclient.HttpClientProvider;
6+
7+
public class JDKHttpProvider implements HttpClientProvider {
8+
9+
@Override
10+
public HttpClient createClient(HttpClientConfig config) {
11+
if (config instanceof JDKHttpClientConfig) {
12+
return new JDKHttpClient((JDKHttpClientConfig) config);
13+
}
14+
return null;
15+
}
16+
}

scribejava-core/src/main/java/com/github/scribejava/core/model/AbstractRequest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@
1414
*/
1515
public abstract class AbstractRequest {
1616

17-
public static final String DEFAULT_CONTENT_TYPE = "application/x-www-form-urlencoded";
18-
public static final String CONTENT_TYPE = "Content-Type";
19-
protected static final String CONTENT_LENGTH = "Content-Length";
2017
private static final String OAUTH_PREFIX = "oauth_";
2118

2219
private final String url;
Lines changed: 0 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,5 @@
11
package com.github.scribejava.core.model;
22

3-
import java.io.IOException;
4-
import java.net.HttpURLConnection;
5-
import java.util.Map;
6-
import com.github.scribejava.core.exceptions.OAuthConnectionException;
7-
import com.github.scribejava.core.exceptions.OAuthException;
8-
import com.github.scribejava.core.httpclient.jdk.JDKHttpClientConfig;
9-
import java.io.File;
10-
import java.net.URL;
11-
import java.net.UnknownHostException;
12-
import java.util.HashMap;
13-
import java.util.List;
14-
153
public class OAuthRequest extends AbstractRequest {
164

175
public OAuthRequest(Verb verb, String url) {
@@ -29,79 +17,4 @@ public OAuthRequest(Verb verb, String url) {
2917
public OAuthRequest(Verb verb, String url, OAuthConfig config) {
3018
this(verb, url);
3119
}
32-
33-
public Response send(String userAgent, JDKHttpClientConfig httpClientConfig) {
34-
try {
35-
return doSend(userAgent, httpClientConfig, getHeaders(), getVerb(), getCompleteUrl(),
36-
this);
37-
} catch (IOException | RuntimeException e) {
38-
throw new OAuthConnectionException(getCompleteUrl(), e);
39-
}
40-
}
41-
42-
private static Response doSend(String userAgent, JDKHttpClientConfig httpClientConfig, Map<String, String> headers,
43-
Verb httpVerb, String completeUrl, OAuthRequest request) throws IOException {
44-
final HttpURLConnection connection = (HttpURLConnection) new URL(completeUrl).openConnection();
45-
connection.setInstanceFollowRedirects(httpClientConfig.isFollowRedirects());
46-
connection.setRequestMethod(httpVerb.name());
47-
if (httpClientConfig.getConnectTimeout() != null) {
48-
connection.setConnectTimeout(httpClientConfig.getConnectTimeout());
49-
}
50-
if (httpClientConfig.getReadTimeout() != null) {
51-
connection.setReadTimeout(httpClientConfig.getReadTimeout());
52-
}
53-
addHeaders(connection, headers, userAgent);
54-
if (httpVerb == Verb.POST || httpVerb == Verb.PUT || httpVerb == Verb.DELETE) {
55-
final File filePayload = request.getFilePayload();
56-
if (filePayload != null) {
57-
throw new UnsupportedOperationException("Sync Requests do not support File payload for the moment");
58-
} else if (request.getStringPayload() != null) {
59-
addBody(connection, request.getStringPayload().getBytes(request.getCharset()));
60-
} else {
61-
addBody(connection, request.getByteArrayPayload());
62-
}
63-
}
64-
65-
try {
66-
connection.connect();
67-
final int responseCode = connection.getResponseCode();
68-
return new Response(responseCode, connection.getResponseMessage(), parseHeaders(connection),
69-
responseCode >= 200 && responseCode < 400 ? connection.getInputStream()
70-
: connection.getErrorStream());
71-
} catch (UnknownHostException e) {
72-
throw new OAuthException("The IP address of a host could not be determined.", e);
73-
}
74-
}
75-
76-
private static Map<String, String> parseHeaders(HttpURLConnection conn) {
77-
final Map<String, String> headers = new HashMap<>();
78-
for (Map.Entry<String, List<String>> entry : conn.getHeaderFields().entrySet()) {
79-
final String key = entry.getKey();
80-
if ("Content-Encoding".equalsIgnoreCase(key)) {
81-
headers.put("Content-Encoding", entry.getValue().get(0));
82-
} else {
83-
headers.put(key, entry.getValue().get(0));
84-
}
85-
}
86-
return headers;
87-
}
88-
89-
private static void addHeaders(HttpURLConnection connection, Map<String, String> headers, String userAgent) {
90-
for (Map.Entry<String, String> entry : headers.entrySet()) {
91-
connection.setRequestProperty(entry.getKey(), entry.getValue());
92-
}
93-
if (userAgent != null) {
94-
connection.setRequestProperty(OAuthConstants.USER_AGENT_HEADER_NAME, userAgent);
95-
}
96-
}
97-
98-
private static void addBody(HttpURLConnection connection, byte[] content) throws IOException {
99-
connection.setRequestProperty(CONTENT_LENGTH, String.valueOf(content.length));
100-
101-
if (connection.getRequestProperty(CONTENT_TYPE) == null) {
102-
connection.setRequestProperty(CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
103-
}
104-
connection.setDoOutput(true);
105-
connection.getOutputStream().write(content);
106-
}
10720
}

scribejava-core/src/main/java/com/github/scribejava/core/oauth/OAuthService.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.github.scribejava.core.model.AbstractRequest;
55
import com.github.scribejava.core.httpclient.HttpClient;
66
import com.github.scribejava.core.httpclient.HttpClientConfig;
7+
import com.github.scribejava.core.httpclient.jdk.JDKHttpClient;
78
import com.github.scribejava.core.httpclient.jdk.JDKHttpClientConfig;
89
import com.github.scribejava.core.model.OAuthAsyncRequestCallback;
910
import com.github.scribejava.core.model.OAuthConfig;
@@ -35,7 +36,7 @@ public OAuthService(OAuthConfig config) {
3536
final HttpClient externalHttpClient = config.getHttpClient();
3637

3738
if (httpClientConfig == null && externalHttpClient == null) {
38-
httpClient = null;
39+
httpClient = new JDKHttpClient(JDKHttpClientConfig.defaultConfig());
3940
} else {
4041
httpClient = externalHttpClient == null ? getClient(httpClientConfig) : externalHttpClient;
4142
}
@@ -103,9 +104,9 @@ public Response execute(OAuthRequestAsync request) throws InterruptedException,
103104
}
104105

105106
public Response execute(OAuthRequest request) {
106-
final HttpClientConfig httpClientConfig = config.getHttpClientConfig();
107-
return request.send(config.getUserAgent(),
108-
httpClientConfig instanceof JDKHttpClientConfig ? (JDKHttpClientConfig) httpClientConfig
109-
: JDKHttpClientConfig.defaultConfig());
107+
final JDKHttpClient jdkHttpClient = httpClient instanceof JDKHttpClient ? (JDKHttpClient) httpClient
108+
: new JDKHttpClient(JDKHttpClientConfig.defaultConfig());
109+
110+
return jdkHttpClient.send(config.getUserAgent(), request);
110111
}
111112
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
com.github.scribejava.core.httpclient.jdk.JDKHttpProvider
2+

scribejava-httpclient-ahc/src/main/java/com/github/scribejava/httpclient/ahc/AhcHttpClient.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.github.scribejava.httpclient.ahc;
22

33
import com.github.scribejava.core.httpclient.AbstractAsyncOnlyHttpClient;
4-
import com.github.scribejava.core.model.AbstractRequest;
54
import com.github.scribejava.core.model.OAuthAsyncRequestCallback;
65
import com.github.scribejava.core.model.OAuthConstants;
76
import com.github.scribejava.core.model.OAuthRequestAsync;
@@ -13,7 +12,6 @@
1312
import java.util.Map;
1413
import java.util.concurrent.Future;
1514

16-
import static com.github.scribejava.core.model.AbstractRequest.DEFAULT_CONTENT_TYPE;
1715
import java.io.File;
1816
import org.asynchttpclient.AsyncHttpClientConfig;
1917
import org.asynchttpclient.BoundRequestBuilder;
@@ -82,8 +80,8 @@ private <T> Future<T> doExecuteAsync(String userAgent, Map<String, String> heade
8280
}
8381

8482
if (httpVerb == Verb.POST || httpVerb == Verb.PUT || httpVerb == Verb.DELETE) {
85-
if (!headers.containsKey(AbstractRequest.CONTENT_TYPE)) {
86-
boundRequestBuilder = boundRequestBuilder.addHeader(AbstractRequest.CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
83+
if (!headers.containsKey(CONTENT_TYPE)) {
84+
boundRequestBuilder = boundRequestBuilder.addHeader(CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
8785
}
8886
boundRequestBuilder = bodySetter.setBody(boundRequestBuilder, bodyContents);
8987
}

scribejava-httpclient-ning/src/main/java/com/github/scribejava/httpclient/ning/NingHttpClient.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.github.scribejava.httpclient.ning;
22

33
import com.github.scribejava.core.httpclient.AbstractAsyncOnlyHttpClient;
4-
import com.github.scribejava.core.model.AbstractRequest;
54
import com.github.scribejava.core.model.OAuthAsyncRequestCallback;
65
import com.github.scribejava.core.model.OAuthConstants;
76
import com.github.scribejava.core.model.OAuthRequestAsync;
@@ -11,7 +10,6 @@
1110
import java.util.Map;
1211
import java.util.concurrent.Future;
1312

14-
import static com.github.scribejava.core.model.AbstractRequest.DEFAULT_CONTENT_TYPE;
1513
import com.ning.http.client.AsyncHttpClientConfig;
1614
import java.io.File;
1715

@@ -90,8 +88,8 @@ private <T> Future<T> doExecuteAsync(String userAgent, Map<String, String> heade
9088
}
9189

9290
if (httpVerb == Verb.POST || httpVerb == Verb.PUT || httpVerb == Verb.DELETE) {
93-
if (!headers.containsKey(AbstractRequest.CONTENT_TYPE)) {
94-
boundRequestBuilder = boundRequestBuilder.addHeader(AbstractRequest.CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
91+
if (!headers.containsKey(CONTENT_TYPE)) {
92+
boundRequestBuilder = boundRequestBuilder.addHeader(CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
9593
}
9694
boundRequestBuilder = bodySetter.setBody(boundRequestBuilder, bodyContents);
9795
}

scribejava-httpclient-okhttp/src/main/java/com/github/scribejava/httpclient/okhttp/OkHttpHttpClient.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.github.scribejava.httpclient.okhttp;
22

3-
import com.github.scribejava.core.model.AbstractRequest;
43
import com.github.scribejava.core.httpclient.HttpClient;
54
import com.github.scribejava.core.model.OAuthAsyncRequestCallback;
65
import com.github.scribejava.core.model.OAuthConstants;
@@ -17,7 +16,6 @@
1716
import java.util.Map;
1817
import java.util.concurrent.Future;
1918

20-
import static com.github.scribejava.core.model.AbstractRequest.DEFAULT_CONTENT_TYPE;
2119
import com.github.scribejava.core.model.Response;
2220
import java.io.File;
2321
import java.util.HashMap;
@@ -117,8 +115,8 @@ private Call createCall(String userAgent, Map<String, String> headers, Verb http
117115
// prepare body
118116
final RequestBody body;
119117
if (bodyContents != null && HttpMethod.permitsRequestBody(method)) {
120-
final MediaType mediaType = headers.containsKey(AbstractRequest.CONTENT_TYPE)
121-
? MediaType.parse(headers.get(AbstractRequest.CONTENT_TYPE)) : DEFAULT_CONTENT_TYPE_MEDIA_TYPE;
118+
final MediaType mediaType = headers.containsKey(CONTENT_TYPE) ? MediaType.parse(headers.get(CONTENT_TYPE))
119+
: DEFAULT_CONTENT_TYPE_MEDIA_TYPE;
122120

123121
body = bodyType.createBody(mediaType, bodyContents);
124122
} else {

0 commit comments

Comments
 (0)