我正在使用“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管道?
答案 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
}