fixed lzma decoding to fix browser requirements

This commit is contained in:
javi
2013-04-24 15:10:58 +02:00
parent f0fc44aac9
commit efa79b243c
4 changed files with 43 additions and 23 deletions
+4 -6
View File
@@ -291,19 +291,17 @@ module.exports = function(){
// TODO: check ?
//console.log("type of req.query.lzma is " + typeof(req.query.lzma));
//console.log("req.query.lzma is " + req.query.lzma);
// Decode (from base64)
var lzma = new Buffer(req.query.lzma, 'base64');
var lzma = (new Buffer(req.query.lzma, 'base64').toString('binary')).split('').map(function(c) { return c.charCodeAt(0) - 128 })
// Decompress
//console.log("LZMA decompression starts with " + lzma);
LZMA.decompress(
lzma,
function(result) {
//console.log("LZMA decompression completed, payload: "); console.dir(result);
try {
req.query = JSON.parse(result);
delete req.query.lzma
_.extend(req.query, JSON.parse(result))
me.req2params(req, callback);
} catch (err) {
callback(new Error('Error parsing lzma as JSON: ' + err));
@@ -317,7 +315,7 @@ module.exports = function(){
}
// Whitelist query parameters and attach format
var good_query = ['sql', 'geom_type', 'cache_buster', 'cache_policy', 'callback', 'interactivity', 'map_key', 'api_key', 'style', 'style_version', 'style_convert' ];
var good_query = ['sql', 'geom_type', 'cache_buster', 'cache_policy', 'callback', 'interactivity', 'map_key', 'api_key', 'style', 'style_version', 'style_convert', 'config' ];
var bad_query = _.difference(_.keys(req.query), good_query);
_.each(bad_query, function(key){ delete req.query[key]; });
+2 -17
View File
@@ -7,30 +7,15 @@ var semver = require('semver');
var mapnik = require('mapnik');
var Step = require('step');
var http = require('http');
var LZMA = require('lzma/lzma_worker.js').LZMA;
var SQLAPIEmu = require(__dirname + '/../support/SQLAPIEmu.js');
require(__dirname + '/../support/test_helper');
var helper = require(__dirname + '/../support/test_helper');
var CartodbWindshaft = require(__dirname + '/../../lib/cartodb/cartodb_windshaft');
var serverOptions = require(__dirname + '/../../lib/cartodb/server_options');
var server = new CartodbWindshaft(serverOptions);
server.setMaxListeners(0);
// Utility function to compress & encode LZMA
function lzma_compress_to_base64(payload, mode, callback) {
var HEX = [ '0','1','2','3','4','5','6','7',
'8','9','a','b','c','d','e','f' ];
LZMA.compress(payload, mode,
function(ints) {
var base64 = new Buffer(ints).toString('base64');
callback(null, base64);
},
function(percent) {
//console.log("Compressing: " + percent + "%");
}
);
}
suite('server', function() {
@@ -808,7 +793,7 @@ suite('server', function() {
function compressQuery () {
//console.log("Compressing starts");
var next = this;
lzma_compress_to_base64(JSON.stringify(qo), 1, this);
helper.lzma_compress_to_base64(JSON.stringify(qo), 1, this);
//cosole.log("compress returned " + x );
},
function sendRequest(err, lzma) {
+18
View File
@@ -6,6 +6,7 @@
*/
var _ = require('underscore');
var LZMA = require('lzma/lzma_worker.js').LZMA;
// set environment specific variables
global.settings = require(__dirname + '/../../config/settings');
@@ -13,4 +14,21 @@ global.environment = require(__dirname + '/../../config/environments/test');
_.extend(global.settings, global.environment);
// Utility function to compress & encode LZMA
function lzma_compress_to_base64(payload, mode, callback) {
LZMA.compress(payload, mode,
function(ints) {
ints = ints.map(function(c) { return String.fromCharCode(c + 128) }).join('')
var base64 = new Buffer(ints, 'binary').toString('base64');
callback(null, base64);
},
function(percent) {
//console.log("Compressing: " + percent + "%");
}
);
}
module.exports = {
lzma_compress_to_base64: lzma_compress_to_base64
}
+19
View File
@@ -62,5 +62,24 @@ suite('req2params', function() {
});
});
});
test('it should extend params with decoded lzma', function(done) {
var qo = {
style: 'test',
style_version: '2.1.0',
cache_buster: 5
};
test_helper.lzma_compress_to_base64(JSON.stringify(qo), 1, function(err, data) {
opts.req2params({ query: { non_included: 'toberemoved', api_key: 'test', style: 'override', lzma: data }}, function(err, req) {
var query = req.params
assert.equal(qo.style, query.style)
assert.equal(qo.style_version, query.style_version)
assert.equal(qo.cache_buster, query.cache_buster)
assert.equal('test', query.api_key)
assert.equal(undefined, query.non_included)
done();
});
});
});
});