2010-03-13 16:37:24 -05:00
module Fog
module AWS
2010-09-08 17:40:02 -04:00
class Storage
2010-03-13 16:37:24 -05:00
class Real
2009-08-08 17:46:13 -04:00
2010-09-08 17:40:02 -04:00
require 'fog/aws/parsers/storage/copy_object'
2010-06-12 18:31:17 -04:00
2009-08-08 17:46:13 -04:00
# Copy an object from one S3 bucket to another
#
# ==== Parameters
# * source_bucket_name<~String> - Name of source bucket
# * source_object_name<~String> - Name of source object
# * target_bucket_name<~String> - Name of bucket to create copy in
# * target_object_name<~String> - Name for new copy of object
# * options<~Hash>:
# * 'x-amz-metadata-directive'<~String> - Specifies whether to copy metadata from source or replace with data in request. Must be in ['COPY', 'REPLACE']
# * 'x-amz-copy_source-if-match'<~String> - Copies object if its etag matches this value
# * 'x-amz-copy_source-if-modified_since'<~Time> - Copies object it it has been modified since this time
# * 'x-amz-copy_source-if-none-match'<~String> - Copies object if its etag does not match this value
# * 'x-amz-copy_source-if-unmodified-since'<~Time> - Copies object it it has not been modified since this time
#
# ==== Returns
2009-11-02 21:48:49 -05:00
# * response<~Excon::Response>:
2009-08-08 17:46:13 -04:00
# * body<~Hash>:
# * 'ETag'<~String> - etag of new object
# * 'LastModified'<~Time> - date object was last modified
#
2010-10-29 21:05:59 -04:00
# ==== See Also
# http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectCOPY.html
2009-08-08 17:46:13 -04:00
def copy_object ( source_bucket_name , source_object_name , target_bucket_name , target_object_name , options = { } )
headers = { 'x-amz-copy-source' = > " / #{ source_bucket_name } / #{ source_object_name } " } . merge! ( options )
request ( {
2009-08-16 14:44:50 -04:00
:expects = > 200 ,
:headers = > headers ,
:host = > " #{ target_bucket_name } . #{ @host } " ,
:method = > 'PUT' ,
2010-09-08 17:40:02 -04:00
:parser = > Fog :: Parsers :: AWS :: Storage :: CopyObject . new ,
2009-10-04 18:29:31 -04:00
:path = > CGI . escape ( target_object_name )
2009-08-08 17:46:13 -04:00
} )
end
2009-07-13 22:14:59 -04:00
end
2009-08-08 17:46:13 -04:00
2010-10-29 21:16:36 -04:00
class Mock # :nodoc:all
2009-07-13 22:14:59 -04:00
2009-08-08 17:46:13 -04:00
def copy_object ( source_bucket_name , source_object_name , target_bucket_name , target_object_name , options = { } )
2009-11-20 14:08:08 -05:00
response = Excon :: Response . new
2010-03-13 16:37:24 -05:00
source_bucket = @data [ :buckets ] [ source_bucket_name ]
2009-08-16 14:45:52 -04:00
source_object = source_bucket && source_bucket [ :objects ] [ source_object_name ]
2010-03-13 16:37:24 -05:00
target_bucket = @data [ :buckets ] [ target_bucket_name ]
2009-08-08 17:46:13 -04:00
2009-08-16 14:45:52 -04:00
if source_object && target_bucket
2009-08-08 17:46:13 -04:00
response . status = 200
target_object = source_object . dup
2009-08-16 14:45:52 -04:00
target_object . merge! ( {
'Name' = > target_object_name
} )
target_bucket [ :objects ] [ target_object_name ] = target_object
2009-08-08 17:46:13 -04:00
response . body = {
'ETag' = > target_object [ 'ETag' ] ,
'LastModified' = > Time . parse ( target_object [ 'LastModified' ] )
}
2009-08-16 14:45:52 -04:00
else
response . status = 404
2009-11-20 14:08:08 -05:00
raise ( Excon :: Errors . status_error ( { :expects = > 200 } , response ) )
2009-08-08 17:46:13 -04:00
end
response
end
end
2009-07-13 22:14:59 -04:00
end
end
2010-03-13 16:37:24 -05:00
end