Skip to content

Commit fa82701

Browse files
committed
Include telemetry header
1 parent 007dea8 commit fa82701

8 files changed

Lines changed: 165 additions & 10 deletions

File tree

core/src/main/java/com/auth0/Auth0.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,22 @@
2525
package com.auth0;
2626

2727
import com.auth0.authentication.AuthenticationAPIClient;
28+
import com.auth0.util.BaseMetrics;
29+
import com.auth0.util.Metrics;
2830
import com.squareup.okhttp.HttpUrl;
2931

3032
public class Auth0 {
3133

34+
public static final String VERSION = "1.0.0";
35+
public static final String NAME = "auth0-java";
36+
3237
private static final String AUTH0_US_CDN_URL = "https://cdn.auth0.com";
3338
private static final String DOT_AUTH0_DOT_COM = ".auth0.com";
3439

35-
protected final String clientId;
36-
protected final String domainUrl;
37-
protected final String configurationUrl;
40+
private final String clientId;
41+
private final String domainUrl;
42+
private final String configurationUrl;
43+
private Metrics metrics;
3844

3945
public Auth0(String clientId, String domain) {
4046
this(clientId, domain, null);
@@ -44,6 +50,8 @@ public Auth0(String clientId, String domain, String configurationDomain) {
4450
this.clientId = clientId;
4551
this.domainUrl = ensureUrlString(domain);
4652
this.configurationUrl = resolveConfiguration(configurationDomain, this.domainUrl);
53+
this.metrics = new BaseMetrics();
54+
this.metrics.usingLibrary(Auth0.NAME, Auth0.VERSION);
4755
}
4856

4957
private String resolveConfiguration(String configurationDomain, String domainUrl) {
@@ -95,4 +103,16 @@ public String getAuthorizeUrl() {
95103
.build()
96104
.toString();
97105
}
106+
107+
public Metrics getMetrics() {
108+
return metrics;
109+
}
110+
111+
public void setMetrics(Metrics metrics) {
112+
if (metrics == null) {
113+
this.metrics = new BaseMetrics();
114+
} else {
115+
this.metrics = metrics;
116+
}
117+
}
98118
}

core/src/main/java/com/auth0/authentication/AuthenticationAPIClient.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import com.auth0.internal.RequestFactory;
3333
import com.auth0.request.ParameterizableRequest;
3434
import com.auth0.request.Request;
35+
import com.auth0.util.BaseMetrics;
36+
import com.auth0.util.Metrics;
3537
import com.fasterxml.jackson.databind.ObjectMapper;
3638
import com.squareup.okhttp.HttpUrl;
3739
import com.squareup.okhttp.OkHttpClient;
@@ -73,7 +75,7 @@ public AuthenticationAPIClient(Auth0 auth0) {
7375
* Creates a new API client instance providing Auth API and Configuration Urls different than the default. (Useful for on premise deploys).
7476
* @param clientID Your application clientID.
7577
* @param baseURL Auth0's auth API endpoint
76-
* @param configurationURL Auth0's enpoint where App info can be retrieved.
78+
* @param configurationURL Auth0's endpoint where App info can be retrieved.
7779
*/
7880
@SuppressWarnings("unused")
7981
public AuthenticationAPIClient(String clientID, String baseURL, String configurationURL) {
@@ -84,6 +86,10 @@ protected AuthenticationAPIClient(Auth0 auth0, OkHttpClient client, ObjectMapper
8486
this.auth0 = auth0;
8587
this.client = client;
8688
this.mapper = mapper;
89+
final Metrics metrics = auth0.getMetrics();
90+
if (metrics != null) {
91+
RequestFactory.setClientInfo(metrics.getValue());
92+
}
8793
}
8894

8995
public String getClientId() {
@@ -94,6 +100,14 @@ public String getBaseURL() {
94100
return auth0.getDomainUrl();
95101
}
96102

103+
/**
104+
* Set the value of 'User-Agent' header for every request to Auth0 Authentication API
105+
* @param userAgent value to send in every request to Auth0
106+
*/
107+
public void setUserAgent(String userAgent) {
108+
RequestFactory.setUserAgent(userAgent);
109+
}
110+
97111
/**
98112
* Set the default DB connection name used. By default is 'Username-Password-Authentication'
99113
* @param defaultDbConnection name to use on every login with DB connection

core/src/main/java/com/auth0/internal/BaseRequest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@
2424

2525
package com.auth0.internal;
2626

27-
import com.auth0.Auth0Exception;
2827
import com.auth0.APIException;
29-
import com.auth0.request.AuthorizableRequest;
30-
import com.auth0.request.ParameterizableRequest;
28+
import com.auth0.Auth0Exception;
3129
import com.auth0.RequestBodyBuildException;
3230
import com.auth0.callback.BaseCallback;
31+
import com.auth0.request.AuthorizableRequest;
32+
import com.auth0.request.ParameterizableRequest;
3333
import com.fasterxml.jackson.databind.ObjectReader;
3434
import com.fasterxml.jackson.databind.ObjectWriter;
3535
import com.squareup.okhttp.Callback;

core/src/main/java/com/auth0/internal/RequestFactory.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import com.auth0.request.AuthorizableRequest;
2828
import com.auth0.request.ParameterizableRequest;
29+
import com.auth0.util.Metrics;
2930
import com.fasterxml.jackson.databind.ObjectMapper;
3031
import com.squareup.okhttp.HttpUrl;
3132
import com.squareup.okhttp.OkHttpClient;
@@ -37,8 +38,6 @@ public class RequestFactory {
3738
private static String CLIENT_INFO;
3839
private static String USER_AGENT;
3940

40-
protected RequestFactory() {}
41-
4241
public static void setClientInfo(String clientInfo) {
4342
CLIENT_INFO = clientInfo;
4443
}
@@ -85,7 +84,7 @@ public static <T> ParameterizableRequest<T> DELETE(HttpUrl url, OkHttpClient cli
8584

8685
private static <T> ParameterizableRequest<T> addMetricHeader(ParameterizableRequest<T> request) {
8786
if (CLIENT_INFO != null) {
88-
request.addHeader("Auth0-Client", CLIENT_INFO);
87+
request.addHeader(Metrics.HEADER_NAME, CLIENT_INFO);
8988
}
9089
if (USER_AGENT != null) {
9190
request.addHeader("User-Agent", USER_AGENT);
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.auth0.util;
2+
3+
import java.io.UnsupportedEncodingException;
4+
import java.nio.charset.Charset;
5+
6+
public class Base64 {
7+
8+
private static final byte[] ENCODE_MAP = new byte[] {
9+
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
10+
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
11+
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4',
12+
'5', '6', '7', '8', '9', '-', '_'
13+
};
14+
15+
public static String encodeUrlSafe(String string) {
16+
byte[] in = string.getBytes(Charset.defaultCharset());
17+
int length = (in.length + 2) * 4 / 3;
18+
byte[] out = new byte[length];
19+
int index = 0, end = in.length - in.length % 3;
20+
for (int i = 0; i < end; i += 3) {
21+
out[index++] = ENCODE_MAP[(in[i] & 0xff) >> 2];
22+
out[index++] = ENCODE_MAP[((in[i] & 0x03) << 4) | ((in[i + 1] & 0xff) >> 4)];
23+
out[index++] = ENCODE_MAP[((in[i + 1] & 0x0f) << 2) | ((in[i + 2] & 0xff) >> 6)];
24+
out[index++] = ENCODE_MAP[(in[i + 2] & 0x3f)];
25+
}
26+
switch (in.length % 3) {
27+
case 1:
28+
out[index++] = ENCODE_MAP[(in[end] & 0xff) >> 2];
29+
out[index++] = ENCODE_MAP[(in[end] & 0x03) << 4];
30+
out[index++] = '=';
31+
out[index++] = '=';
32+
break;
33+
case 2:
34+
out[index++] = ENCODE_MAP[(in[end] & 0xff) >> 2];
35+
out[index++] = ENCODE_MAP[((in[end] & 0x03) << 4) | ((in[end + 1] & 0xff) >> 4)];
36+
out[index++] = ENCODE_MAP[((in[end + 1] & 0x0f) << 2)];
37+
out[index++] = '=';
38+
break;
39+
}
40+
try {
41+
return new String(out, 0, index, "US-ASCII");
42+
} catch (UnsupportedEncodingException e) {
43+
return null;
44+
}
45+
}
46+
47+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.auth0.util;
2+
3+
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
9+
public class BaseMetrics implements Metrics {
10+
11+
private final Map<String, String> values;
12+
13+
public BaseMetrics() {
14+
this.values = new HashMap<>();
15+
}
16+
17+
@Override
18+
public void usingLibrary(String name, String version) {
19+
values.put(NAME_KEY, name);
20+
values.put(VERSION_KEY, version);
21+
}
22+
23+
@Override
24+
public String getValue() {
25+
if (values.isEmpty()) {
26+
return null;
27+
}
28+
try {
29+
String json = new ObjectMapper().writeValueAsString(values);
30+
return Base64.encodeUrlSafe(json);
31+
} catch (JsonProcessingException e) {
32+
return null;
33+
}
34+
}
35+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.auth0.util;
2+
3+
public interface Metrics {
4+
String NAME_KEY = "name";
5+
String VERSION_KEY = "version";
6+
String HEADER_NAME = "Auth0-Client";
7+
8+
void usingLibrary(String name, String version);
9+
String getValue();
10+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.auth0.util;
2+
3+
import org.junit.Before;
4+
import org.junit.Test;
5+
6+
import static org.hamcrest.Matchers.is;
7+
import static org.hamcrest.Matchers.notNullValue;
8+
import static org.hamcrest.Matchers.nullValue;
9+
import static org.junit.Assert.assertThat;
10+
11+
public class BaseMetricsTest {
12+
13+
private BaseMetrics metrics;
14+
15+
@Before
16+
public void setUp() throws Exception {
17+
metrics = new BaseMetrics();
18+
}
19+
20+
@Test
21+
public void shouldReturnBase64() throws Exception {
22+
metrics.usingLibrary("auth0-java", "1.0.0");
23+
assertThat(metrics.getValue(), is(notNullValue()));
24+
}
25+
26+
@Test
27+
public void shouldReturnNullWhenNoInfoIsProvided() throws Exception {
28+
assertThat(metrics.getValue(), is(nullValue()));
29+
}
30+
}

0 commit comments

Comments
 (0)