收到304后我应该关闭代理连接吗?

时间:2014-12-29 19:20:55

标签: javascript node.js sockets http proxy

我有一个http请求/回复问题。

我们说我有一个代理服务器,只是将客户端的请求转发给第三方服务器,第三方服务器的响应回到客户端:

var http = require('http');
var url = require('url');

http.createServer(function (req, res) {

  var opts = {
    hostname : 'www.example.com',
    port     : 80,
    path     : req.url,
    method   : req.method,
    headers  : req.headers
  };
  opts.headers.host = opts.host;

  var proxyReq = http.request(opts, function (proxyResponse) {
    res.writeHead(proxyResponse.statusCode, proxyResponse.headers);
    proxyResponse.pipe(res);
  });

  req.pipe(proxyReq);

}).listen(3000);

让我们说客户端是缓存感知的(就像浏览器一样),它传递了一个if-modified-sinceif-none-match(或其他)标头,导致第三方服务器响应304状态代码。

现在,从技术上讲,服务器不应该发送一个正文,而客户端在收到304之后并不关心响应正文。

通过在错误地发送带有304的响应主体的服务器的代理响应处理程序中执行此操作,它是否有意义(并且会节省任何带宽/资源):

var proxyReq = http.request(opts, function (proxyResponse) {

  // Terminate the request, and respond with empty body.
  if (proxyResponse.statusCode === 304) {
    proxyResponse.connection.end();
    return res.end();
  }

  /* ... */

或者这样终止套接字是不是很糟糕?我是不是很熟悉是否使用http keep-alive连接调用套接字上的.end(),或者对性能有任何影响。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

  

现在,从技术上讲,客户端在收到304后不关心响应主体。

304响应不应包含响应正文。如果是这样,那将违反协议,您应该关闭连接。 RFC2616:

  

304响应绝不能包含消息体,因此总是在头字段后面的第一个空行终止。