Skip to content

Commit eaefb2e

Browse files
authored
Avoid null in User-Agent header (#1483)
* Avoid null in User-Agent header * Rename variable * Check prefix in test
1 parent 653473c commit eaefb2e

File tree

3 files changed

+146
-10
lines changed

3 files changed

+146
-10
lines changed

src/main/java/com/adyen/Config.java

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ public void setUsername(String username) {
4242
this.username = username;
4343
}
4444

45+
public Config username(String username) {
46+
this.username = username;
47+
return this;
48+
}
49+
4550
public String getPassword() {
4651
return password;
4752
}
@@ -50,6 +55,11 @@ public void setPassword(String password) {
5055
this.password = password;
5156
}
5257

58+
public Config password(String password) {
59+
this.password = password;
60+
return this;
61+
}
62+
5363
public Environment getEnvironment() {
5464
return environment;
5565
}
@@ -58,6 +68,11 @@ public void setEnvironment(Environment environment) {
5868
this.environment = environment;
5969
}
6070

71+
public Config environment(Environment environment) {
72+
this.environment = environment;
73+
return this;
74+
}
75+
6176
public String getApplicationName() {
6277
return applicationName;
6378
}
@@ -66,6 +81,11 @@ public void setApplicationName(String applicationName) {
6681
this.applicationName = applicationName;
6782
}
6883

84+
public Config applicationName(String applicationName) {
85+
this.applicationName = applicationName;
86+
return this;
87+
}
88+
6989
public String getApiKey() {
7090
return apiKey;
7191
}
@@ -74,6 +94,11 @@ public void setApiKey(String apiKey) {
7494
this.apiKey = apiKey;
7595
}
7696

97+
public Config apiKey(String apiKey) {
98+
this.apiKey = apiKey;
99+
return this;
100+
}
101+
77102
public String getTerminalApiCloudEndpoint() {
78103
return terminalApiCloudEndpoint;
79104
}
@@ -82,6 +107,11 @@ public void setTerminalApiCloudEndpoint(String terminalApiCloudEndpoint) {
82107
this.terminalApiCloudEndpoint = terminalApiCloudEndpoint;
83108
}
84109

110+
public Config terminalApiCloudEndpoint(String terminalApiCloudEndpoint) {
111+
this.terminalApiCloudEndpoint = terminalApiCloudEndpoint;
112+
return this;
113+
}
114+
85115
public String getTerminalApiLocalEndpoint() {
86116
return terminalApiLocalEndpoint;
87117
}
@@ -90,6 +120,11 @@ public void setTerminalApiLocalEndpoint(String terminalApiLocalEndpoint) {
90120
this.terminalApiLocalEndpoint = terminalApiLocalEndpoint;
91121
}
92122

123+
public Config terminalApiLocalEndpoint(String terminalApiLocalEndpoint) {
124+
this.terminalApiLocalEndpoint = terminalApiLocalEndpoint;
125+
return this;
126+
}
127+
93128
public Region getTerminalApiRegion() {
94129
return terminalApiRegion;
95130
}
@@ -98,6 +133,11 @@ public void setTerminalApiRegion(Region terminalApiRegion) {
98133
this.terminalApiRegion = terminalApiRegion;
99134
}
100135

136+
public Config terminalApiRegion(Region terminalApiRegion) {
137+
this.terminalApiRegion = terminalApiRegion;
138+
return this;
139+
}
140+
101141
public int getConnectionTimeoutMillis() {
102142
return connectionTimeoutMillis;
103143
}
@@ -106,6 +146,11 @@ public void setConnectionTimeoutMillis(int connectionTimeoutMillis) {
106146
this.connectionTimeoutMillis = connectionTimeoutMillis;
107147
}
108148

149+
public Config connectionTimeoutMillis(int connectionTimeoutMillis) {
150+
this.connectionTimeoutMillis = connectionTimeoutMillis;
151+
return this;
152+
}
153+
109154
public int getReadTimeoutMillis() {
110155
return readTimeoutMillis;
111156
}
@@ -114,6 +159,11 @@ public void setReadTimeoutMillis(int readTimeoutMillis) {
114159
this.readTimeoutMillis = readTimeoutMillis;
115160
}
116161

162+
public Config readTimeoutMillis(int readTimeoutMillis) {
163+
this.readTimeoutMillis = readTimeoutMillis;
164+
return this;
165+
}
166+
117167
public int getDefaultKeepAliveMillis() {
118168
return defaultKeepAliveMillis;
119169
}
@@ -122,6 +172,11 @@ public void setDefaultKeepAliveMillis(int defaultKeepAliveMillis) {
122172
this.defaultKeepAliveMillis = defaultKeepAliveMillis;
123173
}
124174

175+
public Config defaultKeepAliveMillis(int defaultKeepAliveMillis) {
176+
this.defaultKeepAliveMillis = defaultKeepAliveMillis;
177+
return this;
178+
}
179+
125180
public int getConnectionRequestTimeoutMillis() {
126181
return connectionRequestTimeoutMillis;
127182
}
@@ -130,6 +185,11 @@ public void setConnectionRequestTimeoutMillis(int connectionRequestTimeoutMillis
130185
this.connectionRequestTimeoutMillis = connectionRequestTimeoutMillis;
131186
}
132187

188+
public Config connectionRequestTimeoutMillis(int connectionRequestTimeoutMillis) {
189+
this.connectionRequestTimeoutMillis = connectionRequestTimeoutMillis;
190+
return this;
191+
}
192+
133193
public Boolean getProtocolUpgradeEnabled() {
134194
return protocolUpgradeEnabled;
135195
}
@@ -142,13 +202,24 @@ public void setProtocolUpgradeEnabled(Boolean protocolUpgradeEnabled) {
142202
this.protocolUpgradeEnabled = protocolUpgradeEnabled;
143203
}
144204

205+
public Config protocolUpgradeEnabled(Boolean protocolUpgradeEnabled) {
206+
this.protocolUpgradeEnabled = protocolUpgradeEnabled;
207+
return this;
208+
}
209+
145210
public String getLiveEndpointUrlPrefix() {
146211
return this.liveEndpointUrlPrefix;
147212
}
213+
148214
public void setLiveEndpointUrlPrefix(String liveEndpointUrlPrefix) {
149215
this.liveEndpointUrlPrefix = liveEndpointUrlPrefix;
150216
}
151217

218+
public Config liveEndpointUrlPrefix(String liveEndpointUrlPrefix) {
219+
this.liveEndpointUrlPrefix = liveEndpointUrlPrefix;
220+
return this;
221+
}
222+
152223
public SSLContext getSSLContext() {
153224
return sslContext;
154225
}
@@ -162,6 +233,11 @@ public void setSSLContext(SSLContext sslContext) {
162233
this.sslContext = sslContext;
163234
}
164235

236+
public Config sslContext(SSLContext sslContext) {
237+
this.sslContext = sslContext;
238+
return this;
239+
}
240+
165241
public HostnameVerifier getHostnameVerifier() {
166242
return hostnameVerifier;
167243
}
@@ -175,4 +251,9 @@ public HostnameVerifier getHostnameVerifier() {
175251
public void setHostnameVerifier(HostnameVerifier hostnameVerifier) {
176252
this.hostnameVerifier = hostnameVerifier;
177253
}
254+
255+
public Config hostnameVerifier(HostnameVerifier hostnameVerifier) {
256+
this.hostnameVerifier = hostnameVerifier;
257+
return this;
258+
}
178259
}

src/main/java/com/adyen/httpclient/AdyenHttpClient.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public String request(String endpoint, String requestBody, Config config, boolea
111111
}
112112
}
113113

