1 | var util = require('../util');
|
2 | var Rest = require('./rest');
|
3 | var Json = require('./json');
|
4 | var JsonBuilder = require('../json/builder');
|
5 | var JsonParser = require('../json/parser');
|
6 |
|
7 | function populateBody(req) {
|
8 | var builder = new JsonBuilder();
|
9 | var input = req.service.api.operations[req.operation].input;
|
10 |
|
11 | if (input.payload) {
|
12 | var params = {};
|
13 | var payloadShape = input.members[input.payload];
|
14 | params = req.params[input.payload];
|
15 | if (params === undefined) return;
|
16 |
|
17 | if (payloadShape.type === 'structure') {
|
18 | req.httpRequest.body = builder.build(params, payloadShape);
|
19 | applyContentTypeHeader(req);
|
20 | } else {
|
21 | req.httpRequest.body = params;
|
22 | if (payloadShape.type === 'binary' || payloadShape.isStreaming) {
|
23 | applyContentTypeHeader(req, true);
|
24 | }
|
25 | }
|
26 | } else {
|
27 | var body = builder.build(req.params, input);
|
28 | if (body !== '{}' || req.httpRequest.method !== 'GET') {
|
29 | req.httpRequest.body = body;
|
30 | }
|
31 | applyContentTypeHeader(req);
|
32 | }
|
33 | }
|
34 |
|
35 | function applyContentTypeHeader(req, isBinary) {
|
36 | var operation = req.service.api.operations[req.operation];
|
37 | var input = operation.input;
|
38 |
|
39 | if (!req.httpRequest.headers['Content-Type']) {
|
40 | var type = isBinary ? 'binary/octet-stream' : 'application/json';
|
41 | req.httpRequest.headers['Content-Type'] = type;
|
42 | }
|
43 | }
|
44 |
|
45 | function buildRequest(req) {
|
46 | Rest.buildRequest(req);
|
47 |
|
48 |
|
49 | if (['HEAD', 'DELETE'].indexOf(req.httpRequest.method) < 0) {
|
50 | populateBody(req);
|
51 | }
|
52 | }
|
53 |
|
54 | function extractError(resp) {
|
55 | Json.extractError(resp);
|
56 | }
|
57 |
|
58 | function extractData(resp) {
|
59 | Rest.extractData(resp);
|
60 |
|
61 | var req = resp.request;
|
62 | var operation = req.service.api.operations[req.operation];
|
63 | var rules = req.service.api.operations[req.operation].output || {};
|
64 | var parser;
|
65 | var hasEventOutput = operation.hasEventOutput;
|
66 |
|
67 | if (rules.payload) {
|
68 | var payloadMember = rules.members[rules.payload];
|
69 | var body = resp.httpResponse.body;
|
70 | if (payloadMember.isEventStream) {
|
71 | parser = new JsonParser();
|
72 | resp.data[payload] = util.createEventStream(
|
73 | AWS.HttpClient.streamsApiVersion === 2 ? resp.httpResponse.stream : body,
|
74 | parser,
|
75 | payloadMember
|
76 | );
|
77 | } else if (payloadMember.type === 'structure' || payloadMember.type === 'list') {
|
78 | var parser = new JsonParser();
|
79 | resp.data[rules.payload] = parser.parse(body, payloadMember);
|
80 | } else if (payloadMember.type === 'binary' || payloadMember.isStreaming) {
|
81 | resp.data[rules.payload] = body;
|
82 | } else {
|
83 | resp.data[rules.payload] = payloadMember.toType(body);
|
84 | }
|
85 | } else {
|
86 | var data = resp.data;
|
87 | Json.extractData(resp);
|
88 | resp.data = util.merge(data, resp.data);
|
89 | }
|
90 | }
|
91 |
|
92 |
|
93 |
|
94 |
|
95 | module.exports = {
|
96 | buildRequest: buildRequest,
|
97 | extractError: extractError,
|
98 | extractData: extractData
|
99 | };
|