mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
143 lines
3.9 KiB
JavaScript
143 lines
3.9 KiB
JavaScript
var assert = require('assert'),
|
|
spdy = require('../../'),
|
|
keys = require('../fixtures/keys'),
|
|
https = require('https'),
|
|
tls = require('tls'),request
|
|
Buffer = require('buffer').Buffer;
|
|
|
|
|
|
suite('A SPDY Server', function() {
|
|
var server;
|
|
setup(function(done) {
|
|
server = spdy.createServer(keys, function(req, res) {
|
|
res.end('ok');
|
|
});
|
|
|
|
server.listen(8081, done);
|
|
});
|
|
|
|
teardown(function(done) {
|
|
server.once('close', done);
|
|
server.close();
|
|
});
|
|
|
|
test('should respond on regular https requests', function(done) {
|
|
https.request({
|
|
host: 'localhost',
|
|
port: 8081,
|
|
path: '/',
|
|
method: 'GET'
|
|
}, function(res) {
|
|
assert.equal(res.statusCode, 200);
|
|
done();
|
|
}).end();
|
|
});
|
|
|
|
test('should respond on spdy requests', function(done) {
|
|
var socket = tls.connect(
|
|
8081,
|
|
'localhost',
|
|
{ NPNProtocols: ['spdy/2'] },
|
|
function() {
|
|
var deflate = spdy.utils.createDeflate(),
|
|
chunks = [],
|
|
length = 0;
|
|
|
|
deflate.on('data', function(chunk) {
|
|
chunks.push(chunk);
|
|
length += chunk.length;
|
|
});
|
|
|
|
// Deflate headers
|
|
deflate.write(new Buffer([
|
|
0x00, 0x04, // method, url, version = 3 fields
|
|
0x00, 0x06,
|
|
0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, // method
|
|
0x00, 0x03,
|
|
0x47, 0x45, 0x54, // get
|
|
0x00, 0x03,
|
|
0x75, 0x72, 0x6c, // url
|
|
0x00, 0x01,
|
|
0x2f, // '/'
|
|
0x00, 0x07,
|
|
0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, // version
|
|
0x00, 0x08,
|
|
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, // HTTP/1.1
|
|
0x00, 0x04,
|
|
0x68, 0x6f, 0x73, 0x74, // host
|
|
0x00, 0x09,
|
|
0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74 //localhost
|
|
]));
|
|
|
|
deflate.flush(function() {
|
|
// StreamID + Associated StreamID
|
|
length += 10;
|
|
|
|
// Headers
|
|
socket.write(new Buffer([
|
|
0x80, 0x02, 0x00, 0x01, // Control, Version, SYN_STREAM
|
|
0x00, 0x00, 0x00, length, // Flags, length (1 byte in this case)
|
|
0x00, 0x00, 0x00, 0x01, // StreamID
|
|
0x00, 0x00, 0x00, 0x00, // Associated StreamID
|
|
0x00, 0x00 // Priority + Unused
|
|
]));
|
|
|
|
// Write compressed headers
|
|
chunks.forEach(function(chunk) {
|
|
socket.write(chunk);
|
|
});
|
|
});
|
|
|
|
var response = new Buffer(85),
|
|
offset = 0;
|
|
|
|
socket.on('data', function(chunk) {
|
|
assert.ok(offset + chunk.length <= 85);
|
|
|
|
chunk.copy(response, offset);
|
|
offset += chunk.length;
|
|
|
|
if (offset === 85) {
|
|
var frames = [];
|
|
|
|
offset = 0;
|
|
while (offset < response.length) {
|
|
var len = (response.readUInt32BE(offset + 4) & 0x00ffffff) + 8;
|
|
frames.push(response.slice(offset, offset + len));
|
|
|
|
offset += len;
|
|
}
|
|
|
|
// SYN_STREAM frame
|
|
assert.ok(frames.some(function(frame) {
|
|
return frame[0] === 0x80 && // Control frame
|
|
frame[1] === 0x02 && // Version
|
|
frame.readUInt16BE(2) === 0x0002 && // SYN_STREAM
|
|
frame.readUInt32BE(8) === 0x0001; // StreamID
|
|
}));
|
|
|
|
// Data frames
|
|
assert.ok(frames.some(function(frame) {
|
|
return frame[0] === 0x00 && // Data frame
|
|
frame.readUInt32BE(0) === 0x0001 && // StreamID
|
|
frame.slice(8).toString() === 'ok';
|
|
}));
|
|
|
|
socket.destroy();
|
|
}
|
|
});
|
|
|
|
socket.on('close', function() {
|
|
done();
|
|
});
|
|
}
|
|
);
|
|
|
|
server.on('request', function(req, res) {
|
|
assert.equal(req.url, '/');
|
|
assert.equal(req.method, 'GET');
|
|
res.end('ok');
|
|
});
|
|
});
|
|
});
|