From 33e996d33dcb5a68709f1c130d02e8e18a8f7698 Mon Sep 17 00:00:00 2001 From: Jesse Ditson Date: Mon, 18 Jul 2016 19:37:33 -0700 Subject: [PATCH 1/4] Add baseDir option, add --baseDir flag to cli options to specify base path --- README.md | 1 + bin/http-server | 6 +++++- lib/http-server.js | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0ffbbc1f..78b4089e 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ This will install `http-server` globally so that it may be run from the command | ------------- |-------------|-------------| |`-p` or `--port` |Port to use. Use `-p 0` to look for an open port, starting at 8080. It will also read from `process.env.PORT`. |8080 | |`-a` |Address to use |0.0.0.0| +|`--baseDir` | Base path to serve files from | `/` | |`-d` |Show directory listings |`true` | |`-i` | Display autoIndex | `true` | |`-g` or `--gzip` |When enabled it will serve `./public/some-file.js.gz` in place of `./public/some-file.js` when a gzipped version of the file exists and the request accepts gzip encoding. If brotli is also enabled, it will try to serve brotli first.|`false`| diff --git a/bin/http-server b/bin/http-server index 7c597fa8..93206684 100755 --- a/bin/http-server +++ b/bin/http-server @@ -27,6 +27,7 @@ if (argv.h || argv.help) { ' -p --port Port to use. If 0, look for open port. [8080]', ' -a Address to use [0.0.0.0]', ' -d Show directory listings [true]', + ' --baseDir Base directory to serve files from [/]', ' -i Display autoIndex [true]', ' -g --gzip Serve gzip files when possible [false]', ' -b --brotli Serve brotli files when possible [false]', @@ -73,6 +74,7 @@ var port = argv.p || argv.port || parseInt(process.env.PORT, 10), proxyOptions = argv['proxy-options'], utc = argv.U || argv.utc, version = argv.v || argv.version, + baseDir = argv.baseDir || argv.basedir, logger; var proxyOptionsBooleanProps = [ @@ -142,6 +144,7 @@ function listen(port) { cache: argv.c, timeout: argv.t, showDir: argv.d, + baseDir: baseDir, autoIndex: argv.i, gzip: argv.g || argv.gzip, brotli: argv.b || argv.brotli, @@ -216,7 +219,8 @@ function listen(port) { ([chalk.yellow('AutoIndex: '), argv.i ? chalk.red('not visible') : chalk.cyan('visible')].join('')), ([chalk.yellow('Serve GZIP Files: '), argv.g || argv.gzip ? chalk.cyan('true') : chalk.red('false')].join('')), ([chalk.yellow('Serve Brotli Files: '), argv.b || argv.brotli ? chalk.cyan('true') : chalk.red('false')].join('')), - ([chalk.yellow('Default File Extension: '), argv.e ? chalk.cyan(argv.e) : (argv.ext ? chalk.cyan(argv.ext) : chalk.red('none'))].join('')) + ([chalk.yellow('Default File Extension: '), argv.e ? chalk.cyan(argv.e) : (argv.ext ? chalk.cyan(argv.ext) : chalk.red('none'))].join('')), + ([chalk.yellow('Base directory: '), baseDir ? chalk.cyan(baseDir) : chalk.cyan('/')].join('')) ].join('\n')); logger.info(chalk.yellow('\nAvailable on:')); diff --git a/lib/http-server.js b/lib/http-server.js index dfe4c474..0e946ac7 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -127,6 +127,7 @@ function HttpServer(options) { before.push(httpServerCore({ root: this.root, + baseDir: options.baseDir, cache: this.cache, showDir: this.showDir, showDotfiles: this.showDotfiles, From 62935b8f969d80995d3d56d3db80dade13618f52 Mon Sep 17 00:00:00 2001 From: Jesse Ditson Date: Fri, 22 Jun 2018 15:01:51 -0700 Subject: [PATCH 2/4] add path to logged URLs --- bin/http-server | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/http-server b/bin/http-server index 93206684..38db952b 100755 --- a/bin/http-server +++ b/bin/http-server @@ -200,7 +200,8 @@ function listen(port) { var server = httpServer.createServer(options); server.listen(port, host, function () { - var protocol = tls ? 'https://' : 'http://'; + var protocol = tls ? 'https://' : 'http://', + path = baseDir ? '/' + baseDir.replace(/^\//, '') : ''; logger.info([ chalk.yellow('Starting up http-server, serving '), @@ -226,12 +227,12 @@ function listen(port) { logger.info(chalk.yellow('\nAvailable on:')); if (argv.a && host !== '0.0.0.0') { - logger.info(` ${protocol}${host}:${chalk.green(port.toString())}`); + logger.info(` ${protocol}${host}:${chalk.green(port.toString())}${path}`); } else { Object.keys(ifaces).forEach(function (dev) { ifaces[dev].forEach(function (details) { if (details.family === 'IPv4') { - logger.info((' ' + protocol + details.address + ':' + chalk.green(port.toString()))); + logger.info((' ' + protocol + details.address + ':' + chalk.green(port.toString()) + path)); } }); }); From d2b5c5310b0581e374ae2551814415fac59b82f3 Mon Sep 17 00:00:00 2001 From: Jesse Ditson Date: Mon, 22 Apr 2019 20:28:43 -0700 Subject: [PATCH 3/4] Address feedback from @thornjad, add --base-dir flag --- README.md | 2 +- bin/http-server | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 78b4089e..57ec2c1b 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ This will install `http-server` globally so that it may be run from the command | ------------- |-------------|-------------| |`-p` or `--port` |Port to use. Use `-p 0` to look for an open port, starting at 8080. It will also read from `process.env.PORT`. |8080 | |`-a` |Address to use |0.0.0.0| -|`--baseDir` | Base path to serve files from | `/` | +|`--base-dir` | Base path to serve files from | `/` | |`-d` |Show directory listings |`true` | |`-i` | Display autoIndex | `true` | |`-g` or `--gzip` |When enabled it will serve `./public/some-file.js.gz` in place of `./public/some-file.js` when a gzipped version of the file exists and the request accepts gzip encoding. If brotli is also enabled, it will try to serve brotli first.|`false`| diff --git a/bin/http-server b/bin/http-server index 38db952b..8813143e 100755 --- a/bin/http-server +++ b/bin/http-server @@ -27,7 +27,7 @@ if (argv.h || argv.help) { ' -p --port Port to use. If 0, look for open port. [8080]', ' -a Address to use [0.0.0.0]', ' -d Show directory listings [true]', - ' --baseDir Base directory to serve files from [/]', + ' --base-dir Base directory to serve files from [/]', ' -i Display autoIndex [true]', ' -g --gzip Serve gzip files when possible [false]', ' -b --brotli Serve brotli files when possible [false]', @@ -74,7 +74,7 @@ var port = argv.p || argv.port || parseInt(process.env.PORT, 10), proxyOptions = argv['proxy-options'], utc = argv.U || argv.utc, version = argv.v || argv.version, - baseDir = argv.baseDir || argv.basedir, + baseDir = argv['base-dir'], logger; var proxyOptionsBooleanProps = [ From 0c6b7efea9d7ec4ba3694be758cefc7f4a0cd43c Mon Sep 17 00:00:00 2001 From: "max.sagan" Date: Mon, 17 Oct 2022 14:10:41 +1100 Subject: [PATCH 4/4] base-dir tests --- test/main.test.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/test/main.test.js b/test/main.test.js index df4c65b8..99fa91b4 100644 --- a/test/main.test.js +++ b/test/main.test.js @@ -291,6 +291,37 @@ test('http-server main', (t) => { } }); }), + + new Promise((resolve) => { + const server = httpServer.createServer({ + root, + baseDir: '/test' + }); + + server.listen(8084, async () => { + try { + await Promise.all([ + // should serve files at the specified baseDir + requestAsync("http://localhost:8084/test/file").then(async (res) => { + t.equal(res.statusCode, 200); + const fileData = await fsReadFile(path.join(root, 'file'), 'utf8'); + t.equal(res.body.trim(), fileData.trim()); + }).catch(err => t.fail(err.toString())), + + // should not serve files at the root + requestAsync("http://localhost:8084/file").then((res) => { + t.equal(res.statusCode, 403); + t.equal(res.body, ''); + }).catch(err => t.fail(err.toString())), + ]); + } catch (err) { + t.fail(err.toString()); + } finally { + server.close(); + resolve(); + } + }); + }), ]).then(() => t.end()) .catch(err => { t.fail(err.toString());