rest.js 4.5 KB

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