-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
server.js
86 lines (69 loc) · 2.04 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
var http = require('http')
var fs = require('fs')
var after = require('after-all')
var pump = require('pump')
var path = require('path')
var mkdirp = require('mkdirp')
var cors = require('cors')
var url = require('url')
module.exports = function(root) {
if (!root) root = '/'
root = fs.realpathSync(root)
var onrequest = function(req, res) {
var qs = url.parse(req.url, true).query
var trim = function(u) {
u = u.replace(root, '')
if (u[0] !== '/') u = '/'+u
return u
}
var onerror = function(err) {
if (!err) return res.end()
res.statusCode = err.code === 'ENOENT' ? 404 : 500
res.end(err.message)
}
var name = path.join('/', req.url.split('?')[0]).replace(/%20/g, '\ ')
var u = path.join(root, name)
if (req.method === 'POST') return mkdirp(u, onerror)
if (req.method === 'PUT') return pump(req, fs.createWriteStream(u), onerror)
var onfile = function(st) {
server.emit('file', u, st)
res.setHeader('Content-Length', st.size)
pump(fs.createReadStream(u), res)
}
var ondirectory = function(st) {
server.emit('directory', u, st)
fs.readdir(u, function(err, files) {
if (err) return onerror(err)
var next = after(function() {
res.end(JSON.stringify(files))
})
files.forEach(function(file, i) {
var n = next()
fs.stat(path.join(u, file), function(err, st) {
if (err) return n(err)
files[i] = {
path: trim(path.join(u, file)),
mountPath: path.join(u, file),
type: st.isDirectory() ? 'directory' : 'file',
size: st.size
}
n()
})
})
})
}
fs.stat(u, function(err, st) {
if (err) return onerror(err)
if (st.isDirectory()) return ondirectory(st)
onfile(st)
})
}
var c = cors()
var server = http.createServer(function(req, res) {
c(req, res, function() {
onrequest(req, res)
})
})
server.root = root
return server
}