rest.js (4000B)
1 var util = require('../util'); 2 3 function populateMethod(req) { 4 req.httpRequest.method = req.service.api.operations[req.operation].httpMethod; 5 } 6 7 function populateURI(req) { 8 var operation = req.service.api.operations[req.operation]; 9 var input = operation.input; 10 var uri = [req.httpRequest.endpoint.path, operation.httpPath].join('/'); 11 uri = uri.replace(/\/+/g, '/'); 12 13 var queryString = {}, queryStringSet = false; 14 util.each(input.members, function (name, member) { 15 var paramValue = req.params[name]; 16 if (paramValue === null || paramValue === undefined) return; 17 if (member.location === 'uri') { 18 var regex = new RegExp('\\{' + member.name + '(\\+)?\\}'); 19 uri = uri.replace(regex, function(_, plus) { 20 var fn = plus ? util.uriEscapePath : util.uriEscape; 21 return fn(String(paramValue)); 22 }); 23 } else if (member.location === 'querystring') { 24 queryStringSet = true; 25 26 if (member.type === 'list') { 27 queryString[member.name] = paramValue.map(function(val) { 28 return util.uriEscape(String(val)); 29 }); 30 } else if (member.type === 'map') { 31 util.each(paramValue, function(key, value) { 32 if (Array.isArray(value)) { 33 queryString[key] = value.map(function(val) { 34 return util.uriEscape(String(val)); 35 }); 36 } else { 37 queryString[key] = util.uriEscape(String(value)); 38 } 39 }); 40 } else { 41 queryString[member.name] = util.uriEscape(String(paramValue)); 42 } 43 } 44 }); 45 46 if (queryStringSet) { 47 uri += (uri.indexOf('?') >= 0 ? '&' : '?'); 48 var parts = []; 49 util.arrayEach(Object.keys(queryString).sort(), function(key) { 50 if (!Array.isArray(queryString[key])) { 51 queryString[key] = [queryString[key]]; 52 } 53 for (var i = 0; i < queryString[key].length; i++) { 54 parts.push(util.uriEscape(String(key)) + '=' + queryString[key][i]); 55 } 56 }); 57 uri += parts.join('&'); 58 } 59 60 req.httpRequest.path = uri; 61 } 62 63 function populateHeaders(req) { 64 var operation = req.service.api.operations[req.operation]; 65 util.each(operation.input.members, function (name, member) { 66 var value = req.params[name]; 67 if (value === null || value === undefined) return; 68 69 if (member.location === 'headers' && member.type === 'map') { 70 util.each(value, function(key, memberValue) { 71 req.httpRequest.headers[member.name + key] = memberValue; 72 }); 73 } else if (member.location === 'header') { 74 value = member.toWireFormat(value).toString(); 75 req.httpRequest.headers[member.name] = value; 76 } 77 }); 78 } 79 80 function buildRequest(req) { 81 populateMethod(req); 82 populateURI(req); 83 populateHeaders(req); 84 } 85 86 function extractError() { 87 } 88 89 function extractData(resp) { 90 var req = resp.request; 91 var data = {}; 92 var r = resp.httpResponse; 93 var operation = req.service.api.operations[req.operation]; 94 var output = operation.output; 95 96 // normalize headers names to lower-cased keys for matching 97 var headers = {}; 98 util.each(r.headers, function (k, v) { 99 headers[k.toLowerCase()] = v; 100 }); 101 102 util.each(output.members, function(name, member) { 103 var header = (member.name || name).toLowerCase(); 104 if (member.location === 'headers' && member.type === 'map') { 105 data[name] = {}; 106 var location = member.isLocationName ? member.name : ''; 107 var pattern = new RegExp('^' + location + '(.+)', 'i'); 108 util.each(r.headers, function (k, v) { 109 var result = k.match(pattern); 110 if (result !== null) { 111 data[name][result[1]] = v; 112 } 113 }); 114 } else if (member.location === 'header') { 115 if (headers[header] !== undefined) { 116 data[name] = headers[header]; 117 } 118 } else if (member.location === 'statusCode') { 119 data[name] = parseInt(r.statusCode, 10); 120 } 121 }); 122 123 resp.data = data; 124 } 125 126 module.exports = { 127 buildRequest: buildRequest, 128 extractError: extractError, 129 extractData: extractData 130 };