forked from coolaj86/walnut.js
		
	separate static from app
This commit is contained in:
		
							parent
							
								
									94eddd2fcc
								
							
						
					
					
						commit
						e5d9ad8386
					
				| @ -6,7 +6,6 @@ module.exports.create = function (securePort, vhostsdir) { | |||||||
|   var fs = require('fs'); |   var fs = require('fs'); | ||||||
|   var path = require('path'); |   var path = require('path'); | ||||||
|   var dummyCerts; |   var dummyCerts; | ||||||
|   var serveFavicon; |  | ||||||
|   var loopbackToken = require('crypto').randomBytes(32).toString('hex'); |   var loopbackToken = require('crypto').randomBytes(32).toString('hex'); | ||||||
| 
 | 
 | ||||||
|   function handleAppScopedError(tag, domaininfo, req, res, fn) { |   function handleAppScopedError(tag, domaininfo, req, res, fn) { | ||||||
| @ -115,47 +114,39 @@ module.exports.create = function (securePort, vhostsdir) { | |||||||
|                 localApp = getDummyAppContext(null, "[ERROR] no connect-style export from " + domaininfo.dirname); |                 localApp = getDummyAppContext(null, "[ERROR] no connect-style export from " + domaininfo.dirname); | ||||||
|               } |               } | ||||||
| 
 | 
 | ||||||
|  |               function fourohfour(req, res) { | ||||||
|  |                 res.writeHead(404); | ||||||
|  |                 res.end( | ||||||
|  |                     "<html>" | ||||||
|  |                   + "<head>" | ||||||
|  |                   + '<link rel="icon" href="favicon.ico" />' | ||||||
|  |                   + "</head>" | ||||||
|  |                   + "<body>" | ||||||
|  |                   + "Cannot " | ||||||
|  |                   + encodeURI(req.method) | ||||||
|  |                   + " 'https://" | ||||||
|  |                   + encodeURI(domaininfo.hostname) | ||||||
|  |                   + '/' | ||||||
|  |                   + encodeURI(domaininfo.pathname ? (domaininfo.pathname + '/') : '') | ||||||
|  |                   + encodeURI(req.url.replace(/^\//, '')) | ||||||
|  |                   + "'" | ||||||
|  |                   + "<br/>" | ||||||
|  |                   + "<br/>" | ||||||
|  |                   + "Domain: " + encodeURI(domaininfo.hostname) | ||||||
|  |                   + "<br/>" | ||||||
|  |                   + "App: " + encodeURI(domaininfo.pathname) | ||||||
|  |                   + "<br/>" | ||||||
|  |                   + "Route : " + encodeURI(req.url) | ||||||
|  |                   + "</body>" | ||||||
|  |                   + "</html>" | ||||||
|  |                 ); | ||||||
|  |               } | ||||||
|  | 
 | ||||||
|               // Note: pathname should NEVER have a leading '/' on its own
 |               // Note: pathname should NEVER have a leading '/' on its own
 | ||||||
|               // we always add it explicitly
 |               // we always add it explicitly
 | ||||||
|               function localAppWrapped(req, res) { |               function localAppWrapped(req, res) { | ||||||
|                 console.log('[debug]', domaininfo.hostname + '/' + domaininfo.pathname, req.url); |                 console.log('[debug]', domaininfo.hostname + '/' + domaininfo.pathname, req.url); | ||||||
|                 localApp(req, res, handleAppScopedError('localApp', domaininfo, req, res, function (req, res) { |                 localApp(req, res, handleAppScopedError('localApp', domaininfo, req, res, fourohfour)); | ||||||
|                   if (!serveFavicon) { |  | ||||||
|                     serveFavicon = require('serve-favicon')(path.join(__dirname, '..', 'public', 'favicon.ico')); |  | ||||||
|                   } |  | ||||||
| 
 |  | ||||||
|                   // TODO redirect GET /favicon.ico to GET (req.headers.referer||'') + /favicon.ico
 |  | ||||||
|                   // TODO other common root things - robots.txt, app-icon, etc
 |  | ||||||
|                   serveFavicon(req, res, handleAppScopedError('serveFavicon', domaininfo, req, res, function (req, res) { |  | ||||||
|                     connectContext.static(req, res, handleAppScopedError('connect.static', domaininfo, req, res, function (req, res) { |  | ||||||
|                       res.writeHead(404); |  | ||||||
|                       res.end( |  | ||||||
|                           "<html>" |  | ||||||
|                         + "<head>" |  | ||||||
|                         + '<link rel="icon" href="favicon.ico" />' |  | ||||||
|                         + "</head>" |  | ||||||
|                         + "<body>" |  | ||||||
|                         + "Cannot " |  | ||||||
|                         + encodeURI(req.method) |  | ||||||
|                         + " 'https://" |  | ||||||
|                         + encodeURI(domaininfo.hostname) |  | ||||||
|                         + '/' |  | ||||||
|                         + encodeURI(domaininfo.pathname ? (domaininfo.pathname + '/') : '') |  | ||||||
|                         + encodeURI(req.url.replace(/^\//, '')) |  | ||||||
|                         + "'" |  | ||||||
|                         + "<br/>" |  | ||||||
|                         + "<br/>" |  | ||||||
|                         + "Domain: " + encodeURI(domaininfo.hostname) |  | ||||||
|                         + "<br/>" |  | ||||||
|                         + "App: " + encodeURI(domaininfo.pathname) |  | ||||||
|                         + "<br/>" |  | ||||||
|                         + "Route : " + encodeURI(req.url) |  | ||||||
|                         + "</body>" |  | ||||||
|                         + "</html>" |  | ||||||
|                       ); |  | ||||||
|                     })); |  | ||||||
|                   })); |  | ||||||
|                 })); |  | ||||||
|               } |               } | ||||||
|               try { |               try { | ||||||
|                 var localConnect = connect(); |                 var localConnect = connect(); | ||||||
| @ -324,37 +315,13 @@ module.exports.create = function (securePort, vhostsdir) { | |||||||
|           console.log('[log] [once] Loading all mounts for ' + domainApp.hostname); |           console.log('[log] [once] Loading all mounts for ' + domainApp.hostname); | ||||||
|           domainApp._loaded = true; |           domainApp._loaded = true; | ||||||
|           app.use(vhost(domainApp.hostname, domainApp.apps)); |           app.use(vhost(domainApp.hostname, domainApp.apps)); | ||||||
|           app.use(vhost('www.' + domainApp.hostname, function (req, res/*, next*/) { |           app.use(vhost('www.' + domainApp.hostname, function (req, res) { | ||||||
|             if (/\.appcache\b/.test(req.url)) { |             res.send({ | ||||||
|               res.setHeader('Content-Type', 'text/cache-manifest'); |               error: { | ||||||
|               res.end('CACHE MANIFEST\n\n# v0__DELETE__CACHE__MANIFEST__\n\nNETWORK:\n*'); |                 message: "this is an api. ain't no www belong here" | ||||||
|               //domainApp.apps(req, res, next);
 |               , code: "E_WWW" | ||||||
|               return; |               } | ||||||
|             } |             }); | ||||||
|             // TODO XXX this is in the api section, so it should hard break
 |  | ||||||
|             //res.statusCode = 301;
 |  | ||||||
|             //res.setHeader('Location', newLoc);
 |  | ||||||
| 
 |  | ||||||
|             // TODO port number for non-443
 |  | ||||||
|             var escapeHtml = require('escape-html'); |  | ||||||
|             var newLocation = 'https://' + domainApp.hostname + req.url; |  | ||||||
|             var safeLocation = escapeHtml(newLocation); |  | ||||||
| 
 |  | ||||||
|             var metaRedirect = '' |  | ||||||
|               + '<html>\n' |  | ||||||
|               + '<head>\n' |  | ||||||
|               + '  <style>* { background-color: white; color: white; text-decoration: none; }</style>\n' |  | ||||||
|               + '  <META http-equiv="refresh" content="0;URL=' + safeLocation + '">\n' |  | ||||||
|               + '</head>\n' |  | ||||||
|               + '<body style="display: none;">\n' |  | ||||||
|               + '  <p>You requested an old resource. Please use this instead: \n' |  | ||||||
|               + '    <a href="' + safeLocation + '">' + safeLocation + '</a></p>\n' |  | ||||||
|               + '</body>\n' |  | ||||||
|               + '</html>\n' |  | ||||||
|               ; |  | ||||||
| 
 |  | ||||||
|             // 301 redirects will not work for appcache
 |  | ||||||
|             res.end(metaRedirect); |  | ||||||
|           })); |           })); | ||||||
|         }); |         }); | ||||||
|       } |       } | ||||||
|  | |||||||
							
								
								
									
										66
									
								
								worker.js
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								worker.js
									
									
									
									
									
								
							| @ -49,6 +49,36 @@ function init(info) { | |||||||
|         }); |         }); | ||||||
|       }); |       }); | ||||||
| 
 | 
 | ||||||
