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