Express Js将原始http2头信息写入res对象套接字

我需要得到一个原始的套接字后,在我的网站上的具体url的请求,我有这样的逻辑,即时运行使用spdy的http2服务器:

bin.js:

var app = require('../app'); var debug = require('debug')('http2-nodejs-test:server'); const spdy = require('spdy'); const path = require('path'); const fs = require('fs'); var port = normalizePort(process.env.PORT || '443'); app.set('port', port); const options = { key: fs.readFileSync('privkey.pem'), cert: fs.readFileSync('fullchain.pem'), ca : fs.readFileSync('chain.pem'), spdy: { protocols: [ 'h2'], plain: false } } spdy.createServer(options, app).listen(port); 

在我的app.js中有路由逻辑:

 var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var exphbs = require('express-handlebars'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.engine('handlebars', exphbs()); app.set('view engine', 'handlebars'); app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.get('/api/flow', function(req, res){ }); 

 app.get('/api/flow', function(req, res){ }); 

我试图采取响应套接字,并手动发送标题,回答代码200,但连接挂断出于某种原因:

 app.get('/api/flow',function(req, res){ var val = req.spdyStream.id; var data = new Buffer ([0x00, 0x00, 0x02, 0x1, 0x5]); // HTTP2 headers frame var stream_id = new Buffer(4); stream_id.writeUInt32BE(val, 0, noAssert=false); // add stream id to HTTP2 header var payload = new Buffer([0x88,0x87]); // write payload data = Buffer.concat([data, stream_id, payload]); var sock = res.connection; sock.write(data,'binary'); }); 

我在这里做的是我在响应套接字中手动写入HEADERS http2帧, var payload = new Buffer([0x88,0x87]); 是静态http2头信息表中的索引:

 0x88 = :status: 200 0x87 = :scheme: https 

那我期望看到浏览器将会收到,但它没有,它挂断,然后我得到连接超时。 也许我需要访问SSL套接字? 还是实际的SPDYstream? 另外我不能只是使用res.end()这个写之后,因为它会手动添加标题,我不想被添加。 我需要发送自定义有效载荷,所以res.write等不适合我

UPDATE

这是我在wireshark得到的:

截图

正如你所看到的,我的http2头,由于某种原因被包裹在数据有效载荷中:

 00 00 0b 00 00 00 00 00 15 00 00 02 01 05 00 00 00 15 88 87 

我认为我写的框架开始于00 00 02为什么会发生这种情况?

UPDATE2

我已经删除了所有的中间件,我只剩下这个:

 var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.engine('handlebars', exphbs()); app.set('view engine', 'handlebars'); app.use(express.static(path.join(__dirname, 'public'))); 

由于某种原因,我仍然将我的标题帧包装在DATA中