当客户端发送“Expect:100-continue”标头作为请求导致系统背压的发布请求的一部分时,我在akka http端点中遇到了一些意外行为。下面(设计的)端点是我能找到的最简单的方法来重现这种行为 - 我不是试图上传文件,当我尝试将传入的POST数据传输到服务器进程的stdin时,我实际上遇到了这个问题。从该进程的stdout返回数据。但问题似乎是相同的。
val route = path("test") {
post {
extractRequest { httpRequest =>
val file = new File("test-123")
def fileWritingFuture = httpRequest.entity.dataBytes.runWith(FileIO.toFile(file))
def fileSource = Source.fromFuture(fileWritingFuture).map(x => ByteString("")).drop(1).concat(FileIO.fromFile(file))
complete(HttpEntity.Chunked.fromData(`application/pdf`, fileSource))
}
}
}
当curl客户端(默认情况下发送Expect: 100-continue
标头)使用大小为18kb的POST有效负载时,系统会发送带有Connection: close
标头的200 OK响应,而不是100继续,大概是作为减慢传入请求的一种方式。然后,Curl通过在发送有效负载之前等待2秒(没有收到100 Continue
)来响应此情况,并且端点在该点继续并从文件返回响应。 Curl可能在这里表现不正确,我不确定,但我认为无论如何都可以预期客户可能会不时出现错误行为!
以较小的有效负载发送导致服务器以100继续响应,然后流程立即继续。
此外,正如所料,在curl中省略Expect: 100-continue
标头(通过在命令行上指定-H "Expect:"
)意味着发送了有效负载并立即返回响应。
我的问题是akka http的行为是否是预期的,特别是:
Expect: 100-continue
的传入HTTP POST请求,其中系统中存在任何背压,即使在这种情况下由于传入流的方式背压是不可避免的,因此背压也是不可避免的链接到传出流?这是使用akka版本2.4.3虽然我遇到了与2.4.2相同(或非常相似)的问题
由于
史蒂夫编辑:为清晰起见添加curl命令行
标准通话(curl包括Expect: 100-continue
)
curl --trace-ascii curl-trace.txt --data "@post-test1.html" -X POST http://localhost:8080/test
使用标题覆盖调用(排除Expect: 100-continue
)
curl -H "Expect:" --trace-ascii curl-trace.txt --data "@post-test1.html" -X POST http://localhost:8080/test