在收到整个请求之前,服务器是否可以发送HTTP响应?

jos*_*736 35 http

考虑一个大的HTTP请求:

POST /upload HTTP/1.1
Content-Type: multipart/form-data
Content-Length: 1048576

...
Run Code Online (Sandbox Code Playgroud)

客户端现在开始上传一兆字节的数据,这可能需要一段时间.但是,服务器确定需要HTTP授权,因此它决定它将响应HTTP 401 Unauthorized.

必须服务器等待,直到它收到整个请求(IE,标头+ CRLF CRLF + Content-Length字节)才能响应?

实际上,这种行为会破坏任何浏览器吗?浏览器是否继续上传文件,或者如果收到"过早"响应,它们是否会停止传输?

更重要的是,在这种情况下,他们是否能够成功进行身份验证并再次开始上传(使用凭据),或者像这样切断上传是否不可靠?

小智 24

查看定义协议的RFC 2616,在8.2.2节监视错误状态消息的连接中,它指出

发送消息体的HTTP/1.1(或更高版本)客户端应该在发送请求时监视网络连接的错误状态.如果客户端看到错误状态,它应该立即停止传输正文.

所以我会说使用你可以跳转发送401错误.然后看10.4.2 401 Unauthorized

该请求需要用户身份验证.响应必须包含WWW-Authenticate头字段(第14.47节),其中包含适用于所请求资源的质询.客户端可以使用合适的Authorization头字段重复请求

客户端可以使用适当的凭据重试的状态.

我没有进行任何实验来看看浏览器实际上是如何执行的.

  • 我最后[测试此行为](http://stackoverflow.com/a/18370751/201952)有一个稍微不同的问题,答案不是很好.在完成发送请求之前,所有浏览器都不会处理早期响应. (7认同)
  • 好的,所以 RFC 声明客户端应该“停止传输正文”。但是服务器无法知道下一个请求从哪里开始,所以客户端“停止传输”就意味着断开连接,因为保持连接需要知道请求的结束。 (3认同)
  • 我看到了同样的问题。所有浏览器都看不到来自服务器的实际响应。他们传输整个事情,并看到连接已关闭并重试。如果浏览器未修复,则服务器必须进行补偿,并且在接收所有发送的有效负载时资源会受到影响。如果这样做,就会产生 DDOS 攻击的可能性,等待数据上传后再响应。不好。浏览器需要支持规范。 (3认同)
  • 似乎Apache HttpClient for Java无法在服务器上不能读取整个请求体,这很可悲:(我们遇到了这个问题,当不使用先发制人的HTTP Basic身份验证时,服务器已经从头部看到了请求不能被允许并立即发回HTTP 401.我知道curl和wget可以在这种情况下存活.我的意见是,所有客户端都应该能够处理这个问题,因为服务器可以防止拒绝这一点很重要恶意客户端发送大量请求可以实现服务攻击. (2认同)
  • 反过来,我发现,当请求仍在发送时,Apache HttpClient for Java 的异步版本确实会在早期响应时停止发送,但这个版本即使没有错误状态也会这样做。 (2认同)