scala - Play 何时何地设置 Content-Length header ?

标签 scala http playframework content-length

我正在尝试使用 Common Log Format 记录我的 Play 应用程序收到的每个请求。

我可以在 Filter 中获取所有这些字段除了身长以外都还好。

我注意到,调用 Play 会返回 Content-Length,因为 Play 会自动计算出它,而无需您告诉它(除非您正在使用 Chunked Responses 等做一些时髦的事情)。

这会让我相信,在过滤器中,我可以简单地调用

next(rh).map{ response => log(response.header.headers.get("Content-Length")); response }

但是这会返回None!然而,当我 curl 任何调用时,我都会看到标题。这意味着 Content-Length 必须在 Filter 之后设置,但是在哪里呢?我如何/可以从 Global.scala 访问它?如果没有,那么任何人都知道获取此信息的简单方法(通过编程或其他方式)。

我使用的是 Play 2.2.3

最佳答案

回复内容长度是在将数据写回netty响应的iteratee中设置的,它会根据推送到iteratee的内容选择是否应该设置内容长度或开始对响应进行分块,因此实际上不会计算您可以在过滤器中访问的任何位置。您可以在此处检查发生这种情况的来源:

https://github.com/playframework/playframework/blob/2.3.x/framework/src/play/src/main/scala/play/core/server/netty/NettyResultStreamer.scala#L119

关于scala - Play 何时何地设置 Content-Length header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25651354/

相关文章:

mongodb - Scala 中是否存在用于 MongoDB "schema"升级的良好框架?

scala - 在 Spark 中广播 Joda DateTime 时出错

ruby - 使用 ruby​​ 的异步 HTTP 请求

playframework - 如何等待一个超时的 Promise?

java - 如何使用 sbt 在 java playframework 项目中导入 jetcd

scala - 为什么 Scala 编译器会因缺少 JavaSparkContext 过滤器的参数类型而失败?

scala - 不同类型List的通用unapply方法

java - 连接开销低的服务

http - 托管在不同域上的 AngularJS 和模板文件

java - 为什么 JUnit 测试在 Play 2.3.1/Java 项目中不起作用?