vulcan 0.1.6 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/vulcan/cli.rb +3 -0
- data/lib/vulcan/version.rb +1 -1
- data/server/lib/spawner.js +9 -4
- data/server/node_modules/cradle/lib/cradle.js +0 -1
- data/server/node_modules/cradle/package.json +3 -3
- data/server/node_modules/cradle/test/cache-test.js +6 -7
- data/server/node_modules/cradle/test/cradle-test.js +4 -5
- data/server/node_modules/cradle/test/response-test.js +5 -6
- data/server/node_modules/express/History.md +40 -0
- data/server/node_modules/express/Makefile +3 -9
- data/server/node_modules/express/Readme.md +3 -1
- data/server/node_modules/express/bin/express +61 -63
- data/server/node_modules/express/lib/express.js +1 -1
- data/server/node_modules/express/lib/request.js +9 -7
- data/server/node_modules/express/lib/view.js +19 -16
- data/server/node_modules/express/node_modules/connect/lib/connect.js +1 -1
- data/server/node_modules/express/node_modules/connect/lib/http.js +2 -0
- data/server/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js +135 -31
- data/server/node_modules/express/node_modules/connect/lib/middleware/limit.js +5 -1
- data/server/node_modules/express/node_modules/connect/lib/middleware/session.js +2 -2
- data/server/node_modules/express/node_modules/connect/lib/middleware/static.js +26 -21
- data/server/node_modules/express/node_modules/connect/lib/middleware/staticCache.js +91 -38
- data/server/node_modules/express/node_modules/connect/lib/middleware/vhost.js +1 -1
- data/server/node_modules/express/node_modules/connect/lib/utils.js +11 -4
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/Makefile +14 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md +286 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/TODO +3 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js +70 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js +43 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js +48 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/index.js +1 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js +61 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js +377 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js +3 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js +312 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js +25 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js +6 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/package.json +22 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/common.js +19 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt +1 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt +1 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/no-filename/generic.http +13 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md +3 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http +26 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-firefox-3.6.http +24 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-safari-5.http +23 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-chrome-12.http +24 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-7.http +22 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-8.http +22 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-safari-5.http +22 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js +3 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js +21 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multi_video.upload +0 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js +72 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js +89 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js +24 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js +80 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js +104 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js +715 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js +50 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js +45 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js +72 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/run.js +2 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js +63 -0
- data/server/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js +47 -0
- data/server/node_modules/express/node_modules/connect/package.json +7 -6
- data/server/node_modules/express/node_modules/connect/test.js +44 -31
- data/server/node_modules/express/node_modules/qs/History.md +11 -0
- data/server/node_modules/express/node_modules/qs/Makefile +1 -3
- data/server/node_modules/express/node_modules/qs/Readme.md +2 -4
- data/server/node_modules/express/node_modules/qs/lib/querystring.js +100 -74
- data/server/node_modules/express/node_modules/qs/package.json +9 -2
- data/server/node_modules/express/node_modules/qs/test/mocha.opts +2 -0
- data/server/node_modules/express/node_modules/qs/test/{parse.test.js → parse.js} +1 -2
- data/server/node_modules/express/node_modules/qs/test/{stringify.test.js → stringify.js} +0 -0
- data/server/node_modules/express/package.json +7 -7
- data/server/node_modules/express/testing/foo/app.js +35 -0
- data/server/node_modules/express/testing/foo/package.json +9 -0
- data/server/node_modules/express/testing/foo/public/stylesheets/style.css +8 -0
- data/server/node_modules/express/testing/foo/routes/index.js +10 -0
- data/server/node_modules/express/testing/foo/views/index.jade +2 -0
- data/server/node_modules/express/testing/foo/views/layout.jade +6 -0
- data/server/node_modules/express/testing/index.js +31 -5
- data/server/node_modules/express/testing/public/test.txt +2971 -0
- data/server/node_modules/express/testing/views/page.html +1 -0
- data/server/node_modules/express/testing/views/page.jade +3 -0
- data/server/node_modules/express/testing/views/test.md +1 -0
- data/server/node_modules/express/testing/views/user/index.jade +1 -0
- data/server/node_modules/express/testing/views/user/list.jade +1 -0
- data/server/node_modules/node-uuid/README.md +166 -67
- data/server/node_modules/node-uuid/benchmark/README.md +53 -0
- data/server/node_modules/node-uuid/benchmark/bench.gnu +174 -0
- data/server/node_modules/node-uuid/benchmark/bench.sh +34 -0
- data/server/node_modules/node-uuid/{test → benchmark}/benchmark-native.c +0 -0
- data/server/node_modules/node-uuid/benchmark/benchmark.js +84 -0
- data/server/node_modules/node-uuid/package.json +5 -3
- data/server/node_modules/node-uuid/test/benchmark-native +0 -0
- data/server/node_modules/node-uuid/test/compare_v1.js +63 -0
- data/server/node_modules/node-uuid/test/test.html +3 -0
- data/server/node_modules/node-uuid/test/test.js +214 -57
- data/server/node_modules/node-uuid/uuid.js +225 -56
- data/server/node_modules/restler/README.md +20 -7
- data/server/node_modules/restler/bin/restler +1 -1
- data/server/node_modules/restler/lib/multipartform.js +9 -8
- data/server/node_modules/restler/lib/restler.js +64 -22
- data/server/node_modules/restler/package.json +2 -2
- data/server/node_modules/restler/test/restler.js +22 -2
- data/server/node_modules/restler/test/test_helper.js +20 -1
- data/server/package.json +8 -8
- data/server/web.js +22 -6
- metadata +72 -82
- data/server/node_modules/cradle/node_modules/vows/LICENSE +0 -20
- data/server/node_modules/cradle/node_modules/vows/Makefile +0 -7
- data/server/node_modules/cradle/node_modules/vows/README.md +0 -39
- data/server/node_modules/cradle/node_modules/vows/bin/vows +0 -515
- data/server/node_modules/cradle/node_modules/vows/lib/assert/error.js +0 -27
- data/server/node_modules/cradle/node_modules/vows/lib/assert/macros.js +0 -215
- data/server/node_modules/cradle/node_modules/vows/lib/assert/utils.js +0 -77
- data/server/node_modules/cradle/node_modules/vows/lib/vows.js +0 -193
- data/server/node_modules/cradle/node_modules/vows/lib/vows/console.js +0 -131
- data/server/node_modules/cradle/node_modules/vows/lib/vows/context.js +0 -55
- data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/file.js +0 -29
- data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html +0 -2
- data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html +0 -61
- data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-html.js +0 -54
- data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-json.js +0 -54
- data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-plain.js +0 -38
- data/server/node_modules/cradle/node_modules/vows/lib/vows/extras.js +0 -28
- data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/dot-matrix.js +0 -67
- data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/json.js +0 -16
- data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/silent.js +0 -8
- data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/spec.js +0 -44
- data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/watch.js +0 -39
- data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/xunit.js +0 -90
- data/server/node_modules/cradle/node_modules/vows/lib/vows/suite.js +0 -319
- data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/LICENSE +0 -20
- data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/Makefile +0 -4
- data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/README.md +0 -72
- data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/lib/eyes.js +0 -233
- data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/package.json +0 -14
- data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/test/eyes-test.js +0 -55
- data/server/node_modules/cradle/node_modules/vows/package.json +0 -14
- data/server/node_modules/cradle/node_modules/vows/test/assert-test.js +0 -135
- data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/failing.js +0 -18
- data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/log.js +0 -18
- data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/passing.js +0 -17
- data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/stderr.js +0 -18
- data/server/node_modules/cradle/node_modules/vows/test/isolate-test.js +0 -140
- data/server/node_modules/cradle/node_modules/vows/test/testInherit.js +0 -133
- data/server/node_modules/cradle/node_modules/vows/test/vows-error-test.js +0 -51
- data/server/node_modules/cradle/node_modules/vows/test/vows-test.js +0 -374
- data/server/node_modules/express/node_modules/qs/support/expresso/History.md +0 -128
- data/server/node_modules/express/node_modules/qs/support/expresso/Makefile +0 -53
- data/server/node_modules/express/node_modules/qs/support/expresso/Readme.md +0 -61
- data/server/node_modules/express/node_modules/qs/support/expresso/bin/expresso +0 -856
- data/server/node_modules/express/node_modules/qs/support/expresso/docs/api.html +0 -1080
- data/server/node_modules/express/node_modules/qs/support/expresso/docs/index.html +0 -377
- data/server/node_modules/express/node_modules/qs/support/expresso/docs/index.md +0 -290
- data/server/node_modules/express/node_modules/qs/support/expresso/docs/layout/foot.html +0 -3
- data/server/node_modules/express/node_modules/qs/support/expresso/docs/layout/head.html +0 -42
- data/server/node_modules/express/node_modules/qs/support/expresso/lib/bar.js +0 -4
- data/server/node_modules/express/node_modules/qs/support/expresso/lib/foo.js +0 -16
- data/server/node_modules/express/node_modules/qs/support/expresso/package.json +0 -12
- data/server/node_modules/express/node_modules/qs/support/expresso/test/assert.test.js +0 -91
- data/server/node_modules/express/node_modules/qs/support/expresso/test/async.test.js +0 -12
- data/server/node_modules/express/node_modules/qs/support/expresso/test/bar.test.js +0 -13
- data/server/node_modules/express/node_modules/qs/support/expresso/test/foo.test.js +0 -14
- data/server/node_modules/express/node_modules/qs/support/expresso/test/http.test.js +0 -146
- data/server/node_modules/express/node_modules/qs/support/expresso/test/serial/async.test.js +0 -39
- data/server/node_modules/express/node_modules/qs/support/expresso/test/serial/http.test.js +0 -48
- data/server/node_modules/express/node_modules/qs/support/should/History.md +0 -22
- data/server/node_modules/express/node_modules/qs/support/should/Makefile +0 -6
- data/server/node_modules/express/node_modules/qs/support/should/Readme.md +0 -248
- data/server/node_modules/express/node_modules/qs/support/should/examples/runner.js +0 -53
- data/server/node_modules/express/node_modules/qs/support/should/index.js +0 -2
- data/server/node_modules/express/node_modules/qs/support/should/lib/eql.js +0 -91
- data/server/node_modules/express/node_modules/qs/support/should/lib/should.js +0 -548
- data/server/node_modules/express/node_modules/qs/support/should/package.json +0 -8
- data/server/node_modules/express/node_modules/qs/support/should/test/should.test.js +0 -358
- data/server/node_modules/express/testing/views/users.jade +0 -1
- data/server/node_modules/node-uuid/test/benchmark.js +0 -27
|
@@ -292,16 +292,18 @@ req.flash = function(type, msg){
|
|
|
292
292
|
req.is = function(type){
|
|
293
293
|
var fn = this.app.is(type);
|
|
294
294
|
if (fn) return fn(this);
|
|
295
|
-
var
|
|
296
|
-
if (!
|
|
295
|
+
var ct = this.headers['content-type'];
|
|
296
|
+
if (!ct) return false;
|
|
297
|
+
ct = ct.split(';')[0];
|
|
297
298
|
if (!~type.indexOf('/')) type = mime.lookup(type);
|
|
298
299
|
if (~type.indexOf('*')) {
|
|
299
|
-
type = type.split('/')
|
|
300
|
-
|
|
301
|
-
if ('*' == type[0] && type[1] ==
|
|
302
|
-
if ('*' == type[1] && type[0] ==
|
|
300
|
+
type = type.split('/');
|
|
301
|
+
ct = ct.split('/');
|
|
302
|
+
if ('*' == type[0] && type[1] == ct[1]) return true;
|
|
303
|
+
if ('*' == type[1] && type[0] == ct[0]) return true;
|
|
304
|
+
return false;
|
|
303
305
|
}
|
|
304
|
-
return !! ~
|
|
306
|
+
return !! ~ct.indexOf(type);
|
|
305
307
|
};
|
|
306
308
|
|
|
307
309
|
// Callback for isXMLHttpRequest / xhr
|
|
@@ -47,7 +47,10 @@ exports.register = View.register;
|
|
|
47
47
|
*/
|
|
48
48
|
|
|
49
49
|
exports.compile = function(view, cache, cid, options){
|
|
50
|
-
if (cache && cid && cache[cid])
|
|
50
|
+
if (cache && cid && cache[cid]){
|
|
51
|
+
options.filename = cache[cid].path;
|
|
52
|
+
return cache[cid];
|
|
53
|
+
}
|
|
51
54
|
|
|
52
55
|
// lookup
|
|
53
56
|
view = exports.lookup(view, options);
|
|
@@ -58,13 +61,13 @@ exports.compile = function(view, cache, cid, options){
|
|
|
58
61
|
var err = new Error('failed to locate view "' + view.original.view + '"');
|
|
59
62
|
err.view = view.original;
|
|
60
63
|
throw err;
|
|
61
|
-
}
|
|
64
|
+
}
|
|
62
65
|
|
|
63
66
|
// compile
|
|
64
67
|
options.filename = view.path;
|
|
65
68
|
view.fn = view.templateEngine.compile(view.contents, options);
|
|
66
69
|
cache[cid] = view;
|
|
67
|
-
|
|
70
|
+
|
|
68
71
|
return view;
|
|
69
72
|
};
|
|
70
73
|
|
|
@@ -81,11 +84,11 @@ exports.compile = function(view, cache, cid, options){
|
|
|
81
84
|
*
|
|
82
85
|
* Lookup:
|
|
83
86
|
*
|
|
84
|
-
* - partial `_<name>`
|
|
85
|
-
* - any `<name>/index`
|
|
86
|
-
* - non-layout `../<name>/index`
|
|
87
|
-
* - any `<root>/<name>`
|
|
88
|
-
* - partial `<root>/_<name>`
|
|
87
|
+
* - partial `_<name>`
|
|
88
|
+
* - any `<name>/index`
|
|
89
|
+
* - non-layout `../<name>/index`
|
|
90
|
+
* - any `<root>/<name>`
|
|
91
|
+
* - partial `<root>/_<name>`
|
|
89
92
|
*
|
|
90
93
|
* @param {String} view
|
|
91
94
|
* @param {Object} options
|
|
@@ -161,7 +164,7 @@ function renderPartial(res, view, options, parentLocals, parent){
|
|
|
161
164
|
|
|
162
165
|
// Inherit locals from parent
|
|
163
166
|
union(options, parentLocals);
|
|
164
|
-
|
|
167
|
+
|
|
165
168
|
// Merge locals
|
|
166
169
|
if (locals) merge(options, locals);
|
|
167
170
|
|
|
@@ -202,7 +205,7 @@ function renderPartial(res, view, options, parentLocals, parent){
|
|
|
202
205
|
options.lastInCollection = i == len - 1;
|
|
203
206
|
object = val;
|
|
204
207
|
buf += render();
|
|
205
|
-
}
|
|
208
|
+
}
|
|
206
209
|
} else {
|
|
207
210
|
keys = Object.keys(collection);
|
|
208
211
|
len = keys.length;
|
|
@@ -227,20 +230,20 @@ function renderPartial(res, view, options, parentLocals, parent){
|
|
|
227
230
|
};
|
|
228
231
|
|
|
229
232
|
/**
|
|
230
|
-
* Render `view` partial with the given `options`. Optionally a
|
|
233
|
+
* Render `view` partial with the given `options`. Optionally a
|
|
231
234
|
* callback `fn(err, str)` may be passed instead of writing to
|
|
232
235
|
* the socket.
|
|
233
236
|
*
|
|
234
237
|
* Options:
|
|
235
238
|
*
|
|
236
|
-
* - `object` Single object with name derived from the view (unless `as` is present)
|
|
239
|
+
* - `object` Single object with name derived from the view (unless `as` is present)
|
|
237
240
|
*
|
|
238
241
|
* - `as` Variable name for each `collection` value, defaults to the view name.
|
|
239
242
|
* * as: 'something' will add the `something` local variable
|
|
240
243
|
* * as: this will use the collection value as the template context
|
|
241
244
|
* * as: global will merge the collection value's properties with `locals`
|
|
242
245
|
*
|
|
243
|
-
* - `collection` Array of objects, the name is derived from the view name itself.
|
|
246
|
+
* - `collection` Array of objects, the name is derived from the view name itself.
|
|
244
247
|
* For example _video.html_ will have a object _video_ available to it.
|
|
245
248
|
*
|
|
246
249
|
* @param {String} view
|
|
@@ -294,7 +297,7 @@ res.partial = function(view, options, fn){
|
|
|
294
297
|
* automatically, however otherwise a response of _200_ and _text/html_ is given.
|
|
295
298
|
*
|
|
296
299
|
* Options:
|
|
297
|
-
*
|
|
300
|
+
*
|
|
298
301
|
* - `scope` Template evaluation context (the value of `this`)
|
|
299
302
|
* - `debug` Output debugging information
|
|
300
303
|
* - `status` Response status code
|
|
@@ -430,7 +433,7 @@ res._render = function(view, opts, fn, parent, sub){
|
|
|
430
433
|
// partial return
|
|
431
434
|
} else if (partial) {
|
|
432
435
|
return str;
|
|
433
|
-
// render complete, and
|
|
436
|
+
// render complete, and
|
|
434
437
|
// callback given
|
|
435
438
|
} else if (fn) {
|
|
436
439
|
fn(null, str);
|
|
@@ -454,4 +457,4 @@ function hintAtViewPaths(view, options) {
|
|
|
454
457
|
console.error(' - %s', path);
|
|
455
458
|
});
|
|
456
459
|
console.error();
|
|
457
|
-
}
|
|
460
|
+
}
|
|
@@ -163,10 +163,12 @@ Server.prototype.handle = function(req, res, out) {
|
|
|
163
163
|
|
|
164
164
|
res.statusCode = 500;
|
|
165
165
|
res.setHeader('Content-Type', 'text/plain');
|
|
166
|
+
if ('HEAD' == req.method) return res.end();
|
|
166
167
|
res.end(msg);
|
|
167
168
|
} else {
|
|
168
169
|
res.statusCode = 404;
|
|
169
170
|
res.setHeader('Content-Type', 'text/plain');
|
|
171
|
+
if ('HEAD' == req.method) return res.end();
|
|
170
172
|
res.end('Cannot ' + req.method + ' ' + req.url);
|
|
171
173
|
}
|
|
172
174
|
return;
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
* Module dependencies.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
var qs = require('qs')
|
|
13
|
+
var qs = require('qs')
|
|
14
|
+
, formidable = require('formidable');
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Extract the mime type from the given request's
|
|
@@ -29,10 +30,9 @@ function mime(req) {
|
|
|
29
30
|
/**
|
|
30
31
|
* Parse request bodies.
|
|
31
32
|
*
|
|
32
|
-
* By default _application/json_
|
|
33
|
-
* are supported, however you may map `connect.bodyParser.parse[contentType]`
|
|
34
|
-
* to a function
|
|
35
|
-
* one for other content-types.
|
|
33
|
+
* By default _application/json_, _application/x-www-form-urlencoded_,
|
|
34
|
+
* and _multipart/form-data_ are supported, however you may map `connect.bodyParser.parse[contentType]`
|
|
35
|
+
* to a function receiving `(req, options, callback)`.
|
|
36
36
|
*
|
|
37
37
|
* Examples:
|
|
38
38
|
*
|
|
@@ -43,36 +43,52 @@ function mime(req) {
|
|
|
43
43
|
* }
|
|
44
44
|
* );
|
|
45
45
|
*
|
|
46
|
-
* Since both _json_ and _x-www-form-urlencoded_ are supported by
|
|
47
|
-
* default, either of the following requests would result in the response
|
|
48
|
-
* of "viewing user tj".
|
|
49
|
-
*
|
|
50
46
|
* $ curl -d 'user[name]=tj' http://localhost/
|
|
51
47
|
* $ curl -d '{"user":{"name":"tj"}}' -H "Content-Type: application/json" http://localhost/
|
|
52
48
|
*
|
|
49
|
+
* Multipart req.files:
|
|
50
|
+
*
|
|
51
|
+
* As a security measure files are stored in a separate object, stored
|
|
52
|
+
* as `req.files`. This prevents attacks that may potentially alter
|
|
53
|
+
* filenames, and depending on the application gain access to restricted files.
|
|
54
|
+
*
|
|
55
|
+
* Multipart configuration:
|
|
56
|
+
*
|
|
57
|
+
* The `options` passed are provided to each parser function.
|
|
58
|
+
* The _multipart/form-data_ parser merges these with formidable's
|
|
59
|
+
* IncomingForm object, allowing you to tweak the upload directory,
|
|
60
|
+
* size limits, etc. For example you may wish to retain the file extension
|
|
61
|
+
* and change the upload directory:
|
|
62
|
+
*
|
|
63
|
+
* server.use(bodyParser({ uploadDir: '/www/mysite.com/uploads' }));
|
|
64
|
+
*
|
|
65
|
+
* View [node-formidable](https://github.com/felixge/node-formidable) for more information.
|
|
66
|
+
*
|
|
67
|
+
* If you wish to use formidable directly within your app, and do not
|
|
68
|
+
* desire this behaviour for multipart requests simply remove the
|
|
69
|
+
* parser:
|
|
70
|
+
*
|
|
71
|
+
* delete connect.bodyParser.parse['multipart/form-data'];
|
|
72
|
+
*
|
|
73
|
+
* Or
|
|
74
|
+
*
|
|
75
|
+
* delete express.bodyParser.parse['multipart/form-data'];
|
|
76
|
+
*
|
|
77
|
+
* @param {Object} options
|
|
53
78
|
* @return {Function}
|
|
54
79
|
* @api public
|
|
55
80
|
*/
|
|
56
81
|
|
|
57
|
-
exports = module.exports = function bodyParser(){
|
|
82
|
+
exports = module.exports = function bodyParser(options){
|
|
83
|
+
options = options || {};
|
|
58
84
|
return function bodyParser(req, res, next) {
|
|
85
|
+
if (req.body) return next();
|
|
86
|
+
req.body = {};
|
|
87
|
+
|
|
59
88
|
if ('GET' == req.method || 'HEAD' == req.method) return next();
|
|
60
89
|
var parser = exports.parse[mime(req)];
|
|
61
|
-
if (parser
|
|
62
|
-
|
|
63
|
-
req.setEncoding('utf8');
|
|
64
|
-
req.on('data', function(chunk) { data += chunk; });
|
|
65
|
-
req.on('end', function(){
|
|
66
|
-
req.rawBody = data;
|
|
67
|
-
try {
|
|
68
|
-
req.body = data
|
|
69
|
-
? parser(data)
|
|
70
|
-
: {};
|
|
71
|
-
} catch (err) {
|
|
72
|
-
return next(err);
|
|
73
|
-
}
|
|
74
|
-
next();
|
|
75
|
-
});
|
|
90
|
+
if (parser) {
|
|
91
|
+
parser(req, options, next);
|
|
76
92
|
} else {
|
|
77
93
|
next();
|
|
78
94
|
}
|
|
@@ -80,13 +96,101 @@ exports = module.exports = function bodyParser(){
|
|
|
80
96
|
};
|
|
81
97
|
|
|
82
98
|
/**
|
|
83
|
-
*
|
|
99
|
+
* Parsers.
|
|
100
|
+
*/
|
|
101
|
+
|
|
102
|
+
exports.parse = {};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Parse application/x-www-form-urlencoded.
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
exports.parse['application/x-www-form-urlencoded'] = function(req, options, fn){
|
|
109
|
+
var buf = '';
|
|
110
|
+
req.setEncoding('utf8');
|
|
111
|
+
req.on('data', function(chunk){ buf += chunk });
|
|
112
|
+
req.on('end', function(){
|
|
113
|
+
try {
|
|
114
|
+
req.body = buf.length
|
|
115
|
+
? qs.parse(buf)
|
|
116
|
+
: {};
|
|
117
|
+
fn();
|
|
118
|
+
} catch (err){
|
|
119
|
+
fn(err);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Parse application/json.
|
|
126
|
+
*/
|
|
127
|
+
|
|
128
|
+
exports.parse['application/json'] = function(req, options, fn){
|
|
129
|
+
var buf = '';
|
|
130
|
+
req.setEncoding('utf8');
|
|
131
|
+
req.on('data', function(chunk){ buf += chunk });
|
|
132
|
+
req.on('end', function(){
|
|
133
|
+
try {
|
|
134
|
+
req.body = buf.length
|
|
135
|
+
? JSON.parse(buf)
|
|
136
|
+
: {};
|
|
137
|
+
fn();
|
|
138
|
+
} catch (err){
|
|
139
|
+
fn(err);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Parse multipart/form-data.
|
|
84
146
|
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
147
|
+
* TODO: make multiple support optional
|
|
148
|
+
* TODO: revisit "error" flag if it's a formidable bug
|
|
87
149
|
*/
|
|
88
150
|
|
|
89
|
-
exports.parse = {
|
|
90
|
-
|
|
91
|
-
|
|
151
|
+
exports.parse['multipart/form-data'] = function(req, options, fn){
|
|
152
|
+
var form = new formidable.IncomingForm
|
|
153
|
+
, data = {}
|
|
154
|
+
, files = {}
|
|
155
|
+
, done;
|
|
156
|
+
|
|
157
|
+
Object.keys(options).forEach(function(key){
|
|
158
|
+
form[key] = options[key];
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
function ondata(name, val, data){
|
|
162
|
+
if (Array.isArray(data[name])) {
|
|
163
|
+
data[name].push(val);
|
|
164
|
+
} else if (data[name]) {
|
|
165
|
+
data[name] = [data[name], val];
|
|
166
|
+
} else {
|
|
167
|
+
data[name] = val;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
form.on('field', function(name, val){
|
|
172
|
+
ondata(name, val, data);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
form.on('file', function(name, val){
|
|
176
|
+
ondata(name, val, files);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
form.on('error', function(err){
|
|
180
|
+
fn(err);
|
|
181
|
+
done = true;
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
form.on('end', function(){
|
|
185
|
+
if (done) return;
|
|
186
|
+
try {
|
|
187
|
+
req.body = qs.parse(data);
|
|
188
|
+
req.files = qs.parse(files);
|
|
189
|
+
fn();
|
|
190
|
+
} catch (err) {
|
|
191
|
+
fn(err);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
form.parse(req);
|
|
92
196
|
};
|
|
@@ -43,7 +43,11 @@ module.exports = function limit(bytes){
|
|
|
43
43
|
req._limit = true;
|
|
44
44
|
|
|
45
45
|
// limit by content-length
|
|
46
|
-
if (len && len > bytes)
|
|
46
|
+
if (len && len > bytes) {
|
|
47
|
+
res.statusCode = 413;
|
|
48
|
+
res.end('Request Entity Too Large');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
47
51
|
|
|
48
52
|
// limit
|
|
49
53
|
req.on('data', function(chunk){
|
|
@@ -55,10 +55,10 @@ function defaultFingerprint(req) {
|
|
|
55
55
|
};
|
|
56
56
|
|
|
57
57
|
/**
|
|
58
|
-
* Paths to ignore
|
|
58
|
+
* Paths to ignore.
|
|
59
59
|
*/
|
|
60
60
|
|
|
61
|
-
exports.ignore = [
|
|
61
|
+
exports.ignore = [];
|
|
62
62
|
|
|
63
63
|
/**
|
|
64
64
|
* Setup session store with the given `options`.
|
|
@@ -39,6 +39,7 @@ var fs = require('fs')
|
|
|
39
39
|
*
|
|
40
40
|
* - `maxAge` Browser cache maxAge in milliseconds. defaults to 0
|
|
41
41
|
* - `hidden` Allow transfer of hidden files. defaults to false
|
|
42
|
+
* - `redirect` Redirect to trailing "/" when the pathname is a dir
|
|
42
43
|
*
|
|
43
44
|
* @param {String} root
|
|
44
45
|
* @param {Object} options
|
|
@@ -101,6 +102,7 @@ var send = exports.send = function(req, res, next, options){
|
|
|
101
102
|
, head = 'HEAD' == req.method
|
|
102
103
|
, get = 'GET' == req.method
|
|
103
104
|
, root = options.root ? normalize(options.root) : null
|
|
105
|
+
, redirect = false === options.redirect ? false : true
|
|
104
106
|
, getOnly = options.getOnly
|
|
105
107
|
, fn = options.callback
|
|
106
108
|
, hidden = options.hidden
|
|
@@ -132,7 +134,7 @@ var send = exports.send = function(req, res, next, options){
|
|
|
132
134
|
: utils.forbidden(res);
|
|
133
135
|
|
|
134
136
|
// index.html support
|
|
135
|
-
if ('/' == path[path.length - 1]) path += 'index.html';
|
|
137
|
+
if (normalize('/') == path[path.length - 1]) path += 'index.html';
|
|
136
138
|
|
|
137
139
|
// "hidden" file
|
|
138
140
|
if (!hidden && '.' == basename(path)[0]) return next();
|
|
@@ -149,13 +151,34 @@ var send = exports.send = function(req, res, next, options){
|
|
|
149
151
|
: next(err);
|
|
150
152
|
// redirect directory in case index.html is present
|
|
151
153
|
} else if (stat.isDirectory()) {
|
|
154
|
+
if (!redirect) return next();
|
|
152
155
|
res.statusCode = 301;
|
|
153
156
|
res.setHeader('Location', url.pathname + '/');
|
|
154
157
|
res.end('Redirecting to ' + url.pathname + '/');
|
|
155
158
|
return;
|
|
156
159
|
}
|
|
157
160
|
|
|
161
|
+
// header fields
|
|
162
|
+
if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString());
|
|
163
|
+
if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (maxAge / 1000));
|
|
164
|
+
if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString());
|
|
165
|
+
if (!res.getHeader('ETag')) res.setHeader('ETag', utils.etag(stat));
|
|
166
|
+
if (!res.getHeader('content-type')) {
|
|
167
|
+
var charset = mime.charsets.lookup(type);
|
|
168
|
+
res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''));
|
|
169
|
+
}
|
|
170
|
+
res.setHeader('Accept-Ranges', 'bytes');
|
|
171
|
+
|
|
172
|
+
// conditional GET support
|
|
173
|
+
if (utils.conditionalGET(req)) {
|
|
174
|
+
if (!utils.modified(req, res)) {
|
|
175
|
+
req.emit('static');
|
|
176
|
+
return utils.notModified(res);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
158
180
|
var opts = {};
|
|
181
|
+
var chunkSize = stat.size;
|
|
159
182
|
|
|
160
183
|
// we have a Range request
|
|
161
184
|
if (ranges) {
|
|
@@ -166,6 +189,7 @@ var send = exports.send = function(req, res, next, options){
|
|
|
166
189
|
// TODO: multiple support
|
|
167
190
|
opts.start = ranges[0].start;
|
|
168
191
|
opts.end = ranges[0].end;
|
|
192
|
+
chunkSize = opts.end - opts.start + 1;
|
|
169
193
|
res.statusCode = 206;
|
|
170
194
|
res.setHeader('Content-Range', 'bytes '
|
|
171
195
|
+ opts.start
|
|
@@ -179,27 +203,9 @@ var send = exports.send = function(req, res, next, options){
|
|
|
179
203
|
? fn(new Error('Requested Range Not Satisfiable'))
|
|
180
204
|
: invalidRange(res);
|
|
181
205
|
}
|
|
182
|
-
// stream the entire file
|
|
183
|
-
} else {
|
|
184
|
-
res.setHeader('Content-Length', stat.size);
|
|
185
|
-
if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (maxAge / 1000));
|
|
186
|
-
if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString());
|
|
187
|
-
if (!res.getHeader('ETag')) res.setHeader('ETag', utils.etag(stat));
|
|
188
|
-
|
|
189
|
-
// conditional GET support
|
|
190
|
-
if (utils.conditionalGET(req)) {
|
|
191
|
-
if (!utils.modified(req, res)) {
|
|
192
|
-
return utils.notModified(res);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
206
|
}
|
|
196
207
|
|
|
197
|
-
|
|
198
|
-
if (!res.getHeader('content-type')) {
|
|
199
|
-
var charset = mime.charsets.lookup(type);
|
|
200
|
-
res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''));
|
|
201
|
-
}
|
|
202
|
-
res.setHeader('Accept-Ranges', 'bytes');
|
|
208
|
+
res.setHeader('Content-Length', chunkSize);
|
|
203
209
|
|
|
204
210
|
// transfer
|
|
205
211
|
if (head) return res.end();
|
|
@@ -213,7 +219,6 @@ var send = exports.send = function(req, res, next, options){
|
|
|
213
219
|
if (fn) {
|
|
214
220
|
function callback(err) { done || fn(err); done = true }
|
|
215
221
|
req.on('close', callback);
|
|
216
|
-
req.socket.on('error', callback);
|
|
217
222
|
stream.on('end', callback);
|
|
218
223
|
}
|
|
219
224
|
});
|