spdy.node.js: я просто получаю 324 (ERR_EMPTY_RESPONSE)

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

Мой javascript:

EDIT: Теперь скрипт включает информацию о сертификатах. Я взял их из тестового приложения 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 не выдает исключение:

Фелер 324 (net::ERR_EMPTY_RESPONSE)

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

Моя конфигурация на стороне клиента: я использую сборку хрома в качестве браузера, чтобы протестировать spdy. Во время тестов я не использую 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:

Моя отладка на стороне клиента. Служба отладки хрома 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       ?                       ?

EDIT: Поскольку я добавил информацию о сертификате, информация об отладке на стороне клиента немного изменилась. Вот самый новый:

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

Мои средства отладки на стороне сервера. Вот что сообщает мне встроенный отладчик узлов, когда я получаю запрос:

EDIT: Отладка на стороне сервера не изменится, даже если я добавлю в сценарии информацию о сертификате.

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? - Если вам нужно больше деталей, пожалуйста, скажите мне. Спасибо за ваши ответы.


person fridojet    schedule 13.05.2012    source источник
comment
Кажется, я только что прочитал кое-что интересное в комментарий, написанный Storm: It is not possible to run node-spdy without SSL. Я попытаюсь узнать об этом побольше, или кто-нибудь из вас что-то знает об этом факте?   -  person fridojet    schedule 14.05.2012
comment
Теперь я использую SSL с сертификатами примера приложения. Но есть еще те же проблемы.   -  person fridojet    schedule 14.05.2012


Ответы (2)


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

person Tom van der Woerdt    schedule 13.05.2012
comment
В официальном документе SPDY сказано: The results show a speedup over HTTP of 27% - 60% in page load time over plain TCP (without SSL), and 39% - 55% over SSL. Это означает, что обычный TCP тоже возможен, не так ли? - person fridojet; 13.05.2012
comment
TLS/SSL не требуется для SPDY. См. stackoverflow.com/questions/6304217/spdy-without-tls/ для более подробного объяснения. - person William Chan; 13.05.2012
comment
Веб-браузеры не позволят вам использовать SPDY без SSL, если только вы явно не заставите их это делать. Разрешение разработчику отключать SSL предназначено только для облегчения отладки с помощью таких инструментов, как Wireshark. Кроме того, @fridojet, в той части, которую вы цитируете, SPDY сравнивается со старыми http:// и https://. - person Tom van der Woerdt; 14.05.2012
comment
Но StartCom не подпишет локальный хост, не так ли? Поэтому, пока я просто выполняю локальный внутренний тест, я думаю, что мне нужно использовать простой TCP или я должен подписать себя. - person fridojet; 14.05.2012
comment
Да, просто подпишите свои собственные сертификаты для тестирования. В этом нет ничего плохого. - person Tom van der Woerdt; 14.05.2012
comment
@TomvanderWoerdt Чтобы не усложнять, я просто использовал сертификаты тестового приложения node-spdy под названием twitlog. Я только что отредактировал информацию в своем вопросе по этой теме. Но даже если я использую HTTPS, все равно есть некоторые проблемы. - person fridojet; 14.05.2012
comment
@TomvanderWoerdt Проблемы почти остались прежними. Я изменил текст своих вопросов, чтобы описать свои новые проблемы. Но, например, результаты инструмента отладки node.js остались такими же, как и тогда, когда я не использовал сертификаты. - person fridojet; 16.05.2012
comment
Я, возможно, должен добавить одну деталь: я использую сертификаты примера приложения spdy-node под названием twitlog, и я научил свой хром принимать их. - person fridojet; 16.05.2012
comment
Было бы очень полезно иметь информацию с вкладки SPDY в about:net-internals вместо других вкладок. Также убедитесь, что вы открываете обычную версию Chrome и не запускаете ее с помощью каких-либо переключателей CLI, связанных с SPDY. - person Tom van der Woerdt; 16.05.2012
comment
@TomvanderWoerdt Чтобы не делать SSL необходимым, я создал новый профиль хрома и открываю его со следующими флагами: --user-data-dir=Webtest --use-spdy=no-ssl - person fridojet; 16.05.2012
comment
@TomvanderWoerdt about:net-internals/#spdy содержит три раздела. Я скопировал и вставил раздел SPDY status в текст своего вопроса - вы можете найти его в разделе My client-side configuration. Разделы SPDY sessions и Alternate Protocol Mappings пусты, точнее их содержимое None. - person fridojet; 16.05.2012
comment
@TomvanderWoerdt Если это хорошая идея, я протестирую SPDY без флагов командной строки. Выложу сюда результаты. - person fridojet; 16.05.2012
comment
Хорошо, теперь это работает, я больше никогда не буду использовать какие-либо флаги командной строки ...... Да !! Позже я опубликую некоторые подробности для тех, у кого есть такие же подозрительные проблемы. @TomvanderWoerdt Большое спасибо. - person fridojet; 16.05.2012
comment
Эти флаги Chromium действительно предназначены только для разработчиков SPDY (таких как я), а не для пользователей (таких как вы). Их вообще нельзя трогать ;-) - person Tom van der Woerdt; 16.05.2012

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

person William Chan    schedule 13.05.2012
comment
Я тоже так думал. Я знаю о Крисе Строме, но я не хотел писать ему письмо, потому что не хотел беспокоить его личными просьбами о помощи. Или ему можно спросить лично? Или есть другой способ связаться с ним красиво? - person fridojet; 14.05.2012