You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

35 lines
1005 B
CoffeeScript

zeroFill = require "zero-fill"
maybeEncodeValue = (value) ->
if /[^ -~]/.exec(value) # Matches any Unicode and non-printable characters.
encoded = encodeURIComponent(value)
return "uri(#{encoded})"
else
return value
module.exports = (metadata) ->
headers = {}
for key, values of metadata
# It's easier to just always operate on an array, even if there's only a single value.
if not Array.isArray values
values = [values]
# Per RFC 822, we cannot have underscores in the header names. The IA S3 API will automatically convert double hyphens to an underscore, so we do the inverse.
key = key.replace("_", "--")
itemCount = values.length
if itemCount == 0
continue
else if itemCount == 1
headers["x-archive-meta-#{key}"] = maybeEncodeValue(values[0])
else
numberWidth = itemCount.toString().length
for value, i in values
headerName = "x-archive-meta#{zeroFill(numberWidth, i + 1)}-#{key}"
headers[headerName] = maybeEncodeValue(value)
return headers