-
Notifications
You must be signed in to change notification settings - Fork 104
/
Copy pathutils.js
118 lines (99 loc) · 3.29 KB
/
utils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
var crypto = require('crypto');
var generateSignature = function (stringToSign, awsSecret) {
var hmac = crypto.createHmac('sha256', awsSecret);
var signature = hmac.update(stringToSign).digest('base64');
return signature;
};
var sort = function (object) {
var sortedObject = {};
var keys = Object.keys(object).sort();
for (var i = 0; i < keys.length; i++) {
sortedObject[keys[i]] = object[keys[i]];
};
return sortedObject;
}
var capitalize = function (string) {
return string[0].toUpperCase() + string.slice(1)
}
var setDefaultParams = function (params, defaultParams) {
for (var param in defaultParams) {
if (typeof params[param] === 'undefined') {
params[param] = defaultParams[param];
}
}
return params;
}
var formatQueryParams = function (query, method, credentials) {
var params = {};
// format query keys
for (var param in query) {
var capitalized = capitalize(param);
params[capitalized] = query[param];
}
if (method === 'ItemSearch') {
// Default
params = setDefaultParams(params, {
SearchIndex: 'All',
Condition: 'All',
ResponseGroup: 'ItemAttributes',
Keywords: '',
ItemPage: '1'
});
} else if (method === 'ItemLookup') {
// Default
params = setDefaultParams(params, {
SearchIndex: 'All',
Condition: 'All',
ResponseGroup: 'ItemAttributes',
IdType: 'ASIN',
IncludeReviewsSummary: 'True',
TruncateReviewsAt: '1000',
VariationPage: 'All'
});
// Constraints
// If ItemId is an ASIN (specified by IdType), a search index cannot be specified in the request.
if (params['IdType'] === 'ASIN') {
delete params['SearchIndex'];
}
} else if (method === 'BrowseNodeLookup') {
// Default
params = setDefaultParams(params, {
BrowseNodeId: '',
ResponseGroup: 'BrowseNodeInfo'
});
} else if (method === 'SimilarityLookup') {
// Default
params = setDefaultParams(params,{
SimilarityType: 'Intersection',
ResponseGroup: 'ItemAttributes'
});
}
// Constants
params['Version'] = '2013-08-01';
// Common params
params['AWSAccessKeyId'] = credentials.awsId;
// awsTag is associated with domain, so it ought to be defineable in query.
params['AssociateTag'] = query.awsTag || credentials.awsTag;
params['Timestamp'] = new Date().toISOString();
params['Service'] = 'AWSECommerceService';
params['Operation'] = method;
// sort
params = sort(params);
return params;
}
var generateQueryString = function (query, method, credentials) {
var unsignedString = '';
var domain = query.domain || 'webservices.amazon.com';
var params = formatQueryParams(query, method, credentials);
// generate query
unsignedString = Object.keys(params).map(function (key) {
return key + "=" + encodeURIComponent(params[key]).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}).join("&")
var signature = encodeURIComponent(generateSignature('GET\n' + domain + '\n/onca/xml\n' + unsignedString, credentials.awsSecret)).replace(/\+/g, '%2B');
var queryString = 'https://' + domain + '/onca/xml?' + unsignedString + '&Signature=' + signature;
return queryString;
};
exports.generateQueryString = generateQueryString;
exports.formatQueryParams = formatQueryParams;