如何匹配但不消耗Akka HTTP中的路径前缀?

时间:2017-11-20 12:15:20

标签: scala akka akka-http

我的Akka HTTP应用程序将一些请求反向代理到内部HTTP系统:

pathPrefix("/api/") {
  (path("some-upload-endpoint") & post) {
    withSizeLimit(10 * 1024 * 1024) {
      reverseProxyToBackend(rc)
    }
  } ~ reverseProxyToBackend(rc)
}

reverseProxyToBackend是一个自定义指令,它接收传入的请求,添加一些标头并根据剩余的不匹配的路径将其转发到后端系统。 IOW,/api/foobar变为backend.example.com/foobar

对于某个路径some-upload-endpoint但是我需要增加前端的默认大小限制,因为我们期望更大的请求到此端点。

不幸的是,path("some-upload-endpoint") 消耗了剩余的路径,因此上面的代码reverseProxyToBackend会转发到backend.example.com而不是backend.example.com/some-upload-endpoint,这是不是我想要的。

如何匹配Akka HTTP中的路径,但使用它?换句话说,我可以使用哪些指令来保持路径匹配器不受影响的不匹配路径?如果没有这样的指令,我该如何恢复无与伦比的路径?

2 个答案:

答案 0 :(得分:2)

extractMatchedPath应该"重建"已经匹配的路径。来自文档:

  

extractMatchedPath指令提取已经存在的路径   由任何PathDirectives(或任何自定义的PathDirectives)匹配   请求上下文的不匹配路径字段)。你可以用它   构建在其逻辑中使用已匹配部分的指令。

答案 1 :(得分:0)

添加到Ramon的答案中,您可以使用mapRequestContext恢复不匹配的路径:

extractMatchedPath { matchedPath =>
  mapRequestContext(_.withUnmatchedPath(matchedPath)) { // reset the "unmatchedPath"
    ...
  }
}

您可能还对pathPrefixTest,rawPathPrefixTest等感兴趣。基本上,pathPrefixTest类似于pathPrefix,但它并不“消耗”路径段。