Skip to content

Commit b55026b

Browse files
committed
Add fallbackFile option to response for unhandled requests
1 parent 160b756 commit b55026b

5 files changed

Lines changed: 60 additions & 3 deletions

File tree

README.md

Lines changed: 10 additions & 2 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);
@@ -76,14 +83,15 @@ var opts = {
7683
serverHeader : true,
7784
contentType : 'application/octet-stream',
7885
mimeTypes : undefined,
86+
fallbackFile : undefined
7987
handleOptionsMethod: false
8088
}
8189
```
8290

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

86-
### `opts.root`
94+
### `opts.root`
8795

8896
`opts.root` is the directory you want to serve up.
8997

@@ -160,7 +168,7 @@ Defaults to **application/octet-stream**.
160168

161169
Add new or override one or more mime-types. This affects the HTTP Content-Type header.
162170
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).
163-
171+
164172
ecstatic({ mimeType: { 'mime-type': ['file_extension', 'file_extension'] } })
165173

166174
### `opts.handleError`

lib/ecstatic.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var ecstatic = module.exports = function (dir, options) {
2828
handleError = opts.handleError,
2929
headers = opts.headers,
3030
serverHeader = opts.serverHeader,
31+
fallbackFile = opts.fallbackFile;
3132
weakEtags = opts.weakEtags,
3233
handleOptionsMethod = opts.handleOptionsMethod;
3334

@@ -108,6 +109,11 @@ var ecstatic = module.exports = function (dir, options) {
108109
url: parsed.pathname + '.' + defaultExt + ((parsed.search)? parsed.search:'')
109110
}, res, next);
110111
}
112+
else if (fallbackFile) {
113+
middleware({
114+
url: ('/' + path.join(baseDir, fallbackFile))
115+
}, res, next);
116+
}
111117
else {
112118
// Try to serve default ./404.html
113119
middleware({
@@ -273,7 +279,7 @@ var ecstatic = module.exports = function (dir, options) {
273279
}
274280

275281
if (clientEtag) {
276-
if (opts.weakCompare && clientEtag !== serverEtag
282+
if (opts.weakCompare && clientEtag !== serverEtag
277283
&& clientEtag !== ('W/' + serverEtag) && ('W/' + clientEtag) !== serverEtag) {
278284
return false;
279285
} else if (!opts.weakCompare && (clientEtag !== serverEtag || clientEtag.indexOf('W/') === 0)) {

lib/ecstatic/aliases.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,10 @@
2929
"handleOptionsMethod",
3030
"handleoptionsmethod",
3131
"handle-options-method"
32+
],
33+
"fallbackFile": [
34+
"fallbackFile",
35+
"fallbackfile",
36+
"fallback-file"
3237
]
3338
}

lib/ecstatic/opts.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ module.exports = function (opts) {
1515
headers = {},
1616
serverHeader = defaults.serverHeader,
1717
contentType = defaults.contentType,
18+
fallbackFile,
1819
mimeTypes,
1920
weakEtags = defaults.weakEtags,
2021
weakCompare = defaults.weakCompare,
@@ -104,6 +105,13 @@ module.exports = function (opts) {
104105
}
105106
});
106107

108+
aliases.fallbackFile.some(function (k) {
109+
if (isDeclared(k)) {
110+
fallbackFile = opts[k];
111+
return true;
112+
}
113+
});
114+
107115
aliases.serverHeader.some(function (k) {
108116
if (isDeclared(k)) {
109117
serverHeader = opts[k];
@@ -158,6 +166,7 @@ module.exports = function (opts) {
158166
gzip: gzip,
159167
handleError: handleError,
160168
headers: headers,
169+
fallbackFile: fallbackFile,
161170
serverHeader: serverHeader,
162171
contentType: contentType,
163172
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)