Skip to content

Commit 6e68f8d

Browse files
atptroJacksonTian
authored andcommitted
add http header : User-Agnet
1 parent c22a57b commit 6e68f8d

File tree

9 files changed

+183
-14
lines changed

9 files changed

+183
-14
lines changed

aliyun-java-sdk-core/pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,17 @@
116116
</dependencies>
117117

118118
<build>
119+
<resources>
120+
<resource>
121+
<directory>src/main/resources</directory>
122+
<filtering>true</filtering>
123+
<includes>
124+
<include>project.properties</include>
125+
<include>endpoints.json</include>
126+
<include>regions.txt</include>
127+
</includes>
128+
</resource>
129+
</resources>
119130
<sourceDirectory>src/main/java</sourceDirectory>
120131
<plugins>
121132
<plugin>

aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsRequest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.aliyuncs.http.FormatType;
55
import com.aliyuncs.http.HttpRequest;
66
import com.aliyuncs.http.ProtocolType;
7+
import com.aliyuncs.http.UserAgentConfig;
78
import com.aliyuncs.regions.ProductDomain;
89

910
import java.io.UnsupportedEncodingException;
@@ -20,6 +21,7 @@ public abstract class AcsRequest<T extends AcsResponse> extends HttpRequest {
2021
private final Map<String, String> queryParameters = new HashMap<String, String>();
2122
private final Map<String, String> domainParameters = new HashMap<String, String>();
2223
private final Map<String, String> bodyParameters = new HashMap<String, String>();
24+
private UserAgentConfig userAgentConfig;
2325
protected ISignatureComposer composer = null;
2426
private String version = null;
2527
private String product = null;
@@ -316,4 +318,14 @@ public void setSysProductDomain(ProductDomain productDomain) {
316318
this.productDomain = productDomain;
317319
}
318320

321+
public UserAgentConfig getSysUserAgentConfig() {
322+
return userAgentConfig;
323+
}
324+
325+
public void appendUserAgent(String key, String value) {
326+
if (this.userAgentConfig == null) {
327+
this.userAgentConfig = new UserAgentConfig();
328+
}
329+
this.userAgentConfig.append(key, value);
330+
}
319331
}

aliyun-java-sdk-core/src/main/java/com/aliyuncs/DefaultAcsClient.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,7 @@
2222
import com.aliyuncs.exceptions.ErrorCodeConstant;
2323
import com.aliyuncs.exceptions.ErrorMessageConstant;
2424
import com.aliyuncs.exceptions.ServerException;
25-
import com.aliyuncs.http.FormatType;
26-
import com.aliyuncs.http.HttpClientFactory;
27-
import com.aliyuncs.http.HttpRequest;
28-
import com.aliyuncs.http.HttpResponse;
29-
import com.aliyuncs.http.IHttpClient;
25+
import com.aliyuncs.http.*;
3026
import com.aliyuncs.profile.DefaultProfile;
3127
import com.aliyuncs.profile.IClientProfile;
3228
import com.aliyuncs.reader.Reader;
@@ -48,6 +44,7 @@ public class DefaultAcsClient implements IAcsClient {
4844
private IHttpClient httpClient;
4945
private EndpointResolver endpointResolver;
5046
private static final String SIGNATURE_BEGIN = "string to sign is:";
47+
private final UserAgentConfig userAgentConfig = new UserAgentConfig();
5148

5249
@Deprecated
5350
public DefaultAcsClient() {
@@ -69,6 +66,7 @@ public DefaultAcsClient(IClientProfile profile, AlibabaCloudCredentialsProvider
6966
this.clientProfile.setCredentialsProvider(this.credentialsProvider);
7067
this.httpClient = HttpClientFactory.buildClient(this.clientProfile);
7168
this.endpointResolver = new DefaultEndpointResolver(this, profile);
69+
this.appendUserAgent("Client", this.httpClient.getClass().getSimpleName());
7270
}
7371

7472
@Override
@@ -242,7 +240,8 @@ private <T extends AcsResponse> HttpResponse doAction(AcsRequest<T> request, boo
242240
if (request.getSysProtocol() == null) {
243241
request.setSysProtocol(this.clientProfile.getHttpClientConfig().getProtocolType());
244242
}
245-
243+
request.putHeaderParameter("User-Agent",
244+
UserAgentConfig.resolve(request.getSysUserAgentConfig(), this.userAgentConfig));
246245
try {
247246
HttpRequest httpRequest = request.signRequest(signer, credentials, format, domain);
248247
HttpResponse response;
@@ -365,4 +364,11 @@ public DefaultProfile getProfile() {
365364
return (DefaultProfile) clientProfile;
366365
}
367366

367+
public void appendUserAgent(String key, String value) {
368+
this.userAgentConfig.append(key, value);
369+
}
370+
371+
public UserAgentConfig getUserAgentConfig() {
372+
return userAgentConfig;
373+
}
368374
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.aliyuncs.http;
2+
3+
import com.aliyuncs.utils.StringUtils;
4+
5+
import java.io.IOException;
6+
import java.util.*;
7+
8+
public class UserAgentConfig {
9+
10+
static {
11+
Properties props = System.getProperties();
12+
try {
13+
props.load(ClassLoader.getSystemResourceAsStream("project.properties"));
14+
} catch (IOException e) {
15+
props.setProperty("project.version","(got version failed)");
16+
props.setProperty("project.name","aliyun-java-sdk-core");
17+
}
18+
DEFAULT_MESSAGE = String.format("AlibabaCloud (%s; %s) Java/%s %s/%s",
19+
props.getProperty("os.name"), props.getProperty("os.arch"), props.getProperty("java.runtime.version"),
20+
props.getProperty("project.name"), props.getProperty("project.version"));
21+
}
22+
23+
private static String DEFAULT_MESSAGE;
24+
private List<String> excludeList = new ArrayList<String>();
25+
private final Map<String, String> userAgents = new LinkedHashMap<String, String>();
26+
27+
public UserAgentConfig() {
28+
excludeList.add("java");
29+
excludeList.add("aliyun-java-sdk-core");
30+
}
31+
public static String getDefaultMessage(){
32+
return DEFAULT_MESSAGE;
33+
}
34+
public void append(String key, String value) {
35+
if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
36+
return;
37+
}
38+
if (excludeList.contains(key.toLowerCase())){
39+
return;
40+
}
41+
this.userAgents.put(key, value);
42+
}
43+
44+
public Map<String, String> getSysUserAgentsMap() {
45+
return Collections.unmodifiableMap(this.userAgents);
46+
}
47+
48+
public static String resolve(UserAgentConfig requestConfig, UserAgentConfig clientConfig) {
49+
Map<String, String> finalMap = new LinkedHashMap<String, String>();
50+
if (clientConfig != null && clientConfig.getSysUserAgentsMap().size() > 0) {
51+
finalMap.putAll(clientConfig.getSysUserAgentsMap());
52+
}
53+
if (requestConfig != null && requestConfig.getSysUserAgentsMap().size() > 0) {
54+
finalMap.putAll(requestConfig.getSysUserAgentsMap());
55+
}
56+
StringBuilder agents = new StringBuilder(DEFAULT_MESSAGE);
57+
for (Map.Entry<String, String> entry : finalMap.entrySet()) {
58+
agents.append(" ");
59+
agents.append(entry.getKey());
60+
agents.append("/");
61+
agents.append(entry.getValue());
62+
}
63+
return agents.toString();
64+
}
65+
}

aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/StringUtils.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,4 @@ public class StringUtils {
55
public static boolean isEmpty(final CharSequence cs) {
66
return cs == null || cs.length() == 0;
77
}
8-
98
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
project.version=${project.version}
2+
project.name=${project.name}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.aliyuncs.auth.Signer;
77
import com.aliyuncs.http.FormatType;
88
import com.aliyuncs.http.ProtocolType;
9+
import com.aliyuncs.http.UserAgentConfig;
910
import com.aliyuncs.regions.ProductDomain;
1011
import org.junit.Assert;
1112
import org.junit.Test;
@@ -28,6 +29,17 @@ public void acsRequestTest() {
2829
Assert.assertEquals("normal", acsRequest.getHeaderValue("x-sdk-invoke-type"));
2930
}
3031

32+
@Test
33+
public void acsRequestUserConfigTest() {
34+
CommonRpcRequest acsRequest = new CommonRpcRequest("test");
35+
acsRequest.appendUserAgent("test", "1.2.2");
36+
acsRequest.appendUserAgent("user", "1.2.2");
37+
acsRequest.appendUserAgent("user", "1.3.3");
38+
String agent = UserAgentConfig.resolve(acsRequest.getSysUserAgentConfig(), null);
39+
String resultStr = UserAgentConfig.getDefaultMessage() + " test/1.2.2 user/1.3.3";
40+
Assert.assertEquals(resultStr, agent);
41+
}
42+
3143
@Test
3244
public void acsRequestGetSetTest() throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
3345
CommonRpcRequest acsRequest = new CommonRpcRequest("test", "test", "test",

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.security.InvalidKeyException;
77
import java.security.NoSuchAlgorithmException;
88

9+
import com.aliyuncs.http.*;
910
import org.junit.Assert;
1011
import org.junit.Rule;
1112
import org.junit.Test;
@@ -25,13 +26,6 @@
2526
import com.aliyuncs.exceptions.ErrorCodeConstant;
2627
import com.aliyuncs.exceptions.ErrorMessageConstant;
2728
import com.aliyuncs.exceptions.ServerException;
28-
import com.aliyuncs.http.FormatType;
29-
import com.aliyuncs.http.HttpClientConfig;
30-
import com.aliyuncs.http.HttpClientFactory;
31-
import com.aliyuncs.http.HttpRequest;
32-
import com.aliyuncs.http.HttpResponse;
33-
import com.aliyuncs.http.IHttpClient;
34-
import com.aliyuncs.http.ProtocolType;
3529
import com.aliyuncs.http.clients.CompatibleUrlConnClient;
3630
import com.aliyuncs.profile.DefaultProfile;
3731
import com.aliyuncs.regions.ProductDomain;
@@ -606,4 +600,19 @@ public void testResponseStringContentNull() throws ClientException {
606600
thrown.expectMessage(" : ");
607601
spyClient.getAcsResponse(request);
608602
}
603+
604+
@Test
605+
public void userAgentConfigTest() {
606+
Credential credential = Mockito.mock(Credential.class);
607+
Mockito.when(credential.getSecurityToken()).thenReturn(null);
608+
DefaultProfile profile = Mockito.mock(DefaultProfile.class);
609+
Mockito.when(profile.getCredential()).thenReturn(credential);
610+
DefaultAcsClient client = new DefaultAcsClient(profile);
611+
client.appendUserAgent("test", "1.2.2");
612+
client.appendUserAgent("test", "1.2.3");
613+
client.appendUserAgent("order", "1.2.2");
614+
String userAgent = UserAgentConfig.resolve(null, client.getUserAgentConfig());
615+
String resultStr = UserAgentConfig.getDefaultMessage() + " Client/CompatibleUrlConnClient test/1.2.3 order/1.2.2";
616+
Assert.assertEquals(resultStr, userAgent);
617+
}
609618
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.aliyuncs.http;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
import java.util.Map;
7+
8+
public class UserAgentConfigTest {
9+
10+
@Test
11+
public void appendGetTest() {
12+
UserAgentConfig userAgentConfig = new UserAgentConfig();
13+
userAgentConfig.append("Test", "1.2.2");
14+
userAgentConfig.append("Test", null);
15+
userAgentConfig.append("Test", "");
16+
userAgentConfig.append("", "1.2.2");
17+
userAgentConfig.append(null, "1.2.2");
18+
Map<String, String> map = userAgentConfig.getSysUserAgentsMap();
19+
Assert.assertEquals("1.2.2", map.get("Test"));
20+
Assert.assertNull(map.get(null));
21+
Assert.assertNull(map.get(""));
22+
}
23+
24+
@Test
25+
public void resolveTest() {
26+
UserAgentConfig userAgentConfig = new UserAgentConfig();
27+
String agent = UserAgentConfig.resolve(userAgentConfig, null);
28+
Assert.assertEquals(UserAgentConfig.getDefaultMessage(), agent);
29+
30+
agent = UserAgentConfig.resolve(null, userAgentConfig);
31+
Assert.assertEquals(UserAgentConfig.getDefaultMessage(), agent);
32+
33+
userAgentConfig.append("test", "8.8.8");
34+
userAgentConfig.append("Java", "8");
35+
String reaultStr = UserAgentConfig.getDefaultMessage() + " test/8.8.8";
36+
37+
agent = UserAgentConfig.resolve(null, userAgentConfig);
38+
Assert.assertEquals(reaultStr, agent);
39+
40+
agent = UserAgentConfig.resolve(userAgentConfig, null);
41+
Assert.assertEquals(reaultStr, agent);
42+
43+
agent = UserAgentConfig.resolve(null, null);
44+
Assert.assertEquals(UserAgentConfig.getDefaultMessage(), agent);
45+
46+
UserAgentConfig requestUserAgentConfig = new UserAgentConfig();
47+
requestUserAgentConfig.append("requestUserAgentConfig", "8.8.8");
48+
requestUserAgentConfig.append("test", "6.6.6");
49+
reaultStr = UserAgentConfig.getDefaultMessage()+" test/6.6.6 requestUserAgentConfig/8.8.8";
50+
agent = UserAgentConfig.resolve(requestUserAgentConfig, userAgentConfig);
51+
Assert.assertEquals(reaultStr, agent);
52+
}
53+
}

0 commit comments

Comments
 (0)