spdy.node.js: я только что получил 324 (ERR_EMPTY_RESPONSE)

Я просто хотел попробовать SPDY, используя пакет узлов "node-spdy".

Мой JavaScript:

РЕДАКТИРОВАТЬ: Теперь скрипт включает в себя информацию о сертификатах. Я взял их из тестового приложения twitlog.

var spdy = require('spdy'),
    fs = require('fs');

var options = {
    key: fs.readFileSync(__dirname + '/keys/spdy-key.pem'),
    cert: fs.readFileSync(__dirname + '/keys/spdy-cert.pem'),
    ca: fs.readFileSync(__dirname + '/keys/spdy-csr.pem')
};

var spdy = require('spdy');

var server = spdy.createServer({}, function(req, res) {
    console.log('Send response...');
    res.writeHead(200, {
        "Content-Type": "text/plain"
    });
    res.write("Hello World!\n");
    res.end();
    console.log('Response has been sended.');
});

server.listen(3000);

Моя проблема: функция обратного вызова никогда не выполняется, соответственно, узел никогда не регистрирует "Отправить ответ..." или "Ответ отправлен". Я просто получаю пустой ответ, но node.js не выбрасывает исключение:

Fehler 324 (net:: ERR_EMPTY_RESPONSE)

Мой серверный конфиг : я использую node.js (версия 0.7.6) и node-spdy (commit eafd9c9fdd) под Windows Se7en.

Моя конфигурация на стороне клиента: я использую сборку Chromium в качестве браузера для тестирования Spdy Out. Во время моих тестов я не использую SSL, поэтому мне пришлось изменить свою конфигурацию. Это то, что вы можете найти под about:net-internals/#spdy:

==SPDY Status==

SPDY Enabled:               true
Use Alternate Protocol:     false
Force SPDY Always:          true
Force SPDY Over SSL:        false
Next Protocols:

Мой отладочный материал на стороне клиента: служба отладки Chromium about:net-internals/#tests говорит мне:

Result  Experiment                      Error                   Time (ms)
FAIL    Fetch http://localhost:3000/
        Don't use any proxy             EMPTY_RESPONSE (-324)   3022

        Fetch http://localhost:3000/
        Use system proxy settings       ?                       ?

РЕДАКТИРОВАТЬ: так как я добавил информацию о сертификате, информация отладки на стороне клиента немного изменилась. Вот самый новый:

Result  Experiment                      Error                   Time (ms)
FAIL    Fetch https://localhost:3000/
        Don't use any proxy             ABORTED (-3)            9

FAIL    Fetch https://localhost:3000/
        Use system proxy settings       ABORTED (-3)            300489

FAIL    Fetch https://localhost:3000/
        Use Firefox's proxy settings    ABORTED (-3)            4

FAIL    Fetch https://localhost:3000/
        Use system proxy settings       ABORTED (-3)            300438

Мой отладочный материал на стороне сервера: вот что мне сообщает встроенный отладчик узлов при получении запроса:

РЕДАКТИРОВАТЬ: Отладка на стороне сервера не изменится, даже если я добавлю информацию сертификата в сценарии.

debug>n
break in net.js:865
 863
 864 function onconnection(clientHandle) {
 865   var handle = this;
 866   var self = handle.socket;
 867
debug>
break in net.js:866
 864 function onconnection(clientHandle) {
 865   var handle = this;
 866   var self = handle.socket;
 867
 868   debug('onconnection');
debug>
break in net.js:868
 866   var self = handle.socket;
 867
 868   debug('onconnection');
 869
 870   if (!clientHandle) {
debug>
break in net.js:870
 868   debug('onconnection');
 869
 870   if (!clientHandle) {
 871     self.emit('error', errnoException(errno, 'accept'));
 872     return;
debug>
break in net.js:875
 873   }
 874
 875   if (self.maxConnections && self.connections >= self.maxConnections) {
 876     clientHandle.close();
 877     return;
debug>
break in net.js:880
 878   }
 879
 880   var socket = new Socket({
 881     handle: clientHandle,
 882     allowHalfOpen: self.allowHalfOpen
debug>
break in net.js:884
 882     allowHalfOpen: self.allowHalfOpen
 883   });
 884   socket.readable = socket.writable = true;
 885
 886   socket.resume();
debug>
break in net.js:886
 884   socket.readable = socket.writable = true;
 885
 886   socket.resume();
 887
 888   self.connections++;
debug>
break in net.js:888
 886   socket.resume();
 887
 888   self.connections++;
 889   socket.server = self;
 890
debug>
break in net.js:889
 887
 888   self.connections++;
 889   socket.server = self;
 890
 891   ;
debug>
break in net.js:892
 890
 891   ;
 892   self.emit('connection', socket);
 893   socket.emit('connect');
 894 }
debug>
break in net.js:893
 891   ;
 892   self.emit('connection', socket);
 893   socket.emit('connect');
 894 }
 895
debug>
break in net.js:894
 892   self.emit('connection', socket);
 893   socket.emit('connect');
 894 }
 895
 896
debug>

Мой вопрос: я просто хочу вернуть простое текстовое сообщение клиенту, используя SPDY. Как я могу сделать это с помощью node.js? - Если вам нужно больше деталей, пожалуйста, скажите мне. Спасибо за ваши ответы.

2 ответа

Решение

Снова включите SSL. SPDY не будет работать без него.

ERR_EMPTY_RESPONSE означает, что Chromium смог подключиться к сокету, но получил пустой ответ. По всей вероятности, это указывает на проблему с конфигурацией сервера, тем более что обратный вызов никогда не вызывается. Крис Стром (автор node-spdy), вероятно, был бы рад помочь вам здесь.

Другие вопросы по тегам