h2cli
Version:
A command line interface for HTTP/2
101 lines (92 loc) • 3.14 kB
JavaScript
var util = require('util');
var h2frame = require('../frame');
var Http2Frame = h2frame.Http2Frame;
/******************
* PUSH_PROMISE FRAME
******************/
var Http2PushPromiseFrame = module.exports = function (buf) {
if (!(this instanceof Http2PushPromiseFrame)) {
return new Http2PushPromiseFrame(buf);
}
if (buf) {
this.buf = buf;
if (this.flags & Http2PushPromiseFrame.FLAG_PADDED) {
this.block = buf.slice(Http2Frame.HEADER_SIZE + 5, buf.length - this.padLength);
} else {
this.block = buf.slice(Http2Frame.HEADER_SIZE + 4);
}
} else {
this.block = new Buffer(0);
this.buf = new Buffer([
0x00, 0x00, 0x04, Http2PushPromiseFrame.TYPE_CODE, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00]);
}
};
util.inherits(Http2PushPromiseFrame, Http2Frame);
Http2Frame.defineType(Http2PushPromiseFrame, {
NAME: 'PUSH_PROMISE',
CODE: 0x05,
});
Http2Frame.defineFlags(Http2PushPromiseFrame, {
END_HEADERS: { value: 0x04 },
PADDED: { value: 0x08 },
});
Object.defineProperty(Http2PushPromiseFrame.prototype, 'promisedStreamId', {
get: function () {
var offset = 0;
if (this.flags & Http2PushPromiseFrame.FLAG_PADDED) {
offset += 1;
}
return this.buf.readUInt32BE(Http2Frame.HEADER_SIZE + offset) & 0x7FFFFFFF;
},
});
Object.defineProperty(Http2PushPromiseFrame.prototype, 'padLength', {
get: function () {
if (this.flags & Http2PushPromiseFrame.FLAG_PADDED) {
return this.buf[Http2Frame.HEADER_SIZE + 0];
} else {
return 0;
}
},
set: function (length) {
if (this.flags & Http2PushPromiseFrame.FLAG_PADDED) {
this.buf[Http2Frame.HEADER_SIZE + 0] = length;
} else {
this.buf = Buffer.concat([
this.buf.slice(0, Http2Frame.HEADER_SIZE),
new Buffer([length]),
this.buf.slice(Http2Frame.HEADER_SIZE)]);
}
}
});
Http2PushPromiseFrame.prototype.getBuffer = function () {
var bufs = [], padding;
if (this.flags & Http2PushPromiseFrame.FLAG_PADDED) {
bufs.push(this.buf.slice(0, Http2Frame.HEADER_SIZE + 5));
bufs.push(this.block);
padding = new Buffer(this.padLength);
padding.fill(0);
bufs.push(padding);
} else {
bufs.push(this.buf.slice(0, Http2Frame.HEADER_SIZE + 4));
bufs.push(this.block);
}
this.buf = Buffer.concat(bufs);
return this.buf;
};
Http2PushPromiseFrame.prototype.getBlock = function () {
return this.block;
};
Http2PushPromiseFrame.prototype.setBlock = function (block, paddingLen) {
var length = 4;
this.block = block;
this.padLength = paddingLen;
length += block.length;
if (paddingLen) {
this.flags |= Http2PushPromiseFrame.FLAG_PADDED;
length += 1 + paddingLen;
} else {
this.flags &= ~Http2PushPromiseFrame.FLAG_PADDED;
}
this.length = length;
};