Skip to content

Commit 75ec70c

Browse files
authored
Be able to filter incoming headers, remove Connection* headers by default (#62)
1 parent 48c9499 commit 75ec70c

File tree

4 files changed

+20
-4
lines changed

4 files changed

+20
-4
lines changed

core/src/main/scala/org/ivovk/connect_rpc_scala/ConnectHandler.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class ConnectHandler[F[_] : Async](
2121
channel: Channel,
2222
errorHandler: ErrorHandler[F],
2323
treatTrailersAsHeaders: Boolean,
24+
incomingHeadersFilter: String => Boolean,
2425
) {
2526

2627
private val logger: Logger = LoggerFactory.getLogger(getClass)
@@ -75,7 +76,7 @@ class ConnectHandler[F[_] : Async](
7576
channel,
7677
method.descriptor,
7778
callOptions,
78-
req.headers.toMetadata,
79+
req.headers.toMetadata(incomingHeadersFilter),
7980
message
8081
)
8182
}

core/src/main/scala/org/ivovk/connect_rpc_scala/ConnectRouteBuilder.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import scala.concurrent.duration.*
2121

2222
object ConnectRouteBuilder {
2323

24+
private val DefaultIncomingHeadersFilter: String => Boolean = name =>
25+
!name.toLowerCase.startsWith("connection")
26+
2427
def forService[F[_] : Async](service: ServerServiceDefinition): ConnectRouteBuilder[F] =
2528
forServices(Seq(service))
2629

@@ -33,6 +36,7 @@ object ConnectRouteBuilder {
3336
serverConfigurator = identity,
3437
channelConfigurator = identity,
3538
customJsonCodec = None,
39+
incomingHeadersFilter = DefaultIncomingHeadersFilter,
3640
pathPrefix = Uri.Path.Root,
3741
executor = ExecutionContext.global,
3842
waitForShutdown = 5.seconds,
@@ -46,6 +50,7 @@ final class ConnectRouteBuilder[F[_] : Async] private(
4650
serverConfigurator: Endo[ServerBuilder[_]],
4751
channelConfigurator: Endo[ManagedChannelBuilder[_]],
4852
customJsonCodec: Option[JsonMessageCodec[F]],
53+
incomingHeadersFilter: String => Boolean,
4954
pathPrefix: Uri.Path,
5055
executor: Executor,
5156
waitForShutdown: Duration,
@@ -57,6 +62,7 @@ final class ConnectRouteBuilder[F[_] : Async] private(
5762
serverConfigurator: Endo[ServerBuilder[_]] = serverConfigurator,
5863
channelConfigurator: Endo[ManagedChannelBuilder[_]] = channelConfigurator,
5964
customJsonCodec: Option[JsonMessageCodec[F]] = customJsonCodec,
65+
incomingHeadersFilter: String => Boolean = incomingHeadersFilter,
6066
pathPrefix: Uri.Path = pathPrefix,
6167
executor: Executor = executor,
6268
waitForShutdown: Duration = waitForShutdown,
@@ -67,6 +73,7 @@ final class ConnectRouteBuilder[F[_] : Async] private(
6773
serverConfigurator,
6874
channelConfigurator,
6975
customJsonCodec,
76+
incomingHeadersFilter,
7077
pathPrefix,
7178
executor,
7279
waitForShutdown,
@@ -82,6 +89,9 @@ final class ConnectRouteBuilder[F[_] : Async] private(
8289
def withJsonCodecConfigurator(method: Endo[JsonMessageCodecBuilder[F]]): ConnectRouteBuilder[F] =
8390
copy(customJsonCodec = Some(method(JsonMessageCodecBuilder[F]()).build))
8491

92+
def withIncomingHeadersFilter(filter: String => Boolean): ConnectRouteBuilder[F] =
93+
copy(incomingHeadersFilter = filter)
94+
8595
def withPathPrefix(path: Uri.Path): ConnectRouteBuilder[F] =
8696
copy(pathPrefix = path)
8797

@@ -136,6 +146,7 @@ final class ConnectRouteBuilder[F[_] : Async] private(
136146
channel,
137147
errorHandler,
138148
treatTrailersAsHeaders,
149+
incomingHeadersFilter,
139150
)
140151

141152
val connectRoutes = HttpRoutes[F] {
@@ -172,6 +183,7 @@ final class ConnectRouteBuilder[F[_] : Async] private(
172183
val transcodingHandler = new TranscodingHandler(
173184
channel,
174185
errorHandler,
186+
incomingHeadersFilter,
175187
)
176188

177189
val transcodingRoutes = HttpRoutes[F] { req =>

core/src/main/scala/org/ivovk/connect_rpc_scala/Mappings.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ object Mappings extends HeaderMappings, StatusCodeMappings, ResponseCodeExtensio
1212
trait HeaderMappings {
1313

1414
extension (headers: Headers) {
15-
def toMetadata: Metadata = {
15+
def toMetadata(filter: String => Boolean): Metadata = {
1616
val metadata = new Metadata()
1717
headers.foreach { header =>
18-
metadata.put(asciiKey(header.name.toString), header.value)
18+
if (filter(header.name.toString)) {
19+
metadata.put(asciiKey(header.name.toString), header.value)
20+
}
1921
}
2022
metadata
2123
}

core/src/main/scala/org/ivovk/connect_rpc_scala/TranscodingHandler.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import scala.util.chaining.*
2020
class TranscodingHandler[F[_] : Async](
2121
channel: Channel,
2222
errorHandler: ErrorHandler[F],
23+
incomingHeadersFilter: String => Boolean,
2324
) {
2425

2526
private val logger: Logger = LoggerFactory.getLogger(getClass)
@@ -55,7 +56,7 @@ class TranscodingHandler[F[_] : Async](
5556
channel,
5657
method.descriptor,
5758
callOptions,
58-
headers.toMetadata,
59+
headers.toMetadata(incomingHeadersFilter),
5960
message
6061
)
6162
.map { response =>

0 commit comments

Comments
 (0)