'use strict'; const methods = require('methods').map(method => { return method.toUpperCase(); }); module.exports = options => { options = options || {}; options.allowedMethods = options.allowedMethods || [ 'POST' ]; return function overrideMethod(ctx, next) { const orginalMethod = ctx.request.method; if (options.allowedMethods.indexOf(orginalMethod) === -1) return next(); let method; // body support const body = ctx.request.body; if (body && body._method) { method = body._method.toUpperCase(); } else { // header support const header = ctx.get('x-http-method-override'); if (header) { method = header.toUpperCase(); } } if (method) { // only allow supported methods // if you want to support other methods, // just create your own utility! if (methods.indexOf(method) === -1) { ctx.throw(400, `invalid overriden method: "${method}"`); } ctx.request.method = method; } return next(); }; };