2014-12-29 5 views
2

У меня есть вопрос с запросом/ответом на http.Должен ли я закрыть прокси-соединение после получения 304?

Скажем, у меня есть прокси-сервер, который просто пересылает запросы клиента к серверу третьей стороны, а также ответы сервера третьих лиц-обратно к клиенту:

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); 

Допустим, клиент кэш-Aware (как браузер), и он передал заголовок 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 или оказывает какое-либо влияние на производительность.

Благодарим за помощь!

ответ

2

Теперь, технически, клиент не заботится о теле ответа после получения 304.

304 ответа не должно содержать тело ответа. Если это произойдет, это будет нарушением протокола, и вы должны закрыть соединение. RFC2616:

Ответ 304 НЕ ДОЛЖЕН содержать тело сообщения и, таким образом, всегда заканчивается первой пустой строкой после полей заголовка.

Смежные вопросы