Compare commits

...

58 Commits

Author SHA1 Message Date
Douglas Christopher Wilson
a399faa180 1.9.1 2017-09-29 00:23:59 -04:00
Douglas Christopher Wilson
fc6953383f deps: parseurl@~1.3.2 2017-09-29 00:22:44 -04:00
Douglas Christopher Wilson
45dbe4f219 docs: add express.static to the express example
closes #64
2017-09-29 00:20:54 -04:00
Daniel Tschinder
76e3c3af41 deps: debug@2.6.9
closes #65
2017-09-28 23:27:29 -04:00
Douglas Christopher Wilson
da37631e2c build: Node.js@8.3 2017-09-02 20:01:11 -04:00
Douglas Christopher Wilson
3e09fb26f9 build: Node.js@6.11 2017-09-02 19:58:07 -04:00
Douglas Christopher Wilson
0894f8c9ff deps: mime-types@~2.1.17 2017-09-02 19:54:30 -04:00
Douglas Christopher Wilson
a4f1ef3d5e deps: http-errors@~1.6.2 2017-09-02 19:48:04 -04:00
Douglas Christopher Wilson
ccbeaebe69 deps: accepts@~1.3.4 2017-09-02 19:45:33 -04:00
Douglas Christopher Wilson
bc077cbe29 1.9.0 2017-05-25 15:45:44 -04:00
Douglas Christopher Wilson
9ecc9a68f9 Set X-Content-Type-Options: nosniff header 2017-05-25 01:11:36 -04:00
Douglas Christopher Wilson
2b7755a28b Refactor responding to common function 2017-05-25 01:07:35 -04:00
Douglas Christopher Wilson
506626c751 lint: remove two unused variable declarations 2017-05-25 00:51:11 -04:00
Douglas Christopher Wilson
2349675b98 build: Node.js@7.10 2017-05-25 00:45:05 -04:00
Douglas Christopher Wilson
c5a317fb45 deps: batch@0.6.1 2017-05-25 00:44:21 -04:00
Douglas Christopher Wilson
9284264604 deps: debug@2.6.8
closes #63
2017-05-25 00:42:30 -04:00
Douglas Christopher Wilson
c2585e2c16 build: Node.js@7.9 2017-04-28 22:09:36 -04:00
Douglas Christopher Wilson
e7d4062773 tests: remove unused file 2017-04-25 23:17:40 -04:00
Douglas Christopher Wilson
3e32e4ac3d build: Node.js@7.8 2017-04-25 23:13:11 -04:00
Lucian Buzzo
69137b760f deps: debug@2.6.4
closes #62
2017-04-25 23:11:41 -04:00
Douglas Christopher Wilson
a8205c834a build: Node.js@7.7 2017-03-25 22:48:16 -04:00
Douglas Christopher Wilson
d09bb5e774 deps: batch@0.6.0 2017-03-25 22:45:23 -04:00
Douglas Christopher Wilson
6024e991ca deps: debug@2.6.3 2017-03-25 22:35:02 -04:00
Douglas Christopher Wilson
f7e0bb551d deps: mime-types@~2.1.15 2017-03-25 22:32:39 -04:00
Douglas Christopher Wilson
7215f76cca build: Node.js@7.6 2017-03-08 00:17:05 -05:00
Douglas Christopher Wilson
c6b63e4666 build: Node.js@6.10 2017-03-08 00:15:37 -05:00
Douglas Christopher Wilson
ec31019c9e build: Node.js@4.8 2017-03-08 00:09:12 -05:00
Douglas Christopher Wilson
efe0c6fa7d deps: http-errors@~1.6.1 2017-03-08 00:04:36 -05:00
Douglas Christopher Wilson
d2bebdbd87 deps: mime-types@~2.1.14 2017-03-02 22:33:47 -05:00
Douglas Christopher Wilson
3048085dc4 deps: debug@2.6.1 2017-03-02 22:31:26 -05:00
Douglas Christopher Wilson
1c8c8b9a59 build: Node.js@7.4 2017-02-08 00:37:09 -05:00
Douglas Christopher Wilson
2bbaaba5cc build: Node.js@4.7 2017-02-08 00:35:08 -05:00
Douglas Christopher Wilson
84285a0826 build: support Node.js 7.x 2016-11-21 20:31:31 -05:00
Douglas Christopher Wilson
11c2b39640 deps: mime-types@~2.1.13 2016-11-21 20:30:36 -05:00
Douglas Christopher Wilson
98ecd80f57 deps: http-errors@~1.5.1 2016-11-21 20:29:37 -05:00
Douglas Christopher Wilson
53a7b06bc6 deps: debug@2.3.3 2016-11-20 22:11:16 -05:00
Douglas Christopher Wilson
4ed20255be build: Node.js@6.9 2016-11-20 22:08:36 -05:00
Douglas Christopher Wilson
8201055cba build: Node.js@4.6 2016-11-20 22:05:47 -05:00
Douglas Christopher Wilson
af6bec9cc3 docs: add preamble to install section 2016-09-15 19:16:03 +02:00
Douglas Christopher Wilson
2932faa568 build: istanbul@0.4.5 2016-09-15 19:10:35 +02:00
Douglas Christopher Wilson
dc54507b68 build: after@0.8.2 2016-09-15 19:06:24 +02:00
Douglas Christopher Wilson
72b08d6395 build: Node.js@4.5 2016-09-15 19:04:36 +02:00
Douglas Christopher Wilson
1284ad0a9f build: istanbul@0.4.4 2016-08-20 21:48:50 -04:00
Douglas Christopher Wilson
a275e385c4 build: Node.js@5.12 2016-08-20 21:43:35 -04:00
Douglas Christopher Wilson
357452911d 1.8.0 2016-06-17 12:13:08 -04:00
Douglas Christopher Wilson
fb1c509620 build: support Node.js 6.x 2016-06-16 20:37:26 -04:00
Douglas Christopher Wilson
2e1836e614 build: Node.js@5.11 2016-06-16 20:37:07 -04:00
Douglas Christopher Wilson
ed181e36ed deps: http-errors@~1.5.0 2016-06-16 19:46:25 -04:00
Douglas Christopher Wilson
f99abfe86a build: mocha@2.5.3 2016-06-16 19:44:37 -04:00
Douglas Christopher Wilson
e9ccd54a5d build: istanbul@0.4.3 2016-06-16 19:43:53 -04:00
Douglas Christopher Wilson
972e4d1ced deps: accepts@~1.3.3
fixes #56
2016-06-16 19:42:47 -04:00
Douglas Christopher Wilson
28e28c8352 deps: mime-types@~2.1.11
closes #47
2016-06-16 19:41:07 -04:00
Douglas Christopher Wilson
cd7ab38593 build: cache node_modules on CI 2016-04-17 22:19:04 -04:00
Douglas Christopher Wilson
a8c6d17b08 build: Node.js@5.10 2016-04-17 22:11:58 -04:00
Douglas Christopher Wilson
6cb3ab01a0 build: Node.js@4.4 2016-04-17 22:09:43 -04:00
Douglas Christopher Wilson
11b27ed4d3 build: mocha@2.4.5 2016-02-13 16:09:46 -05:00
Patrick Glynn
5afc181207 Make inline file search case-insensitive
closes #38
closes #45
2016-01-24 18:51:15 -05:00
Douglas Christopher Wilson
8195aa5d6a deps: accepts@~1.3.1 2016-01-24 18:45:30 -05:00
10 changed files with 162 additions and 64 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
coverage
node_modules
npm-debug.log
package-lock.json

