Skip to content

Commit 5b879e4

Browse files
committed
Switch default http client to ApacheHttpClient
1 parent a5ba1e7 commit 5b879e4

File tree

15 files changed

+195
-80
lines changed

15 files changed

+195
-80
lines changed

aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public class HttpClientConfig {
6565

6666
public static HttpClientConfig getDefault() {
6767
HttpClientConfig config = new HttpClientConfig();
68-
config.setClientType(HttpClientType.Compatible);
68+
config.setClientType(HttpClientType.ApacheHttpClient);
6969
return config;
7070
}
7171

aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpMessage.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ public void setHttpContent(byte[] content, String encoding, FormatType format) {
8080
this.encoding = null;
8181
return;
8282
}
83+
84+
// for GET HEADER DELETE OPTION method, sdk should ignore the content
85+
if(getSysMethod() != null && !getSysMethod().hasContent()){
86+
content = new byte[0];
87+
}
88+
8389
this.httpContent = content;
8490
this.encoding = encoding;
8591
String contentLen = String.valueOf(content.length);

aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static String debugHttpRequest(HttpRequest request) throws ClientExceptio
5858

5959
public static String debugHttpResponse(HttpResponse response) throws ClientException {
6060
if (isHttpDebug) {
61-
String protocol = response.getSysUrl().split("://")[0].toUpperCase() + "/1.1";
61+
String protocol = "HTTP/1.1";
6262
StringBuilder debugString = new StringBuilder("< " + protocol + " " + response.getStatus() + "\n< ");
6363
Map<String, String> responseHeaders = response.getSysHeaders();
6464
for (Entry<String, String> entry : responseHeaders.entrySet()) {

aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/ApacheHttpClient.java

Lines changed: 44 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,9 @@
11
package com.aliyuncs.http.clients;
22

3-
import java.io.IOException;
4-
import java.security.KeyManagementException;
5-
import java.security.NoSuchAlgorithmException;
6-
import java.security.cert.CertificateException;
7-
import java.security.cert.X509Certificate;
8-
import java.util.Map;
9-
import java.util.concurrent.Callable;
10-
import java.util.concurrent.ExecutorService;
11-
import java.util.concurrent.Future;
12-
import java.util.concurrent.SynchronousQueue;
13-
import java.util.concurrent.ThreadFactory;
14-
import java.util.concurrent.ThreadPoolExecutor;
15-
import java.util.concurrent.TimeUnit;
16-
import java.util.concurrent.atomic.AtomicInteger;
17-
18-
import javax.net.ssl.SSLContext;
19-
3+
import com.aliyuncs.exceptions.ClientException;
4+
import com.aliyuncs.http.*;
5+
import com.aliyuncs.utils.IOUtils;
6+
import com.aliyuncs.utils.StringUtils;
207
import org.apache.http.Header;
218
import org.apache.http.HttpResponse;
229
import org.apache.http.client.config.RequestConfig;
@@ -41,14 +28,15 @@
4128
import org.apache.http.ssl.TrustStrategy;
4229
import org.apache.http.util.EntityUtils;
4330

44-
import com.aliyuncs.exceptions.ClientException;
45-
import com.aliyuncs.http.CallBack;
46-
import com.aliyuncs.http.FormatType;
47-
import com.aliyuncs.http.HttpClientConfig;
48-
import com.aliyuncs.http.HttpRequest;
49-
import com.aliyuncs.http.IHttpClient;
50-
import com.aliyuncs.utils.IOUtils;
51-
import com.aliyuncs.utils.StringUtils;
31+
import javax.net.ssl.SSLContext;
32+
import java.io.IOException;
33+
import java.security.KeyManagementException;
34+
import java.security.NoSuchAlgorithmException;
35+
import java.security.cert.CertificateException;
36+
import java.security.cert.X509Certificate;
37+
import java.util.Map;
38+
import java.util.concurrent.*;
39+
import java.util.concurrent.atomic.AtomicInteger;
5240

5341
public class ApacheHttpClient extends IHttpClient {
5442

@@ -81,28 +69,36 @@ protected void init(final HttpClientConfig config) throws ClientException {
8169
.setConnectionRequestTimeout((int) config.getWriteTimeoutMillis()).build();
8270
builder.setDefaultRequestConfig(defaultConfig);
8371

84-
// https
72+
// http
8573
RegistryBuilder<ConnectionSocketFactory> socketFactoryRegistryBuilder = RegistryBuilder.create();
8674
socketFactoryRegistryBuilder.register("http", new PlainConnectionSocketFactory());
87-
if (config.isIgnoreSSLCerts()) {
88-
try {
89-
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
90-
// trust all
91-
@Override
92-
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
93-
return true;
94-
}
95-
}).build();
9675

97-
SSLConnectionSocketFactory connectionFactory = new SSLConnectionSocketFactory(sslContext,
98-
NoopHostnameVerifier.INSTANCE);
76+
// https
77+
// register default https connector(ignore untrusted cert)
9978

100-
socketFactoryRegistryBuilder.register("https", connectionFactory);
79+
// SSLContext sc = SSLContext.getInstance("SSL");
80+
// sc.init(null, new TrustManager[]{trustAll}, new java.security.SecureRandom());
81+
//
82+
try {
83+
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
84+
// trust all
85+
@Override
86+
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
87+
return true;
88+
}
89+
}).build();
10190

102-
} catch (Exception e) {
103-
throw new ClientException("SDK.InitFailed", "Init https with SSL certs ignore failed", e);
104-
}
105-
} else {
91+
SSLConnectionSocketFactory connectionFactory = new SSLConnectionSocketFactory(sslContext,
92+
NoopHostnameVerifier.INSTANCE);
93+
94+
socketFactoryRegistryBuilder.register("https", connectionFactory);
95+
96+
} catch (Exception e) {
97+
throw new ClientException("SDK.InitFailed", "Init https with SSL certs ignore failed", e);
98+
}
99+
100+
// override default https connector if possible
101+
if (!config.isIgnoreSSLCerts()) {
106102
if (config.getSslSocketFactory() != null) {
107103
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(config
108104
.getSslSocketFactory(), config.getHostnameVerifier());
@@ -122,6 +118,7 @@ public boolean isTrusted(X509Certificate[] chain, String authType) throws Certif
122118
}
123119
}
124120

121+
125122
// connPool
126123
connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistryBuilder.build());
127124
connectionManager.setMaxTotal(config.getMaxRequests());
@@ -167,9 +164,8 @@ private HttpUriRequest parseToHttpRequest(HttpRequest apiReq) throws IOException
167164
String contentType = apiReq.getHeaderValue(CONTENT_TYPE);
168165
if (StringUtils.isEmpty(contentType)) {
169166
contentType = apiReq.getContentTypeValue(apiReq.getHttpContentType(), apiReq.getSysEncoding());
170-
} else {
171-
bodyBuilder.setContentType(ContentType.parse(contentType));
172167
}
168+
bodyBuilder.setContentType(ContentType.parse(contentType));
173169
bodyBuilder.setBinary(apiReq.getHttpContent());
174170
builder.setEntity(bodyBuilder.build());
175171
}
@@ -183,6 +179,7 @@ private HttpUriRequest parseToHttpRequest(HttpRequest apiReq) throws IOException
183179
builder.addHeader(entry.getKey(), entry.getValue());
184180
}
185181

