Javascript expressjs将原始http2头写入res对象套接字
我需要在我的站点上的特定url上请求后获得原始套接字,我有如下逻辑,我使用spdy运行http2服务器: bin.js: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
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,这就是为什么我想这样做,它不是官方网站/登录,也永远不会