【问题标题】:Should I close a proxy connection after receiving a 304?收到 304 后我应该关闭代理连接吗?
【发布时间】:2014-12-30 04:03:37
【问题描述】:

我有一个 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();
  }

  /* ... */

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

感谢您的帮助!

【问题讨论】:

    标签: javascript node.js sockets http proxy


    【解决方案1】:

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

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

    304 响应不得包含消息正文,因此始终以标头字段之后的第一个空行终止。

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 2022-01-15
      • 2019-03-25
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      相关资源
      最近更新 更多