all files / modules/middleware/ methodOverride.js

95.45% Statements 21/22
88.89% Branches 16/18
100% Functions 2/2
95.45% Lines 21/22
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 67 68 69 70                                                                                                  
const normalizeHeaderName = require("../utils/normalizeHeaderName");
const {is} = require("ramda");
/**
 * 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:
 *
 *   let 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 || {};
 
    Iif (is(String, options)) {
        options = {paramName: options};
    }
 
    const paramName = options.paramName || "_method";
    const headerName = normalizeHeaderName(options.headerName || "X-Http-Method-Override");
 
    return function (conn) {
        let 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 Eif (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;