Зависание сокета при использовании https.request в node.js - PullRequest
2 голосов
/ 04 мая 2011

При использовании https.request с node.js v04.7, я получаю следующую ошибку:

Error: socket hang up
    at CleartextStream.<anonymous> (http.js:1272:45)
    at CleartextStream.emit (events.js:61:17)
    at Array.<anonymous> (tls.js:617:22)
    at EventEmitter._tickCallback (node.js:126:26)

Упрощенный код, который сгенерирует ошибку:

var https = require('https')
  , fs    = require('fs')

var options = {
  host: 'localhost'
, port: 8000
, key: fs.readFileSync('../../test-key.pem')
, cert: fs.readFileSync('../../test-cert.pem')
}

// Set up server and start listening
https.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'})
  res.end('success')
}).listen(options.port, options.host)

// Wait a second to let the server start up
setTimeout(function() {
  var clientRequest = https.request(options, function(res) {
    res.on('data', function (chunk) {
      console.log('Called')
    })
  })

  clientRequest.write('')
  clientRequest.end()
}, 1000)

Я получаюошибка даже в том случае, если сервер и клиент работают на разных экземплярах узлов и протестированы с портами 8000, 3000 и 443, а также с сертификатами SSL и без них.У меня есть libssl и libssl-dev на моей машине с Ubuntu.

Есть идеи о том, что может быть причиной?

Ответы [ 4 ]

1 голос
/ 09 августа 2011

В

https.createServer(function (req, res) {

вам не хватает опций при создании сервера, должно быть:

https.createServer(options, function (req, res) {

с вашим ключом и сертификатом внутри

1 голос
/ 11 июня 2011

У меня была очень похожая проблема, когда конечное событие ответа никогда не запускалось.

Добавление этой строки исправило проблему:

// Hack to emit end on close because of a core bug that never fires end
response.on('close', function () {response.emit('end')});

Я нашел пример этого в библиотеке запросов, упомянутой в предыдущем ответе.

0 голосов
/ 13 июня 2011

У меня была похожая проблема, и я думаю, что я получил решение. но тогда у меня есть еще одна проблема с сокетом. Смотрите мое решение здесь: http://groups.google.com/group/nodejs/browse_thread/thread/9189df2597aa199e/b83b16c08a051706?lnk=gst&q=hang+up#b83b16c08a051706

ключевой момент: используйте 0.4.8, http.request вместо http.createClient.

Однако новая проблема заключается в том, что если я оставляю программу запущенной в течение длительного времени (я фактически оставил ее работающей, но в выходные дни не работал), то при отправке запроса на http-сервер я получу ошибку зависания сокета. , (даже не добраться до http.request). Я не знаю, если это из-за моего кода, или это другая проблема с http Server

0 голосов
/ 17 мая 2011

Краткий ответ: Используйте самый последний исходный код вместо того, который у вас есть.Сохраните его там, где вам нужно, а затем потребуйте его, вы готовы.


В исходном коде запроса 1.2.0, строка main.js 76, я вижу

http.createClient(options.uri.port, options.uri.hostname, options.uri.protocol === 'https:');

Глядя на исходный код http.js , я вижу

exports.createClient = function(port, host) {
  var c = new Client();
  c.port = port;
  c.host = host;
  return c;
};

Он запрашивает 3 параметра, но фактическая функция имеет только 2. Функциональность заменена отдельным модулем дляhttps.

Глядя на последний исходный код main.js , я вижу существенные изменения.Наиболее важным является добавление require('https').

Похоже, что запрос был исправлен, но никогда не переустанавливался.К счастью, исправление, похоже, сработает, если вы просто скопируете вручную из исходное представление последнего исходного кода main.js и используете его вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...