|  |       function scrubTheDub(req, res/*, next*/) { | ||||||
|  |         // hack for bricked app-cache
 | ||||||
|  |         if (/\.appcache\b/.test(req.url)) { | ||||||
|  |           res.setHeader('Content-Type', 'text/cache-manifest'); | ||||||
|  |           res.end('CACHE MANIFEST\n\n# v0__DELETE__CACHE__MANIFEST__\n\nNETWORK:\n*'); | ||||||
|  |           return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // TODO port number for non-443
 | ||||||
|  |         var escapeHtml = require('escape-html'); | ||||||
|  |         var newLocation = 'https://' + req.headers.host.replace(/^www\./, '') + req.url; | ||||||
|  |         var safeLocation = escapeHtml(newLocation); | ||||||
|  | 
 | ||||||
|  |         var metaRedirect = '' | ||||||
|  |           + '<html>\n' | ||||||
|  |           + '<head>\n' | ||||||
|  |           + '  <style>* { background-color: white; color: white; text-decoration: none; }</style>\n' | ||||||
|  |           + '  <META http-equiv="refresh" content="0;URL=' + safeLocation + '">\n' | ||||||
|  |           + '</head>\n' | ||||||
|  |           + '<body style="display: none;">\n' | ||||||
|  |           + '  <p>You requested an old resource. Please use this instead: \n' | ||||||
|  |           + '    <a href="' + safeLocation + '">' + safeLocation + '</a></p>\n' | ||||||
|  |           + '</body>\n' | ||||||
|  |           + '</html>\n' | ||||||
|  |           ; | ||||||
|  | 
 | ||||||
|  |         // 301 redirects will not work for appcache
 | ||||||
|  |         res.end(metaRedirect); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|       app.use('/', function (req, res, next) { |       app.use('/', function (req, res, next) { | ||||||
|         if (/^\/api/.test(req.url)) { |         if (/^\/api/.test(req.url)) { | ||||||
|           next(); |           next(); | ||||||
| @ -66,10 +96,27 @@ function init(info) { | |||||||
|         } |         } | ||||||
|         host = host.toLowerCase(); |         host = host.toLowerCase(); | ||||||
| 
 | 
 | ||||||
|  |         if (/^www\./.test(host)) { | ||||||
|  |           scrubTheDub(req, res, next); | ||||||
|  |           return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         function serveIt() { | ||||||
|  |           // TODO redirect GET /favicon.ico to GET (req.headers.referer||'') + /favicon.ico
 | ||||||
|  |           // TODO other common root things - robots.txt, app-icon, etc
 | ||||||
|  |           staticHandlers[host].favicon(req, res, function (err) { | ||||||
|  |             if (err) { | ||||||
|  |               next(err); | ||||||
|  |               return; | ||||||
|  |             } | ||||||
|  |             staticHandlers[host](req, res, next); | ||||||
|  |           }); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         if (staticHandlers[host]) { |         if (staticHandlers[host]) { | ||||||
|           if (staticHandlers[host].then) { |           if (staticHandlers[host].then) { | ||||||
|             staticHandlers[host].then(function () { |             staticHandlers[host].then(function () { | ||||||
|               staticHandlers[host](req, res, next); |               serveIt(); | ||||||
|             }, function (err) { |             }, function (err) { | ||||||
|               res.send({ |               res.send({ | ||||||
|                 error: { |                 error: { | ||||||
| @ -81,7 +128,7 @@ function init(info) { | |||||||
|             return; |             return; | ||||||
|           } |           } | ||||||
| 
 | 
 | ||||||
|           staticHandlers[host](req, res, next); |           serveIt(); | ||||||
|           return; |           return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -107,21 +154,24 @@ function init(info) { | |||||||
|                 return; |                 return; | ||||||
|               } |               } | ||||||
| 
 | 
 | ||||||
|               if (-1 === node.indexOf('.') || invalidHost.test(node)) { |               // ignore .gitkeep and folders without a .
 | ||||||
|  |               if (0 === node.indexOf('.') || -1 === node.indexOf('.') || invalidHost.test(node)) { | ||||||
|                 return; |                 return; | ||||||
|               } |               } | ||||||
| 
 | 
 | ||||||
|               console.log('vhost static'); |               console.log('vhost static'); | ||||||
|               console.log(node); |               console.log(node); | ||||||
|               staticHandlers[node] = require('serve-static')(path.join(__dirname, 'sites-enabled', node)); |               staticHandlers[node] = require('serve-static')(path.join(__dirname, 'sites-enabled', node)); | ||||||
|  |               try { | ||||||
|  |                 // TODO look for favicon
 | ||||||
|  |                 staticHandlers[node].favicon = require('serve-favicon')(path.join(__dirname, 'sites-enabled', node, 'favicon.ico')); | ||||||
|  |               } catch(e) { | ||||||
|  |                 staticHandlers[node].favicon = function (req, res, next) { next(); }; | ||||||
|  |               } | ||||||
|             }); |             }); | ||||||
| 
 | 
 | ||||||
|             console.log('vhost static final'); |  | ||||||
|             console.log(host); |  | ||||||
|             console.log(staticHandlers[host]); |  | ||||||
| 
 |  | ||||||
|             if (staticHandlers[host]) { |             if (staticHandlers[host]) { | ||||||
|               staticHandlers[host](req, res, next); |               serveIt(); | ||||||
|             } else { |             } else { | ||||||
|               next(); |               next(); | ||||||
|             } |             } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user