Skip to content

Commit 18538d6

Browse files
Add x-restate-server header in responses. (#285)
1 parent 69c58b0 commit 18538d6

File tree

5 files changed

+76
-6
lines changed

5 files changed

+76
-6
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ allprojects {
2424

2525
configure<com.diffplug.gradle.spotless.SpotlessExtension> {
2626
java {
27-
targetExclude("build/generated/**/*.java")
27+
targetExclude("build/**/*.java")
2828

2929
googleJavaFormat()
3030

sdk-common/build.gradle.kts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,67 @@ dependencies {
1616
testImplementation(testingLibs.junit.jupiter)
1717
testImplementation(testingLibs.assertj)
1818
}
19+
20+
val generatedVersionDir = layout.buildDirectory.dir("version")
21+
22+
generatedVersionDir.get().asFile.mkdirs()
23+
24+
sourceSets { main { java { srcDir(generatedVersionDir) } } }
25+
26+
// Configure generation of version class
27+
28+
// From https://discuss.kotlinlang.org/t/use-git-hash-as-version-number-in-build-gradle-kts/19818/4
29+
fun String.runCommand(
30+
workingDir: File = File("."),
31+
timeoutAmount: Long = 5,
32+
timeoutUnit: TimeUnit = TimeUnit.SECONDS
33+
): String =
34+
ProcessBuilder(split("\\s(?=(?:[^'\"`]*(['\"`])[^'\"`]*\\1)*[^'\"`]*$)".toRegex()))
35+
.directory(workingDir)
36+
.redirectOutput(ProcessBuilder.Redirect.PIPE)
37+
.redirectError(ProcessBuilder.Redirect.PIPE)
38+
.start()
39+
.apply { waitFor(timeoutAmount, timeoutUnit) }
40+
.run {
41+
val error = errorStream.bufferedReader().readText().trim()
42+
if (error.isNotEmpty()) {
43+
throw IllegalStateException(error)
44+
}
45+
inputStream.bufferedReader().readText().trim()
46+
}
47+
48+
val generateVersionClass =
49+
tasks.register("generateVersionClass") {
50+
dependsOn(project.tasks.processResources)
51+
outputs.dir(generatedVersionDir)
52+
53+
doFirst {
54+
val gitHash = "git rev-parse --short=8 HEAD".runCommand(workingDir = rootDir)
55+
val containingDir = generatedVersionDir.get().dir("dev/restate/sdk/version").asFile
56+
assert(containingDir.exists() || containingDir.mkdirs())
57+
58+
file("$containingDir/Version.java")
59+
.writeText(
60+
"""
61+
package dev.restate.sdk.version;
62+
63+
public final class Version {
64+
private Version() {}
65+
66+
public static final String VERSION = "$version";
67+
public static final String GIT_HASH = "$gitHash";
68+
public static final String X_RESTATE_SERVER = "restate-sdk-java/" + VERSION + "_" + GIT_HASH;
69+
}
70+
"""
71+
.trimIndent())
72+
73+
check(file("${projectDir}/build/version/dev/restate/sdk/version/Version.java").exists()) {
74+
"${projectDir}/build/version/dev/restate/sdk/version/Version.java doesn't exist?!"
75+
}
76+
}
77+
}
78+
79+
tasks {
80+
withType<JavaCompile>().configureEach { dependsOn(generateVersionClass) }
81+
withType<Jar>().configureEach { dependsOn(generateVersionClass) }
82+
}

sdk-core/build.gradle.kts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import com.google.protobuf.gradle.id
2-
31
plugins {
42
`java-library`
53
`library-publishing-conventions`

sdk-http-vertx/src/main/java/dev/restate/sdk/http/vertx/RequestHttpServerHandler.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import dev.restate.sdk.core.ResolvedEndpointHandler;
1919
import dev.restate.sdk.core.RestateEndpoint;
2020
import dev.restate.sdk.core.manifest.DeploymentManifestSchema;
21+
import dev.restate.sdk.version.Version;
2122
import io.netty.util.AsciiString;
2223
import io.opentelemetry.api.OpenTelemetry;
2324
import io.opentelemetry.context.propagation.TextMapGetter;
@@ -41,6 +42,9 @@ class RequestHttpServerHandler implements Handler<HttpServerRequest> {
4142
private static final Logger LOG = LogManager.getLogger(RequestHttpServerHandler.class);
4243

4344
private static final AsciiString APPLICATION_RESTATE = AsciiString.cached("application/restate");
45+
private static final AsciiString X_RESTATE_SERVER_KEY = AsciiString.cached("x-restate-server");
46+
private static final AsciiString X_RESTATE_SERVER_VALUE =
47+
AsciiString.cached(Version.X_RESTATE_SERVER);
4448
private static final ObjectMapper MANIFEST_OBJECT_MAPPER = new ObjectMapper();
4549

4650
private static final Pattern SLASH = Pattern.compile(Pattern.quote("/"));
@@ -127,7 +131,9 @@ public void handle(HttpServerRequest request) {
127131
// Vert.x will send them as soon as we send the first write
128132
HttpServerResponse response = request.response();
129133
response.setStatusCode(OK.code());
130-
response.putHeader(CONTENT_TYPE, APPLICATION_RESTATE);
134+
response
135+
.putHeader(CONTENT_TYPE, APPLICATION_RESTATE)
136+
.putHeader(X_RESTATE_SERVER_KEY, X_RESTATE_SERVER_VALUE);
131137
// This is No-op for HTTP2
132138
response.setChunked(true);
133139

@@ -159,6 +165,7 @@ private void handleDiscoveryRequest(HttpServerRequest request) {
159165
request
160166
.response()
161167
.setStatusCode(OK.code())
168+
.putHeader(X_RESTATE_SERVER_KEY, X_RESTATE_SERVER_VALUE)
162169
.putHeader(CONTENT_TYPE, APPLICATION_JSON)
163170
.end(responseBuffer);
164171
}

sdk-lambda/src/main/java/dev/restate/sdk/lambda/RestateLambdaEndpoint.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import dev.restate.sdk.core.ResolvedEndpointHandler;
2020
import dev.restate.sdk.core.RestateEndpoint;
2121
import dev.restate.sdk.core.manifest.DeploymentManifestSchema;
22+
import dev.restate.sdk.version.Version;
2223
import io.opentelemetry.api.OpenTelemetry;
2324
import io.opentelemetry.context.propagation.TextMapGetter;
2425
import java.nio.ByteBuffer;
@@ -39,9 +40,9 @@ public final class RestateLambdaEndpoint {
3940
private static final String INVOKE_PATH_SEGMENT = "invoke";
4041
private static final String DISCOVER_PATH = "/discover";
4142
private static final Map<String, String> INVOKE_RESPONSE_HEADERS =
42-
Map.of("content-type", "application/restate");
43+
Map.of("content-type", "application/restate", "x-restate-server", Version.X_RESTATE_SERVER);
4344
private static final Map<String, String> DISCOVER_RESPONSE_HEADERS =
44-
Map.of("content-type", "application/json");
45+
Map.of("content-type", "application/json", "x-restate-server", Version.X_RESTATE_SERVER);
4546

4647
private static TextMapGetter<Map<String, String>> OTEL_HEADERS_GETTER =
4748
new TextMapGetter<>() {

0 commit comments

Comments
 (0)