12345678910111213141516171819202122232425262728293031323334353637383940 |
- '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();
- };
- };
|