-
Notifications
You must be signed in to change notification settings - Fork 41
/
methodOverride.js
66 lines (58 loc) · 2.2 KB
/
methodOverride.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
var normalizeHeaderName = require('../utils/normalizeHeaderName');
/**
* A middleware that overrides the method of the request to a value that was
* given either in a request parameter or a request header. Can be useful when
* you need to use HTTP methods other than GET and POST with clients that don't
* support them, like web browsers.
*
* For example, you could use the following HTML form:
*
* <form method="POST" action="/">
* <input type="hidden" name="_method" value="PUT">
* </form>
*
* with an app that uses methodOverride:
*
* var app = mach.stack();
* app.use(mach.params);
* app.use(mach.methodOverride);
* app.run(function (request) {
* return request.method; // PUT
* });
*
* Note: When using mach.methodOverride with POST parameters you need to put
* mach.params in front of it so that the request parameters will be available.
*
* Options may be any of the following:
*
* - paramName The name of the request param that contains the
* request method. Defaults to "_method"
* - headerName The name of the HTTP header that will contain the
* request method. This allows you to put the request
* method in an HTTP header instead of a request param.
* Defaults to "X-Http-Method-Override"
*/
function methodOverride(app, options) {
options = options || {};
if (typeof options === 'string')
options = { paramName: options };
var paramName = options.paramName || '_method';
var headerName = normalizeHeaderName(options.headerName || 'X-Http-Method-Override');
return function (conn) {
var method;
if (conn.request.headers[headerName]) {
method = conn.request.headers[headerName];
} else if (!conn.params) {
conn.onError(new Error('No params! Use mach.params in front of mach.methodOverride'));
} else if (conn.params[paramName]) {
method = conn.params[paramName];
// If multiple _method parameters were used, use the last one.
if (Array.isArray(method))
method = method[method.length - 1];
}
if (method)
conn.method = method.toUpperCase();
return conn.call(app);
};
}
module.exports = methodOverride;