diff options
author | Feross Aboukhadijeh <feross@feross.org> | 2014-09-13 21:04:13 +0400 |
---|---|---|
committer | Feross Aboukhadijeh <feross@feross.org> | 2014-09-13 21:04:13 +0400 |
commit | 8290a91b398b44b41f29306a328d8ee5097c222e (patch) | |
tree | 1f58db7313b3ac22f3d15b82444f723f813be717 /lib/server.js | |
parent | c24aab11fd46388a789cf1263832fe57836959a5 (diff) |
`webtorrent` module works with browserify (fix #88)
Diffstat (limited to 'lib/server.js')
-rw-r--r-- | lib/server.js | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/lib/server.js b/lib/server.js new file mode 100644 index 0000000..3f85629 --- /dev/null +++ b/lib/server.js @@ -0,0 +1,58 @@ +var debug = require('debug')('webtorrent:server') +var http = require('http') +var mime = require('mime') +var pump = require('pump') +var rangeParser = require('range-parser') +var url = require('url') + +module.exports = function Server (webtorrent, port) { + var server = http.createServer() + + server.on('connection', function (socket) { + socket.setTimeout(36000000) + }) + + server.on('request', function (req, res) { + debug('onRequest') + + var u = url.parse(req.url) + if (u.pathname === '/favicon.ico') return res.end() + if (u.pathname === '/') u.pathname = '/' + webtorrent.index + var i = Number(u.pathname.slice(1)) + + if (isNaN(i) || i >= webtorrent.torrent.files.length) { + res.statusCode = 404 + return res.end() + } + + if (webtorrent.torrent) onTorrent(webtorrent.torrent) + else webtorrent.once('torrent', onTorrent) + + function onTorrent (torrent) { + var file = torrent.files[i] + + res.setHeader('accept-ranges', 'bytes') + res.setHeader('content-type', mime.lookup(file.name)) + res.statusCode = 206 + + var range + if (req.headers.range) { + // no support for multi-range reqs + range = rangeParser(file.length, req.headers.range)[0] + debug('range %s', JSON.stringify(range)) + res.setHeader( + 'Content-Range', + 'bytes ' + range.start + '-' + range.end + '/' + file.length + ) + res.setHeader('Content-Length', range.end - range.start + 1) + } else { + res.setHeader('Content-Length', file.length) + } + if (req.method === 'HEAD') res.end() + pump(file.createReadStream(range), res) + } + }) + server.listen(port) + + return server +} |