Skip to content

Instantly share code, notes, and snippets.

@AlejandroRivera
Last active January 30, 2018 11:30
Show Gist options
  • Save AlejandroRivera/713207c8e4b3699c6383c2ce3d706859 to your computer and use it in GitHub Desktop.
Save AlejandroRivera/713207c8e4b3699c6383c2ce3d706859 to your computer and use it in GitHub Desktop.
Using Play's MVC RequestHeader info in a WS Client filter
import javax.inject.{Inject, Singleton}
import play.api.libs.ws.{WSClient, WSRequest, WSRequestFilter}
@Singleton
class MyWsClient @Inject()(wsClient: WSClient,
filters: java.util.Set[WSRequestFilter] ) extends WSClient {
override def underlying[T]: T = wsClient.asInstanceOf[T]
override def url (url: String): WSRequest = {
val request: WSRequest = wsClient.url(url)
filters.forEach(filter => request.withRequestFilter(filter))
request
}
override def close (): Unit = wsClient.close ()
}
@Singleton
class TracerForwarderWsClientFilter @Inject()(configuration: Config)
(implicit parentRequest: RequestHeader) extends WSRequestFilter {
val someValue = configuration.getInt("foobar")
override def apply(executor: WSRequestExecutor): WSRequestExecutor = {
(request: StandaloneWSRequest) => {
request.addHttpHeaders(("x-tracer-id", parentRequest.headers.get("x-tracer-id").getOrElse("n/a")))
executor.apply(request)
}
}
}
import com.google.inject.AbstractModule
import com.google.inject.multibindings.Multibinder
import play.api.libs.ws.WSRequestFilter
class WsClientFiltersModule extends AbstractModule {
override protected def configure(): Unit = {
val requestFilterMultibinder: Multibinder[WSRequestFilter] = Multibinder.newSetBinder(binder, classOf[WSRequestFilter])
requestFilterMultibinder.addBinding().to(classOf[TracerForwarderWsClientFilter]).asEagerSingleton()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment