【发布时间】: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-since 或 if-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