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;
     }, {});
 }