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

时间:2013-01-10 04:48:23

标签: http

考虑一个大的HTTP请求:

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

...

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

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

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

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

2 个答案:

答案 0 :(得分:22)

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

  

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

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

  

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

说明客户端可以使用合适的凭据重试。

我没有进行任何实验来查看浏览器的实际执行情况。

答案 1 :(得分:-1)

要使其成为可能,您需要使用双线程HTTP客户端或支持异步I / O的HTTP客户端。我找不到任何这样的HTTP客户端。

但是,您可以设计一个应用层协商协议来达到相同的效果:

在您的客户端应用程序中,分别发起3个更改消息传递,接收和发送的请求。

  1. GET / xxx / connect(使用服务器发送的事件或WebSocket创建任务进程并监视任务状态)
  2. GET / xxx / out?pid = 23534(从服务器接收处理后的结果)
  3. POST / xxx / in?pid = 23534(将数据发送到服务器进程)

在服务器应用程序中,使用4个线程

  1. 开始新的任务流程并立即发布流程状态
  2. 获取out
  3. 获取in
  4. 开始处理