    # File lib/fog/google/storage.rb, line 205
            def signature(params)
              string_to_sign =
    "\#{params[:method]}\n\#{params[:headers]['Content-MD5']}\n\#{params[:headers]['Content-Type']}\n\#{params[:headers]['Date']}\n"

              google_headers, canonical_google_headers = {}, ''
              for key, value in params[:headers]
                if key[0..6] == 'x-goog-'
                  google_headers[key] = value
                end
              end

              google_headers = google_headers.sort {|x, y| x[0] <=> y[0]}
              for key, value in google_headers
                canonical_google_headers << "#{key}:#{value}\n"
              end
              string_to_sign << "#{canonical_google_headers}"

              subdomain = params[:host].split(".#{@host}").first
              unless subdomain =~ /^(?!goog)(?:[a-z]|\d(?!\d{0,2}(?:\.\d{1,3}){3}$))(?:[a-z0-9]|\.(?![\.\-])|\-(?![\.])){1,61}[a-z0-9]$/
                if subdomain =~ /_/
                  # https://github.com/fog/fog/pull/1258#issuecomment-10248620.
                  Fog::Logger.warning("fog: the specified google storage bucket name (#{subdomain}) is not DNS compliant (only characters a through z, digits 0 through 9, and the hyphen).")
                else
                  # - Bucket names must contain only lowercase letters, numbers, dashes (-), underscores (_), and dots (.). Names containing dots require verification.
                  # - Bucket names must start and end with a number or letter.
                  # - Bucket names must contain 3 to 63 characters. Names containing dots can contain up to 222 characters, but each dot-separated component can be no longer than 63 characters.
                  # - Bucket names cannot be represented as an IP address in dotted-decimal notation (for example, 192.168.5.4).
                  # - Bucket names cannot begin with the "goog" prefix.
                  # - Also, for DNS compliance, you should not have a period adjacent to another period or dash. For example, ".." or "-." or ".-" are not acceptable.
                  Fog::Logger.warning("fog: the specified google storage bucket name (#{subdomain}) is not a valid dns name.  See: https://developers.google.com/storage/docs/bucketnaming")
                end
                params[:host] = params[:host].split("#{subdomain}.")[-1]
                if params[:path]
                  params[:path] = "#{subdomain}/#{params[:path]}"
                else
                  params[:path] = "#{subdomain}"
                end
                subdomain = nil
              end

              canonical_resource  = "/"
              unless subdomain.nil? || subdomain == @host
                canonical_resource << "#{CGI.escape(subdomain).downcase}/"
              end
              canonical_resource << "#{params[:path]}"
              canonical_resource << '?'
              for key in (params[:query] || {}).keys
                if ['acl', 'cors', 'location', 'logging', 'requestPayment', 'torrent', 'versions', 'versioning'].include?(key)
                  canonical_resource << "#{key}&"
                end
              end
              canonical_resource.chop!
              string_to_sign << "#{canonical_resource}"

              signed_string = @hmac.sign(string_to_sign)
              Base64.encode64(signed_string).chomp!
            end