oniyi-http-plugin-format-url-template
Version:
Plugin for injecting template values into request href and/or query string
102 lines (84 loc) • 2.99 kB
JavaScript
;
// node core modules
const url = require('url');
// 3rd party modules
const _ = require('lodash');
const debug = require('debug')('oniyi:http-client:plugin:format-url-template');
// internal modules
const { formatHref, formatQuery } = require('./utils');
const PHASE_NAME = 'format-url-template';
const defaultPluginOptions = {
applyToUrl: true,
applyToQueryString: false,
valuesMap: {
authType: {
oauth: 'oauth',
basic: 'basic',
saml: 'form',
cookie: 'form',
},
},
};
const processUri = (requestOptions, { applyToUrl, valuesMap }) => {
const { uri } = requestOptions;
if (!(applyToUrl && uri)) {
return uri;
}
// provided uri can be either String or an Object
const isUriString = _.isString(uri);
const formattedHref = formatHref(isUriString ? uri : uri.href, requestOptions, valuesMap);
return isUriString ? formattedHref : url.parse(formattedHref);
};
const processQuerystring = (requestOptions, { applyToQueryString, valuesMap }) => {
const { qs } = requestOptions;
if (!applyToQueryString || !qs) {
return qs;
}
return formatQuery(qs, requestOptions, valuesMap);
};
/**
* Replace templateStrings in your requestOptions's `uri` and `qs` with values extracted from other
* properties in `requestOptions`
*
* @param {Object} [params] the plugin params
* @param {Object} [params.valuesMap] map templateValues to a custom value
* @param {Boolean} [params.applyToUrl=true] parse template strings in url parameter?
* @param {Boolean} [params.applyToQueryString=false] parse template strings in query parameter?
* @example
* // disables modifying request url
* pluginFactory({ applyToUrl: false });
* @example
* // enables modifying request querystring
* pluginFactory({ applyToQueryString: true });
* @example
* // provides custom values map for { authType } templateString
* pluginFactory({ valuesMap: { authType: { oauth: 'oauth2' } } });
* @return {*}
*/
const pluginFactory = (params = {}) => {
const pluginOptions = _.merge({}, defaultPluginOptions, params);
debug('Plugin options compiled: %o', pluginOptions);
return {
name: PHASE_NAME,
onRequest: [{
phaseName: PHASE_NAME,
handler: (ctx, next) => {
const { options: requestOptions } = ctx;
const {
plugins: {
formatUrlTemplate,
} = {},
} = requestOptions;
const options = _.merge({}, pluginOptions, formatUrlTemplate);
const uri = processUri(requestOptions, options);
debug('request options uri updated: %o', uri);
const qs = processQuerystring(requestOptions, options);
debug('request options qs updated: %o', qs);
// update the context with latest changes of request options
_.assign(ctx, { options: _.assign({}, requestOptions, { uri, qs }) });
next();
},
}],
};
};
module.exports = pluginFactory;