Scala Spray Can:如何使用自定义服务器管道?

时间:2014-04-04 15:58:38

标签: scala spray

我正在使用“IO(Http) ! Http.Bind(self)”启动Spray-Can网络服务器;似乎Spray服务器被硬编码为使用默认管道,该管道全部隐藏在IO(Http)内。我正在使用Spray 1.3.0

在一些与Spray相关的文档中有一个页面describes the server pipeline,它甚至有一个关于“创建管道阶段”的部分(虽然它看起来像)。

但是,如果我创建一个自定义管道阶段,如何让我的Spray Can服务器使用它?

从代码中可以看出,服务器硬编码使用默认管道 - spray.can.server.HttpListener the private pipelineStage val中设置为HttpServerConnection.pipelineStage的静态调用,不允许自定义标准管道设置。

我的具体用例是我想为某些网址启用“requestChunkAggregation”而不是其他网址。

我可以使用“猴子修补”方法覆盖管道,使用与我的代码库中的Spray内部类相同的完全限定名称定义类,然后依赖链接器首先加载它们,但是有一种不那么黑客的方式自定义Spray Can管道?

1 个答案:

答案 0 :(得分:2)

在Spray 1.2.1中为HTTP客户端创建管道阶段要简单得多。以下是我的团队如何使用它:

val logRequest: HttpRequest => HttpRequest = { r => log.debug(r.toString); r }

val logResponse: HttpResponse => HttpResponse = { r => log.debug(r.toString); r }

private val defaultPipeline = defaultRequest ~> logRequest ~> sendReceive ~> logResponse 

def isServerOnline: Future[Boolean] = {
  val responseFuture = defaultPipeline(Get(properties.serverOnlineUrl))
  val serverOnline = responseFuture map { response =>
    response.status == StatusCodes.OK     
  }
  serverOnline
}