114-
private HttpUriRequestBase createRequest(String endpoint, String requestBody, Config config, boolean isApiKeyRequired, RequestOptions requestOptions, ApiConstants.HttpMethod httpMethod, Map<String, String> params) throws HTTPClientException {
114+
HttpUriRequestBase createRequest(String endpoint, String requestBody, Config config, boolean isApiKeyRequired, RequestOptions requestOptions, ApiConstants.HttpMethod httpMethod, Map<String, String> params) throws HTTPClientException {
115115
HttpUriRequestBase httpRequest = createHttpRequestBase(createUri(endpoint, params), requestBody, httpMethod);
116116

117117
RequestConfig.Builder builder = RequestConfig.custom();
@@ -140,7 +140,13 @@ private void setHeaders(Config config, RequestOptions requestOptions, HttpUriReq
140140

141141
setContentType(httpUriRequest, APPLICATION_JSON_TYPE);
142142
httpUriRequest.addHeader(ACCEPT_CHARSET, CHARSET);
143-
httpUriRequest.addHeader(USER_AGENT, String.format("%s %s/%s", config.getApplicationName(), Client.LIB_NAME, Client.LIB_VERSION));
143+
144+
String applicationName = config.getApplicationName();
145+
String userAgent = (applicationName != null && !applicationName.isBlank())
146+
? String.format("%s %s/%s", applicationName, Client.LIB_NAME, Client.LIB_VERSION)
147+
: String.format("%s/%s", Client.LIB_NAME, Client.LIB_VERSION);
148+
httpUriRequest.addHeader(USER_AGENT, userAgent);
149+
144150
httpUriRequest.addHeader(ADYEN_LIBRARY_NAME, Client.LIB_NAME);
145151
httpUriRequest.addHeader(ADYEN_LIBRARY_VERSION, Client.LIB_VERSION);
146152

src/test/java/com/adyen/ClientTest.java renamed to src/test/java/com/adyen/httpclient/ClientTest.java

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1-
package com.adyen;
1+
package com.adyen.httpclient;
22

33
import java.util.HashMap;
4+
import java.util.Map;
45
import java.util.stream.Stream;
56

67
import javax.net.ssl.SSLContext;
78

9+
import com.adyen.BaseTest;
10+
import com.adyen.Client;
11+
import com.adyen.Config;
12+
import com.adyen.constants.ApiConstants;
13+
import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
14+
import org.apache.hc.core5.http.Header;
815
import org.junit.Assert;
916
import org.junit.Test;
1017
import org.mockito.Mock;
@@ -16,7 +23,9 @@
1623
import com.adyen.enums.Region;
1724
import com.adyen.model.RequestOptions;
1825

19-
public class ClientTest {
26+
import static org.junit.Assert.*;
27+
28+
public class ClientTest extends BaseTest {
2029

2130
@Mock
2231
private SSLContext clientCertificateAuthSSLContext;
@@ -31,7 +40,7 @@ public void testConfigTestClient() {
3140
config.setEnvironment(Environment.TEST);
3241
config.setApiKey(apiKey);
3342
Client client = new Client(config);
34-
Assert.assertEquals(Environment.TEST, client.getConfig().getEnvironment());
43+
assertEquals(Environment.TEST, client.getConfig().getEnvironment());
3544
}
3645

3746
@Test
@@ -41,7 +50,8 @@ public void testConfigLiveClient() {
4150
config.setLiveEndpointUrlPrefix("prefix");
4251
config.setApiKey(apiKey);
4352
Client client = new Client(config);
44-
Assert.assertEquals(Environment.LIVE, client.getConfig().getEnvironment());
53+
assertEquals(Environment.LIVE, client.getConfig().getEnvironment());
54+
assertEquals("prefix", client.getConfig().getLiveEndpointUrlPrefix());
4555
}
4656

4757
private static Stream<Arguments> provideCloudTestEndpointTestCases() {
@@ -61,7 +71,7 @@ public void testGetCloudEndpointForTestEnvironment(Region region, Environment en
6171
testConfig.setEnvironment(Environment.TEST);
6272
testConfig.setTerminalApiRegion(region);
6373
Client testClient = new Client(testConfig);
64-
Assert.assertEquals(expectedEndpoint, testConfig.getTerminalApiCloudEndpoint());
74+
assertEquals(expectedEndpoint, testConfig.getTerminalApiCloudEndpoint());
6575
}
6676

6777
private static Stream<Arguments> provideCloudLiveEndpointTestCases() {
@@ -81,7 +91,7 @@ public void testGetCloudEndpointForLiveEnvironment(Region region, Environment en
8191
liveConfig.setEnvironment(Environment.LIVE);
8292
liveConfig.setTerminalApiRegion(region);
8393
Client liveClient = new Client(liveConfig);
84-
Assert.assertEquals(expectedEndpoint, liveConfig.getTerminalApiCloudEndpoint());
94+
assertEquals(expectedEndpoint, liveConfig.getTerminalApiCloudEndpoint());
8595
}
8696

8797
@Test
@@ -97,7 +107,7 @@ public void testUnmappedIndiaRegionThrowsException() {
97107
@Test
98108
public void testClientCertificateAuth() {
99109
Client client = new Client(clientCertificateAuthSSLContext, apiKey);
100-
Assert.assertEquals(Environment.LIVE, client.getConfig().getEnvironment());
110+
assertEquals(Environment.LIVE, client.getConfig().getEnvironment());
101111
}
102112

103113
@Test
@@ -108,6 +118,45 @@ public void testRequestOptionsBuilderPattern() {
108118
.idempotencyKey("idempotency")
109119
.requestedVerificationCodeHeader("headers")
110120
.additionalServiceHeaders(map);
111-
Assert.assertEquals(requestOptions.getAdditionalServiceHeaders(), map);
121+
assertEquals(requestOptions.getAdditionalServiceHeaders(), map);
122+
}
123+
124+
@Test
125+
public void testUserAgentWithApplicationName() throws Exception {
126+
127+
AdyenHttpClient client = new AdyenHttpClient();
128+
HttpUriRequestBase requestWithAppName = client.createRequest(
129+
"https://chekout.adyen.com",
130+
"{}",
131+
new Config()
132+
.applicationName("test-app"),
133+
true,
134+
null,
135+
ApiConstants.HttpMethod.POST,
136+
Map.of()
137+
);
138+
139+
Header userAgent = requestWithAppName.getFirstHeader("User-Agent");
140+
assertNotNull(userAgent);
141+
assertEquals("test-app " + Client.LIB_NAME + "/" + Client.LIB_VERSION, userAgent.getValue());
142+
}
143+
144+
@Test
145+
public void testUserAgentWithoutApplicationName() throws Exception {
146+
147+
AdyenHttpClient client = new AdyenHttpClient();
148+
HttpUriRequestBase requestWithoutAppName = client.createRequest(
149+
"https://chekout.adyen.com",
150+
"{}",
151+
new Config(),
152+
true,
153+
null,
154+
ApiConstants.HttpMethod.POST,
155+
Map.of()
156+
);
157+
158+
Header userAgent = requestWithoutAppName.getFirstHeader("User-Agent");
159+
assertNotNull(userAgent);
160+
assertEquals(Client.LIB_NAME + "/" + Client.LIB_VERSION, userAgent.getValue());
112161
}
113162
}

0 commit comments

Comments
 (0)