@ -66,7 +66,7 @@ WebServer.prototype = {
@@ -66,7 +66,7 @@ WebServer.prototype = {
this . server = null ;
} ,
_handler : function ( req , res ) {
var url = req . url ;
var url = req . url . replace ( /\/\//g , '/' ) ;
var urlParts = /([^?]*)((?:\?(.*))?)/ . exec ( url ) ;
var pathPart = decodeURI ( urlParts [ 1 ] ) , queryPart = urlParts [ 3 ] ;
var verbose = this . verbose ;
@ -158,6 +158,17 @@ WebServer.prototype = {
@@ -158,6 +158,17 @@ WebServer.prototype = {
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 ) {
res . setHeader ( 'Content-Type' , 'text/html' ) ;
res . writeHead ( 200 ) ;
@ -180,21 +191,34 @@ WebServer.prototype = {
@@ -180,21 +191,34 @@ WebServer.prototype = {
res . write ( '<a href=\"..\">..</a><br>\n' ) ;
}
files . forEach ( function ( file ) {
var stat = fs . statSync ( path . join ( dir , file ) ) ;
var stat ;
var item = pathPart + file ;
if ( stat . isDirectory ( ) ) {
res . write ( '<a href=\"' + encodeURI ( item ) + '\">' +
file + '</a><br>\n' ) ;
return ;
var href = '' ;
var label = '' ;
var extraAttributes = '' ;
try {
stat = fs . statSync ( path . join ( dir , file ) ) ;
} catch ( e ) {
href = encodeURI ( item ) ;
label = file + ' (' + e + ')' ;
extraAttributes = ' style="color:red"' ;
}
var ext = path . extname ( file ) . toLowerCase ( ) ;
if ( ext === '.pdf' ) {
res . write ( '<a href=\"/web/viewer.html?file=' +
encodeURI ( item ) + '\" target=pdf>' +
file + '</a><br>\n' ) ;
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 ) {
res . write ( '<a href=\"' + encodeURI ( item ) + '\">' +
file + '</a><br>\n' ) ;
href = encodeURI ( item ) ;
label = file ;
}
}
if ( label ) {
res . write ( '<a href=\"' + escapeHTML ( href ) + '\"' +
extraAttributes + '>' + escapeHTML ( label ) + '</a><br>\n' ) ;
}
} ) ;
if ( files . length === 0 ) {