Skip to content

@ryanflorence /static_server.js
Last active

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Node.JS static file web server. Put it in your path to fire up servers in any directory, takes an optional port argument.
var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs")
port = process.argv[2] || 8888;
http.createServer(function(request, response) {
var uri = url.parse(request.url).pathname
, filename = path.join(process.cwd(), uri);
path.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;
}
response.writeHead(200);
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");
@davidgovea

Thank you!

@agentgt

likewise on the thank you!

@jameswomack

Thank you for making this available

@hhadri

Thank you!

@respectTheCode

This doesn't set the mim type. You can use the mime module like this https://gist.github.com/1926868

@shahalpk

Thanks a lot!

@manhhung741

thanks XD

@tonylukasavage

Great stuff, exactly what I was looking for.

@hamxiaoz

You may use the non-static module as well

@mattrudder

Thanks for this! :)

@dylantack

Careful! This code is vulnerable to a directory traversal attack.

@tonylukasavage

I'm just using it for a local web preview anyway

@smurph269

I'm just getting started with node.js and backbone.js and this has been perfect for setting up demo apps quickly.

@alexblackie

I needed to put up a holding page for a website I was building and this was an awesome lightweight solution... Thanks!

@jagtesh

Just what I was looking for. Danke Shoen!

@yaniv-aknin

Consider also python -m SimpleHTTPServer 888 or twistd -n web -p 8888 --path .. The former is installed pretty much anywhere where there's Python, the latter is better performing and is bundled with many distributions including Mac OSX - no need for pasting/downloading another file.

@yosske

Thanks!

@Filirom1

So good !

@Premier

Great!

@axelsears

Thank you, this rocks!

@ubinix-warun

Thanks!

@Waxolunist

path.exists should be changed to fs.exists

@kljensen

Nice! I typically use

python -m SimpleHTTPServer

to serve the cwd.

@srgg6701

Brilliant solution!

@samof76

fantastic.... love this!

@adamgibbons

nice, this totally is the javascript spirit of the python SimpleHTTPServer

@ambrosechua

I dumped in piping because I was using it to transfer larger files. May be slow... gist

@aamirafridi

Great example to understand

@Lordoomer

Wow the first one that works for me thank very much for this code!
Well, it works everywhere except in...surprise: IE11 & <

@Ajedi32

Quick question: does this script ensure that data in higher-level directories is inaccessible via http requests? E.g. I can't request /../../../../.ssh/id_rsa (just an example) and have it send that data to me?

@samuelfine

@dylantack @Ajedi32 I was concerned about this as well, but after some quick testing it appears that url.parse is sanitizing the requested path. For example, if this node server is running from /home and you try visiting 1.2.3.4:8888/../../../../.ssh/id_rsa it resolves to /home/.ssh/id_rsa.

@tahiralvi

Thanks.

@nathanbuckley

Great work, Thanks

@bgkittrell

FYI, if you're serving media files you might want to look at the send module. It will handle large files better, and Partial Content requests (important for HTML5 video).

https://github.com/visionmedia/send

@Jerskouille

To be sure to avoid transversal directory attacks without relying on url.parse, one could also do

var cwd = process.cwd();
http.createServer (function (req, res) {
    var uri = url.parse(req.url).pathname,
        filename = path.join(cwd, uri);
    if (filename.indexOf(cwd) !== 0)
        // Abort
}

Also, I would use filename = path.join(filename, 'index.html') instead of filename += '/index.html'. / isn't necessarily the OS separator, or we wouldn't use a path module.

@johnjqc

muy bueno, gracias

@meetkiran

thanks a lot dude

@brandt1871

Many thanks.

Shouldn't the method "exists" be used with fs instead of path?
On line 12 of the code we have:

path.exists(filename, function(exists) {...});

This gave me an error and it seemed fine after I replaced it with:

fs.exists(filename, function(exists) {...});
@einsiol

Agree with the last comment, replacing path.exist with fs.exist fixed an error that I did not fully understand. Otherwise, fantastic solution, perfect for beginners :)

@raidenz

yes thanks brandt1871 path.exists is now called fs.exists

@fordnox

Same issue here, path.exists is now called fs.exists

Please fix for future generations :)

@ratneshnavlakhe

Thanks!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.