|
|
@ -80,7 +80,7 @@ WebServer.prototype = { |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
_handler: function (req, res) { |
|
|
|
_handler: function (req, res) { |
|
|
|
var url = req.url; |
|
|
|
var url = req.url.replace(/\/\//g, '/'); |
|
|
|
var urlParts = /([^?]*)((?:\?(.*))?)/.exec(url); |
|
|
|
var urlParts = /([^?]*)((?:\?(.*))?)/.exec(url); |
|
|
|
var pathPart = decodeURI(urlParts[1]), queryPart = urlParts[3]; |
|
|
|
var pathPart = decodeURI(urlParts[1]), queryPart = urlParts[3]; |
|
|
|
var verbose = this.verbose; |
|
|
|
var verbose = this.verbose; |
|
|
@ -172,6 +172,17 @@ WebServer.prototype = { |
|
|
|
serveRequestedFile(filePath); |
|
|
|
serveRequestedFile(filePath); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function escapeHTML(untrusted) { |
|
|
|
|
|
|
|
// Escape untrusted input so that it can safely be used in a HTML response
|
|
|
|
|
|
|
|
// in HTML and in HTML attributes.
|
|
|
|
|
|
|
|
return untrusted |
|
|
|
|
|
|
|
.replace(/&/g, '&') |
|
|
|
|
|
|
|
.replace(/</g, '<') |
|
|
|
|
|
|
|
.replace(/>/g, '>') |
|
|
|
|
|
|
|
.replace(/"/g, '"') |
|
|
|
|
|
|
|
.replace(/'/g, '''); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function serveDirectoryIndex(dir) { |
|
|
|
function serveDirectoryIndex(dir) { |
|
|
|
res.setHeader('Content-Type', 'text/html'); |
|
|
|
res.setHeader('Content-Type', 'text/html'); |
|
|
|
res.writeHead(200); |
|
|
|
res.writeHead(200); |
|
|
@ -194,21 +205,34 @@ WebServer.prototype = { |
|
|
|
res.write('<a href=\"..\">..</a><br>\n'); |
|
|
|
res.write('<a href=\"..\">..</a><br>\n'); |
|
|
|
} |
|
|
|
} |
|
|
|
files.forEach(function (file) { |
|
|
|
files.forEach(function (file) { |
|
|
|
var stat = fs.statSync(path.join(dir, file)); |
|
|
|
var stat; |
|
|
|
var item = pathPart + file; |
|
|
|
var item = pathPart + file; |
|
|
|
if (stat.isDirectory()) { |
|
|
|
var href = ''; |
|
|
|
res.write('<a href=\"' + encodeURI(item) + '\">' + |
|
|
|
var label = ''; |
|
|
|
file + '</a><br>\n'); |
|
|
|
var extraAttributes = ''; |
|
|
|
return; |
|
|
|
try { |
|
|
|
|
|
|
|
stat = fs.statSync(path.join(dir, file)); |
|
|
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
|
|
href = encodeURI(item); |
|
|
|
|
|
|
|
label = file + ' (' + e + ')'; |
|
|
|
|
|
|
|
extraAttributes = ' style="color:red"'; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (stat) { |
|
|
|
|
|
|
|
if (stat.isDirectory()) { |
|
|
|
|
|
|
|
href = encodeURI(item); |
|
|
|
|
|
|
|
label = file; |
|
|
|
|
|
|
|
} else if (path.extname(file).toLowerCase() === '.pdf') { |
|
|
|
|
|
|
|
href = '/web/viewer.html?file=' + encodeURIComponent(item); |
|
|
|
|
|
|
|
label = file; |
|
|
|
|
|
|
|
extraAttributes = ' target="pdf"'; |
|
|
|
|
|
|
|
} else if (all) { |
|
|
|
|
|
|
|
href = encodeURI(item); |
|
|
|
|
|
|
|
label = file; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
var ext = path.extname(file).toLowerCase(); |
|
|
|
if (label) { |
|
|
|
if (ext === '.pdf') { |
|
|
|
res.write('<a href=\"' + escapeHTML(href) + '\"' + |
|
|
|
res.write('<a href=\"/web/viewer.html?file=' + |
|
|
|
extraAttributes + '>' + escapeHTML(label) + '</a><br>\n'); |
|
|
|
encodeURI(item) + '\" target=pdf>' + |
|
|
|
|
|
|
|
file + '</a><br>\n'); |
|
|
|
|
|
|
|
} else if (all) { |
|
|
|
|
|
|
|
res.write('<a href=\"' + encodeURI(item) + '\">' + |
|
|
|
|
|
|
|
file + '</a><br>\n'); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
if (files.length === 0) { |
|
|
|
if (files.length === 0) { |
|
|
|