View File

@@ -6,12 +6,25 @@ node_js:
- "1.8"
- "2.5"
- "3.3"
- "4.2"
- "5.3"
- "4.8"
- "5.12"
- "6.11"
- "7.10"
- "8.3"
sudo: false
cache:
directories:
- node_modules
before_install:
# Skip updating shrinkwrap / lock
- "npm config set shrinkwrap false"
# Setup Node.js version-specific dependencies
- "test $TRAVIS_NODE_VERSION != '0.8' || npm rm --save-dev istanbul"
# Update Node.js modules
- "test ! -d node_modules || npm prune"
- "test ! -d node_modules || npm rebuild"
script:
# Run test script, depending on istanbul install
- "test ! -z $(npm -ps ls istanbul) || npm test"

View File

@@ -1,3 +1,57 @@
1.9.1 / 2017-09-28
==================
* deps: accepts@~1.3.4
- deps: mime-types@~2.1.16
* deps: debug@2.6.9
* deps: http-errors@~1.6.2
- deps: depd@1.1.1
* deps: mime-types@~2.1.17
- Add new mime types
- deps: mime-db@~1.30.0
* deps: parseurl@~1.3.2
- perf: reduce overhead for full URLs
- perf: unroll the "fast-path" `RegExp`
1.9.0 / 2017-05-25
==================
* Set `X-Content-Type-Options: nosniff` header
* deps: batch@0.6.1
* deps: debug@2.6.8
- Allow colors in workers
- Deprecated `DEBUG_FD` environment variable set to `3` or higher
- Fix `DEBUG_MAX_ARRAY_LENGTH`
- Fix error when running under React Native
- Use same color for same namespace
- deps: ms@2.0.0
* deps: http-errors@~1.6.1
- Make `message` property enumerable for `HttpError`s
- deps: inherits@2.0.3
- deps: setprototypeof@1.0.3
- deps: statuses@'>= 1.3.1 < 2'
* deps: mime-types@~2.1.15
- Add new mime types
- Add `audio/mp3`
1.8.0 / 2016-06-17
==================
* Make inline file search case-insensitive
* deps: accepts@~1.3.3
- deps: mime-types@~2.1.11
- deps: negotiator@0.6.1
- perf: improve header parsing speed
* deps: http-errors@~1.5.0
- Use `setprototypeof` module to replace `__proto__` setting
- deps: inherits@2.0.1
- deps: statuses@'>= 1.3.0 < 2'
- perf: enable strict mode
* deps: mime-types@~2.1.11
- Add new mime types
- Update primary extension for `audio/mp4`
- deps: mime-db@~1.23.0
1.7.3 / 2016-01-24
==================

