diff --git a/lib/fog/aws/models/s3/files.rb b/lib/fog/aws/models/s3/files.rb index f6894cf8f..69553a374 100644 --- a/lib/fog/aws/models/s3/files.rb +++ b/lib/fog/aws/models/s3/files.rb @@ -30,6 +30,7 @@ module Fog options ) if parent + merge_attributes(parent.files.attributes) load(parent.files.map {|file| file.attributes}) else nil diff --git a/lib/fog/aws/requests/s3/get_bucket.rb b/lib/fog/aws/requests/s3/get_bucket.rb index 0c89909d3..4898c98e9 100644 --- a/lib/fog/aws/requests/s3/get_bucket.rb +++ b/lib/fog/aws/requests/s3/get_bucket.rb @@ -61,23 +61,28 @@ module Fog end response = Excon::Response.new if bucket = @data[:buckets][bucket_name] + contents = bucket[:objects].values.sort {|x,y| x['Key'] <=> y['Key']}.reject do |object| + (options['prefix'] && object['Key'][0...options['prefix'].length] != options['prefix']) || + (options['marker'] && object['Key'] <= options['marker']) + end.map do |object| + data = object.reject {|key, value| !['ETag', 'Key', 'LastModified', 'Size', 'StorageClass'].include?(key)} + data.merge!({ + 'LastModified' => Time.parse(data['LastModified']), + 'Owner' => bucket['Owner'], + 'Size' => data['Size'].to_i + }) + data + end + max_keys = options['max-keys'] || 1000 + size = [max_keys, 1000].min + truncated_contents = contents[0...size] + response.status = 200 response.body = { - 'Contents' => bucket[:objects].values.sort {|x,y| x['Key'] <=> y['Key']}.reject do |object| - (options['prefix'] && object['Key'][0...options['prefix'].length] != options['prefix']) || - (options['marker'] && object['Key'] <= options['marker']) - end.map do |object| - data = object.reject {|key, value| !['ETag', 'Key', 'LastModified', 'Size', 'StorageClass'].include?(key)} - data.merge!({ - 'LastModified' => Time.parse(data['LastModified']), - 'Owner' => bucket['Owner'], - 'Size' => data['Size'].to_i - }) - data - end, - 'IsTruncated' => false, + 'Contents' => truncated_contents, + 'IsTruncated' => truncated_contents.size != contents.size, 'Marker' => options['marker'], - 'MaxKeys' => options['max-keys'] || 1000, + 'MaxKeys' => max_keys, 'Name' => bucket['Name'], 'Prefix' => options['prefix'] } diff --git a/spec/aws/models/s3/files_spec.rb b/spec/aws/models/s3/files_spec.rb index 845788d55..76094b5a9 100644 --- a/spec/aws/models/s3/files_spec.rb +++ b/spec/aws/models/s3/files_spec.rb @@ -3,10 +3,13 @@ require File.dirname(__FILE__) + '/../../../spec_helper' describe 'Fog::AWS::S3::Files' do before(:each) do - @directory = AWS[:s3].directories.create(:key => 'fogdirectoryname') + @directory = AWS[:s3].directories.create(:key => "fog#{Time.now.to_f}") end after(:each) do + until @directory.files.reload.empty? + @directory.files.each {|file| file.destroy} + end @directory.destroy end @@ -34,6 +37,25 @@ describe 'Fog::AWS::S3::Files' do directory.files.all.should be_nil end + it "should return 1000 files and report truncated" do + 1010.times do |n| + @directory.files.create(:key => "file-#{n}") + end + response = @directory.files.all + response.should have(1000).items + response.is_truncated.should be_true + end + + it "should limit the max_keys to 1000" do + 1010.times do |n| + @directory.files.create(:key => "file-#{n}") + end + response = @directory.files.all(:max_keys => 2000) + response.should have(1000).items + response.max_keys.should == 2000 + response.is_truncated.should be_true + end + end describe "#create" do