bug 1130874 - h2 test server altsvc 06 r=hurley

This only updates node-http2 for mozilla's CI needs by supporting
sending of the AltSvc frame (-06). It does not implement receiving or
the node internal tests.
This commit is contained in:
Patrick McManus 2015-02-08 09:00:39 -05:00
Родитель bfa57d2872
Коммит c19611d6a0
2 изменённых файлов: 49 добавлений и 85 удалений

Просмотреть файл

@ -785,7 +785,7 @@ Deserializer.CONTINUATION = function readContinuation(buffer, frame) {
frame.data = buffer;
};
// [ALTSVC](http://tools.ietf.org/html/draft-ietf-httpbis-alt-svc-04#section-4)
// [ALTSVC](http://tools.ietf.org/html/draft-ietf-httpbis-alt-svc-06#section-4)
// ------------------------------------------------------------
//
// The ALTSVC frame (type=0xA) advertises the availability of an alternative service to the client.
@ -799,79 +799,40 @@ frameFlags.ALTSVC = [];
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Max-Age (32) |
// +-------------------------------+----------------+--------------+
// | Port (16) | Reserved (8) | PID_LEN (8) |
// +-------------------------------+----------------+--------------+
// | Protocol-ID (*) |
// +---------------+-----------------------------------------------+
// | HOST_LEN (8) | Host (*) ...
// +---------------+-----------------------------------------------+
// | Origin? (*) ...
// | Origin-Len (16) | Origin? (*) ...
// +-------------------------------+-------------------------------+
// | Alt-Svc-Field-Value (*) ...
// +---------------------------------------------------------------+
//
// The ALTSVC frame contains the following fields:
//
// Max-Age: An unsigned, 32-bit integer indicating the freshness
// lifetime of the alternative service association, as per [ALT-SVC](http://tools.ietf.org/html/draft-ietf-httpbis-alt-svc-01)
// section 2.2.
// Origin-Len: An unsinged 16 bit integer indicating the length of the origin
// field. Must be empty for non zero stream id
//
// Port: An unsigned, 16-bit integer indicating the port that the
// alternative service is available upon.
// Origin: origin this directive applies to. If empty it applies to the
// same origin as the stream with the same id
//
// Reserved: For future use. Senders MUST set these bits to '0', and
// recipients MUST ignore them.
//
// PID_LEN: An unsigned, 8-bit integer indicating the length, in
// octets, of the Protocol-ID field.
//
// Protocol-ID: A sequence of bytes (length determined by PID_LEN)
// containing the ALPN protocol identifier of the alternative
// service.
//
// HOST_LEN: An unsigned, 8-bit integer indicating the length, in
// octets, of the Host field.
//
// Host: A sequence of characters (length determined by HOST_LEN)
// containing an ASCII string indicating the host that the
// alternative service is available upon. An internationalized
// domain [IDNA] MUST be expressed using A-labels.
//
// Origin: An optional sequence of characters (length determined by
// subtracting the length of all lpreceding fields from the frame
// length) containing ASCII serialisation of an origin ([RFC6454](http://tools.ietf.org/html/rfc6454),
// Section 6.2) that the alternate service is applicable to.
// Alt-Svc-Field-Value: an ascaii string corresponding to the HTTP response
// header field value for Alt-Svc
typeSpecificAttributes.ALTSVC = ['maxAge', 'port', 'protocolID', 'host',
'origin'];
Serializer.ALTSVC = function writeAltSvc(frame, buffers) {
var buffer = new Buffer(8);
buffer.writeUInt32BE(frame.maxAge, 0);
buffer.writeUInt16BE(frame.port, 4);
buffer.writeUInt8(0, 6);
buffer.writeUInt8(frame.protocolID.length, 7);
var hdr = frame.protocolID + "=\"" + frame.host + ":" + frame.port + "\"";
if (frame.maxAge) {
hdr += "; ma=" + frame.maxAge;
}
buffer = new Buffer(2);
buffer.writeUInt16BE(frame.origin.length, 0);
buffers.push(buffer);
buffers.push(new Buffer(frame.protocolID, 'ascii'));
buffer = new Buffer(1);
buffer.writeUInt8(frame.host.length, 0);
buffers.push(buffer);
buffers.push(new Buffer(frame.host, 'ascii'));
buffers.push(new Buffer(frame.origin, 'ascii'));
buffers.push(new Buffer(hdr, 'ascii'));
};
Deserializer.ALTSVC = function readAltSvc(buffer, frame) {
frame.maxAge = buffer.readUInt32BE(0);
frame.port = buffer.readUInt16BE(4);
var pidLength = buffer.readUInt8(7);
frame.protocolID = buffer.toString('ascii', 8, 8 + pidLength);
var hostLength = buffer.readUInt8(8 + pidLength);
frame.host = buffer.toString('ascii', 9 + pidLength, 9 + pidLength + hostLength);
frame.origin = buffer.toString('ascii', 9 + pidLength + hostLength);
// todo
};
// BLOCKED

Просмотреть файл

@ -176,34 +176,37 @@ var test_frames = [{
},
// length + type + flags + stream + content
buffer: new Buffer('000004' + '09' + '04' + '0000000A' + '12345678', 'hex')
}, {
frame: {
type: 'ALTSVC',
flags: { },
stream: 0,
},
// need to be updated for -06
//{
// frame: {
// type: 'ALTSVC',
// flags: { },
// stream: 0,
maxAge: 31536000,
port: 4443,
protocolID: "h2",
host: "altsvc.example.com",
origin: ""
},
buffer: new Buffer('00001D' + '0A' + '00' + '00000000' + '01E13380' + '115B' + '00' + '02' + '6832' + '12' + '616C747376632E6578616D706C652E636F6D', 'hex')
}, {
frame: {
type: 'ALTSVC',
flags: { },
stream: 0,
maxAge: 31536000,
port: 4443,
protocolID: "h2",
host: "altsvc.example.com",
origin: "https://onlyme.example.com"
},
buffer: new Buffer('000037' + '0A' + '00' + '00000000' + '01E13380' + '115B' + '00' + '02' + '6832' + '12' + '616C747376632E6578616D706C652E636F6D' + '68747470733A2F2F6F6E6C796D652E6578616D706C652E636F6D', 'hex')
}, {
// maxAge: 31536000,
// port: 4443,
// protocolID: "h2",
// host: "altsvc.example.com",
// origin: ""
// },
// buffer: new Buffer('00001D' + '0A' + '00' + '00000000' + '01E13380' + '115B' + '00' + '02' + '6832' + '12' + '616C747376632E6578616D706C652E636F6D', 'hex')
//}, {
// frame: {
// type: 'ALTSVC',
// flags: { },
// stream: 0,
//
// maxAge: 31536000,
// port: 4443,
// protocolID: "h2",
// host: "altsvc.example.com",
// origin: "https://onlyme.example.com"
// },
// buffer: new Buffer('000037' + '0A' + '00' + '00000000' + '01E13380' + '115B' + '00' + '02' + '6832' + '12' + '616C747376632E6578616D706C652E636F6D' + '68747470733A2F2F6F6E6C796D652E6578616D706C652E636F6D', 'hex')
//
//},
{
frame: {
type: 'BLOCKED',
flags: { },