182+
186183
return builder.build();
187184
}
188185

@@ -191,8 +188,8 @@ private com.aliyuncs.http.HttpResponse parseToHttpResponse(HttpResponse httpResp
191188

192189
// status code
193190
result.setStatus(httpResponse.getStatusLine().getStatusCode());
194-
195-
if (httpResponse.getEntity() != null) {
191+
if ((httpResponse.getEntity() != null &&
192+
(httpResponse.getEntity().getContentLength() > 0 || httpResponse.getEntity().isChunked()))) {
196193
// content type
197194
Header contentTypeHeader = httpResponse.getEntity().getContentType();
198195
ContentType contentType = ContentType.parse(contentTypeHeader.getValue());
@@ -206,13 +203,6 @@ private com.aliyuncs.http.HttpResponse parseToHttpResponse(HttpResponse httpResp
206203

207204
// body
208205
result.setHttpContent(EntityUtils.toByteArray(httpResponse.getEntity()), charset, formatType);
209-
} else {
210-
Header contentTypeHeader = httpResponse.getFirstHeader("Content-Type");
211-
if (contentTypeHeader != null) {
212-
ContentType contentType = ContentType.parse(contentTypeHeader.getValue());
213-
FormatType formatType = FormatType.mapAcceptToFormat(contentType.getMimeType());
214-
result.setHttpContentType(formatType);
215-
}
216206
}
217207

218208
// headers
@@ -237,7 +227,7 @@ public final com.aliyuncs.http.HttpResponse syncInvoke(HttpRequest apiRequest) t
237227

238228
@Override
239229
public final Future<com.aliyuncs.http.HttpResponse> asyncInvoke(final HttpRequest apiRequest,
240-
final CallBack callback) {
230+
final CallBack callback) {
241231
return executorService.submit(new Callable<com.aliyuncs.http.HttpResponse>() {
242232
@Override
243233
public com.aliyuncs.http.HttpResponse call() throws Exception {

aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/CompatibleUrlConnClient.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,22 @@ protected void init(HttpClientConfig clientConfig) throws ClientException {
4646

4747
@Override
4848
public HttpResponse syncInvoke(HttpRequest request) throws IOException {
49-
OutputStream out = null;
5049
InputStream content = null;
5150
HttpResponse response = null;
5251
HttpURLConnection httpConn = buildHttpConnection(request);
52+
OutputStream out = null;
5353

5454
try {
5555
httpConn.connect();
5656
if (null != request.getHttpContent() && request.getHttpContent().length > 0) {
5757
out = httpConn.getOutputStream();
58-
out.write(request.getHttpContent());
58+
if(request.getSysMethod().hasContent()){
59+
out.write(request.getHttpContent());
60+
}
61+
out.flush();
62+
5963
}
64+
6065
content = httpConn.getInputStream();
6166
response = new HttpResponse(httpConn.getURL().toString());
6267
parseHttpConn(response, httpConn, content);

aliyun-java-sdk-core/src/test/java/com/aliyuncs/DefaultAcsClientTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.mockito.BDDMockito;
1717
import org.mockito.Mockito;
1818
import org.powermock.api.mockito.PowerMockito;
19+
import org.powermock.core.classloader.annotations.PowerMockIgnore;
1920
import org.powermock.core.classloader.annotations.PrepareForTest;
2021
import org.powermock.modules.junit4.PowerMockRunner;
2122

@@ -40,7 +41,7 @@
4041
import com.aliyuncs.http.clients.CompatibleUrlConnClient;
4142
import com.aliyuncs.profile.DefaultProfile;
4243
import com.aliyuncs.regions.ProductDomain;
43-
44+
@PowerMockIgnore("javax.net.ssl.*")
4445
@RunWith(PowerMockRunner.class)
4546
@PrepareForTest(HttpUtil.class)
4647
public class DefaultAcsClientTest {
@@ -651,7 +652,7 @@ public void userAgentConfigTest() {
651652
client.appendUserAgent("order", "1.2.2");
652653
String userAgent = UserAgentConfig.resolve(null, client.getUserAgentConfig());
653654
String resultStr = UserAgentConfig.getDefaultMessage()
654-
+ " Client/CompatibleUrlConnClient test/1.2.3 order/1.2.2";
655+
+ " Client/ApacheHttpClient test/1.2.3 order/1.2.2";
655656
Assert.assertEquals(resultStr, userAgent);
656657
}
657658
}

aliyun-java-sdk-core/src/test/java/com/aliyuncs/auth/OssSignatureComposerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
import org.junit.Assert;
66
import org.junit.Test;
77
import org.junit.runner.RunWith;
8+
import org.powermock.core.classloader.annotations.PowerMockIgnore;
89
import org.powermock.core.classloader.annotations.PrepareForTest;
910
import org.powermock.modules.junit4.PowerMockRunner;
1011

1112
import java.util.HashMap;
1213
import java.util.Map;
1314

1415
import static org.mockito.Mockito.mock;
15-
16+
@PowerMockIgnore("javax.net.ssl.*")
1617
@RunWith(PowerMockRunner.class)
1718
@PrepareForTest(FormatType.class)
1819
public class OssSignatureComposerTest {

aliyun-java-sdk-core/src/test/java/com/aliyuncs/http/HttpClientFactoryTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static com.aliyuncs.http.HttpClientFactory.HTTP_CLIENT_IMPL_KEY;
44

5+
import com.aliyuncs.http.clients.ApacheHttpClient;
56
import org.junit.Assert;
67
import org.junit.Test;
78

@@ -50,7 +51,7 @@ public void buildClientTest() {
5051

5152
profile.setHttpClientConfig(null);
5253
client = HttpClientFactory.buildClient(profile);
53-
Assert.assertTrue(client instanceof CompatibleUrlConnClient);
54+
Assert.assertTrue(client instanceof ApacheHttpClient);
5455

5556
try {
5657
System.setProperty(HTTP_CLIENT_IMPL_KEY, "com.aliyuncs.http.HttpClientFactory");

aliyun-java-sdk-core/src/test/java/com/aliyuncs/http/HttpMessageTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.aliyuncs.http;
22

33
import com.aliyuncs.exceptions.ClientException;
4+
import org.apache.http.entity.ContentType;
45
import org.junit.Assert;
56
import org.junit.Test;
67

78
import java.util.Map;
89

10+
import static com.aliyuncs.http.HttpMessage.CONTENT_TYPE;
11+
912
public class HttpMessageTest {
1013

1114
@Test
@@ -67,4 +70,34 @@ public void setGetTest() throws ClientException {
6770
request.setHttpContent(null, null, null);
6871
Assert.assertEquals("", request.getHttpContentString());
6972
}
73+
74+
@Test
75+
public void setHttpContentWillNullTest() throws ClientException {
76+
HttpRequest request = new HttpRequest("test");
77+
request.setSysMethod(MethodType.PUT);
78+
79+
request.setHttpContent(null, null, null);
80+
Assert.assertEquals(null, request.getHeaderValue(HttpMessage.CONTENT_MD5));
81+
}
82+
83+
@Test
84+
public void setHttpContentWillGETTest() throws ClientException {
85+
HttpRequest request = new HttpRequest("test");
86+
request.setSysMethod(MethodType.GET);
87+
88+
request.setHttpContent("content".getBytes(), null, null);
89+
// md5 of empty string
90+
Assert.assertEquals("1B2M2Y8AsgTpgAmY7PhCfg==", request.getHeaderValue(HttpMessage.CONTENT_MD5));
91+
}
92+
93+
@Test
94+
public void setHttpContentWillPOSTTest() throws ClientException {
95+
HttpRequest request = new HttpRequest("test");
96+
request.setSysMethod(MethodType.POST);
97+
98+
request.setHttpContent("content".getBytes(), null, FormatType.XML);
99+
// md5 of "content"
100+
Assert.assertEquals("mgNkuembtIDdJeHwKEyFVQ==", request.getHeaderValue(HttpMessage.CONTENT_MD5));
101+
Assert.assertEquals("application/xml",request.getHeaderValue(CONTENT_TYPE));
102+
}
70103
}

aliyun-java-sdk-core/src/test/java/com/aliyuncs/http/clients/ApacheIdleConnectionCleanerTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@
1010

1111
import org.apache.http.conn.HttpClientConnectionManager;
1212
import org.junit.Assert;
13+
import org.junit.Before;
1314
import org.junit.Test;
1415
import org.mockito.invocation.InvocationOnMock;
1516
import org.mockito.stubbing.Answer;
1617

1718
public class ApacheIdleConnectionCleanerTest {
1819

20+
@Before
21+
public void init(){
22+
ApacheIdleConnectionCleaner.shutdown();
23+
}
24+
1925
@Test
2026
public void getSetTest() {
2127
ApacheIdleConnectionCleaner.setPeriodSec(1);

0 commit comments

Comments
 (0)