1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

[aws|storage] Handle S3 object deletions in the face of versioning.

This commit is contained in:
Kevin Menard 2011-12-15 14:26:08 -05:00
parent f9de06b603
commit f2b61321bb
5 changed files with 38 additions and 9 deletions

View file

@ -36,7 +36,20 @@ module Fog
response = Excon::Response.new
if bucket = self.data[:buckets][bucket_name]
response.status = 204
bucket[:objects].delete(object_name)
if bucket[:versioning]
delete_marker = {
:delete_marker => true,
'Key' => object_name,
'VersionId' => Fog::Mock.random_base64(32),
'Last-Modified' => Fog::Time.now.to_date_header
}
bucket[:objects][object_name] ||= []
bucket[:objects][object_name] << delete_marker
else
bucket[:objects].delete(object_name)
end
else
response.status = 404
raise(Excon::Errors.status_error({:expects => 204}, response))

View file

@ -73,7 +73,8 @@ module Fog
(prefix && object['Key'][0...prefix.length] != prefix) ||
(marker && object['Key'] <= marker) ||
(delimiter && object['Key'][(prefix ? prefix.length : 0)..-1].include?(delimiter) \
&& common_prefixes << object['Key'].sub(/^(#{prefix}[^#{delimiter}]+.).*/, '\1'))
&& common_prefixes << object['Key'].sub(/^(#{prefix}[^#{delimiter}]+.).*/, '\1')) ||
object.has_key?(:delete_marker)
end.map do |object|
data = object.reject {|key, value| !['ETag', 'Key', 'StorageClass'].include?(key)}
data.merge!({

View file

@ -87,14 +87,23 @@ module Fog
(delimiter && object['Key'][(prefix ? prefix.length : 0)..-1].include?(delimiter) \
&& common_prefixes << object['Key'].sub(/^(#{prefix}[^#{delimiter}]+.).*/, '\1'))
end.map do |object|
data = { 'Version' => {} }
data['Version'] = object.reject {|key, value| !['ETag', 'Key', 'StorageClass', 'VersionId'].include?(key)}
data['Version'].merge!({
if object.has_key?(:delete_marker)
tag_name = 'DeleteMarker'
extracted_attrs = ['Key', 'VersionId']
else
tag_name = 'Version'
extracted_attrs = ['ETag', 'Key', 'StorageClass', 'VersionId']
end
data = {}
data[tag_name] = object.reject { |key, value| !extracted_attrs.include?(key) }
data[tag_name].merge!({
'LastModified' => Time.parse(object['Last-Modified']),
'Owner' => bucket['Owner'],
'Size' => object['Content-Length'].to_i,
'IsLatest' => object == bucket[:objects][object['Key']].last
})
data[tag_name]['Size'] = object['Content-Length'].to_i if tag_name == 'Version'
data
end

View file

@ -70,7 +70,8 @@ module Fog
end
response = Excon::Response.new
if (bucket = self.data[:buckets][bucket_name])
if (object = bucket[:objects][object_name].last)
object = bucket[:objects][object_name].last if bucket[:objects].has_key?(object_name)
if (object && !object[:delete_marker])
if options['If-Match'] && options['If-Match'] != object['ETag']
response.status = 412
elsif options['If-Modified-Since'] && options['If-Modified-Since'] > Time.parse(object['Last-Modified'])

View file

@ -81,8 +81,13 @@ module Fog
end
end
bucket[:objects][object_name] ||= []
bucket[:objects][object_name] << object
if bucket[:versioning]
bucket[:objects][object_name] ||= []
bucket[:objects][object_name] << object
else
bucket[:objects][object_name] = [object]
end
response.headers = {
'Content-Length' => object['Content-Length'],
'Content-Type' => object['Content-Type'],