Skip to content

Instantly share code, notes, and snippets.

@aolde
Forked from ryanflorence/static_server.js
Last active February 27, 2024 23:00
Show Gist options
  • Save aolde/8104861 to your computer and use it in GitHub Desktop.
Save aolde/8104861 to your computer and use it in GitHub Desktop.
Simple web server in Node.js. This fork added mime types for common file types.
var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs")
port = process.argv[2] || 8888,
mimeTypes = {
"html": "text/html",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"png": "image/png",
"svg": "image/svg+xml",
"json": "application/json",
"js": "text/javascript",
"css": "text/css"
};
http.createServer(function(request, response) {
var uri = url.parse(request.url).pathname,
filename = path.join(process.cwd(), uri);
fs.exists(filename, function(exists) {
if(!exists) {
response.writeHead(404, { "Content-Type": "text/plain" });
response.write("404 Not Found\n");
response.end();
return;
}
if (fs.statSync(filename).isDirectory())
filename += '/index.html';
fs.readFile(filename, "binary", function(err, file) {
if(err) {
response.writeHead(500, {"Content-Type": "text/plain"});
response.write(err + "\n");
response.end();
return;
}
var mimeType = mimeTypes[filename.split('.').pop()];
if (!mimeType) {
mimeType = 'text/plain';
}
response.writeHead(200, { "Content-Type": mimeType });
response.write(file, "binary");
response.end();
});
});
}).listen(parseInt(port, 10));
console.log("Static file server running at\n => http://localhost:" + port + "/\nCTRL + C to shutdown");
@aolde
Copy link
Author

aolde commented Jun 2, 2020

@oxk4r01 I think since we are dealing with files of different encoding, text, image, etc, it makes sense to read the file in the raw binary format. Also, we are not interested in actually parsing and understand the file content - just passing it to the response stream.

The code can probably be optimised with using file streams instead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment