2016-04-21 6 views
0

Я хочу создать сервер http2, используя node-http2 модуль без TLS. Мой код выглядит следующим образом:HTTP2_Plain в модуле node-http2 не работает?

http2 = require('http2'); 
const bunyan = require('bunyan'); 

var log = bunyan.createLogger({name: "HTTP2 server without TLS!"}); 

var options = { 
    log: log 
} 

var server = http2.raw.createServer(options, function(request, response) { 
    console.log("Receiving HTTP2 request!"); 
    // response.writeHead(200); 
    response.end('Hello world from HTTP2!'); 
}); 

server.listen(8000); 

Однако, это не работает. При подключении к этому серверу из хром он показывает загрузку. Когда я закрыл сервер, загрузка заканчивается пустым файлом (26 байтов).

Кто-нибудь знает, что здесь не так? Нужно ли настраивать браузер? Заранее спасибо!

ответ

2

Chrome и все другие браузеры поддерживают только HTTP/2 через TLS (h2), а не простой HTTP/2 (h2c). Поэтому ваш браузер не понимает, что возвращается с сервера, и, видимо, node-http2 не отправляет правильный ответ об ошибке при получении запроса, отличного от http2.

0

Проблема возникает не только из браузера. Использование curl, которое поддерживает HTTP2 по URL http: //, также не работает. Ниже приведены результаты от завитка:

$ curl -I --http2 http://54.208.83.136:8000/ -v -k 
* Trying 54.208.83.136... 
* Connected to 54.208.83.136 (54.208.83.136) port 8000 (#0) 
> HEAD/HTTP/1.1 
> Host: 54.208.83.136:8000 
> User-Agent: curl/7.47.1 
> Accept: */* 
> Connection: Upgrade, HTTP2-Settings 
> Upgrade: h2c 
> HTTP2-Settings: AAMAAABkAAQAAP__ 
> 

Как мы видим на выходе из винта. Он отправляет запрос HTTP/1.1 Upgrade с соответствующими заголовками, установленными в соответствии с http2 rfc.

На стороне сервера журналы были очень длинными, поэтому я представляю здесь только содержание сообщений в соответствующих трех журналах.

New incoming HTTP/2 connection 

Client connection header prelude does not match 

PROTOCOL ERROR, Fatal error, closing connection 

Так что в основном сервер закрыл соединение, поскольку прелюдия заголовка соединения клиента не совпадает. Проверяя код, я понял, что ошибка возникла из функции readPrelude endpoint.js. Это функция для чтения заголовка клиента, но я не знаю, что это неправильно в заголовке клиента :(.

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

Обновление: выясняется, что я ошибался. Модуль node-http2 поддерживает HTTP2 поверх открытого текста с прямым подключением, он не поддерживает HTTP/2 сервер с обновлением от HTTP/1.1. используя механизм Upgrade для подключения к серверу, не поддерживающему обновление. Использование клиента nghttp для подключения к серверу с предшествующими знаниями работает следующим образом.

$ nghttp http://127.0.0.1:8000/ 
Hello world from HTTP2! 

Сервер nghttpd также поддерживает HTTP2 без TLS, хотя он не поддерживает HTTP Upgrade.

$ nghttpd -d /Documents/Proxy 8080 --no-tls -v 

Поэтому я настоятельно рекомендую использовать nghttp, если вы хотите протестировать HTTP2 без TLS.

Смежные вопросы