query.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. var AWS = require('../core');
  2. var util = require('../util');
  3. var QueryParamSerializer = require('../query/query_param_serializer');
  4. var Shape = require('../model/shape');
  5. var populateHostPrefix = require('./helpers').populateHostPrefix;
  6. function buildRequest(req) {
  7. var operation = req.service.api.operations[req.operation];
  8. var httpRequest = req.httpRequest;
  9. httpRequest.headers['Content-Type'] =
  10. 'application/x-www-form-urlencoded; charset=utf-8';
  11. httpRequest.params = {
  12. Version: req.service.api.apiVersion,
  13. Action: operation.name
  14. };
  15. // convert the request parameters into a list of query params,
  16. // e.g. Deeply.NestedParam.0.Name=value
  17. var builder = new QueryParamSerializer();
  18. builder.serialize(req.params, operation.input, function(name, value) {
  19. httpRequest.params[name] = value;
  20. });
  21. httpRequest.body = util.queryParamsToString(httpRequest.params);
  22. populateHostPrefix(req);
  23. }
  24. function extractError(resp) {
  25. var data, body = resp.httpResponse.body.toString();
  26. if (body.match('<UnknownOperationException')) {
  27. data = {
  28. Code: 'UnknownOperation',
  29. Message: 'Unknown operation ' + resp.request.operation
  30. };
  31. } else {
  32. try {
  33. data = new AWS.XML.Parser().parse(body);
  34. } catch (e) {
  35. data = {
  36. Code: resp.httpResponse.statusCode,
  37. Message: resp.httpResponse.statusMessage
  38. };
  39. }
  40. }
  41. if (data.requestId && !resp.requestId) resp.requestId = data.requestId;
  42. if (data.Errors) data = data.Errors;
  43. if (data.Error) data = data.Error;
  44. if (data.Code) {
  45. resp.error = util.error(new Error(), {
  46. code: data.Code,
  47. message: data.Message
  48. });
  49. } else {
  50. resp.error = util.error(new Error(), {
  51. code: resp.httpResponse.statusCode,
  52. message: null
  53. });
  54. }
  55. }
  56. function extractData(resp) {
  57. var req = resp.request;
  58. var operation = req.service.api.operations[req.operation];
  59. var shape = operation.output || {};
  60. var origRules = shape;
  61. if (origRules.resultWrapper) {
  62. var tmp = Shape.create({type: 'structure'});
  63. tmp.members[origRules.resultWrapper] = shape;
  64. tmp.memberNames = [origRules.resultWrapper];
  65. util.property(shape, 'name', shape.resultWrapper);
  66. shape = tmp;
  67. }
  68. var parser = new AWS.XML.Parser();
  69. // TODO: Refactor XML Parser to parse RequestId from response.
  70. if (shape && shape.members && !shape.members._XAMZRequestId) {
  71. var requestIdShape = Shape.create(
  72. { type: 'string' },
  73. { api: { protocol: 'query' } },
  74. 'requestId'
  75. );
  76. shape.members._XAMZRequestId = requestIdShape;
  77. }
  78. var data = parser.parse(resp.httpResponse.body.toString(), shape);
  79. resp.requestId = data._XAMZRequestId || data.requestId;
  80. if (data._XAMZRequestId) delete data._XAMZRequestId;
  81. if (origRules.resultWrapper) {
  82. if (data[origRules.resultWrapper]) {
  83. util.update(data, data[origRules.resultWrapper]);
  84. delete data[origRules.resultWrapper];
  85. }
  86. }
  87. resp.data = data;
  88. }
  89. /**
  90. * @api private
  91. */
  92. module.exports = {
  93. buildRequest: buildRequest,
  94. extractError: extractError,
  95. extractData: extractData
  96. };