From 39fc2ac12c248c191143ece6937b0795acd863e0 Mon Sep 17 00:00:00 2001 From: David Glasser Date: Fri, 18 Jul 2014 16:45:16 -0700 Subject: [PATCH] Move spiderable phantom script to an asset --- packages/spiderable/package.js | 2 ++ packages/spiderable/phantom_script.js | 22 ++++++++++++++++++++++ packages/spiderable/spiderable.js | 23 +++-------------------- 3 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 packages/spiderable/phantom_script.js diff --git a/packages/spiderable/package.js b/packages/spiderable/package.js index 8420a72bc3..b6bfa46c1b 100644 --- a/packages/spiderable/package.js +++ b/packages/spiderable/package.js @@ -11,6 +11,8 @@ Package.on_use(function (api) { api.add_files('spiderable.html', 'client'); api.add_files('spiderable.js', 'server'); + + api.add_files('phantom_script.js', 'server', { isAsset: true }); }); Package.on_test(function (api) { diff --git a/packages/spiderable/phantom_script.js b/packages/spiderable/phantom_script.js new file mode 100644 index 0000000000..00835824fb --- /dev/null +++ b/packages/spiderable/phantom_script.js @@ -0,0 +1,22 @@ +// 'url' is assigned to in a statement before this. +var page = require('webpage').create(); +page.open(url); +setInterval(function() { + var ready = page.evaluate(function () { + if (typeof Meteor !== 'undefined' + && typeof(Meteor.status) !== 'undefined' + && Meteor.status().connected) { + Deps.flush(); + return DDP._allSubscriptionsReady(); + } + return false; + }); + if (ready) { + var out = page.content; + out = out.replace(/]+>(.|\n|\r)*?<\/script\s*>/ig, ''); + out = out.replace('', ''); + console.log(out); + phantom.exit(); + } +}, 100); + diff --git a/packages/spiderable/spiderable.js b/packages/spiderable/spiderable.js index 116711585f..4d70f2f82e 100644 --- a/packages/spiderable/spiderable.js +++ b/packages/spiderable/spiderable.js @@ -47,6 +47,8 @@ Spiderable._urlForPhantom = function (siteAbsoluteUrl, requestUrl) { return urlParser.format(parsedAbsoluteUrl); }; +var PHANTOM_SCRIPT = Assets.getText("phantom_script.js"); + WebApp.connectHandlers.use(function (req, res, next) { // _escaped_fragment_ comes from Google's AJAX crawling spec: // https://developers.google.com/webmasters/ajax-crawling/docs/specification @@ -68,26 +70,7 @@ WebApp.connectHandlers.use(function (req, res, next) { // be able to contain newlines, it should be unable to exploit bash as // well. var phantomScript = "var url = " + JSON.stringify(url) + ";" + - "var page = require('webpage').create();" + - "page.open(url);" + - "setInterval(function() {" + - " var ready = page.evaluate(function () {" + - " if (typeof Meteor !== 'undefined' " + - " && typeof(Meteor.status) !== 'undefined' " + - " && Meteor.status().connected) {" + - " Deps.flush();" + - " return DDP._allSubscriptionsReady();" + - " }" + - " return false;" + - " });" + - " if (ready) {" + - " var out = page.content;" + - " out = out.replace(/]+>(.|\\n|\\r)*?<\\/script\\s*>/ig, '');" + - " out = out.replace('', '');" + - " console.log(out);" + - " phantom.exit();" + - " }" + - "}, 100);\n"; + PHANTOM_SCRIPT; // Run phantomjs. //