UNPKG

mof-request

Version:

A middleware wrapped request.js module for floodesh

74 lines (55 loc) 1.88 kB
'use strict' const request = require('request') module.exports = globalOptions=>{ let requestOptions = [ 'uri','url','qs','method','headers','body','form','json','multipart','followRedirect', 'followAllRedirects', 'maxRedirects','encoding','pool','timeout','proxy','auth','oauth', 'strictSSL','jar','aws','gzip','time','tunnel','proxyHeaderWhiteList','proxyHeaderExclusiveList', 'localAddress','forever']; globalOptions=globalOptions||{}; return function* (ctx, next) { yield new Promise((resolve,reject) => { let options = {timeout:15000,encoding:null,gzip:true,time:true,headers:{}}; merge(options,globalOptions); merge(options,ctx.opt); options = pick(options, requestOptions); merge(options.headers,globalOptions.headers); merge(options.headers,ctx.opt.headers); ctx.app.logger.debug("Requesting: %s", options.uri, options); if(ctx.scounter) ctx.scounter('request'); ctx.ts = new Date(); request(options, (err,res) => { ctx.app.logger.debug("Requested: %s", options.uri); if(ctx.stiming) ctx.stiming("response"); if(err){ if(ctx.scounter) ctx.scounter('request.error'); return reject(err); } ctx.app.logger.verbose("Network time: %d ms", res.elapsedTime); ctx.response.res = res; ctx.request.req = res.request; // attach an instance of `Request` while got response, need see if it is necessary. resolve(); }); }); return next(); } } function merge(a, b){ if (a && b) { for (var key in b) { if(typeof b[key] === 'object'){ a[key] = JSON.parse(JSON.stringify(b[key])); }else{ a[key] = b[key]; } } } return a; } function pick(options, keys){ return keys.reduce((obj,key) => { if(options.hasOwnProperty(key)) obj[key] = options[key]; return obj; },Object.create(null)); }