我有一个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();
}
/* ... */
或者这样终止套接字是不是很糟糕?我是不是很熟悉是否使用http keep-alive连接调用套接字上的.end()
,或者对性能有任何影响。
感谢您的帮助!
答案 0 :(得分:2)
现在,从技术上讲,客户端在收到304后不关心响应主体。
304响应不应包含响应正文。如果是这样,那将违反协议,您应该关闭连接。 RFC2616:
304响应绝不能包含消息体,因此总是在头字段后面的第一个空行终止。