diff --git a/ChangeLog.md b/ChangeLog.md index da6a393..6e6b7e3 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,12 @@ +2015/05/13 Version 0.8.2 +- Updated dev depedencies and fixed all failing tests + +2015/05/12 Version 0.8.1 +- Fixed an issue where .types file is in another directory that the root directory + +2015/05/11 Version 0.8.0 +- Add ability to define custom mime-types, inline or with Apache .types file + 2015/05/09 Version 0.7.6 - Fix double encoding in directory listings diff --git a/README.md b/README.md index 1a8057c..2877c44 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Ecstatic [![build status](https://secure.travis-ci.org/jfhbrook/node-ecstatic.png)](http://travis-ci.org/jfhbrook/node-ecstatic) +# Ecstatic [![build status](https://secure.travis-ci.org/jfhbrook/node-ecstatic.png)](http://travis-ci.org/jfhbrook/node-ecstatic) [![dependencies status](https://david-dm.org/jfhbrook/node-ecstatic.svg)](https://david-dm.org/jfhbrook/node-ecstatic) ![](http://imgur.com/vhub5.png) @@ -72,7 +72,9 @@ var opts = { si : false, defaultExt : 'html', gzip : false, - serverHeader : true + serverHeader : true, + contentType : 'application/octet-stream', + mimeTypes : undefined } ``` @@ -139,6 +141,13 @@ on all responses served by ecstatic. Set `opts.contentType` in order to change default Content-Type header value. Defaults to **application/octet-stream**. +### `opts.mimeTypes` + +Add new or override one or more mime-types. This affects the HTTP Content-Type header. +Can either be a path to a [`.types`](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types) file or an object hash of type(s). + + ecstatic({ mimeType: { 'mime-type': ['file_extension', 'file_extension'] } }) + ### `opts.handleError` Turn **off** handleErrors to allow fall-through with `opts.handleError === false`, Defaults to **true**. diff --git a/lib/ecstatic.js b/lib/ecstatic.js index b17afd5..ff06913 100755 --- a/lib/ecstatic.js +++ b/lib/ecstatic.js @@ -1,5 +1,7 @@ #! /usr/bin/env node +'use strict'; + var path = require('path'), fs = require('fs'), url = require('url'), @@ -31,6 +33,17 @@ var ecstatic = module.exports = function (dir, options) { opts.root = dir; if (defaultExt && /^\./.test(defaultExt)) defaultExt = defaultExt.replace(/^\./, ''); + // Support hashes and .types files in mimeTypes @since 0.8 + if (opts.mimeTypes) { + if (typeof opts.mimeTypes === 'string') { + //TODO: should handleError have any effect here? + mime.load(opts.mimeTypes); // will throw if path is wrong as intended + } else if (typeof opts.mimeTypes === 'object') { + mime.define(opts.mimeTypes); + } + } + + return function middleware (req, res, next) { // Strip any null bytes from the url @@ -188,7 +201,7 @@ var ecstatic = module.exports = function (dir, options) { status['500'](res, next, { error: err }); }); res.on('close', function () { - fstream.destroy(); + fstream.destroy(); }); res.writeHead(206, { 'Content-Range': 'bytes ' + start + '-' + end + '/' + total, diff --git a/lib/ecstatic/opts.js b/lib/ecstatic/opts.js index 421e623..3159bbd 100644 --- a/lib/ecstatic/opts.js +++ b/lib/ecstatic/opts.js @@ -1,5 +1,7 @@ // This is so you can have options aliasing and defaults in one place. +'use strict'; + module.exports = function (opts) { var autoIndex = true, @@ -10,15 +12,20 @@ module.exports = function (opts) { gzip = false, defaultExt = '.html', handleError = true, - serverHeader = true; - contentType = 'application/octet-stream'; + serverHeader = true, + contentType = 'application/octet-stream', + mimeTypes; + + function isDeclared(k) { + return typeof opts[k] !== 'undefined' && opts[k] !== null; + } if (opts) { [ 'autoIndex', 'autoindex' ].some(function (k) { - if (typeof opts[k] !== 'undefined' && opts[k] !== null) { + if (isDeclared(k)) { autoIndex = opts[k]; return true; } @@ -28,7 +35,7 @@ module.exports = function (opts) { 'showDir', 'showdir' ].some(function (k) { - if (typeof opts[k] !== 'undefined' && opts[k] !== null) { + if (isDeclared(k)) { showDir = opts[k]; return true; } @@ -39,7 +46,7 @@ module.exports = function (opts) { 'humanreadable', 'human-readable' ].some(function (k) { - if (typeof opts[k] !== 'undefined' && opts[k] !== null) { + if (isDeclared(k)) { humanReadable = opts[k]; return true; } @@ -49,7 +56,7 @@ module.exports = function (opts) { 'si', 'index' ].some(function (k) { - if (typeof opts[k] !== 'undefined' && opts[k] !== null) { + if (isDeclared(k)) { si = opts[k]; return true; } @@ -76,10 +83,10 @@ module.exports = function (opts) { 'handleError', 'handleerror' ].some(function (k) { - if (typeof opts[k] !== 'undefined' && opts[k] !== null) { - handleError = opts[k]; - return true; - } + if (isDeclared(k)) { + handleError = opts[k]; + return true; + } }); [ @@ -87,10 +94,10 @@ module.exports = function (opts) { 'serverheader', 'server-header' ].some(function (k) { - if (typeof opts[k] !== 'undefined' && opts[k] !== null) { - serverHeader = opts[k]; - return true; - } + if (isDeclared(k)) { + serverHeader = opts[k]; + return true; + } }); [ @@ -98,10 +105,26 @@ module.exports = function (opts) { 'contenttype', 'content-type' ].some(function (k) { - if (typeof opts[k] !== 'undefined' && opts[k] !== null) { - contentType = opts[k]; - return true; - } + if (isDeclared(k)) { + contentType = opts[k]; + return true; + } + }); + + [ + 'mimetype', + 'mimetypes', + 'mimeType', + 'mimeTypes', + 'mime-type', + 'mime-types', + 'mime-Type', + 'mime-Types' + ].some(function (k) { + if (isDeclared(k)) { + mimeTypes = opts[k]; + return true; + } }); } @@ -117,6 +140,7 @@ module.exports = function (opts) { gzip: gzip, handleError: handleError, serverHeader: serverHeader, - contentType: contentType + contentType: contentType, + mimeTypes: mimeTypes }; }; diff --git a/lib/ecstatic/showdir.js b/lib/ecstatic/showdir.js index 731a323..5943b24 100644 --- a/lib/ecstatic/showdir.js +++ b/lib/ecstatic/showdir.js @@ -1,3 +1,5 @@ +'use strict'; + var ecstatic = require('../ecstatic'), fs = require('fs'), path = require('path'), diff --git a/lib/ecstatic/status-handlers.js b/lib/ecstatic/status-handlers.js index 9874534..8fcefcf 100644 --- a/lib/ecstatic/status-handlers.js +++ b/lib/ecstatic/status-handlers.js @@ -1,3 +1,5 @@ +'use strict'; + // not modified exports['304'] = function (res, next) { res.statusCode = 304; diff --git a/package.json b/package.json index 81b8732..92923d0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "author": "Joshua Holbrook (http://jesusabdullah.net)", "name": "ecstatic", "description": "A simple static file server middleware that works with both Express and Flatiron", - "version": "0.7.6", + "version": "0.8.2", "homepage": "https://github.com/jfhbrook/node-ecstatic", "repository": { "type": "git", @@ -28,10 +28,11 @@ "url-join": "0.0.1" }, "devDependencies": { - "tap": "^0.4.13", + "eol": "^0.2.0", + "express": "^4.12.3", + "mkdirp": "^0.5.0", "request": "^2.49.0", - "express": "^3.0.6", - "union": "^0.3.8", - "mkdirp": "^0.5.0" + "tap": "^1.0.3", + "union": "^0.4.4" } } diff --git a/test/content-type.js b/test/content-type.js index 4340aef..25c35a4 100644 --- a/test/content-type.js +++ b/test/content-type.js @@ -1,26 +1,28 @@ var test = require('tap').test, - ecstatic = require('../'), http = require('http'), - request = require('request'); + request = require('request'), + ecstatic = require('../'); test('default default contentType', function(t) { - var server = http.createServer(ecstatic({ - root: __dirname + '/public/', - contentType: 'text/plain' - })); + try { + var server = http.createServer(ecstatic({ + root: __dirname + '/public/', + contentType: 'text/plain' + })); + } catch (e) { + t.fail(e.message); + t.end(); + } t.plan(3); - t.on('end', function() { server.close(); }); - server.listen(0, function() { var port = server.address().port; request.get('http://localhost:' + port + '/f_f', function(err, res, body) { t.ifError(err); t.equal(res.statusCode, 200); t.equal(res.headers['content-type'], 'text/plain; charset=UTF-8'); - t.end(); + server.close(function() { t.end(); }); }); }); }); - diff --git a/test/core-error.js b/test/core-error.js index d1e769c..80a76dc 100644 --- a/test/core-error.js +++ b/test/core-error.js @@ -11,7 +11,7 @@ var root = __dirname + '/public', mkdirp.sync(root + '/emptyDir'); -var cases = require('./common-cases-error'); +var cases = require('./secret/common-cases-error'); test('core', function (t) { var filenames = Object.keys(cases); diff --git a/test/core.js b/test/core.js index 9e7c716..d5e5e27 100644 --- a/test/core.js +++ b/test/core.js @@ -4,14 +4,15 @@ var test = require('tap').test, request = require('request'), mkdirp = require('mkdirp'), fs = require('fs'), - path = require('path'); + path = require('path'), + eol = require('eol'); var root = __dirname + '/public', baseDir = 'base'; mkdirp.sync(root + '/emptyDir'); -var cases = require('./common-cases'); +var cases = require('./secret/common-cases'); test('core', function (t) { var filenames = Object.keys(cases); @@ -52,11 +53,11 @@ test('core', function (t) { } if (r.body !== undefined) { - t.equal(body, r.body, 'body for `' + file + '`'); + t.equal(eol.lf(body), r.body, 'body for `' + file + '`'); } if (r.location !== undefined) { - t.equal(res.headers.location, path.join('/', baseDir, r.location), 'location for `' + file + '`'); + t.equal(path.normalize(res.headers.location), path.join('/', baseDir, r.location), 'location for `' + file + '`'); } if (--pending === 0) { diff --git a/test/custom-content-type-file-secret.js b/test/custom-content-type-file-secret.js new file mode 100644 index 0000000..ab0d14c --- /dev/null +++ b/test/custom-content-type-file-secret.js @@ -0,0 +1,28 @@ +var test = require('tap').test, + http = require('http'), + request = require('request'), + ecstatic = require('../'); + +test('custom contentType via .types file', function(t) { + try { + var server = http.createServer(ecstatic({ + root: __dirname + '/public/', + mimetypes: __dirname + '/secret/custom_mime_type.types' + })); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(3) + + server.listen(0, function() { + var port = server.address().port; + request.get('http://localhost:' + port + '/custom_mime_type.opml', function(err, res, body) { + t.ifError(err); + t.equal(res.statusCode, 200, 'custom_mime_type.opml should be found'); + t.equal(res.headers['content-type'], 'application/secret; charset=utf-8'); + server.close(function() { t.end(); }); + }); + }); +}); diff --git a/test/custom-content-type-file.js b/test/custom-content-type-file.js new file mode 100644 index 0000000..1a972f5 --- /dev/null +++ b/test/custom-content-type-file.js @@ -0,0 +1,45 @@ +var test = require('tap').test, + http = require('http'), + request = require('request'), + ecstatic = require('../'); + +function setup(opts) { + return http.createServer(ecstatic(opts)); +} + +test('throws when custom contentType .types file does not exist', function(t) { + t.plan(1); + + t.throws( + setup.bind(null, { + root: __dirname + '/public/', + mimeTypes: 'this_file_does_not_exist.types' + }) + ); + +}); + +test('custom contentType via .types file', function(t) { + try { + var server = setup({ + root: __dirname + '/public', + 'mime-types': __dirname + '/public/custom_mime_type.types' + }); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(3) + + server.listen(0, function() { + var port = server.address().port; + + request.get('http://localhost:' + port + '/custom_mime_type.opml', function(err, res, body) { + t.ifError(err); + t.equal(res.statusCode, 200, 'custom_mime_type.opml should be found'); + t.equal(res.headers['content-type'], 'application/foo; charset=utf-8'); + server.close(function() { t.end(); }); + }); + }); +}); diff --git a/test/custom-content-type.js b/test/custom-content-type.js new file mode 100644 index 0000000..e7e4bab --- /dev/null +++ b/test/custom-content-type.js @@ -0,0 +1,30 @@ +var test = require('tap').test, + http = require('http'), + request = require('request'), + ecstatic = require('../'); + +test('custom contentType', function(t) { + try { + var server = http.createServer(ecstatic({ + root: __dirname + '/public/', + mimetype: { + 'application/jon': ['opml'] + } + })); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(3); + + server.listen(0, function() { + var port = server.address().port; + request.get('http://localhost:' + port + '/custom_mime_type.opml', function(err, res, body) { + t.ifError(err); + t.equal(res.statusCode, 200, 'custom_mime_type.opml should be found'); + t.equal(res.headers['content-type'], 'application/jon; charset=utf-8'); + server.close(function() { t.end(); }); + }); + }); +}); diff --git a/test/default-default-ext.js b/test/default-default-ext.js index f1ff97d..57b2a70 100644 --- a/test/default-default-ext.js +++ b/test/default-default-ext.js @@ -1,19 +1,20 @@ var test = require('tap').test, ecstatic = require('../'), http = require('http'), - request = require('request'); + request = require('request'), + eol = require('eol'); test('default defaultExt', function (t) { t.plan(3); var server = http.createServer(ecstatic(__dirname + '/public/subdir')); - t.on('end', function () { server.close() }) server.listen(0, function () { var port = server.address().port; request.get('http://localhost:' + port, function (err, res, body) { t.ifError(err); t.equal(res.statusCode, 200); - t.equal(body, 'index!!!\n'); + t.equal(eol.lf(body), 'index!!!\n'); + server.close(function() { t.end(); }); }); }); }); diff --git a/test/escaping.js b/test/escaping.js index 771ffd7..8ada877 100644 --- a/test/escaping.js +++ b/test/escaping.js @@ -1,30 +1,19 @@ var test = require('tap').test, ecstatic = require('../'), http = require('http'), - request = require('request'); - -var server; + request = require('request'), + eol = require('eol'); test('escaping special characters', function (t) { - server = http.createServer(ecstatic(__dirname + '/public')); + var server = http.createServer(ecstatic(__dirname + '/public')); server.listen(0, function () { var port = server.address().port; request.get('http://localhost:' + port + "/curimit%40gmail.com%20(40%25)", function (err, res, body) { t.ifError(err); t.equal(res.statusCode, 200); - t.equal(body, 'index!!!\n'); - t.end(); + t.equal(eol.lf(body), 'index!!!\n'); + server.close(function() { t.end(); }); }); }); }); - -test('server teardown', function (t) { - server.close(); - - var to = setTimeout(function () { - process.stderr.write('# server not closing; slaughtering process.\n'); - process.exit(0); - }, 5000); - t.end(); -}); diff --git a/test/express-error.js b/test/express-error.js index b3ee033..2ae8b17 100644 --- a/test/express-error.js +++ b/test/express-error.js @@ -12,7 +12,7 @@ var root = __dirname + '/public', mkdirp.sync(root + '/emptyDir'); -var cases = require('./common-cases-error'); +var cases = require('./secret/common-cases-error'); test('express', function (t) { var filenames = Object.keys(cases); diff --git a/test/express.js b/test/express.js index 9f6e3fb..c99d99c 100644 --- a/test/express.js +++ b/test/express.js @@ -5,14 +5,15 @@ var test = require('tap').test, request = require('request'), mkdirp = require('mkdirp'), fs = require('fs'), - path = require('path'); + path = require('path'), + eol = require('eol'); var root = __dirname + '/public', baseDir = 'base'; mkdirp.sync(root + '/emptyDir'); -var cases = require('./common-cases'); +var cases = require('./secret/common-cases'); test('express', function (t) { var filenames = Object.keys(cases); @@ -60,7 +61,7 @@ test('express', function (t) { } if (r.body !== undefined) { - t.equal(body, r.body, 'body for `' + file + '`'); + t.equal(eol.lf(body), r.body, 'body for `' + file + '`'); } if (--pending === 0) { diff --git a/test/html-reflection.js b/test/html-reflection.js index 4543cdc..f399096 100644 --- a/test/html-reflection.js +++ b/test/html-reflection.js @@ -3,10 +3,8 @@ var test = require('tap').test, http = require('http'), request = require('request'); -var server; - test('html reflection prevented', function (t) { - server = http.createServer(ecstatic(__dirname + '/public/containsSymlink')); + var server = http.createServer(ecstatic(__dirname + '/public/containsSymlink')); server.listen(0, function () { var port = server.address().port; @@ -16,17 +14,7 @@ test('html reflection prevented', function (t) { body.indexOf(attack) != -1) { t.fail('Unescaped HTML reflected with vulnerable or missing content-type.'); } - t.end(); + server.close(function() { t.end(); }); }); }); }); - -test('server teardown', function (t) { - server.close(); - - var to = setTimeout(function () { - process.stderr.write('# server not closing; slaughtering process.\n'); - process.exit(0); - }, 5000); - t.end(); -}); diff --git a/test/malformed-dir.js b/test/malformed-dir.js index 388a85e..594cec9 100644 --- a/test/malformed-dir.js +++ b/test/malformed-dir.js @@ -1,32 +1,20 @@ var test = require('tap').test, ecstatic = require('../lib/ecstatic'), - http = require('http') -; - -var server; + http = require('http'), + request = require('request'); test('malformed showdir uri', function (t) { - server = http.createServer(ecstatic(__dirname, { showDir: true })); + var server = http.createServer(ecstatic(__dirname, { showDir: true })); + + t.plan(2); server.listen(0, function () { - var r = http.get({ - host: 'localhost', - port: server.address().port, - path: '/?%' - }); - r.on('response', function (res) { + + request.get('http://localhost:' + server.address().port + '/?%', function (err, res, body) { + t.ifError(err); t.equal(res.statusCode, 400); - t.end(); + server.close(function() { t.end(); }); }); - }); -}); - -test('server teardown', function (t) { - server.close(); - var to = setTimeout(function () { - process.stderr.write('# server not closing; slaughtering process.\n'); - process.exit(0); - }, 5000); - t.end(); + }); }); diff --git a/test/malformed.js b/test/malformed.js index 1af17ee..05639aa 100644 --- a/test/malformed.js +++ b/test/malformed.js @@ -1,32 +1,19 @@ var test = require('tap').test, ecstatic = require('../lib/ecstatic'), - http = require('http') -; - -var server; + http = require('http'), + request = require('request'); test('malformed uri', function (t) { - server = http.createServer(ecstatic(__dirname)); + var server = http.createServer(ecstatic(__dirname)); + + t.plan(2); server.listen(0, function () { - var r = http.get({ - host: 'localhost', - port: server.address().port, - path: '/%' - }); - r.on('response', function (res) { + request.get('http://localhost:' + server.address().port + '/%', function (err, res, body) { + t.ifError(err); t.equal(res.statusCode, 400); - t.end(); + server.close(function() { t.end(); }); }); }); }); -test('server teardown', function (t) { - server.close(); - - var to = setTimeout(function () { - process.stderr.write('# server not closing; slaughtering process.\n'); - process.exit(0); - }, 5000); - t.end(); -}); diff --git a/test/mime.js b/test/mime.js new file mode 100644 index 0000000..6950985 --- /dev/null +++ b/test/mime.js @@ -0,0 +1,41 @@ +var test = require('tap').test, + mime = require('mime'); + +test('mime package lookup', function(t) { + t.plan(4); + + t.equal(mime.lookup('/path/to/file.txt'), 'text/plain'); + t.equal(mime.lookup('file.txt'), 'text/plain'); + t.equal(mime.lookup('.TXT'), 'text/plain'); + t.equal(mime.lookup('htm'), 'text/html'); + + t.end(); +}); + +test('custom definition of mime-type with the mime package', function(t) { + t.plan(1); + + mime.define({ + 'application/xml': ['opml'] + }); + t.equal(mime.lookup('.opml'), 'application/xml'); + + t.end(); +}); + +test('custom definition of mime-type with a .types file', function(t) { + t.plan(2); + + try { + mime.load('test/public/custom_mime_type.types'); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.equal(mime.lookup('.opml'), 'application/foo'); // see public/custom_mime_type.types + + t.throws( mime.load.bind(mime, 'public/this_file_does_not_exist.types') ); + + t.end(); +}); diff --git a/test/public/custom_mime_type.opml b/test/public/custom_mime_type.opml new file mode 100644 index 0000000..5e24bcc --- /dev/null +++ b/test/public/custom_mime_type.opml @@ -0,0 +1,13 @@ + + + + + Tue 9 May 2006 06:44:27 GMT+00:00 + BKN + Sat 20 May 2006 00:17:25 GMT+00:00 + + + + + + diff --git a/test/public/custom_mime_type.types b/test/public/custom_mime_type.types new file mode 100644 index 0000000..1af14d2 --- /dev/null +++ b/test/public/custom_mime_type.types @@ -0,0 +1,3 @@ +# This file is an example of the Apache .types file format for describing mime-types. +# Other example: http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types +application/foo opml diff --git a/test/public/d.js b/test/public/d.js deleted file mode 120000 index fc9ebc0..0000000 --- a/test/public/d.js +++ /dev/null @@ -1 +0,0 @@ -c.js \ No newline at end of file diff --git a/test/public/d.js b/test/public/d.js new file mode 100644 index 0000000..7ab25e5 --- /dev/null +++ b/test/public/d.js @@ -0,0 +1 @@ +d.js diff --git a/test/range.js b/test/range.js index 1d404a1..c4d2f7c 100644 --- a/test/range.js +++ b/test/range.js @@ -1,7 +1,8 @@ var test = require('tap').test, ecstatic = require('../'), http = require('http'), - request = require('request'); + request = require('request'), + eol = require('eol'); test('range', function (t) { t.plan(4); @@ -37,7 +38,7 @@ test('range past the end', function (t) { request.get(opts, function (err, res, body) { t.ifError(err); t.equal(res.statusCode, 206, 'partial content status code'); - t.equal(body, 'e!!\n'); + t.equal(eol.lf(body), 'e!!\n'); t.equal(parseInt(res.headers['content-length']), body.length); }); }); @@ -82,6 +83,7 @@ test('flipped range', function (t) { }); test('partial range', function (t) { + // 1 test is platform depedent "res.headers['content-range']" t.plan(5); var server = http.createServer(ecstatic(__dirname + '/public/subdir')); t.on('end', function () { server.close() }) @@ -95,9 +97,14 @@ test('partial range', function (t) { request.get(opts, function (err, res, body) { t.ifError(err); t.equal(res.statusCode, 206, 'partial content status code'); - t.equal(body, 'e!!\n'); + t.equal(eol.lf(body), 'e!!\n'); t.equal(parseInt(res.headers['content-length']), body.length); - t.equal(res.headers['content-range'], 'bytes 3-10/11'); + + if (process.platform === 'win32') { + t.equal(res.headers['content-range'], 'bytes 3-11/12'); + } else { + t.equal(res.headers['content-range'], 'bytes 3-10/11'); + } }); }); }); diff --git a/test/common-cases-error.js b/test/secret/common-cases-error.js similarity index 100% rename from test/common-cases-error.js rename to test/secret/common-cases-error.js diff --git a/test/common-cases.js b/test/secret/common-cases.js similarity index 94% rename from test/common-cases.js rename to test/secret/common-cases.js index 7c8b803..9d0e37a 100644 --- a/test/common-cases.js +++ b/test/secret/common-cases.js @@ -20,7 +20,7 @@ module.exports = { 'd.js' : { code : 200, type : 'application/javascript', - body : 'console.log(\'C!!!\');\n', + body : 'd.js\n', }, 'e.js' : { code : 200, @@ -85,7 +85,7 @@ module.exports = { code : 200, file: 'compress/foo.js.gz', headers: {'accept-encoding': 'compress, gzip'}, - body: fs.readFileSync(path.join(__dirname, 'public', 'compress', 'foo.js.gz'), 'utf8') + body: fs.readFileSync(path.join(__dirname, '../', 'public', 'compress', 'foo.js.gz'), 'utf8') }, // no accept-encoding of gzip, so serve regular file 'compress/foo_2.js' : { diff --git a/test/secret/custom_mime_type.types b/test/secret/custom_mime_type.types new file mode 100644 index 0000000..8f68da3 --- /dev/null +++ b/test/secret/custom_mime_type.types @@ -0,0 +1,3 @@ +# This file is an example of the Apache .types file format for describing mime-types. +# Other example: http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types +application/secret opml diff --git a/test/union-multiple-folders-cases.js b/test/secret/union-multiple-folders-cases.js similarity index 100% rename from test/union-multiple-folders-cases.js rename to test/secret/union-multiple-folders-cases.js diff --git a/test/union-error.js b/test/union-error.js index 79b063e..b3fa675 100644 --- a/test/union-error.js +++ b/test/union-error.js @@ -11,7 +11,7 @@ var root = __dirname + '/public', mkdirp.sync(root + '/emptyDir'); -var cases = require('./common-cases-error'); +var cases = require('./secret/common-cases-error'); test('union', function (t) { var filenames = Object.keys(cases); diff --git a/test/union-multiple-folders.js b/test/union-multiple-folders.js index ff1ecbe..bb90c06 100644 --- a/test/union-multiple-folders.js +++ b/test/union-multiple-folders.js @@ -1,18 +1,17 @@ +'use strict'; + var test = require('tap').test, ecstatic = require('../lib/ecstatic'), union = require('union'), request = require('request'), - mkdirp = require('mkdirp'), - fs = require('fs'), - path = require('path'); + path = require('path'), + eol = require('eol'); var subdir = __dirname + '/public/subdir', - anotherSubdir = __dirname + '/public/another-subdir', - baseDir = 'base'; - -mkdirp.sync(root + '/emptyDir'); + anotherSubdir = __dirname + '/public/another-subdir', + baseDir = 'base'; -var cases = require('./union-multiple-folders-cases'); +var cases = require('./secret/union-multiple-folders-cases'); test('union', function(t) { var filenames = Object.keys(cases); @@ -42,6 +41,9 @@ test('union', function(t) { server.listen(port, function() { var pending = filenames.length; + + t.plan(pending * 3); + filenames.forEach(function(file) { var uri = 'http://localhost:' + port + path.join('/', baseDir, file), headers = cases[file].headers || {}; @@ -63,7 +65,7 @@ test('union', function(t) { } if (r.body !== undefined) { - t.equal(body, r.body, 'body for `' + file + '`'); + t.equal(eol.lf(body), r.body, 'body for `' + file + '`'); } if (--pending === 0) { diff --git a/test/union.js b/test/union.js index b5f23ad..251603a 100644 --- a/test/union.js +++ b/test/union.js @@ -4,14 +4,15 @@ var test = require('tap').test, request = require('request'), mkdirp = require('mkdirp'), fs = require('fs'), - path = require('path'); + path = require('path'), + eol = require('eol'); var root = __dirname + '/public', baseDir = 'base'; mkdirp.sync(root + '/emptyDir'); -var cases = require('./common-cases'); +var cases = require('./secret/common-cases'); test('union', function (t) { var filenames = Object.keys(cases); @@ -54,7 +55,7 @@ test('union', function (t) { } if (r.body !== undefined) { - t.equal(body, r.body, 'body for `' + file + '`'); + t.equal(eol.lf(body), r.body, 'body for `' + file + '`'); } if (--pending === 0) {