Skip to content

file(DOWNLOAD|UPLOAD): Add HTTPHEADER suboption

Ruslan Baratov requested to merge ruslo/cmake:pr.curl.headers into master

This feature allow to set HTTP custom headers for download/upload operations for various purposes.

For example this is how to download file from private S3 bucket with external HMAC calculation:

set(S3_KEY "...")
set(S3_SECRET "...")
set(S3_BUCKET_NAME "...")
set(FILENAME "myfile.tar.gz")
set(SHA1 "...")

set(S3_RESOURCE "/${S3_BUCKET_NAME}/${FILENAME}")
set(content_type "application/x-compressed-tar")

string(TIMESTAMP now "%a, %d %b %Y %H:%M:%S +0000" UTC)

set(string_to_sign "GET\n\n${content_type}\n${now}\n${S3_RESOURCE}")

# FIXME: workaround, tested on Linux
execute_process(
    COMMAND echo -n "${string_to_sign}"
    COMMAND openssl sha1 -hmac "${S3_SECRET}" -binary
    COMMAND base64
    RESULT_VARIABLE result
    OUTPUT_VARIABLE signature
    ERROR_VARIABLE error
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_STRIP_TRAILING_WHITESPACE
)

# TODO: check ${result}, print ${error}

file(
    DOWNLOAD
    "https://${S3_BUCKET_NAME}.s3.amazonaws.com/${FILENAME}"
    "${local_output}"
    EXPECTED_HASH SHA1=${SHA1}
    HTTPHEADER "Host: ${S3_BUCKET_NAME}.s3.amazonaws.com"
    HTTPHEADER "Date: ${now}"
    HTTPHEADER "Content-Type: ${content_type}"
    HTTPHEADER "Authorization: AWS ${S3_KEY}:${signature}"
)

Merge request reports