Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript expressjs将原始http2头写入res对象套接字_Javascript_Node.js_Sockets_Http2 - Fatal编程技术网

Javascript expressjs将原始http2头写入res对象套接字

Javascript expressjs将原始http2头写入res对象套接字,javascript,node.js,sockets,http2,Javascript,Node.js,Sockets,Http2,我需要在我的站点上的特定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 = norm

我需要在我的站点上的特定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);
在my 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){

});

我尝试使用响应套接字并手动发送标头,以代码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');
});
00 00 0b 00 00 00 00 00 15 00 00 02 01 05 00 00
00 15 88 87
我在这里要做的是在响应套接字中手动写入头文件http2帧,
var payload=newbuffer([0x88,0x87])是静态http2标头表中的索引:

0x88 = :status: 200
0x87 = :scheme: https
我希望看到浏览器将接收到什么,但它没有,它挂断了,然后我得到连接超时。也许我需要访问SSL套接字?还是真正的SPDY流?此外,我不能在写了这篇文章之后只使用
res.end()
,因为它将手动添加我不想添加的头。我需要发送自定义负载,因此
res.write
etc不适合我

更新

以下是我从wireshark得到的信息:

如您所见,我的http2头由于某种原因被包装在数据负载中:

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');
});
00 00 0b 00 00 00 00 00 15 00 00 02 01 05 00 00
00 15 88 87
我假设我编写的框架以
0002
开始,为什么会发生这种情况

更新2

我删除了所有中间件,只剩下以下内容:

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')));

由于某种原因,我仍然将标题框包装在数据中

即使浏览器挂起,您是否可以检查是否正在发送数据?我建议使用Wireshark或tcpdump进行此类检查。如果您针对实际存在的总体问题提出问题,可能会更好。现在,您正在询问一个解决方案路径(访问原始套接字)的问题,这可能不是解决问题的正确方法。@lilezek我更新了我的帖子并附呈screen@jfriend00更新帖子title@jfriend00我知道这不是正确的方法,不正确的方法等等,这就是这个web应用程序的目的,它的意思是用于在一些http2客户端上进行pentesting,这就是为什么我想这样做,它不是官方网站/登录,而且永远不会被使用。即使浏览器挂断,你能检查数据是否被发送吗?我建议使用Wireshark或tcpdump进行此类检查。如果您针对实际存在的总体问题提出问题,可能会更好。现在,您正在询问一个解决方案路径(访问原始套接字)的问题,这可能不是解决问题的正确方法。@lilezek我更新了我的帖子并附呈screen@jfriend00更新帖子title@jfriend00我知道这不是正确的方法,不正确的方法等等,这就是这个web应用程序的目的,它的意思是用于在一些http2客户机上进行pentesting,这就是为什么我想这样做,它不是官方网站/登录,也永远不会