|  |  |  | const http = require('http'); | 
					
						
							|  |  |  | const url = require('url'); | 
					
						
							|  |  |  | const fs = require('fs'); | 
					
						
							|  |  |  | const path = require('path'); | 
					
						
							|  |  |  | // you can pass the parameter in the command line. e.g. node static_server.js 3000
 | 
					
						
							|  |  |  | const port = process.argv[3] || 9000; | 
					
						
							|  |  |  | const hostname = process.argv[2] || 'localhost'; | 
					
						
							|  |  |  | // maps file extention to MIME types
 | 
					
						
							|  |  |  | const mimeType = { | 
					
						
							|  |  |  |   '.ico': 'image/x-icon', | 
					
						
							|  |  |  |   '.html': 'text/html', | 
					
						
							|  |  |  |   '.js': 'text/javascript', | 
					
						
							|  |  |  |   '.json': 'application/json', | 
					
						
							|  |  |  |   '.css': 'text/css', | 
					
						
							|  |  |  |   '.png': 'image/png', | 
					
						
							|  |  |  |   '.jpg': 'image/jpeg', | 
					
						
							|  |  |  |   '.wav': 'audio/wav', | 
					
						
							|  |  |  |   '.mp3': 'audio/mpeg', | 
					
						
							|  |  |  |   '.svg': 'image/svg+xml', | 
					
						
							|  |  |  |   '.pdf': 'application/pdf', | 
					
						
							|  |  |  |   '.doc': 'application/msword', | 
					
						
							|  |  |  |   '.eot': 'appliaction/vnd.ms-fontobject', | 
					
						
							|  |  |  |   '.ttf': 'aplication/font-sfnt', | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | http | 
					
						
							|  |  |  |   .createServer((req, res) => { | 
					
						
							|  |  |  |     //   console.log(`${req.method} ${req.url}`);
 | 
					
						
							|  |  |  |     // parse URL
 | 
					
						
							|  |  |  |     const parsedUrl = url.parse(req.url); | 
					
						
							|  |  |  |     // extract URL path
 | 
					
						
							|  |  |  |     // Avoid https://en.wikipedia.org/wiki/Directory_traversal_attack
 | 
					
						
							|  |  |  |     // e.g curl --path-as-is http://localhost:9000/../fileInDanger.txt
 | 
					
						
							|  |  |  |     // by limiting the path to current directory only
 | 
					
						
							|  |  |  |     const sanitizePath = path | 
					
						
							|  |  |  |       .normalize(parsedUrl.pathname) | 
					
						
							|  |  |  |       .replace(/^(\.\.[/\\])+/, ''); | 
					
						
							|  |  |  |     let pathname = path.join(__dirname, sanitizePath); | 
					
						
							|  |  |  |     fs.exists(pathname, exist => { | 
					
						
							|  |  |  |       if (!exist) { | 
					
						
							|  |  |  |         // if the file is not found, return 404
 | 
					
						
							|  |  |  |         res.statusCode = 404; | 
					
						
							|  |  |  |         res.end(`File ${pathname} not found!`); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       // if is a directory, then look for index.html
 | 
					
						
							|  |  |  |       if (fs.statSync(pathname).isDirectory()) { | 
					
						
							|  |  |  |         pathname += '/index.html'; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       // read file from file system
 | 
					
						
							|  |  |  |       fs.readFile(pathname, (err, data) => { | 
					
						
							|  |  |  |         if (err) { | 
					
						
							|  |  |  |           res.statusCode = 500; | 
					
						
							|  |  |  |           res.end(`Error getting the file: ${err}.`); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           // based on the URL path, extract the file extention. e.g. .js, .doc, ...
 | 
					
						
							|  |  |  |           const { ext } = path.parse(pathname); | 
					
						
							|  |  |  |           // if the file is found, set Content-type and send data
 | 
					
						
							|  |  |  |           res.setHeader('Content-type', mimeType[ext] || 'text/plain'); | 
					
						
							|  |  |  |           res.end(data); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  |   .listen(parseInt(port, 10), hostname); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // eslint-disable-next-line
 | 
					
						
							|  |  |  | console.log(`metrics running on http://${hostname}:${port}/metrics.html`); |