View File

@@ -11,6 +11,10 @@
## Install
This is a [Node.js](https://nodejs.org/en/) module available through the
[npm registry](https://www.npmjs.com/). Installation is done using the
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
```sh
$ npm install serve-index
```
@@ -123,8 +127,12 @@ var serveIndex = require('serve-index')
var app = express()
// Serve URLs like /ftp/thing as public/ftp/thing
app.use('/ftp', serveIndex('public/ftp', {'icons': true}))
app.listen()
// The express.static serves the file contents
// The serveIndex is this module serving the directory
app.use('/ftp', express.static('public/ftp'), serveIndex('public/ftp', {'icons': true}))
// Listen
app.listen(3000)
```
## License

View File

@@ -6,11 +6,19 @@ environment:
- nodejs_version: "1.8"
- nodejs_version: "2.5"
- nodejs_version: "3.3"
- nodejs_version: "4.2"
- nodejs_version: "5.3"
- nodejs_version: "4.8"
- nodejs_version: "5.12"
- nodejs_version: "6.11"
- nodejs_version: "7.10"
- nodejs_version: "8.3"
cache:
- node_modules
install:
- ps: Install-Product node $env:nodejs_version
- npm config set shrinkwrap false
- if "%nodejs_version%" equ "0.8" npm rm --save-dev istanbul
- if exist node_modules npm prune
- if exist node_modules npm rebuild
- npm install
build: off
test_script:

View File

@@ -208,11 +208,7 @@ serveIndex.html = function _html(req, res, files, next, dir, showUp, icons, path
// render html
render(locals, function (err, body) {
if (err) return next(err);
var buf = new Buffer(body, 'utf8');
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.setHeader('Content-Length', buf.length);
res.end(buf);
send(res, 'text/html', body)
});
});
});
@@ -223,12 +219,7 @@ serveIndex.html = function _html(req, res, files, next, dir, showUp, icons, path
*/
serveIndex.json = function _json(req, res, files) {
var body = JSON.stringify(files);
var buf = new Buffer(body, 'utf8');
res.setHeader('Content-Type', 'application/json; charset=utf-8');
res.setHeader('Content-Length', buf.length);
res.end(buf);
send(res, 'application/json', JSON.stringify(files))
};
/**
@@ -236,12 +227,7 @@ serveIndex.json = function _json(req, res, files) {
*/
serveIndex.plain = function _plain(req, res, files) {
var body = files.join('\n') + '\n';
var buf = new Buffer(body, 'utf8');
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
res.setHeader('Content-Length', buf.length);
res.end(buf);
send(res, 'text/plain', (files.join('\n') + '\n'))
};
/**
@@ -425,9 +411,7 @@ function iconLookup(filename) {
function iconStyle(files, useIcons) {
if (!useIcons) return '';
var className;
var i;
var iconName;
var list = [];
var rules = {};
var selector;
@@ -505,6 +489,23 @@ function removeHidden(files) {
});
}
/**
* Send a response.
* @private
*/
function send (res, type, body) {
// security header for content sniffing
res.setHeader('X-Content-Type-Options', 'nosniff')
// standard headers
res.setHeader('Content-Type', type + '; charset=utf-8')
res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'))
// body
res.end(body, 'utf8')
}
/**
* Stat all files and return array of stat
* in same order.

View File

@@ -1,23 +1,23 @@
{
"name": "serve-index",
"description": "Serve directory listings",
"version": "1.7.3",
"version": "1.9.1",
"author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
"license": "MIT",
"repository": "expressjs/serve-index",
"dependencies": {
"accepts": "~1.2.13",
"batch": "0.5.3",
"debug": "~2.2.0",
"accepts": "~1.3.4",
"batch": "0.6.1",
"debug": "2.6.9",
"escape-html": "~1.0.3",
"http-errors": "~1.3.1",
"mime-types": "~2.1.9",
"parseurl": "~1.3.1"
"http-errors": "~1.6.2",
"mime-types": "~2.1.17",
"parseurl": "~1.3.2"
},
"devDependencies": {
"after": "0.8.1",
"istanbul": "0.4.2",
"mocha": "2.3.4",
"after": "0.8.2",
"istanbul": "0.4.5",
"mocha": "2.5.3",
"supertest": "1.1.0"
},
"files": [

View File

@@ -52,11 +52,11 @@
}
function search() {
var str = $('search').value
, links = $('files').all('a');
var str = $('search').value.toLowerCase();
var links = $('files').all('a');
links.each(function(link){
var text = link.textContent;
var text = link.textContent.toLowerCase();
if ('..' == text) return;
if (str.length && ~text.indexOf(str)) {

View File

@@ -1,26 +0,0 @@
var bytes = require('bytes');
exports['default request body'] = function(app){
it('should default to {}', function(done){
app.request()
.post('/')
.end(function(res){
res.body.should.equal('{}');
done();
})
})
};
exports['limit body to'] = function(size, type, app){
it('should accept a limit option', function(done){
app.request()
.post('/')
.set('Content-Length', bytes(size) + 1)
.set('Content-Type', type)
.end(function(res){
res.should.have.status(413);
done();
})
})
}

View File

@@ -26,6 +26,15 @@ describe('serveIndex(root)', function () {
.expect(200, done)
})
it('should include security header', function (done) {
var server = createServer()
request(server)
.get('/')
.expect('X-Content-Type-Options', 'nosniff')
.expect(200, done)
})
it('should serve a directory index', function (done) {
var server = createServer()
@@ -117,6 +126,16 @@ describe('serveIndex(root)', function () {
.expect(/さくら\.txt/)
.expect(200, done)
});
it('should include security header', function (done) {
var server = createServer()
request(server)
.get('/')
.set('Accept', 'application/json')
.expect('X-Content-Type-Options', 'nosniff')
.expect(200, done)
})
});
describe('when Accept: text/html is given', function () {
@@ -136,6 +155,16 @@ describe('serveIndex(root)', function () {
.end(done);
});
it('should include security header', function (done) {
var server = createServer()
request(server)
.get('/')
.set('Accept', 'text/html')
.expect('X-Content-Type-Options', 'nosniff')
.expect(200, done)
})
it('should property escape file names', function (done) {
var server = createServer()
@@ -194,6 +223,16 @@ describe('serveIndex(root)', function () {
.expect(/さくら\.txt/)
.end(done);
});
it('should include security header', function (done) {
var server = createServer()
request(server)
.get('/')
.set('Accept', 'text/plain')
.expect('X-Content-Type-Options', 'nosniff')
.expect(200, done)
})
});
describe('when Accept: application/x-bogus is given', function () {