diff --git a/lib/fog/aws/requests/s3/put_object.rb b/lib/fog/aws/requests/s3/put_object.rb index bd26c27e6..a595ab355 100644 --- a/lib/fog/aws/requests/s3/put_object.rb +++ b/lib/fog/aws/requests/s3/put_object.rb @@ -24,11 +24,11 @@ unless Fog.mocking? # * response<~Fog::AWS::Response>: # * headers<~Hash>: # * 'ETag'<~String> - etag of new object - def put_object(bucket_name, object_name, object, options = {}) - file = parse_file(object) - headers = file[:headers].merge!(options) + def put_object(bucket_name, object_name, data, options = {}) + data = parse_data(data) + headers = data[:headers].merge!(options) request({ - :body => file[:body], + :body => data[:body], :expects => 200, :headers => headers, :host => "#{bucket_name}.#{@host}", @@ -47,21 +47,21 @@ else module AWS class S3 - def put_object(bucket_name, object_name, object, options = {}) - file = parse_file(object) + def put_object(bucket_name, object_name, data, options = {}) + data = parse_data(data) response = Fog::Response.new if (bucket = Fog::AWS::S3.data[:buckets][bucket_name]) response.status = 200 bucket[:objects][object_name] = { - :body => file[:body], - 'Content-Type' => file[:headers]['Content-Type'], + :body => data[:body], 'ETag' => Fog::AWS::Mock.etag, 'Key' => object_name, 'LastModified' => Time.now.utc.strftime("%a, %d %b %Y %H:%M:%S +0000"), 'Owner' => { 'DisplayName' => 'owner', 'ID' => 'some_id'}, - 'Size' => file[:headers]['Content-Length'], + 'Size' => data[:headers]['Content-Length'], 'StorageClass' => 'STANDARD' } + bucket[:objects][object_name]['Content-Type'] = data[:headers]['Content-Type'] else response.status = 404 raise(Fog::Errors.status_error(200, 404, response)) diff --git a/lib/fog/aws/s3.rb b/lib/fog/aws/s3.rb index 5781c796d..d2e004fa4 100644 --- a/lib/fog/aws/s3.rb +++ b/lib/fog/aws/s3.rb @@ -81,18 +81,24 @@ module Fog private - def parse_file(file) + def parse_data(data) metadata = { :body => nil, :headers => {} } - filename = File.basename(file.path) - unless (mime_types = MIME::Types.of(filename)).empty? - metadata[:headers]['Content-Type'] = mime_types.first.content_type + if data.respond_to?(:path) + filename = File.basename(data.path) + unless (mime_types = MIME::Types.of(filename)).empty? + metadata[:headers]['Content-Type'] = mime_types.first.content_type + end end - metadata[:body] = file.read + if data.respond_to?(:read) + metadata[:body] = data.read + else + metadata[:body] = data + end metadata[:headers]['Content-Length'] = metadata[:body].size.to_s metadata[:headers]['Content-MD5'] = Base64.encode64(Digest::MD5.digest(metadata[:body])).strip metadata