lib/azure_blob/canonicalized_resource.rb



require "cgi"

module AzureBlob
  class CanonicalizedResource
    def initialize(uri, account_name, service_name: nil, url_safe: true)
      # This next line is needed because CanonicalizedResource
      # need to be escaped for auhthorization headers, but not SAS tokens
      path = url_safe ? uri.path : URI::DEFAULT_PARSER.unescape(uri.path)
      resource = "/#{account_name}#{path.empty? ? "/" : path}"
      resource = "/#{service_name}#{resource}" if service_name
      params = CGI.parse(uri.query.to_s)
        .transform_keys(&:downcase)
        .sort
        .map { |param, value| "#{param}:#{value.map(&:strip).sort.join(",")}" }

      @canonicalized_resource = [ resource, *params ].join("\n")
    end

    def to_s
      @canonicalized_resource
    end
  end
end