Cleaner HTTP routing; Support empty http_base_pase configs
authorDarren <darren@darrenwhitlen.com>
Thu, 4 Sep 2014 12:14:41 +0000 (13:14 +0100)
committerDarren <darren@darrenwhitlen.com>
Thu, 4 Sep 2014 12:14:41 +0000 (13:14 +0100)
client/build.js
server/httphandler.js
server/weblistener.js

index 3f1b8878078290b234aecf51abb3064181f674cd..baf346114868a180515ef67d584018fd09d01c77 100644 (file)
@@ -223,12 +223,18 @@ fs.readdir(__dirname + '/src/translations', function (err, translation_files) {
  * Build the index.html file\r
  */\r
 var build_time = new Date().getTime();\r
+var base_path = config.get().http_base_path || '';\r
+\r
+// Trim off any trailing slashes\r
+if (base_path.substr(base_path.length - 1) === '/') {\r
+    base_path = base_path.substr(0, base_path.length - 1);\r
+}\r
 \r
 var index_src = fs.readFileSync(__dirname + '/src/index.html.tmpl', FILE_ENCODING)\r
-    .replace(new RegExp('<%base_path%>', 'g'), config.get().http_base_path || '')\r
+    .replace(new RegExp('<%base_path%>', 'g'), base_path)\r
     .replace(new RegExp('<%build_version%>', 'g'), package_json.version)\r
     .replace(new RegExp('<%build_time%>', 'g'), build_time);\r
-    \r
+\r
 fs.writeFile(__dirname + '/index.html', index_src, { encoding: FILE_ENCODING }, function (err) {\r
     if (!err) {\r
         console.log('Built index.html');\r
index c3fc067fa104efb60740d72a250c89aff44b41a4..c55dc570e8ff7403935cd28d0b8b92e862cda18a 100644 (file)
@@ -22,21 +22,43 @@ module.exports.HttpHandler = HttpHandler;
 
 HttpHandler.prototype.serve = function (request, response) {
     // The incoming requests base path (ie. /kiwiclient)
-    var base_path = global.config.http_base_path || '',
-        whitelisted_folders = ['assets', 'src'];
+    var base_path, base_check,
+        whitelisted_folders = ['/assets', '/src'],
+        is_whitelisted_folder = false;
 
-    // Trim off any trailing slashes
+    // Trim off any trailing slashes from the base_path
+    base_path = global.config.http_base_path || '';
     if (base_path.substr(base_path.length - 1) === '/') {
         base_path = base_path.substr(0, base_path.length - 1);
     }
 
+    // Normalise the URL to compare against the base_path
+    base_check = request.url;
+    if (base_check.substr(base_check.length - 1) !== '/') {
+        base_check += '/';
+    }
+
+    // Normalise the URL we use by removing the base path
+    if (base_check.indexOf(base_path + '/') === 0) {
+        request.url = request.url.replace(base_path, '');
+
+    } else if (base_check !== '/') {
+        // We don't handle requests outside of the base path and not /, so just 404
+        response.writeHead(404);
+        response.write('Not Found');
+        response.end();
+        return;
+    }
+
     // Map any whitelisted folders to the local directories
     whitelisted_folders.forEach(function(folder) {
-        request.url = request.url.replace(base_path + '/' + folder + '/', '/' + folder + '/');
+        if (request.url.indexOf(folder) === 0) {
+            is_whitelisted_folder = true;
+        }
     });
 
-    // Any requests for /base_path/* to load the index file
-    if (request.url.toLowerCase().indexOf(base_path.toLowerCase()) === 0) {
+    // Any requests not for whitelisted assets returns the index page
+    if (!is_whitelisted_folder) {
         request.url = '/index.html';
     }
 
index 475f017257b1e1052a74dbc2e6f9ecb9b2e80937..8680cc82ecf03a8b44299a82a56c2cfb3b56239f 100644 (file)
@@ -85,7 +85,14 @@ var WebListener = module.exports = function (web_config) {
     });
 
     hs.on('request', function(req, res){
-        var transport_url = (global.config.http_base_path || '') + '/transport';
+        var base_path = (global.config.http_base_path || ''),
+            transport_url;
+
+        // Trim off any trailing slashes
+        if (base_path.substr(base_path.length - 1) === '/') {
+            base_path = base_path.substr(0, base_path.length - 1);
+        }
+        transport_url = base_path + '/transport';
 
         Stats.incr('http.request');