lib/fakes3/file_store.rb in fakes3-0.1.5.2 vs lib/fakes3/file_store.rb in fakes3-0.1.6.0

- old
+ new

@@ -80,12 +80,13 @@ real_obj.md5 = metadata[:md5] real_obj.content_type = metadata.fetch(:content_type) { "application/octet-stream" } #real_obj.io = File.open(File.join(obj_root,"content"),'rb') real_obj.io = RateLimitableFile.open(File.join(obj_root,"content"),'rb') real_obj.size = metadata.fetch(:size) { 0 } - real_obj.creation_date = File.ctime(obj_root).iso8601() - real_obj.modified_date = metadata.fetch(:modified_date) { File.mtime(File.join(obj_root,"content")).iso8601() } + real_obj.creation_date = File.ctime(obj_root).utc.iso8601() + real_obj.modified_date = metadata.fetch(:modified_date) { File.mtime(File.join(obj_root,"content")).utc.iso8601() } + real_obj.custom_metadata = metadata.fetch(:custom_metadata) { {} } return real_obj rescue puts $! $!.backtrace.each { |line| puts line } return nil @@ -93,11 +94,11 @@ end def object_metadata(bucket,object) end - def copy_object(src_bucket_name,src_name,dst_bucket_name,dst_name) + def copy_object(src_bucket_name,src_name,dst_bucket_name,dst_name,request) src_root = File.join(@root,src_bucket_name,src_name,SHUCK_METADATA_DIR) src_metadata_filename = File.join(src_root,"metadata") src_metadata = YAML.load(File.open(src_metadata_filename,'rb').read) src_content_filename = File.join(src_root,"content") @@ -108,19 +109,29 @@ FileUtils.mkdir_p(metadata_dir) content = File.join(metadata_dir,"content") metadata = File.join(metadata_dir,"metadata") - File.open(content,'wb') do |f| - File.open(src_content_filename,'rb') do |input| - f << input.read + if src_bucket_name != dst_bucket_name || src_name != dst_name + File.open(content,'wb') do |f| + File.open(src_content_filename,'rb') do |input| + f << input.read + end end + + File.open(metadata,'w') do |f| + File.open(src_metadata_filename,'r') do |input| + f << input.read + end + end end - File.open(metadata,'w') do |f| - File.open(src_metadata_filename,'r') do |input| - f << input.read + metadata_directive = request.header["x-amz-metadata-directive"].first + if metadata_directive == "REPLACE" + metadata_struct = create_metadata(content,request) + File.open(metadata,'w') do |f| + f << YAML::dump(metadata_struct) end end src_bucket = self.get_bucket(src_bucket_name) dst_bucket = self.get_bucket(dst_bucket_name) @@ -147,26 +158,30 @@ FileUtils.mkdir_p(metadata_dir) content = File.join(filename,SHUCK_METADATA_DIR,"content") metadata = File.join(filename,SHUCK_METADATA_DIR,"metadata") - md5 = Digest::MD5.new # TODO put a tmpfile here first and mv it over at the end - File.open(content,'wb') do |f| - request.body do |chunk| - f << chunk - md5 << chunk + match=request.content_type.match(/^multipart\/form-data; boundary=(.+)/) + boundary = match[1] if match + if boundary + boundary = WEBrick::HTTPUtils::dequote(boundary) + filedata = WEBrick::HTTPUtils::parse_form_data(request.body, boundary) + raise HTTPStatus::BadRequest if filedata['file'].empty? + File.open(content, 'wb') do |f| + f << filedata['file'] end + else + File.open(content,'wb') do |f| + request.body do |chunk| + f << chunk + end + end end + metadata_struct = create_metadata(content,request) - metadata_struct = {} - metadata_struct[:md5] = md5.hexdigest - metadata_struct[:content_type] = request.header["content-type"].first - metadata_struct[:size] = File.size(content) - metadata_struct[:modified_date] = File.mtime(content).iso8601() - File.open(metadata,'w') do |f| f << YAML::dump(metadata_struct) end obj = S3Object.new @@ -194,8 +209,25 @@ rescue puts $! $!.backtrace.each { |line| puts line } return nil end + end + + def create_metadata(content,request) + metadata = {} + metadata[:md5] = Digest::MD5.file(content).hexdigest + metadata[:content_type] = request.header["content-type"].first + metadata[:size] = File.size(content) + metadata[:modified_date] = File.mtime(content).utc.iso8601() + + # Add custom metadata from the request header + request.header.each do |key, value| + match = /^x-amz-meta-(.*)$/.match(key) + if match + metadata_struct[:custom_metadata][match[1]] = value.join(', ') + end + end + return metadata end end end