From baed122f243fe1a06f4df640e19e649874abe39a Mon Sep 17 00:00:00 2001 From: David Grochowski Date: Sat, 31 Aug 2024 00:49:51 -0400 Subject: [PATCH] Use h2c when configuring gRPC clients with http:// URLs This allows service meshes to manage mTLS on backfila's behalf --- .../client/GrpcCallbackConnectorProvider.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/service/src/main/kotlin/app/cash/backfila/client/GrpcCallbackConnectorProvider.kt b/service/src/main/kotlin/app/cash/backfila/client/GrpcCallbackConnectorProvider.kt index 26c3fc122..fa84d3cf1 100644 --- a/service/src/main/kotlin/app/cash/backfila/client/GrpcCallbackConnectorProvider.kt +++ b/service/src/main/kotlin/app/cash/backfila/client/GrpcCallbackConnectorProvider.kt @@ -12,6 +12,7 @@ import misk.client.HttpClientConfigUrlProvider import misk.client.HttpClientFactory import misk.client.HttpClientsConfig import misk.moshi.adapter +import okhttp3.Protocol @Singleton class GrpcCallbackConnectorProvider @Inject constructor( @@ -49,16 +50,22 @@ class GrpcCallbackConnectorProvider @Inject constructor( val headers: List? = extraData!!.headers val httpClientEndpointConfig = httpClientsConfig[url] - var okHttpClient = httpClientFactory.create(httpClientEndpointConfig) + val baseUrl = httpClientConfigUrlProvider.getUrl(httpClientEndpointConfig) + + val okHttpClientBuilder = httpClientFactory.create(httpClientEndpointConfig).newBuilder() if (!headers.isNullOrEmpty()) { - okHttpClient = okHttpClient.newBuilder() - .addInterceptor(OkHttpClientSpecifiedHeadersInterceptor(headers)) - .build() + okHttpClientBuilder.addInterceptor(OkHttpClientSpecifiedHeadersInterceptor(headers)) + } + + // Since gRPC uses HTTP/2, force h2c when calling an unencrypted endpoint + if (baseUrl.startsWith("http://")) { + okHttpClientBuilder.protocols(listOf(Protocol.H2_PRIOR_KNOWLEDGE)) + } else { + okHttpClientBuilder.protocols(listOf(Protocol.HTTP_2, Protocol.HTTP_1_1)) } - val baseUrl = httpClientConfigUrlProvider.getUrl(httpClientEndpointConfig) val grpcClient = GrpcClient.Builder() - .client(okHttpClient) + .client(okHttpClientBuilder.build()) .baseUrl(baseUrl) .build() val api = grpcClient.create(BackfilaClientServiceClient::class)