Skip to content

Remove header filters from ConnectHttp4sChannelBuilder #158

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import org.ivovk.connect_rpc_scala.grpc.ClientCalls
import org.ivovk.connect_rpc_scala.http4s.ConnectHttp4sChannelBuilder
import org.ivovk.connect_rpc_scala.util.PipeSyntax.*
import org.slf4j.LoggerFactory
import scalapb.{GeneratedMessage, GeneratedMessageCompanion}
import scalapb.{GeneratedMessage as Message, GeneratedMessageCompanion as Companion}

import java.util.concurrent.TimeUnit
import scala.concurrent.duration.*
Expand Down Expand Up @@ -94,12 +94,10 @@ object Http4sClientLauncher extends IOApp.Simple {
s"Invalid service name: ${spec.service}.",
)

def doRun[Req <: GeneratedMessage, Resp](
def doRun[Req <: Message: Companion, Resp](
methodDescriptor: MethodDescriptor[Req, Resp]
)(
extractPayloads: Resp => Seq[conformance.ConformancePayload]
)(
using comp: GeneratedMessageCompanion[Req]
): IO[ClientCompatResponse] = {
val request = spec.requestMessages.head.unpack[Req]
val metadata = ConformanceHeadersConv.toMetadata(spec.requestHeaders)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import io.grpc.Channel
import org.http4s.Uri
import org.http4s.client.Client
import org.ivovk.connect_rpc_scala.http.codec.{JsonSerDeser, JsonSerDeserBuilder, ProtoMessageCodec}
import org.ivovk.connect_rpc_scala.http.{HeaderMapping, HeadersFilter}
import org.ivovk.connect_rpc_scala.http4s.client.ConnectHttp4sChannel

object ConnectHttp4sChannelBuilder {
Expand All @@ -16,53 +15,29 @@ object ConnectHttp4sChannelBuilder {
new ConnectHttp4sChannelBuilder(
client = client,
customJsonSerDeser = None,
incomingHeadersFilter = HeaderMapping.DefaultIncomingHeadersFilter,
outgoingHeadersFilter = HeaderMapping.DefaultOutgoingHeadersFilter,
useBinaryFormat = false,
)
}

class ConnectHttp4sChannelBuilder[F[_]: Async] private (
client: Client[F],
customJsonSerDeser: Option[JsonSerDeser[F]],
incomingHeadersFilter: HeadersFilter,
outgoingHeadersFilter: HeadersFilter,
useBinaryFormat: Boolean,
) {

private def copy(
customJsonSerDeser: Option[JsonSerDeser[F]] = customJsonSerDeser,
incomingHeadersFilter: HeadersFilter = incomingHeadersFilter,
outgoingHeadersFilter: HeadersFilter = outgoingHeadersFilter,
useBinaryFormat: Boolean = useBinaryFormat,
): ConnectHttp4sChannelBuilder[F] =
new ConnectHttp4sChannelBuilder(
client,
customJsonSerDeser,
incomingHeadersFilter,
outgoingHeadersFilter,
useBinaryFormat,
)

def withJsonCodecConfigurator(method: Endo[JsonSerDeserBuilder[F]]): ConnectHttp4sChannelBuilder[F] =
copy(customJsonSerDeser = Some(method(JsonSerDeserBuilder[F]()).build))

/**
* Filter for incoming headers.
*
* By default, headers with "connection" prefix are filtered out (GRPC requirement).
*/
def withIncomingHeadersFilter(filter: String => Boolean): ConnectHttp4sChannelBuilder[F] =
copy(incomingHeadersFilter = filter)

/**
* Filter for outgoing headers.
*
* By default, headers with "grpc-" prefix are filtered out.
*/
def withOutgoingHeadersFilter(filter: String => Boolean): ConnectHttp4sChannelBuilder[F] =
copy(outgoingHeadersFilter = filter)

/**
* Use protobuf binary format for messages.
*
Expand All @@ -79,11 +54,7 @@ class ConnectHttp4sChannelBuilder[F[_]: Async] private (
if useBinaryFormat then ProtoMessageCodec[F]()
else customJsonSerDeser.getOrElse(JsonSerDeserBuilder[F]().build).codec

val headerMapping = Http4sHeaderMapping(
incomingHeadersFilter,
outgoingHeadersFilter,
treatTrailersAsHeaders = true,
)
val headerMapping = Http4sHeaderMapping(_ => true, _ => true, treatTrailersAsHeaders = true)

new ConnectHttp4sChannel(
httpClient = client,
Expand Down