akka http是否应该尝试结束已指定Expect:100-continue的传入HTTP POST请求,其中系统中存在任何背压?

时间:2016-04-04 11:19:23

标签: scala akka akka-stream akka-http

当客户端发送“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的行为是否是预期的,特别是:

  • akka http应该尝试关闭已指定Expect: 100-continue的传入HTTP POST请求,其中系统中存在任何背压,即使在这种情况下由于传入流的方式背压是不可避免的,因此背压也是不可避免的链接到传出流?
  • akka http是否应该继续处理传入的请求,即使它已经向客户回复了200 OK?
  • 或者,我只是做错了什么?

这是使用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   

0 个答案:

没有答案