From 8aedf9c097e229b4e81022e5370f225f869fc253 Mon Sep 17 00:00:00 2001 From: dabico Date: Tue, 9 Jan 2024 00:17:20 +0100 Subject: [PATCH 1/9] Rename `HttpClientConfig` to `OkHttpClientConfig` --- .../config/{HttpClientConfig.java => OkHttpClientConfig.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/ch/usi/si/seart/config/{HttpClientConfig.java => OkHttpClientConfig.java} (98%) diff --git a/src/main/java/ch/usi/si/seart/config/HttpClientConfig.java b/src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java similarity index 98% rename from src/main/java/ch/usi/si/seart/config/HttpClientConfig.java rename to src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java index d7b6b7fe..4f75341a 100644 --- a/src/main/java/ch/usi/si/seart/config/HttpClientConfig.java +++ b/src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java @@ -15,7 +15,7 @@ import java.util.concurrent.TimeUnit; @Configuration -public class HttpClientConfig { +public class OkHttpClientConfig { @Bean Headers headers(GitHubProperties properties) { From 41aeee304524431982892bc3065399e466983a21 Mon Sep 17 00:00:00 2001 From: dabico Date: Tue, 9 Jan 2024 12:40:57 +0100 Subject: [PATCH 2/9] Add `GitHubHttpHeaders` This utility class will be used to store the names of all the `X` headers from GitHub --- src/main/java/ch/usi/si/seart/config/GraphQlConfig.java | 3 ++- .../java/ch/usi/si/seart/config/OkHttpClientConfig.java | 4 +++- .../java/ch/usi/si/seart/github/GitHubHttpHeaders.java | 9 +++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ch/usi/si/seart/github/GitHubHttpHeaders.java diff --git a/src/main/java/ch/usi/si/seart/config/GraphQlConfig.java b/src/main/java/ch/usi/si/seart/config/GraphQlConfig.java index 2f2924bc..e727d392 100644 --- a/src/main/java/ch/usi/si/seart/config/GraphQlConfig.java +++ b/src/main/java/ch/usi/si/seart/config/GraphQlConfig.java @@ -3,6 +3,7 @@ import ch.usi.si.seart.config.properties.GitHubProperties; import ch.usi.si.seart.github.Endpoint; import ch.usi.si.seart.github.GitHubGraphQlConnector; +import ch.usi.si.seart.github.GitHubHttpHeaders; import ch.usi.si.seart.github.GitHubTokenManager; import ch.usi.si.seart.reactive.LoggingFilterFunction; import io.netty.channel.ChannelOption; @@ -42,7 +43,7 @@ WebClient webClient( return WebClient.builder() .baseUrl(Endpoint.GRAPH_QL.toString()) .clientConnector(reactorClientHttpConnector) - .defaultHeader("X-GitHub-Api-Version", properties.getApiVersion()) + .defaultHeader(GitHubHttpHeaders.X_GITHUB_API_VERSION, properties.getApiVersion()) .filter(loggingFilterFunction) .filter(authorizationFilterFunction) .build(); diff --git a/src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java b/src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java index 4f75341a..dbf4836e 100644 --- a/src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java +++ b/src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java @@ -1,6 +1,8 @@ package ch.usi.si.seart.config; import ch.usi.si.seart.config.properties.GitHubProperties; +import ch.usi.si.seart.github.GitHubHttpHeaders; +import ch.usi.si.seart.github.GitHubMediaTypes; import ch.usi.si.seart.github.GitHubRestConnector; import ch.usi.si.seart.http.interceptor.HeaderAttachmentInterceptor; import ch.usi.si.seart.http.interceptor.LoggingInterceptor; @@ -21,7 +23,7 @@ public class OkHttpClientConfig { Headers headers(GitHubProperties properties) { return Headers.of( HttpHeaders.ACCEPT, "application/vnd.github+json", - "X-GitHub-Api-Version", properties.getApiVersion() + GitHubHttpHeaders.X_GITHUB_API_VERSION, properties.getApiVersion() ); } diff --git a/src/main/java/ch/usi/si/seart/github/GitHubHttpHeaders.java b/src/main/java/ch/usi/si/seart/github/GitHubHttpHeaders.java new file mode 100644 index 00000000..0b665bac --- /dev/null +++ b/src/main/java/ch/usi/si/seart/github/GitHubHttpHeaders.java @@ -0,0 +1,9 @@ +package ch.usi.si.seart.github; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public final class GitHubHttpHeaders { + + public static final String X_GITHUB_API_VERSION = "X-GitHub-Api-Version"; +} From cdbb8dc57d6348243a5e064bb372c9443dc5fa2a Mon Sep 17 00:00:00 2001 From: dabico Date: Tue, 9 Jan 2024 12:47:43 +0100 Subject: [PATCH 3/9] Add `GitHubMediaTypes` This utility class only holds one `MediaType` specific to GitHub that we use in the app. Might be further extended in the future. --- .../si/seart/config/OkHttpClientConfig.java | 2 +- .../usi/si/seart/github/GitHubMediaTypes.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ch/usi/si/seart/github/GitHubMediaTypes.java diff --git a/src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java b/src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java index dbf4836e..6d0a17f4 100644 --- a/src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java +++ b/src/main/java/ch/usi/si/seart/config/OkHttpClientConfig.java @@ -22,7 +22,7 @@ public class OkHttpClientConfig { @Bean Headers headers(GitHubProperties properties) { return Headers.of( - HttpHeaders.ACCEPT, "application/vnd.github+json", + HttpHeaders.ACCEPT, GitHubMediaTypes.APPLICATION_VND_GITHUB_V3_JSON_VALUE, GitHubHttpHeaders.X_GITHUB_API_VERSION, properties.getApiVersion() ); } diff --git a/src/main/java/ch/usi/si/seart/github/GitHubMediaTypes.java b/src/main/java/ch/usi/si/seart/github/GitHubMediaTypes.java new file mode 100644 index 00000000..6671baac --- /dev/null +++ b/src/main/java/ch/usi/si/seart/github/GitHubMediaTypes.java @@ -0,0 +1,19 @@ +package ch.usi.si.seart.github; + +import lombok.experimental.UtilityClass; +import org.springframework.http.MediaType; + +@UtilityClass +public class GitHubMediaTypes { + + public static final MediaType APPLICATION_VND_GITHUB_V3_JSON; + + public static final String APPLICATION_VND_GITHUB_V3_JSON_VALUE; + + static { + String type = "application"; + String subtype = "vnd.github.v3+json"; + APPLICATION_VND_GITHUB_V3_JSON = new MediaType(type, subtype); + APPLICATION_VND_GITHUB_V3_JSON_VALUE = type + "/" + subtype; + } +} From 045fd2a68cedcf090e46bb12b9efc483eea9d80f Mon Sep 17 00:00:00 2001 From: dabico Date: Tue, 9 Jan 2024 13:56:03 +0100 Subject: [PATCH 4/9] Log GitHub request IDs at `TRACE` level Also includes a new `GitHubHttpHeaders` value --- src/main/java/ch/usi/si/seart/github/GitHubHttpHeaders.java | 2 ++ .../ch/usi/si/seart/http/interceptor/LoggingInterceptor.java | 5 +++++ .../java/ch/usi/si/seart/reactive/LoggingFilterFunction.java | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/src/main/java/ch/usi/si/seart/github/GitHubHttpHeaders.java b/src/main/java/ch/usi/si/seart/github/GitHubHttpHeaders.java index 0b665bac..c7003b28 100644 --- a/src/main/java/ch/usi/si/seart/github/GitHubHttpHeaders.java +++ b/src/main/java/ch/usi/si/seart/github/GitHubHttpHeaders.java @@ -5,5 +5,7 @@ @UtilityClass public final class GitHubHttpHeaders { + public static final String X_GITHUB_REQUEST_ID = "X-GitHub-Request-Id"; + public static final String X_GITHUB_API_VERSION = "X-GitHub-Api-Version"; } diff --git a/src/main/java/ch/usi/si/seart/http/interceptor/LoggingInterceptor.java b/src/main/java/ch/usi/si/seart/http/interceptor/LoggingInterceptor.java index 655d68c1..ac41f9ca 100644 --- a/src/main/java/ch/usi/si/seart/http/interceptor/LoggingInterceptor.java +++ b/src/main/java/ch/usi/si/seart/http/interceptor/LoggingInterceptor.java @@ -1,8 +1,10 @@ package ch.usi.si.seart.http.interceptor; +import ch.usi.si.seart.github.GitHubHttpHeaders; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.experimental.FieldDefaults; +import okhttp3.Headers; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; @@ -35,6 +37,9 @@ public Response intercept(@NotNull Chain chain) throws IOException { long endNs = System.nanoTime(); long ms = TimeUnit.NANOSECONDS.toMillis(endNs - startNs); log.debug("<<< {} ({}ms)", response.code(), ms); + Headers headers = response.headers(); + String id = headers.get(GitHubHttpHeaders.X_GITHUB_REQUEST_ID); + log.trace("[[[ {} ]]]", id); return response; } } diff --git a/src/main/java/ch/usi/si/seart/reactive/LoggingFilterFunction.java b/src/main/java/ch/usi/si/seart/reactive/LoggingFilterFunction.java index a88c025f..fe6f4054 100644 --- a/src/main/java/ch/usi/si/seart/reactive/LoggingFilterFunction.java +++ b/src/main/java/ch/usi/si/seart/reactive/LoggingFilterFunction.java @@ -1,10 +1,12 @@ package ch.usi.si.seart.reactive; +import ch.usi.si.seart.github.GitHubHttpHeaders; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.experimental.FieldDefaults; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; +import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; @@ -29,6 +31,9 @@ public Mono filter(@NotNull ClientRequest request, @NotNull Exch long endNs = System.nanoTime(); long ms = TimeUnit.NANOSECONDS.toMillis(endNs - startNs); log.debug("<<< {} ({}ms)", response.rawStatusCode(), ms); + HttpHeaders headers = response.headers().asHttpHeaders(); + String id = headers.getFirst(GitHubHttpHeaders.X_GITHUB_REQUEST_ID); + log.trace("[[[ {} ]]]", id); }) .doOnError(ex -> { if (log.isDebugEnabled()) From 686297ffe61e67cb41d0b62f38f07da01d11d1a4 Mon Sep 17 00:00:00 2001 From: dabico Date: Tue, 9 Jan 2024 13:56:59 +0100 Subject: [PATCH 5/9] Add `TRACE` logging option for debugging run configuration --- .run/springboot/GHSApplication [debug].run.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.run/springboot/GHSApplication [debug].run.xml b/.run/springboot/GHSApplication [debug].run.xml index e016ae3a..44dd1315 100644 --- a/.run/springboot/GHSApplication [debug].run.xml +++ b/.run/springboot/GHSApplication [debug].run.xml @@ -33,6 +33,10 @@