fgiova/aws-signature

View on GitHub
src/aws/getCanonicalHeaders.ts

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
import { ALWAYS_UNSIGNABLE_HEADERS, PROXY_HEADER_PATTERN, SEC_HEADER_PATTERN } from "./constants";
import {HttpRequest} from "./utils";

/**
 * @private
 */
export function getCanonicalHeaders (
    {headers}: HttpRequest,
    unsignableHeaders?: Set<string>,
    signableHeaders?: Set<string>
) {
    const canonical: Record<string, string> = {};
    for (const headerName of Object.keys(headers).sort()) {
        if (headers[headerName] == undefined) {
            continue;
        }

        const canonicalHeaderName = headerName.toLowerCase();
        if (
            canonicalHeaderName in ALWAYS_UNSIGNABLE_HEADERS ||
            unsignableHeaders?.has(canonicalHeaderName) ||
            PROXY_HEADER_PATTERN.test(canonicalHeaderName) ||
            SEC_HEADER_PATTERN.test(canonicalHeaderName)
        ) {
            if (!signableHeaders || (signableHeaders && !signableHeaders.has(canonicalHeaderName))) {
                continue;
            }
        }

        canonical[canonicalHeaderName] = headers[headerName].trim().replace(/\s+/g, " ");
    }

    return canonical;
}
export function getCanonicalHeaderList (headers: object): string {
    return Object.keys(headers).sort().join(";");
}