diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index 290c0dd8..c67b134a 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -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]; }); diff --git a/test/acceptance/server.js b/test/acceptance/server.js index 1b91a207..fd847bc3 100644 --- a/test/acceptance/server.js +++ b/test/acceptance/server.js @@ -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) { diff --git a/test/support/test_helper.js b/test/support/test_helper.js index 3c59cac0..7b465611 100644 --- a/test/support/test_helper.js +++ b/test/support/test_helper.js @@ -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 +} diff --git a/test/unit/cartodb/req2params.test.js b/test/unit/cartodb/req2params.test.js index 2562b076..3b7bb845 100644 --- a/test/unit/cartodb/req2params.test.js +++ b/test/unit/cartodb/req2params.test.js @@ -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(); + }); + }); + }); });