file(DOWNLOAD|UPLOAD): Add HTTPHEADER suboption
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}"
)