Files
tubestation/testing/xpcshell/node-spdy/lib/spdy/utils.js
2012-05-21 12:12:37 +01:00

125 lines
3.6 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
var utils = exports;
var zlib = require('zlib'),
Buffer = require('buffer').Buffer;
// SPDY deflate/inflate dictionary
var dictionary = new Buffer([
'optionsgetheadpostputdeletetraceacceptaccept-charsetaccept-encodingaccept-',
'languageauthorizationexpectfromhostif-modified-sinceif-matchif-none-matchi',
'f-rangeif-unmodifiedsincemax-forwardsproxy-authorizationrangerefererteuser',
'-agent10010120020120220320420520630030130230330430530630740040140240340440',
'5406407408409410411412413414415416417500501502503504505accept-rangesageeta',
'glocationproxy-authenticatepublicretry-afterservervarywarningwww-authentic',
'ateallowcontent-basecontent-encodingcache-controlconnectiondatetrailertran',
'sfer-encodingupgradeviawarningcontent-languagecontent-lengthcontent-locati',
'oncontent-md5content-rangecontent-typeetagexpireslast-modifiedset-cookieMo',
'ndayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSe',
'pOctNovDecchunkedtext/htmlimage/pngimage/jpgimage/gifapplication/xmlapplic',
'ation/xhtmltext/plainpublicmax-agecharset=iso-8859-1utf-8gzipdeflateHTTP/1',
'.1statusversionurl\x00'
].join(''));
//
// ### function createDeflate ()
// Creates deflate stream with SPDY dictionary
//
utils.createDeflate = function createDeflate() {
var deflate = zlib.createDeflate({ dictionary: dictionary, windowBits: 11 });
// Define lock information early
deflate.locked = false;
deflate.lockBuffer = [];
return deflate;
};
//
// ### function createInflate ()
// Creates inflate stream with SPDY dictionary
//
utils.createInflate = function createInflate() {
var inflate = zlib.createInflate({ dictionary: dictionary, windowBits: 15 });
// Define lock information early
inflate.locked = false;
inflate.lockBuffer = [];
return inflate;
};
//
// ### function resetZlibStream (stream)
// #### @stream {zlib.Stream} stream
// Resets zlib stream and associated locks
//
utils.resetZlibStream = function resetZlibStream(stream, callback) {
if (stream.locked) {
stream.lockBuffer.push(function() {
resetZlibStream(stream, callback);
});
return;
}
stream.reset();
stream.lockBuffer = [];
callback(null);
};
var delta = 0;
//
// ### function zstream (stream, buffer, callback)
// #### @stream {Deflate|Inflate} One of streams above
// #### @buffer {Buffer} Input data (to compress or to decompress)
// #### @callback {Function} Continuation to callback
// Compress/decompress data and pass it to callback
//
utils.zstream = function zstream(stream, buffer, callback) {
var flush = stream._flush,
chunks = [],
total = 0;
if (stream.locked) {
stream.lockBuffer.push(function() {
zstream(stream, buffer, callback);
});
return;
}
stream.locked = true;
function collect(chunk) {
chunks.push(chunk);
total += chunk.length;
}
stream.on('data', collect);
stream.write(buffer);
stream.flush(function() {
stream.removeAllListeners('data');
stream._flush = flush;
callback(null, chunks, total);
stream.locked = false;
var deferred = stream.lockBuffer.shift();
if (deferred) deferred();
});
};
//
// ### function zwrap (stream)
// #### @stream {zlib.Stream} stream to wrap
// Wraps stream within function to allow simple deflate/inflate
//
utils.zwrap = function zwrap(stream) {
return function(data, callback) {
utils.zstream(stream, data, callback);
};
};