2016-07-29 5 views
2

Я написал сервер веб-сокета, используя socket.io, node-http2 и express в Node.js. Сервер работает по назначению, за исключением того факта, что согласно запросу DevTools от DevTools socket.io запросы HTTP проходят через HTTP/1.1 (см. Ниже). Столбец «Протокол» должен показывать h2, если запрос был отправлен с использованием протокола HTTP/2.Получение socket.io, express & node-http2 для связи, хотя HTTP/2

Это происходит только в Chrome, другие браузеры используют правильный протокол.

Серверный код (сокращенный):

var PORT = 8667, 
    config = require('./config'), 
    socketioServer = require('socket.io'), 
    app = express(), 
    https = require('http2'), 
    cors = require('cors'); 

app.use(cors(function(req, callback){ 
    var corsOptions = { origin: false }; 
    if (/^https:\/\/mlpvc-rr\.lc/.test(req.header('Origin'))) 
     corsOptions.origin = true; 
    callback(null, corsOptions); 
})); 

app.get('/', function (req, res) { 
    res.sendStatus(403); 
}); 

var server = https.createServer({ 
    cert: fs.readFileSync(config.SSL_CERT), 
    key: fs.readFileSync(config.SSL_KEY), 
}, app); 
server.listen(PORT); 
var io = socketioServer.listen(server); 
// ... 

код подключения браузера:

var conn = io('https://ws.'+location.hostname+':8667/', { reconnectionDelay: 5000 }); 
conn.on('connect', function(){ 
    console.log('[WS] Connected'); 
}); 
conn.on('disconnect',function(){ 
    console.log('[WS] Disconnected'); 
}); 

Выход testssl.sh:

Что мне нужно изменить, чтобы сделать запросы socket.io через HTTP/2?

+0

Hi. Можете ли вы получить мне полный пример? Я хотел бы поближе рассмотреть его. На первый взгляд кажется, что это связано с websockets (который использует socket.io и который не поддерживается HTTP/2), но запросы, которые вы показываете *, кажутся * обычными Ajax ... – dsign

+0

@dsign Сервер с открытым исходным кодом на https://github.com/ponydevs/MLPVC-WS – SeinopSys

+0

Какую библиотеку SSL вы используете (openssl?), а какая версия поддерживает ALPN? https://ma.ttias.be/day-google-chrome-disables-http2-nearly-everyone-may-31st-2016/ –

ответ

2

Как уже говорилось в комментариях, Chrome недавно прекратил разрешать более старые NPN-переговоры для HTTP/2 и вместо этого настаивает на более новом протоколе ALPN. См. Эту статью для получения дополнительной информации: https://ma.ttias.be/day-google-chrome-disables-http2-nearly-everyone-may-31st-2016/

Так что вам в основном нужен Node.js для поддержки ALPN, который, как он выглядит, только что добавлен в v5: https://github.com/nodejs/node/pull/2564. Альтернативой будет маршрутизация вызовов NodeJs через веб-сервер, который проще обновить OpenSSL (например, Nginx или Apache), чтобы поддерживать HTTP/2 через ALPN.

Вы подтвердили, что это проблема, используя программу testssl.sh, которая не подтвердила поддержку ALPN и факт, что Firefox использует HTTP/2.

+0

Мой сервер работает на Node.js версии 4.4.7, который (согласно [этой странице] (https://nodejs.org/en/blog/vulnerability/openssl-march-2016/)) поставляется с OpenSSL 1.0.2 по умолчанию, но, пожалуйста, поправьте меня, если я ошибаюсь. – SeinopSys

+0

Похоже, что ALPN работает только в узле 5: https://github.com/nodejs/node/pull/2564. Похоже, что был разговор с ним обратно до версии v4, но не завершен: https://github.com/nodejs/node/pull/5983 –

+0

Спасибо за информацию, я просто подожду, пока v6 не ударит по LTS. – SeinopSys