Поддерживать связь с суперагентом
Я использую сервер A node.js, который использует суперагент для выдачи HTTP-запросов другому серверу B.
Я исследовал запрос на сервере B и увидел заголовок connection
являющийся close
и httpVersion существо 1.1
:
var http = require('http');
var request = require('superagent');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('req.httpVersion seen on server:' + req.httpVersion);
res.write('\nreq.headers.connection seen on server:' + req.headers.connection);
res.end();
}).listen(1337, '0.0.0.0');
request
.get('localhost:1337/helloword')
.end(function (err, res) {
console.log(res.text);
});
Это ведет к:
req.httpVersion seen on server:1.1
req.headers.connection seen on server:close
Однако, если я получаю доступ к тому же серверу из браузера, я получаю:
req.httpVersion seen on server:1.1
req.headers.connection seen on server:keep-alive
Из http://tools.ietf.org/html/rfc2616 я узнал, что keep-alive
по умолчанию для HTTP 1.1, если не указано иное с помощью Connection: close
,
Итак, мои вопросы:
- Почему Superagent / Node.js явно устанавливает запрос, чтобы не использовать keep-alive / постоянные соединения?
- Как заставить Superagent / Node.js использовать keep-alive соединения?
- Как я могу далее влиять на точное поведение (сколько соединений держать открытым, время ожидания и т. Д.)?
2 ответа
Кажется, это не задокументировано, но вы можете передать агенту http суперагенту с помощью функции agent
, Таким образом, вы можете создать агент поддержки активности с помощью этого модуля: https://www.npmjs.org/package/agentkeepalive и передать его суперагенту.
Что-то вроде этого:
util = require('util');
util.debuglog = require('debuglog');
var http = require('http');
var request = require('superagent');
var Agent = require('agentkeepalive');
var keepaliveAgent = new Agent({
maxSockets: 100,
maxFreeSockets: 10,
timeout: 60000,
keepAliveTimeout: 30000 // free socket keepalive for 30 seconds
});
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('req.httpVersion seen on server:' + req.httpVersion);
res.write('\nreq.headers.connection seen on server:' + req.headers.connection);
res.end();
}).listen(1337, '0.0.0.0');
request
.get('localhost:1337/helloword')
.agent(keepaliveAgent)
.end(function (err, res) {
console.log(res.text);
});
Браузеры могут повторно использовать дескриптор сокета, поэтому он отправляет заголовок Connection: keep-alive
на сервер.
Если вы хотите сохранить соединение, вы можете отправить этот заголовок следующим образом:
request
.get('localhost:1337/helloword')
.set('Connection', 'keep-alive')
.end(function (err, res) {
console.log(res.text);
});
For superagent .timeout(5000) is also available to use.
await superagent.get(`${anyurl}`, { rejectUnauthorized: false })
.set({ "Accept": "application/json", "Content-Type": "application/json", })
.auth(username, password, { "type": "auto" })
.timeout(1000)