From 79a5e5f6346779745ff9737e057920c2bf649643 Mon Sep 17 00:00:00 2001 From: Monica Lent <lent.monica@gmail.com> Date: Tue, 1 Dec 2015 09:27:38 +0100 Subject: [PATCH 1/6] Enable HTML5 mode. --- angular-seo-server.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/angular-seo-server.js b/angular-seo-server.js index c898875..cd257b3 100644 --- a/angular-seo-server.js +++ b/angular-seo-server.js @@ -9,16 +9,15 @@ var server = require('webserver').create(); var port = parseInt(system.args[1]); var urlPrefix = system.args[2]; -var parse_qs = function(s) { - var queryString = {}; - var a = document.createElement("a"); - a.href = s; - a.search.replace( - new RegExp("([^?=&]+)(=([^&]*))?", "g"), - function($0, $1, $2, $3) { queryString[$1] = $3; } - ); - return queryString; -}; +function queryStringToMap(queryString) { + return queryString.split('&').reduce(function(memo, pair) { + var index = pair.split('=')[0].indexOf('?'); + var key = index === -1 ? pair.split('=')[0] : pair.split('=')[0].replace('\/\?', ''); + var value = pair.split('=')[1]; + memo[key] = value; + return memo; + }, {}); +} var renderHtml = function(url, cb) { var page = require('webpage').create(); @@ -42,10 +41,12 @@ var renderHtml = function(url, cb) { }; server.listen(port, function (request, response) { - var route = parse_qs(request.url)._escaped_fragment_; + var route = queryStringToMap(request.url)._escaped_fragment_; + var url = urlPrefix + request.url.slice(1, request.url.indexOf('?')) - + '#!' + decodeURIComponent(route); + + decodeURIComponent(route); + renderHtml(url, function(html) { response.statusCode = 200; response.write(html); From b44807ca40456182ba3a55df55b2aa20a2aeecc4 Mon Sep 17 00:00:00 2001 From: Monica Lent <lent.monica@gmail.com> Date: Tue, 1 Dec 2015 09:34:33 +0100 Subject: [PATCH 2/6] Refactor queryStringToMap fn to be more readable --- angular-seo-server.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/angular-seo-server.js b/angular-seo-server.js index cd257b3..4e61579 100644 --- a/angular-seo-server.js +++ b/angular-seo-server.js @@ -10,10 +10,11 @@ var port = parseInt(system.args[1]); var urlPrefix = system.args[2]; function queryStringToMap(queryString) { - return queryString.split('&').reduce(function(memo, pair) { - var index = pair.split('=')[0].indexOf('?'); - var key = index === -1 ? pair.split('=')[0] : pair.split('=')[0].replace('\/\?', ''); - var value = pair.split('=')[1]; + return queryString.split('&').reduce(function(memo, fragment) { + var preKey = fragment.split('=')[0]; + var value = fragment.split('=')[1]; + var key = preKey.replace('\/\?', ''); + memo[key] = value; return memo; }, {}); From c45237305be78934dc29d373da9c8dc984a9de74 Mon Sep 17 00:00:00 2001 From: Monica Lent <lent.monica@gmail.com> Date: Tue, 1 Dec 2015 12:23:53 +0100 Subject: [PATCH 3/6] Try to handle google requests in the format of /path/something?_escaped_fragment_= --- angular-seo-server.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/angular-seo-server.js b/angular-seo-server.js index 4e61579..3fd4789 100644 --- a/angular-seo-server.js +++ b/angular-seo-server.js @@ -10,6 +10,8 @@ var port = parseInt(system.args[1]); var urlPrefix = system.args[2]; function queryStringToMap(queryString) { + if (!queryString) { return ''; } + return queryString.split('&').reduce(function(memo, fragment) { var preKey = fragment.split('=')[0]; var value = fragment.split('=')[1]; @@ -42,11 +44,15 @@ var renderHtml = function(url, cb) { }; server.listen(port, function (request, response) { - var route = queryStringToMap(request.url)._escaped_fragment_; - - var url = urlPrefix - + request.url.slice(1, request.url.indexOf('?')) - + decodeURIComponent(route); + console.log(request.url); + var qLoc = request.url.indexOf('?'); + var query = request.url.slice(qLoc, request.url.length); + var preQuery = request.url.slice(1, qLoc); + var route = queryStringToMap(request.url); + var fragment = route._escaped_fragment; + var url = urlPrefix + + + preQuery + + (fragment || ''); renderHtml(url, function(html) { response.statusCode = 200; From 95192899aadd655310f7cccb3a4ff762ba3b4d53 Mon Sep 17 00:00:00 2001 From: Monica Lent <lent.monica@gmail.com> Date: Tue, 1 Dec 2015 13:30:41 +0100 Subject: [PATCH 4/6] Support meta + html5 mode in format of /my/html5/url?_escaped_fragment= --- angular-seo-server.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/angular-seo-server.js b/angular-seo-server.js index 3fd4789..44ca8ec 100644 --- a/angular-seo-server.js +++ b/angular-seo-server.js @@ -44,15 +44,15 @@ var renderHtml = function(url, cb) { }; server.listen(port, function (request, response) { - console.log(request.url); var qLoc = request.url.indexOf('?'); - var query = request.url.slice(qLoc, request.url.length); - var preQuery = request.url.slice(1, qLoc); - var route = queryStringToMap(request.url); - var fragment = route._escaped_fragment; - var url = urlPrefix + - + preQuery - + (fragment || ''); + var query = qLoc !== -1 ? + request.url.slice(qLoc, request.url.length) : + ''; + + var preQuery = request.url.slice(0, qLoc); + var route = queryStringToMap(query); + var fragment = route._escaped_fragment_; + var url = urlPrefix + preQuery + fragment; renderHtml(url, function(html) { response.statusCode = 200; From f268223d395f8503e7d2f5eea48016e56f04824d Mon Sep 17 00:00:00 2001 From: Monica Lent <lent.monica@gmail.com> Date: Tue, 1 Dec 2015 13:38:03 +0100 Subject: [PATCH 5/6] Fix undefined error. --- angular-seo-server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/angular-seo-server.js b/angular-seo-server.js index 44ca8ec..4b562f2 100644 --- a/angular-seo-server.js +++ b/angular-seo-server.js @@ -51,7 +51,7 @@ server.listen(port, function (request, response) { var preQuery = request.url.slice(0, qLoc); var route = queryStringToMap(query); - var fragment = route._escaped_fragment_; + var fragment = route._escaped_fragment_ || ''; var url = urlPrefix + preQuery + fragment; renderHtml(url, function(html) { From d47694acce67ab2b1541ff07ad4715352c301438 Mon Sep 17 00:00:00 2001 From: Monica Lent <lent.monica@gmail.com> Date: Tue, 1 Dec 2015 13:50:49 +0100 Subject: [PATCH 6/6] Make angular-seo-server support both /path?_escaped_= and /?_escaped=path --- angular-seo-server.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/angular-seo-server.js b/angular-seo-server.js index 4b562f2..9e52159 100644 --- a/angular-seo-server.js +++ b/angular-seo-server.js @@ -14,10 +14,11 @@ function queryStringToMap(queryString) { return queryString.split('&').reduce(function(memo, fragment) { var preKey = fragment.split('=')[0]; - var value = fragment.split('=')[1]; - var key = preKey.replace('\/\?', ''); + var preVal = fragment.split('=')[1]; + var key = preKey.replace('?', ''); + var val = preVal.replace('\/', ''); - memo[key] = value; + memo[key] = val; return memo; }, {}); }