Skip to content

Commit a780e1e

Browse files
committed
Add fallbackFile option to response for unhandled requests
1 parent dfc66f4 commit a780e1e

File tree

4 files changed

+60
-4
lines changed

4 files changed

+60
-4
lines changed

README.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ To allow fall through to your custom routes:
5555
ecstatic({ root: __dirname + '/public', handleError: false })
5656
```
5757

58+
### fallback file
59+
To response with specified file:
60+
61+
```js
62+
ecstatic({ root: __dirname + '/public', fallbackFile: 'index.html' })
63+
```
64+
5865
# API:
5966

6067
## ecstatic(opts);
@@ -74,14 +81,15 @@ var opts = {
7481
gzip : false,
7582
serverHeader : true,
7683
contentType : 'application/octet-stream',
77-
mimeTypes : undefined
84+
mimeTypes : undefined,
85+
fallbackFile : undefined
7886
}
7987
```
8088

8189
If `opts` is a string, the string is assigned to the root folder and all other
8290
options are set to their defaults.
8391

84-
### `opts.root`
92+
### `opts.root`
8593

8694
`opts.root` is the directory you want to serve up.
8795

@@ -145,7 +153,7 @@ Defaults to **application/octet-stream**.
145153

146154
Add new or override one or more mime-types. This affects the HTTP Content-Type header.
147155
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).
148-
156+
149157
ecstatic({ mimeType: { 'mime-type': ['file_extension', 'file_extension'] } })
150158

151159
### `opts.handleError`

lib/ecstatic.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ var ecstatic = module.exports = function (dir, options) {
2626
baseDir = opts.baseDir,
2727
defaultExt = opts.defaultExt,
2828
handleError = opts.handleError,
29-
serverHeader = opts.serverHeader;
29+
serverHeader = opts.serverHeader,
30+
fallbackFile = opts.fallbackFile;
3031

3132
opts.root = dir;
3233
if (defaultExt && /^\./.test(defaultExt)) defaultExt = defaultExt.replace(/^\./, '');
@@ -98,6 +99,11 @@ var ecstatic = module.exports = function (dir, options) {
9899
url: parsed.pathname + '.' + defaultExt + ((parsed.search)? parsed.search:'')
99100
}, res, next);
100101
}
102+
else if (fallbackFile) {
103+
middleware({
104+
url: ('/' + path.join(baseDir, fallbackFile))
105+
}, res, next);
106+
}
101107
else {
102108
// Try to serve default ./404.html
103109
middleware({

lib/ecstatic/opts.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module.exports = function (opts) {
1212
handleError = true,
1313
serverHeader = true,
1414
contentType = 'application/octet-stream',
15+
fallbackFile,
1516
mimeTypes;
1617

1718
function isDeclared(k) {
@@ -87,6 +88,17 @@ module.exports = function (opts) {
8788
}
8889
});
8990

91+
[
92+
'fallbackFile',
93+
'fallbackfile',
94+
'fallback-file'
95+
].some(function (k) {
96+
if (isDeclared(k)) {
97+
fallbackFile = opts[k];
98+
return true;
99+
}
100+
});
101+
90102
[
91103
'serverHeader',
92104
'serverheader',
@@ -137,6 +149,7 @@ module.exports = function (opts) {
137149
baseDir: (opts && opts.baseDir) || '/',
138150
gzip: gzip,
139151
handleError: handleError,
152+
fallbackFile: fallbackFile,
140153
serverHeader: serverHeader,
141154
contentType: contentType,
142155
mimeTypes: mimeTypes

test/custom-fallback-file.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
var test = require('tap').test,
2+
http = require('http'),
3+
request = require('request'),
4+
ecstatic = require('../');
5+
6+
test('custom fallbackFile', function(t) {
7+
try {
8+
var server = http.createServer(ecstatic({
9+
root: __dirname + '/public/',
10+
fallbackFile: 'a.txt'
11+
}));
12+
} catch (e) {
13+
t.fail(e.message);
14+
t.end();
15+
}
16+
17+
t.plan(4);
18+
19+
server.listen(0, function() {
20+
var port = server.address().port;
21+
request.get('http://localhost:' + port + '/file-not-found', function(err, res, body) {
22+
t.ifError(err);
23+
t.equal(res.statusCode, 200, 'status code should be ok');
24+
t.equal(res.headers['content-type'], 'text/plain; charset=UTF-8');
25+
server.close(function() { t.end(); });
26+
t.equal('A!!!\n', body);
27+
});
28+
});
29+
});

0 commit comments

Comments
 (0)