28 lines
921 B
JavaScript
28 lines
921 B
JavaScript
|
import { escapeUri } from "@smithy/util-uri-escape";
|
||
|
import { SIGNATURE_HEADER } from "./constants";
|
||
|
export const getCanonicalQuery = ({ query = {} }) => {
|
||
|
const keys = [];
|
||
|
const serialized = {};
|
||
|
for (const key of Object.keys(query).sort()) {
|
||
|
if (key.toLowerCase() === SIGNATURE_HEADER) {
|
||
|
continue;
|
||
|
}
|
||
|
keys.push(key);
|
||
|
const value = query[key];
|
||
|
if (typeof value === "string") {
|
||
|
serialized[key] = `${escapeUri(key)}=${escapeUri(value)}`;
|
||
|
}
|
||
|
else if (Array.isArray(value)) {
|
||
|
serialized[key] = value
|
||
|
.slice(0)
|
||
|
.reduce((encoded, value) => encoded.concat([`${escapeUri(key)}=${escapeUri(value)}`]), [])
|
||
|
.sort()
|
||
|
.join("&");
|
||
|
}
|
||
|
}
|
||
|
return keys
|
||
|
.map((key) => serialized[key])
|
||
|
.filter((serialized) => serialized)
|
||
|
.join("&");
|
||
|
};
|