Skip to content

Instantly share code, notes, and snippets.

@kiraind
Last active October 20, 2019 01:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kiraind/8571e3a88c29cf38ecdcdb2684deee89 to your computer and use it in GitHub Desktop.
Save kiraind/8571e3a88c29cf38ecdcdb2684deee89 to your computer and use it in GitHub Desktop.
Static Node.js HTTP-server with mime-type support
const http = require('http')
const url = require('url')
const path = require('path')
const fs = require('fs')
if(!process.argv[2]) {
throw new Error('please specify port as argumnet')
}
const port = parseInt(process.argv[2], 10)
http.createServer(function (request, response) {
const uri = url.parse(request.url).pathname
let filename = path.join(process.cwd(), uri)
// let filename = path.join(process.cwd(), 'static', uri)
const contentTypesByExtension = {
'.html': 'text/html',
'.css': 'text/css',
'.js': 'text/javascript'
}
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
}
const headers = {}
const contentType = contentTypesByExtension[path.extname(filename)]
if (contentType) {
headers['Content-Type'] = contentType
}
response.writeHead(200, headers)
response.write(file, 'binary')
response.end()
})
})
}).listen(port)
console.log('Static file server running at\n => http://localhost:' + port)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment