Skip to content

Update core User-Agent logic #12

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Mar 7, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,12 @@
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>

<developers>
Expand Down
22 changes: 14 additions & 8 deletions src/main/java/com/ibm/cloud/sdk/core/service/WatsonService.java
Original file line number Diff line number Diff line change
Expand Up @@ -194,31 +194,37 @@ public void configureClient(HttpConfigOptions options) {
private Call createCall(final Request request) {
final Request.Builder builder = request.newBuilder();

if (request.headers().get(HttpHeaders.USER_AGENT) == null) {
setUserAgent(builder);
}
setDefaultHeaders(builder);

setAuthentication(builder);

final Request newRequest = builder.build();
return client.newCall(newRequest);
}

/**
* Sets the default headers including User-Agent.
* Set the User-Agent header.
*
* @param builder the new default headers
* @param builder the Request builder
*/
protected void setDefaultHeaders(final Request.Builder builder) {
private void setUserAgent(final Request.Builder builder) {
String userAgent = RequestUtils.getUserAgent();
builder.header(HttpHeaders.USER_AGENT, userAgent);
}

/**
* Sets the default headers.
*
* @param builder the new default headers
*/
protected void setDefaultHeaders(final Request.Builder builder) {
if (defaultHeaders != null) {
for (String key : defaultHeaders.names()) {
builder.header(key, defaultHeaders.get(key));
}
if (defaultHeaders.get(HttpHeaders.USER_AGENT) != null) {
userAgent += " " + defaultHeaders.get(HttpHeaders.USER_AGENT);
}
}
builder.header(HttpHeaders.USER_AGENT, userAgent);
}

/**
Expand Down
40 changes: 19 additions & 21 deletions src/main/java/com/ibm/cloud/sdk/core/util/RequestUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
*/
package com.ibm.cloud.sdk.core.util;

import com.ibm.cloud.sdk.core.http.HttpMediaType;
import com.ibm.cloud.sdk.core.http.InputStreamRequestBody;
import okhttp3.MediaType;
import okhttp3.RequestBody;

Expand All @@ -28,17 +30,13 @@
import java.util.logging.Level;
import java.util.logging.Logger;

import com.ibm.cloud.sdk.core.http.HttpMediaType;
import com.ibm.cloud.sdk.core.http.InputStreamRequestBody;

/**
* Utility functions to use when creating a {@link com.ibm.cloud.sdk.core.http.RequestBuilder }.
*
*/
public final class RequestUtils {

private static final Logger LOG = Logger.getLogger(RequestUtils.class.getName());

private static final String[] properties =
new String[] { "java.vendor", "java.version", "os.arch", "os.name", "os.version" };
private static String userAgent;
Expand Down Expand Up @@ -142,27 +140,15 @@ public static String join(Iterable<?> iterable, String separator) {
return sb.toString();
}

/**
* Gets the user agent.
*
* @return the user agent
*/
public static synchronized String getUserAgent() {
if (userAgent == null) {
userAgent = buildUserAgent();
}
return userAgent;
}

private static String loadSdkVersion() {
private static String loadCoreVersion() {
ClassLoader classLoader = RequestUtils.class.getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("version.properties");
InputStream inputStream = classLoader.getResourceAsStream("sdk-core-version.properties");
Properties properties = new Properties();

try {
properties.load(inputStream);
} catch (Exception e) {
LOG.log(Level.WARNING, "Could not load version.properties", e);
LOG.log(Level.WARNING, "Could not load sdk-core-version.properties", e);
}

return properties.getProperty("version", "unknown-version");
Expand All @@ -174,12 +160,24 @@ private static String loadSdkVersion() {
* @return the string that represents the user agent
*/
private static String buildUserAgent() {
final List<String> details = new ArrayList<String>();
final List<String> details = new ArrayList<>();
for (String propertyName : properties) {
details.add(propertyName + "=" + System.getProperty(propertyName));
}

return "watson-apis-java-sdk/" + loadSdkVersion() + " (" + RequestUtils.join(details, "; ") + ")";
return "ibm-java-sdk-core/" + loadCoreVersion() + " (" + RequestUtils.join(details, "; ") + ")";
}

/**
* Gets the user agent.
*
* @return the user agent
*/
public static synchronized String getUserAgent() {
if (userAgent == null) {
userAgent = buildUserAgent();
}
return userAgent;
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/sdk-core-version.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
version=${project.version}
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
import com.google.gson.JsonObject;
import com.ibm.cloud.sdk.core.http.HttpMediaType;
import com.ibm.cloud.sdk.core.http.RequestBuilder;
import com.ibm.cloud.sdk.core.util.RequestUtils;

import okhttp3.HttpUrl;
import okhttp3.MediaType;
import okhttp3.Request;
Expand All @@ -30,7 +28,6 @@

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

/**
* The Class RequestBuilderTest.
Expand Down Expand Up @@ -246,14 +243,4 @@ public void testSpecialCharacterQuery() {
final Request request = RequestBuilder.get(HttpUrl.parse(url)).query("ä&ö", "ö=ü").build();
assertEquals(url + "?%C3%A4%26%C3%B6=%C3%B6%3D%C3%BC", request.url().toString());
}

/**
* Test user agent.
*/
@Test
public void testUserAgent() {
assertNotNull(RequestUtils.getUserAgent());
assertTrue(RequestUtils.getUserAgent().startsWith("watson-apis-java-sdk/"));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@
*/
package com.ibm.cloud.sdk.core.test.util;

import java.util.HashMap;
import java.util.Map;

import com.google.common.collect.Lists;
import com.ibm.cloud.sdk.core.util.RequestUtils;
import org.junit.Assert;
import org.junit.Test;

import com.google.common.collect.Lists;
import com.ibm.cloud.sdk.core.util.RequestUtils;
import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

/**
* The Class RequestUtilsTest.
Expand Down Expand Up @@ -51,12 +53,12 @@ public void testOmit() {

Map<String, Object> omitted = RequestUtils.omit(params, "A");

Assert.assertTrue(omitted.keySet().containsAll(Lists.newArrayList("B", "C", "D")));
Assert.assertTrue(omitted.values().containsAll(Lists.newArrayList(2, 3, 4)));
assertTrue(omitted.keySet().containsAll(Lists.newArrayList("B", "C", "D")));
assertTrue(omitted.values().containsAll(Lists.newArrayList(2, 3, 4)));

omitted = RequestUtils.omit(params, "F");
Assert.assertTrue(omitted.keySet().containsAll(Lists.newArrayList("A", "B", "C", "D")));
Assert.assertTrue(omitted.values().containsAll(Lists.newArrayList(1, 2, 3, 4)));
assertTrue(omitted.keySet().containsAll(Lists.newArrayList("A", "B", "C", "D")));
assertTrue(omitted.values().containsAll(Lists.newArrayList(1, 2, 3, 4)));
}

/**
Expand Down Expand Up @@ -101,4 +103,12 @@ public void testPickWithNulls() {
Assert.assertNull(RequestUtils.pick(null));
}

/**
* Test user agent.
*/
@Test
public void testUserAgent() {
assertNotNull(RequestUtils.getUserAgent());
assertTrue(RequestUtils.getUserAgent().startsWith("ibm-java-sdk-core/99-SNAPSHOT"));
}
}