2013-02-13 10:11:10 -05:00
|
|
|
module Fog
|
|
|
|
module Storage
|
|
|
|
class Rackspace
|
|
|
|
|
|
|
|
class Metadata
|
|
|
|
|
|
|
|
# META_PREFIX = "X-Object-Meta-"
|
|
|
|
# REMOVE_META_PREFIX = "X-Remove-Object-Meta-"
|
|
|
|
META_PREFIX = "X-Container-Meta-"
|
|
|
|
REMOVE_META_PREFIX = "X-Remove-Container-Meta-"
|
|
|
|
|
2013-02-13 10:56:39 -05:00
|
|
|
# Cloud Files will ignore headers without a value
|
|
|
|
DUMMY_VALUE = 1
|
|
|
|
|
2013-02-13 10:11:10 -05:00
|
|
|
KEY_REGEX = /^#{META_PREFIX}(.*)/
|
|
|
|
|
|
|
|
attr_reader :data
|
|
|
|
|
|
|
|
def initialize(hash={})
|
|
|
|
@data = hash || {}
|
2013-02-13 11:15:48 -05:00
|
|
|
@deleted_hash = {}
|
|
|
|
end
|
|
|
|
|
|
|
|
def delete(key)
|
|
|
|
data.delete(key)
|
|
|
|
@deleted_hash[key] = nil
|
2013-02-13 10:11:10 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def to_headers
|
2013-02-13 11:15:48 -05:00
|
|
|
headers = {}
|
|
|
|
h = data.merge(@deleted_hash)
|
|
|
|
h.each_pair do |k,v|
|
2013-02-13 10:11:10 -05:00
|
|
|
key = to_header_key(k,v)
|
2013-02-13 10:56:39 -05:00
|
|
|
headers[key] = v || DUMMY_VALUE
|
|
|
|
end
|
|
|
|
|
2013-02-13 10:11:10 -05:00
|
|
|
headers
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.from_headers(headers)
|
|
|
|
metadata = Metadata.new
|
|
|
|
headers.each_pair do |k, v|
|
|
|
|
key = Metadata.to_key(k)
|
|
|
|
next unless key
|
2013-02-14 10:56:57 -05:00
|
|
|
metadata.data[key] = Fog::JSON.decode(v)
|
2013-02-13 10:11:10 -05:00
|
|
|
end
|
|
|
|
metadata
|
|
|
|
end
|
|
|
|
|
|
|
|
def respond_to?(method_sym, include_private = false)
|
2013-02-14 11:34:14 -05:00
|
|
|
super(method_sym, include_private) || data.respond_to?(method_sym, include_private)
|
2013-02-13 10:11:10 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def method_missing(method, *args, &block)
|
2013-02-13 11:15:48 -05:00
|
|
|
data.send(method, *args, &block)
|
2013-02-13 10:11:10 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def self.to_key(key)
|
|
|
|
m = key.match KEY_REGEX
|
|
|
|
return nil unless m && m[1]
|
|
|
|
|
|
|
|
a = m[1].split('-')
|
|
|
|
a.collect!(&:downcase)
|
|
|
|
str = a.join('_')
|
|
|
|
str.to_sym
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_header_key(key, value)
|
|
|
|
prefix = value.nil? ? REMOVE_META_PREFIX : META_PREFIX
|
|
|
|
prefix + key.to_s.split(/[-_]/).collect(&:capitalize).join('-')
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|