Skip to content

Commit

Permalink
feat(java): allow setting arbitrary headers (#167)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
markphelps authored Apr 11, 2024
1 parent 66194b5 commit abe7d27
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 49 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/package-sdks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,4 @@ jobs:
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
dagger run go run ./build --languages=${{ inputs.sdk }} --push=true --tag=${{ inputs.tag }}
dagger run go run ./build --sdks=${{ inputs.sdk }} --push=true --tag=${{ inputs.tag }}
28 changes: 14 additions & 14 deletions build/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ import (
)

var (
languages string
push bool
tag string
languageToFn = map[string]buildFn{
sdks string
push bool
tag string
sdkToFn = map[string]buildFn{
"python": pythonBuild,
"rust": rustBuild,
"node": nodeBuild,
Expand All @@ -29,7 +29,7 @@ var (
)

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

func run() error {
var tests = make(map[string]buildFn, len(languageToFn))
var tests = make(map[string]buildFn, len(sdkToFn))

maps.Copy(tests, languageToFn)
maps.Copy(tests, sdkToFn)

if languages != "" {
l := strings.Split(languages, ",")
if sdks != "" {
l := strings.Split(sdks, ",")
subset := make(map[string]buildFn, len(l))
for _, language := range l {
testFn, ok := languageToFn[language]
for _, sdk := range l {
testFn, ok := sdkToFn[sdk]
if !ok {
return fmt.Errorf("language %s is not supported", language)
return fmt.Errorf("sdk %s is not supported", sdk)
}
subset[language] = testFn
subset[sdk] = testFn
}

tests = subset
Expand Down Expand Up @@ -147,7 +147,7 @@ func rustBuild(ctx context.Context, client *dagger.Client, hostDirectory *dagger
func nodeBuild(ctx context.Context, client *dagger.Client, hostDirectory *dagger.Directory) error {
container := client.Container().From("node:21.2-bookworm").
WithDirectory("/src", hostDirectory.Directory("flipt-node"), dagger.ContainerWithDirectoryOpts{
Exclude: []string{"./node_modules/"},
Exclude: []string{".node_modules/"},
}).
WithWorkdir("/src").
WithExec([]string{"npm", "install"}).
Expand Down
37 changes: 27 additions & 10 deletions flipt-java/src/main/java/io/flipt/api/FliptClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,22 @@
import io.flipt.api.authentication.AuthenticationStrategy;
import io.flipt.api.evaluation.Evaluation;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import okhttp3.OkHttpClient;

public class FliptClient {
private final Evaluation evaluation;

private FliptClient(String url, int timeout, AuthenticationStrategy authenticationStrategy) {
OkHttpClient httpClient =
new OkHttpClient.Builder().callTimeout(Duration.ofSeconds(timeout)).build();
this.evaluation = new Evaluation(httpClient, url, authenticationStrategy);
private FliptClient(FliptClientBuilder builder) {
final OkHttpClient httpClient = new OkHttpClient.Builder().callTimeout(builder.timeout).build();
this.evaluation =
Evaluation.builder()
.httpClient(httpClient)
.baseURL(builder.baseURL)
.authenticationStrategy(builder.authenticationStrategy)
.headers(builder.headers)
.build();
}

public Evaluation evaluation() {
Expand All @@ -23,13 +30,13 @@ public static FliptClientBuilder builder() {
}

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

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

private int timeout = 60;

public FliptClientBuilder() {}
private FliptClientBuilder() {}

public FliptClientBuilder url(String url) {
this.baseURL = url;
Expand All @@ -41,13 +48,23 @@ public FliptClientBuilder authentication(AuthenticationStrategy authenticationSt
return this;
}

public FliptClientBuilder timeout(int timeout) {
public FliptClientBuilder headers(Map<String, String> headers) {
this.headers = headers;
return this;
}

public FliptClientBuilder timeout(Duration timeout) {
this.timeout = timeout;
return this;
}

public FliptClientBuilder timeout(int timeout) {
this.timeout = Duration.ofSeconds(timeout);
return this;
}

public FliptClient build() {
return new FliptClient(baseURL, timeout, authenticationStrategy);
return new FliptClient(this);
}
}
}
70 changes: 62 additions & 8 deletions flipt-java/src/main/java/io/flipt/api/evaluation/Evaluation.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,32 +10,73 @@
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import okhttp3.*;

public class Evaluation {
private final OkHttpClient httpClient;
private final String baseURL;
private final AuthenticationStrategy authenticationStrategy;
private final Map<String, String> headers;
private final ObjectMapper objectMapper;

public Evaluation(
OkHttpClient httpClient, String baseURL, AuthenticationStrategy authenticationStrategy) {
this.httpClient = httpClient;
this.baseURL = baseURL;
this.authenticationStrategy = authenticationStrategy;
private Evaluation(EvaluationBuilder builder) {
this.httpClient = builder.httpClient;
this.baseURL = builder.baseURL;
this.authenticationStrategy = builder.authenticationStrategy;
this.headers = builder.headers;
this.objectMapper =
JsonMapper.builder()
.addModule(new Jdk8Module())
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.build();
}

public static EvaluationBuilder builder() {
return new EvaluationBuilder();
}

public static class EvaluationBuilder {
private OkHttpClient httpClient;
private String baseURL;
private AuthenticationStrategy authenticationStrategy;
private Map<String, String> headers;

private EvaluationBuilder() {}

public EvaluationBuilder httpClient(OkHttpClient httpClient) {
this.httpClient = httpClient;
return this;
}

public EvaluationBuilder baseURL(String baseURL) {
this.baseURL = baseURL;
return this;
}

public EvaluationBuilder authenticationStrategy(AuthenticationStrategy authenticationStrategy) {
this.authenticationStrategy = authenticationStrategy;
return this;
}

public EvaluationBuilder headers(Map<String, String> headers) {
this.headers = headers;
return this;
}

public Evaluation build() {
return new Evaluation(this);
}
}

@SuppressWarnings("resource")
public VariantEvaluationResponse evaluateVariant(EvaluationRequest request) {
URL url;

final String path = "/evaluate/v1/variant";

try {
url = new URL(String.format("%s%s", this.baseURL, "/evaluate/v1/variant"));
url = new URL(String.format("%s%s", this.baseURL, path));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
Expand Down Expand Up @@ -66,8 +107,10 @@ public VariantEvaluationResponse evaluateVariant(EvaluationRequest request) {
public BooleanEvaluationResponse evaluateBoolean(EvaluationRequest request) {
URL url;

final String path = "/evaluate/v1/boolean";

try {
url = new URL(String.format("%s%s", this.baseURL, "/evaluate/v1/boolean"));
url = new URL(String.format("%s%s", this.baseURL, path));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
Expand Down Expand Up @@ -106,14 +149,21 @@ public BatchEvaluationResponse evaluateBatch(BatchEvaluationRequest request) {
}

URL url;

final String path = "/evaluate/v1/batch";

try {
url = new URL(String.format("%s%s", this.baseURL, "/evaluate/v1/batch"));
url = new URL(String.format("%s%s", this.baseURL, path));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}

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

if (this.headers != null) {
this.headers.forEach(httpRequest::addHeader);
}

if (this.authenticationStrategy != null) {
httpRequest.addHeader("Authorization", this.authenticationStrategy.getAuthorizationHeader());
}
Expand Down Expand Up @@ -151,6 +201,10 @@ private Request.Builder makeRequest(EvaluationRequest request, URL url) {

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

if (this.headers != null) {
this.headers.forEach(httpRequest::addHeader);
}

if (this.authenticationStrategy != null) {
httpRequest.addHeader("Authorization", this.authenticationStrategy.getAuthorizationHeader());
}
Expand Down
24 changes: 21 additions & 3 deletions flipt-java/src/test/java/TestFliptClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,14 @@ void testVariantEvaluation() {
AuthenticationStrategy authenticationStrategy =
new ClientTokenAuthenticationStrategy(authToken);

Map<String, String> headers = Map.of("Accept", "application/json");

FliptClient fc =
FliptClient.builder().url(fliptURL).authentication(authenticationStrategy).build();
FliptClient.builder()
.url(fliptURL)
.authentication(authenticationStrategy)
.headers(headers)
.build();

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

Map<String, String> headers = Map.of("Accept", "application/json");

FliptClient fc =
FliptClient.builder().url(fliptURL).authentication(authenticationStrategy).build();
FliptClient.builder()
.url(fliptURL)
.authentication(authenticationStrategy)
.headers(headers)
.build();

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

Map<String, String> headers = Map.of("Accept", "application/json");

FliptClient fc =
FliptClient.builder().url(fliptURL).authentication(authenticationStrategy).build();
FliptClient.builder()
.url(fliptURL)
.authentication(authenticationStrategy)
.headers(headers)
.build();

Map<String, String> context = new HashMap<>();
context.put("fizz", "buzz");
Expand Down
26 changes: 13 additions & 13 deletions test/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import (
)

var (
languages string
languageToFn = map[string]integrationTestFn{
sdks string
sdkToFn = map[string]integrationTestFn{
"python": pythonTests,
"node": nodeTests,
"rust": rustTests,
Expand All @@ -27,7 +27,7 @@ var (
type integrationTestFn func(context.Context, *dagger.Client, *dagger.Container, *dagger.Directory) error

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

func main() {
Expand All @@ -39,19 +39,19 @@ func main() {
}

func run() error {
var tests = make(map[string]integrationTestFn, len(languageToFn))
var tests = make(map[string]integrationTestFn, len(sdkToFn))

maps.Copy(tests, languageToFn)
maps.Copy(tests, sdkToFn)

if languages != "" {
l := strings.Split(languages, ",")
if sdks != "" {
l := strings.Split(sdks, ",")
subset := make(map[string]integrationTestFn, len(l))
for _, language := range l {
testFn, ok := languageToFn[language]
for _, sdk := range l {
testFn, ok := sdkToFn[sdk]
if !ok {
return fmt.Errorf("language %s is not supported", language)
return fmt.Errorf("sdk %s is not supported", sdk)
}
subset[language] = testFn
subset[sdk] = testFn
}

tests = subset
Expand Down Expand Up @@ -81,7 +81,7 @@ func run() error {
return g.Wait()
}

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

0 comments on commit abe7d27

Please sign in to comment.