Skip to content

Commit abe7d27

Browse files
authored
feat(java): allow setting arbitrary headers (#167)
* feat(java): allow setting arbitrary headers * chore: fmt Signed-off-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore: convert everything to builder * feat(java): allow setting reference * chore: remove setting reference for now, needs more thought --------- Signed-off-by: Mark Phelps <209477+markphelps@users.noreply.github.com>
1 parent 66194b5 commit abe7d27

File tree

6 files changed

+138
-49
lines changed

6 files changed

+138
-49
lines changed

.github/workflows/package-sdks.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,4 @@ jobs:
5454
env:
5555
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
5656
run: |
57-
dagger run go run ./build --languages=${{ inputs.sdk }} --push=true --tag=${{ inputs.tag }}
57+
dagger run go run ./build --sdks=${{ inputs.sdk }} --push=true --tag=${{ inputs.tag }}

build/main.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ import (
1616
)
1717

1818
var (
19-
languages string
20-
push bool
21-
tag string
22-
languageToFn = map[string]buildFn{
19+
sdks string
20+
push bool
21+
tag string
22+
sdkToFn = map[string]buildFn{
2323
"python": pythonBuild,
2424
"rust": rustBuild,
2525
"node": nodeBuild,
@@ -29,7 +29,7 @@ var (
2929
)
3030

3131
func init() {
32-
flag.StringVar(&languages, "languages", "", "comma separated list of which language(s) to run builds for")
32+
flag.StringVar(&sdks, "sdks", "", "comma separated list of which sdk(s) to run builds for")
3333
flag.BoolVar(&push, "push", false, "push built artifacts to registry")
3434
flag.StringVar(&tag, "tag", "", "tag to use for release")
3535
}
@@ -45,19 +45,19 @@ func main() {
4545
type buildFn func(context.Context, *dagger.Client, *dagger.Directory) error
4646

4747
func run() error {
48-
var tests = make(map[string]buildFn, len(languageToFn))
48+
var tests = make(map[string]buildFn, len(sdkToFn))
4949

50-
maps.Copy(tests, languageToFn)
50+
maps.Copy(tests, sdkToFn)
5151

52-
if languages != "" {
53-
l := strings.Split(languages, ",")
52+
if sdks != "" {
53+
l := strings.Split(sdks, ",")
5454
subset := make(map[string]buildFn, len(l))
55-
for _, language := range l {
56-
testFn, ok := languageToFn[language]
55+
for _, sdk := range l {
56+
testFn, ok := sdkToFn[sdk]
5757
if !ok {
58-
return fmt.Errorf("language %s is not supported", language)
58+
return fmt.Errorf("sdk %s is not supported", sdk)
5959
}
60-
subset[language] = testFn
60+
subset[sdk] = testFn
6161
}
6262

6363
tests = subset
@@ -147,7 +147,7 @@ func rustBuild(ctx context.Context, client *dagger.Client, hostDirectory *dagger
147147
func nodeBuild(ctx context.Context, client *dagger.Client, hostDirectory *dagger.Directory) error {
148148
container := client.Container().From("node:21.2-bookworm").
149149
WithDirectory("/src", hostDirectory.Directory("flipt-node"), dagger.ContainerWithDirectoryOpts{
150-
Exclude: []string{"./node_modules/"},
150+
Exclude: []string{".node_modules/"},
151151
}).
152152
WithWorkdir("/src").
153153
WithExec([]string{"npm", "install"}).

flipt-java/src/main/java/io/flipt/api/FliptClient.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,22 @@
33
import io.flipt.api.authentication.AuthenticationStrategy;
44
import io.flipt.api.evaluation.Evaluation;
55
import java.time.Duration;
6+
import java.util.HashMap;
7+
import java.util.Map;
68
import okhttp3.OkHttpClient;
79

810
public class FliptClient {
911
private final Evaluation evaluation;
1012

11-
private FliptClient(String url, int timeout, AuthenticationStrategy authenticationStrategy) {
12-
OkHttpClient httpClient =
13-
new OkHttpClient.Builder().callTimeout(Duration.ofSeconds(timeout)).build();
14-
this.evaluation = new Evaluation(httpClient, url, authenticationStrategy);
13+
private FliptClient(FliptClientBuilder builder) {
14+
final OkHttpClient httpClient = new OkHttpClient.Builder().callTimeout(builder.timeout).build();
15+
this.evaluation =
16+
Evaluation.builder()
17+
.httpClient(httpClient)
18+
.baseURL(builder.baseURL)
19+
.authenticationStrategy(builder.authenticationStrategy)
20+
.headers(builder.headers)
21+
.build();
1522
}
1623

1724
public Evaluation evaluation() {
@@ -23,13 +30,13 @@ public static FliptClientBuilder builder() {
2330
}
2431

2532
public static final class FliptClientBuilder {
26-
private String baseURL = "http://localhost:8080";
2733

34+
private String baseURL = "http://localhost:8080";
2835
private AuthenticationStrategy authenticationStrategy;
36+
private Map<String, String> headers = new HashMap<>();
37+
private Duration timeout = Duration.ofSeconds(60);
2938

30-
private int timeout = 60;
31-
32-
public FliptClientBuilder() {}
39+
private FliptClientBuilder() {}
3340

3441
public FliptClientBuilder url(String url) {
3542
this.baseURL = url;
@@ -41,13 +48,23 @@ public FliptClientBuilder authentication(AuthenticationStrategy authenticationSt
4148
return this;
4249
}
4350

44-
public FliptClientBuilder timeout(int timeout) {
51+
public FliptClientBuilder headers(Map<String, String> headers) {
52+
this.headers = headers;
53+
return this;
54+
}
55+
56+
public FliptClientBuilder timeout(Duration timeout) {
4557
this.timeout = timeout;
4658
return this;
4759
}
4860

61+
public FliptClientBuilder timeout(int timeout) {
62+
this.timeout = Duration.ofSeconds(timeout);
63+
return this;
64+
}
65+
4966
public FliptClient build() {
50-
return new FliptClient(baseURL, timeout, authenticationStrategy);
67+
return new FliptClient(this);
5168
}
5269
}
5370
}

flipt-java/src/main/java/io/flipt/api/evaluation/Evaluation.java

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,73 @@
1010
import java.io.IOException;
1111
import java.net.MalformedURLException;
1212
import java.net.URL;
13+
import java.util.Map;
1314
import okhttp3.*;
1415

1516
public class Evaluation {
1617
private final OkHttpClient httpClient;
1718
private final String baseURL;
1819
private final AuthenticationStrategy authenticationStrategy;
20+
private final Map<String, String> headers;
1921
private final ObjectMapper objectMapper;
2022

21-
public Evaluation(
22-
OkHttpClient httpClient, String baseURL, AuthenticationStrategy authenticationStrategy) {
23-
this.httpClient = httpClient;
24-
this.baseURL = baseURL;
25-
this.authenticationStrategy = authenticationStrategy;
23+
private Evaluation(EvaluationBuilder builder) {
24+
this.httpClient = builder.httpClient;
25+
this.baseURL = builder.baseURL;
26+
this.authenticationStrategy = builder.authenticationStrategy;
27+
this.headers = builder.headers;
2628
this.objectMapper =
2729
JsonMapper.builder()
2830
.addModule(new Jdk8Module())
2931
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
3032
.build();
3133
}
3234

35+
public static EvaluationBuilder builder() {
36+
return new EvaluationBuilder();
37+
}
38+
39+
public static class EvaluationBuilder {
40+
private OkHttpClient httpClient;
41+
private String baseURL;
42+
private AuthenticationStrategy authenticationStrategy;
43+
private Map<String, String> headers;
44+
45+
private EvaluationBuilder() {}
46+
47+
public EvaluationBuilder httpClient(OkHttpClient httpClient) {
48+
this.httpClient = httpClient;
49+
return this;
50+
}
51+
52+
public EvaluationBuilder baseURL(String baseURL) {
53+
this.baseURL = baseURL;
54+
return this;
55+
}
56+
57+
public EvaluationBuilder authenticationStrategy(AuthenticationStrategy authenticationStrategy) {
58+
this.authenticationStrategy = authenticationStrategy;
59+
return this;
60+
}
61+
62+
public EvaluationBuilder headers(Map<String, String> headers) {
63+
this.headers = headers;
64+
return this;
65+
}
66+
67+
public Evaluation build() {
68+
return new Evaluation(this);
69+
}
70+
}
71+
3372
@SuppressWarnings("resource")
3473
public VariantEvaluationResponse evaluateVariant(EvaluationRequest request) {
3574
URL url;
3675

76+
final String path = "/evaluate/v1/variant";
77+
3778
try {
38-
url = new URL(String.format("%s%s", this.baseURL, "/evaluate/v1/variant"));
79+
url = new URL(String.format("%s%s", this.baseURL, path));
3980
} catch (MalformedURLException e) {
4081
throw new RuntimeException(e);
4182
}
@@ -66,8 +107,10 @@ public VariantEvaluationResponse evaluateVariant(EvaluationRequest request) {
66107
public BooleanEvaluationResponse evaluateBoolean(EvaluationRequest request) {
67108
URL url;
68109

110+
final String path = "/evaluate/v1/boolean";
111+
69112
try {
70-
url = new URL(String.format("%s%s", this.baseURL, "/evaluate/v1/boolean"));
113+
url = new URL(String.format("%s%s", this.baseURL, path));
71114
} catch (MalformedURLException e) {
72115
throw new RuntimeException(e);
73116
}
@@ -106,14 +149,21 @@ public BatchEvaluationResponse evaluateBatch(BatchEvaluationRequest request) {
106149
}
107150

108151
URL url;
152+
153+
final String path = "/evaluate/v1/batch";
154+
109155
try {
110-
url = new URL(String.format("%s%s", this.baseURL, "/evaluate/v1/batch"));
156+
url = new URL(String.format("%s%s", this.baseURL, path));
111157
} catch (MalformedURLException e) {
112158
throw new RuntimeException(e);
113159
}
114160

115161
Request.Builder httpRequest = new Request.Builder().url(url).method("POST", body);
116162

163+
if (this.headers != null) {
164+
this.headers.forEach(httpRequest::addHeader);
165+
}
166+
117167
if (this.authenticationStrategy != null) {
118168
httpRequest.addHeader("Authorization", this.authenticationStrategy.getAuthorizationHeader());
119169
}
@@ -151,6 +201,10 @@ private Request.Builder makeRequest(EvaluationRequest request, URL url) {
151201

152202
Request.Builder httpRequest = new Request.Builder().url(url).method("POST", body);
153203

204+
if (this.headers != null) {
205+
this.headers.forEach(httpRequest::addHeader);
206+
}
207+
154208
if (this.authenticationStrategy != null) {
155209
httpRequest.addHeader("Authorization", this.authenticationStrategy.getAuthorizationHeader());
156210
}

flipt-java/src/test/java/TestFliptClient.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,14 @@ void testVariantEvaluation() {
1818
AuthenticationStrategy authenticationStrategy =
1919
new ClientTokenAuthenticationStrategy(authToken);
2020

21+
Map<String, String> headers = Map.of("Accept", "application/json");
22+
2123
FliptClient fc =
22-
FliptClient.builder().url(fliptURL).authentication(authenticationStrategy).build();
24+
FliptClient.builder()
25+
.url(fliptURL)
26+
.authentication(authenticationStrategy)
27+
.headers(headers)
28+
.build();
2329

2430
Map<String, String> context = new HashMap<>();
2531
context.put("fizz", "buzz");
@@ -46,8 +52,14 @@ void testBooleanEvaluation() {
4652
AuthenticationStrategy authenticationStrategy =
4753
new ClientTokenAuthenticationStrategy(authToken);
4854

55+
Map<String, String> headers = Map.of("Accept", "application/json");
56+
4957
FliptClient fc =
50-
FliptClient.builder().url(fliptURL).authentication(authenticationStrategy).build();
58+
FliptClient.builder()
59+
.url(fliptURL)
60+
.authentication(authenticationStrategy)
61+
.headers(headers)
62+
.build();
5163

5264
Map<String, String> context = new HashMap<>();
5365
context.put("fizz", "buzz");
@@ -74,8 +86,14 @@ void testBatchEvaluation() {
7486
AuthenticationStrategy authenticationStrategy =
7587
new ClientTokenAuthenticationStrategy(authToken);
7688

89+
Map<String, String> headers = Map.of("Accept", "application/json");
90+
7791
FliptClient fc =
78-
FliptClient.builder().url(fliptURL).authentication(authenticationStrategy).build();
92+
FliptClient.builder()
93+
.url(fliptURL)
94+
.authentication(authenticationStrategy)
95+
.headers(headers)
96+
.build();
7997

8098
Map<String, String> context = new HashMap<>();
8199
context.put("fizz", "buzz");

test/main.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import (
1414
)
1515

1616
var (
17-
languages string
18-
languageToFn = map[string]integrationTestFn{
17+
sdks string
18+
sdkToFn = map[string]integrationTestFn{
1919
"python": pythonTests,
2020
"node": nodeTests,
2121
"rust": rustTests,
@@ -27,7 +27,7 @@ var (
2727
type integrationTestFn func(context.Context, *dagger.Client, *dagger.Container, *dagger.Directory) error
2828

2929
func init() {
30-
flag.StringVar(&languages, "languages", "", "comma separated list of which language(s) to run integration tests for")
30+
flag.StringVar(&sdks, "sdks", "", "comma separated list of which sdk(s) to run integration tests for")
3131
}
3232

3333
func main() {
@@ -39,19 +39,19 @@ func main() {
3939
}
4040

4141
func run() error {
42-
var tests = make(map[string]integrationTestFn, len(languageToFn))
42+
var tests = make(map[string]integrationTestFn, len(sdkToFn))
4343

44-
maps.Copy(tests, languageToFn)
44+
maps.Copy(tests, sdkToFn)
4545

46-
if languages != "" {
47-
l := strings.Split(languages, ",")
46+
if sdks != "" {
47+
l := strings.Split(sdks, ",")
4848
subset := make(map[string]integrationTestFn, len(l))
49-
for _, language := range l {
50-
testFn, ok := languageToFn[language]
49+
for _, sdk := range l {
50+
testFn, ok := sdkToFn[sdk]
5151
if !ok {
52-
return fmt.Errorf("language %s is not supported", language)
52+
return fmt.Errorf("sdk %s is not supported", sdk)
5353
}
54-
subset[language] = testFn
54+
subset[sdk] = testFn
5555
}
5656

5757
tests = subset
@@ -81,7 +81,7 @@ func run() error {
8181
return g.Wait()
8282
}
8383

84-
func getTestDependencies(ctx context.Context, client *dagger.Client, dir *dagger.Directory) (*dagger.Container, *dagger.Directory) {
84+
func getTestDependencies(_ context.Context, client *dagger.Client, dir *dagger.Directory) (*dagger.Container, *dagger.Directory) {
8585
// Flipt
8686
flipt := client.Container().From("flipt/flipt:latest").
8787
WithUser("root").
@@ -122,7 +122,7 @@ func nodeTests(ctx context.Context, client *dagger.Client, flipt *dagger.Contain
122122
// The node_modules should never be version controlled, but we will exclude it here
123123
// just to be safe.
124124
WithDirectory("/src", hostDirectory.Directory("flipt-node"), dagger.ContainerWithDirectoryOpts{
125-
Exclude: []string{"./node_modules/"},
125+
Exclude: []string{".node_modules/"},
126126
}).
127127
WithServiceBinding("flipt", flipt.WithExec(nil).AsService()).
128128
WithEnvVariable("FLIPT_URL", "http://flipt:8080").

0 commit comments

Comments
 (0)