aboisvert_aws 3.0.0 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/awsbase/right_awsbase.rb +116 -116
- data/lib/awsbase/version.rb +1 -1
- data/lib/s3/right_s3_interface.rb +167 -167
- data/lib/s3/right_s3_interface.rb.orig +1231 -0
- data/lib/s3/right_s3_interface.rb.rej +37 -0
- metadata +6 -4
data/lib/awsbase/version.rb
CHANGED
@@ -24,11 +24,11 @@
|
|
24
24
|
module RightAws
|
25
25
|
|
26
26
|
class S3Interface < RightAwsBase
|
27
|
-
|
27
|
+
|
28
28
|
USE_100_CONTINUE_PUT_SIZE = 1_000_000
|
29
|
-
|
29
|
+
|
30
30
|
include RightAwsBaseInterface
|
31
|
-
|
31
|
+
|
32
32
|
DEFAULT_HOST = 's3.amazonaws.com'
|
33
33
|
DEFAULT_PORT = 443
|
34
34
|
DEFAULT_PROTOCOL = 'https'
|
@@ -77,7 +77,7 @@ module RightAws
|
|
77
77
|
# Creates new RightS3 instance.
|
78
78
|
#
|
79
79
|
# s3 = RightAws::S3Interface.new('1E3GDYEOGFJPIT7XXXXXX','hgTHt68JY07JKUY08ftHYtERkjgtfERn57XXXXXX', {:logger => Logger.new('/tmp/x.log')}) #=> #<RightAws::S3Interface:0xb7b3c27c>
|
80
|
-
#
|
80
|
+
#
|
81
81
|
# Params is a hash:
|
82
82
|
#
|
83
83
|
# {:server => 's3.amazonaws.com' # Amazon service host: 's3.amazonaws.com'(default)
|
@@ -87,13 +87,13 @@ module RightAws
|
|
87
87
|
# :no_subdomains => true} # Force placing bucket name into path instead of domain name
|
88
88
|
#
|
89
89
|
def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
|
90
|
-
init({ :name => 'S3',
|
91
|
-
:default_host => ENV['S3_URL'] ? URI.parse(ENV['S3_URL']).host : DEFAULT_HOST,
|
90
|
+
init({ :name => 'S3',
|
91
|
+
:default_host => ENV['S3_URL'] ? URI.parse(ENV['S3_URL']).host : DEFAULT_HOST,
|
92
92
|
:default_port => ENV['S3_URL'] ? URI.parse(ENV['S3_URL']).port : DEFAULT_PORT,
|
93
93
|
:default_service => ENV['S3_URL'] ? URI.parse(ENV['S3_URL']).path : DEFAULT_SERVICE,
|
94
|
-
:default_protocol => ENV['S3_URL'] ? URI.parse(ENV['S3_URL']).scheme : DEFAULT_PROTOCOL },
|
95
|
-
aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'],
|
96
|
-
aws_secret_access_key || ENV['AWS_SECRET_ACCESS_KEY'],
|
94
|
+
:default_protocol => ENV['S3_URL'] ? URI.parse(ENV['S3_URL']).scheme : DEFAULT_PROTOCOL },
|
95
|
+
aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'],
|
96
|
+
aws_secret_access_key || ENV['AWS_SECRET_ACCESS_KEY'],
|
97
97
|
params)
|
98
98
|
end
|
99
99
|
|
@@ -193,12 +193,12 @@ module RightAws
|
|
193
193
|
# set other headers
|
194
194
|
request['Authorization'] = "AWS #{@aws_access_key_id}:#{signature}"
|
195
195
|
# prepare output hash
|
196
|
-
{ :request => request,
|
196
|
+
{ :request => request,
|
197
197
|
:server => server,
|
198
198
|
:port => @params[:port],
|
199
199
|
:protocol => @params[:protocol] }
|
200
200
|
end
|
201
|
-
|
201
|
+
|
202
202
|
# Sends request to Amazon and parses the response.
|
203
203
|
# Raises AwsError if any banana happened.
|
204
204
|
def request_info(request, parser, &block) # :nodoc:
|
@@ -207,7 +207,7 @@ module RightAws
|
|
207
207
|
|
208
208
|
# Returns an array of customer's buckets. Each item is a +hash+.
|
209
209
|
#
|
210
|
-
# s3.list_all_my_buckets #=>
|
210
|
+
# s3.list_all_my_buckets #=>
|
211
211
|
# [{:owner_id => "00000000009314cc309ffe736daa2b264357476c7fea6efb2c3347ac3ab2792a",
|
212
212
|
# :owner_display_name => "root",
|
213
213
|
# :name => "bucket_name",
|
@@ -219,7 +219,7 @@ module RightAws
|
|
219
219
|
rescue
|
220
220
|
on_exception
|
221
221
|
end
|
222
|
-
|
222
|
+
|
223
223
|
# Creates new bucket. Returns +true+ or an exception.
|
224
224
|
#
|
225
225
|
# # create a bucket at American server
|
@@ -234,7 +234,7 @@ module RightAws
|
|
234
234
|
when 'eu' then 'EU'
|
235
235
|
else headers[:location].to_s
|
236
236
|
end
|
237
|
-
|
237
|
+
|
238
238
|
unless location.right_blank?
|
239
239
|
data = "<CreateBucketConfiguration><LocationConstraint>#{location}</LocationConstraint></CreateBucketConfiguration>"
|
240
240
|
end
|
@@ -244,9 +244,9 @@ module RightAws
|
|
244
244
|
# if the bucket exists AWS returns an error for the location constraint interface. Drop it
|
245
245
|
e.is_a?(RightAws::AwsError) && e.message.include?('BucketAlreadyOwnedByYou') ? true : on_exception
|
246
246
|
end
|
247
|
-
|
247
|
+
|
248
248
|
# Retrieve bucket location
|
249
|
-
#
|
249
|
+
#
|
250
250
|
# s3.create_bucket('my-awesome-bucket-us') #=> true
|
251
251
|
# puts s3.bucket_location('my-awesome-bucket-us') #=> '' (Amazon's default value assumed)
|
252
252
|
#
|
@@ -259,14 +259,14 @@ module RightAws
|
|
259
259
|
rescue
|
260
260
|
on_exception
|
261
261
|
end
|
262
|
-
|
263
|
-
# Retrieves the logging configuration for a bucket.
|
262
|
+
|
263
|
+
# Retrieves the logging configuration for a bucket.
|
264
264
|
# Returns a hash of {:enabled, :targetbucket, :targetprefix}
|
265
|
-
#
|
265
|
+
#
|
266
266
|
# s3.interface.get_logging_parse(:bucket => "asset_bucket")
|
267
267
|
# => {:enabled=>true, :targetbucket=>"mylogbucket", :targetprefix=>"loggylogs/"}
|
268
268
|
#
|
269
|
-
#
|
269
|
+
#
|
270
270
|
def get_logging_parse(params)
|
271
271
|
AwsUtils.mandatory_arguments([:bucket], params)
|
272
272
|
AwsUtils.allow_only([:bucket, :headers], params)
|
@@ -276,12 +276,12 @@ module RightAws
|
|
276
276
|
rescue
|
277
277
|
on_exception
|
278
278
|
end
|
279
|
-
|
279
|
+
|
280
280
|
# Sets logging configuration for a bucket from the XML configuration document.
|
281
281
|
# params:
|
282
282
|
# :bucket
|
283
283
|
# :xmldoc
|
284
|
-
def put_logging(params)
|
284
|
+
def put_logging(params)
|
285
285
|
AwsUtils.mandatory_arguments([:bucket,:xmldoc], params)
|
286
286
|
AwsUtils.allow_only([:bucket,:xmldoc, :headers], params)
|
287
287
|
params[:headers] = {} unless params[:headers]
|
@@ -294,7 +294,7 @@ module RightAws
|
|
294
294
|
# Deletes new bucket. Bucket must be empty! Returns +true+ or an exception.
|
295
295
|
#
|
296
296
|
# s3.delete_bucket('my_awesome_bucket') #=> true
|
297
|
-
#
|
297
|
+
#
|
298
298
|
# See also: force_delete_bucket method
|
299
299
|
#
|
300
300
|
def delete_bucket(bucket, headers={})
|
@@ -303,7 +303,7 @@ module RightAws
|
|
303
303
|
rescue
|
304
304
|
on_exception
|
305
305
|
end
|
306
|
-
|
306
|
+
|
307
307
|
# Returns an array of bucket's keys. Each array item (key data) is a +hash+.
|
308
308
|
#
|
309
309
|
# s3.list_bucket('my_awesome_bucket', { 'prefix'=>'t', 'marker'=>'', 'max-keys'=>5, delimiter=>'' }) #=>
|
@@ -329,7 +329,7 @@ module RightAws
|
|
329
329
|
end
|
330
330
|
|
331
331
|
# Incrementally list the contents of a bucket. Yields the following hash to a block:
|
332
|
-
# s3.incrementally_list_bucket('my_awesome_bucket', { 'prefix'=>'t', 'marker'=>'', 'max-keys'=>5, delimiter=>'' }) yields
|
332
|
+
# s3.incrementally_list_bucket('my_awesome_bucket', { 'prefix'=>'t', 'marker'=>'', 'max-keys'=>5, delimiter=>'' }) yields
|
333
333
|
# {
|
334
334
|
# :name => 'bucketname',
|
335
335
|
# :prefix => 'subfolder/',
|
@@ -357,7 +357,7 @@ module RightAws
|
|
357
357
|
# }
|
358
358
|
def incrementally_list_bucket(bucket, options={}, headers={}, &block)
|
359
359
|
internal_options = options.right_symbolize_keys
|
360
|
-
begin
|
360
|
+
begin
|
361
361
|
internal_bucket = bucket.dup
|
362
362
|
internal_bucket += '?'+internal_options.map{|k, v| "#{k.to_s}=#{CGI::escape v.to_s}"}.join('&') unless internal_options.right_blank?
|
363
363
|
req_hash = generate_rest_request('GET', headers.merge(:url=>internal_bucket))
|
@@ -366,7 +366,7 @@ module RightAws
|
|
366
366
|
if(there_are_more_keys)
|
367
367
|
internal_options[:marker] = decide_marker(response)
|
368
368
|
total_results = response[:contents].length + response[:common_prefixes].length
|
369
|
-
internal_options[:'max-keys'] ? (internal_options[:'max-keys'] -= total_results) : nil
|
369
|
+
internal_options[:'max-keys'] ? (internal_options[:'max-keys'] -= total_results) : nil
|
370
370
|
end
|
371
371
|
yield response
|
372
372
|
end while there_are_more_keys && under_max_keys(internal_options)
|
@@ -374,8 +374,8 @@ module RightAws
|
|
374
374
|
rescue
|
375
375
|
on_exception
|
376
376
|
end
|
377
|
-
|
378
|
-
|
377
|
+
|
378
|
+
|
379
379
|
private
|
380
380
|
def decide_marker(response)
|
381
381
|
return response[:next_marker].dup if response[:next_marker]
|
@@ -390,11 +390,11 @@ module RightAws
|
|
390
390
|
last_key > last_prefix ? last_key.dup : last_prefix.dup
|
391
391
|
end
|
392
392
|
end
|
393
|
-
|
393
|
+
|
394
394
|
def under_max_keys(internal_options)
|
395
395
|
internal_options[:'max-keys'] ? internal_options[:'max-keys'] > 0 : true
|
396
396
|
end
|
397
|
-
|
397
|
+
|
398
398
|
public
|
399
399
|
# Saves object to Amazon. Returns +true+ or an exception.
|
400
400
|
# Any header starting with AMAZON_METADATA_PREFIX is considered
|
@@ -420,16 +420,16 @@ module RightAws
|
|
420
420
|
# methods. Be sure that your class returns 'nil' from read() after having
|
421
421
|
# read 'size' bytes. Otherwise S3 will drop the socket after
|
422
422
|
# 'Content-Length' bytes have been uploaded, and HttpConnection will
|
423
|
-
# interpret this as an error.
|
424
|
-
#
|
423
|
+
# interpret this as an error.
|
424
|
+
#
|
425
425
|
# This method now supports very large PUTs, where very large
|
426
|
-
# is > 2 GB.
|
427
|
-
#
|
426
|
+
# is > 2 GB.
|
427
|
+
#
|
428
428
|
# For Win32 users: Files and IO objects should be opened in binary mode. If
|
429
429
|
# a text mode IO object is passed to PUT, it will be converted to binary
|
430
430
|
# mode.
|
431
431
|
#
|
432
|
-
|
432
|
+
|
433
433
|
def put(bucket, key, data=nil, headers={})
|
434
434
|
# On Windows, if someone opens a file in text mode, we must reset it so
|
435
435
|
# to binary mode for streaming to work properly
|
@@ -445,9 +445,9 @@ module RightAws
|
|
445
445
|
rescue
|
446
446
|
on_exception
|
447
447
|
end
|
448
|
-
|
449
|
-
|
450
|
-
|
448
|
+
|
449
|
+
|
450
|
+
|
451
451
|
# New experimental API for uploading objects, introduced in RightAws 1.8.1.
|
452
452
|
# store_object is similar in function to the older function put, but returns the full response metadata. It also allows for optional verification
|
453
453
|
# of object md5 checksums on upload. Parameters are passed as hash entries and are checked for completeness as well as for spurious arguments.
|
@@ -459,34 +459,34 @@ module RightAws
|
|
459
459
|
# The optional argument of :headers allows the caller to specify arbitrary request header values.
|
460
460
|
#
|
461
461
|
# s3.store_object(:bucket => "foobucket", :key => "foo", :md5 => "a507841b1bc8115094b00bbe8c1b2954", :data => "polemonium" )
|
462
|
-
# => {"x-amz-id-2"=>"SVsnS2nfDaR+ixyJUlRKM8GndRyEMS16+oZRieamuL61pPxPaTuWrWtlYaEhYrI/",
|
463
|
-
# "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
464
|
-
# "date"=>"Mon, 29 Sep 2008 18:57:46 GMT",
|
465
|
-
# :verified_md5=>true,
|
466
|
-
# "x-amz-request-id"=>"63916465939995BA",
|
467
|
-
# "server"=>"AmazonS3",
|
462
|
+
# => {"x-amz-id-2"=>"SVsnS2nfDaR+ixyJUlRKM8GndRyEMS16+oZRieamuL61pPxPaTuWrWtlYaEhYrI/",
|
463
|
+
# "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
464
|
+
# "date"=>"Mon, 29 Sep 2008 18:57:46 GMT",
|
465
|
+
# :verified_md5=>true,
|
466
|
+
# "x-amz-request-id"=>"63916465939995BA",
|
467
|
+
# "server"=>"AmazonS3",
|
468
468
|
# "content-length"=>"0"}
|
469
469
|
#
|
470
470
|
# s3.store_object(:bucket => "foobucket", :key => "foo", :data => "polemonium" )
|
471
|
-
# => {"x-amz-id-2"=>"MAt9PLjgLX9UYJ5tV2fI/5dBZdpFjlzRVpWgBDpvZpl+V+gJFcBMW2L+LBstYpbR",
|
472
|
-
# "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
473
|
-
# "date"=>"Mon, 29 Sep 2008 18:58:56 GMT",
|
474
|
-
# :verified_md5=>false,
|
475
|
-
# "x-amz-request-id"=>"3B25A996BC2CDD3B",
|
476
|
-
# "server"=>"AmazonS3",
|
471
|
+
# => {"x-amz-id-2"=>"MAt9PLjgLX9UYJ5tV2fI/5dBZdpFjlzRVpWgBDpvZpl+V+gJFcBMW2L+LBstYpbR",
|
472
|
+
# "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
473
|
+
# "date"=>"Mon, 29 Sep 2008 18:58:56 GMT",
|
474
|
+
# :verified_md5=>false,
|
475
|
+
# "x-amz-request-id"=>"3B25A996BC2CDD3B",
|
476
|
+
# "server"=>"AmazonS3",
|
477
477
|
# "content-length"=>"0"}
|
478
|
-
|
478
|
+
|
479
479
|
def store_object(params)
|
480
480
|
AwsUtils.allow_only([:bucket, :key, :data, :headers, :md5], params)
|
481
481
|
AwsUtils.mandatory_arguments([:bucket, :key, :data], params)
|
482
482
|
params[:headers] = {} unless params[:headers]
|
483
|
-
|
483
|
+
|
484
484
|
params[:data].binmode if(params[:data].respond_to?(:binmode)) # On Windows, if someone opens a file in text mode, we must reset it to binary mode for streaming to work properly
|
485
485
|
if (params[:data].respond_to?(:lstat) && params[:data].lstat.size >= USE_100_CONTINUE_PUT_SIZE) ||
|
486
486
|
(params[:data].respond_to?(:size) && params[:data].size >= USE_100_CONTINUE_PUT_SIZE)
|
487
487
|
params[:headers]['expect'] = '100-continue'
|
488
488
|
end
|
489
|
-
|
489
|
+
|
490
490
|
req_hash = generate_rest_request('PUT', params[:headers].merge(:url=>"#{params[:bucket]}/#{CGI::escape params[:key]}", :data=>params[:data]))
|
491
491
|
resp = request_info(req_hash, S3HttpResponseHeadParser.new)
|
492
492
|
if(params[:md5])
|
@@ -498,47 +498,47 @@ module RightAws
|
|
498
498
|
rescue
|
499
499
|
on_exception
|
500
500
|
end
|
501
|
-
|
501
|
+
|
502
502
|
# Identical in function to store_object, but requires verification that the returned ETag is identical to the checksum passed in by the user as the 'md5' argument.
|
503
503
|
# If the check passes, returns the response metadata with the "verified_md5" field set true. Raises an exception if the checksums conflict.
|
504
504
|
# This call is implemented as a wrapper around store_object and the user may gain different semantics by creating a custom wrapper.
|
505
|
-
#
|
505
|
+
#
|
506
506
|
# s3.store_object_and_verify(:bucket => "foobucket", :key => "foo", :md5 => "a507841b1bc8115094b00bbe8c1b2954", :data => "polemonium" )
|
507
|
-
# => {"x-amz-id-2"=>"IZN3XsH4FlBU0+XYkFTfHwaiF1tNzrm6dIW2EM/cthKvl71nldfVC0oVQyydzWpb",
|
508
|
-
# "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
509
|
-
# "date"=>"Mon, 29 Sep 2008 18:38:32 GMT",
|
510
|
-
# :verified_md5=>true,
|
511
|
-
# "x-amz-request-id"=>"E8D7EA4FE00F5DF7",
|
512
|
-
# "server"=>"AmazonS3",
|
507
|
+
# => {"x-amz-id-2"=>"IZN3XsH4FlBU0+XYkFTfHwaiF1tNzrm6dIW2EM/cthKvl71nldfVC0oVQyydzWpb",
|
508
|
+
# "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
509
|
+
# "date"=>"Mon, 29 Sep 2008 18:38:32 GMT",
|
510
|
+
# :verified_md5=>true,
|
511
|
+
# "x-amz-request-id"=>"E8D7EA4FE00F5DF7",
|
512
|
+
# "server"=>"AmazonS3",
|
513
513
|
# "content-length"=>"0"}
|
514
514
|
#
|
515
515
|
# s3.store_object_and_verify(:bucket => "foobucket", :key => "foo", :md5 => "a507841b1bc8115094b00bbe8c1b2953", :data => "polemonium" )
|
516
|
-
# RightAws::AwsError: Uploaded object failed MD5 checksum verification: {"x-amz-id-2"=>"HTxVtd2bf7UHHDn+WzEH43MkEjFZ26xuYvUzbstkV6nrWvECRWQWFSx91z/bl03n",
|
517
|
-
# "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
518
|
-
# "date"=>"Mon, 29 Sep 2008 18:38:41 GMT",
|
519
|
-
# :verified_md5=>false,
|
520
|
-
# "x-amz-request-id"=>"0D7ADE09F42606F2",
|
521
|
-
# "server"=>"AmazonS3",
|
516
|
+
# RightAws::AwsError: Uploaded object failed MD5 checksum verification: {"x-amz-id-2"=>"HTxVtd2bf7UHHDn+WzEH43MkEjFZ26xuYvUzbstkV6nrWvECRWQWFSx91z/bl03n",
|
517
|
+
# "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
518
|
+
# "date"=>"Mon, 29 Sep 2008 18:38:41 GMT",
|
519
|
+
# :verified_md5=>false,
|
520
|
+
# "x-amz-request-id"=>"0D7ADE09F42606F2",
|
521
|
+
# "server"=>"AmazonS3",
|
522
522
|
# "content-length"=>"0"}
|
523
523
|
def store_object_and_verify(params)
|
524
524
|
AwsUtils.mandatory_arguments([:md5], params)
|
525
525
|
r = store_object(params)
|
526
526
|
r[:verified_md5] ? (return r) : (raise AwsError.new("Uploaded object failed MD5 checksum verification: #{r.inspect}"))
|
527
527
|
end
|
528
|
-
|
528
|
+
|
529
529
|
# Retrieves object data from Amazon. Returns a +hash+ or an exception.
|
530
530
|
#
|
531
531
|
# s3.get('my_awesome_bucket', 'log/curent/1.log') #=>
|
532
532
|
#
|
533
|
-
# {:object => "Ola-la!",
|
534
|
-
# :headers => {"last-modified" => "Wed, 23 May 2007 09:08:04 GMT",
|
535
|
-
# "content-type" => "",
|
536
|
-
# "etag" => "\"000000000096f4ee74bc4596443ef2a4\"",
|
537
|
-
# "date" => "Wed, 23 May 2007 09:08:03 GMT",
|
538
|
-
# "x-amz-id-2" => "ZZZZZZZZZZZZZZZZZZZZ1HJXZoehfrS4QxcxTdNGldR7w/FVqblP50fU8cuIMLiu",
|
533
|
+
# {:object => "Ola-la!",
|
534
|
+
# :headers => {"last-modified" => "Wed, 23 May 2007 09:08:04 GMT",
|
535
|
+
# "content-type" => "",
|
536
|
+
# "etag" => "\"000000000096f4ee74bc4596443ef2a4\"",
|
537
|
+
# "date" => "Wed, 23 May 2007 09:08:03 GMT",
|
538
|
+
# "x-amz-id-2" => "ZZZZZZZZZZZZZZZZZZZZ1HJXZoehfrS4QxcxTdNGldR7w/FVqblP50fU8cuIMLiu",
|
539
539
|
# "x-amz-meta-family" => "Woho556!",
|
540
|
-
# "x-amz-request-id" => "0000000C246D770C",
|
541
|
-
# "server" => "AmazonS3",
|
540
|
+
# "x-amz-request-id" => "0000000C246D770C",
|
541
|
+
# "server" => "AmazonS3",
|
542
542
|
# "content-length" => "7"}}
|
543
543
|
#
|
544
544
|
# If a block is provided, yields incrementally to the block as
|
@@ -551,7 +551,7 @@ module RightAws
|
|
551
551
|
# foo.write(chunk)
|
552
552
|
# end
|
553
553
|
# foo.close
|
554
|
-
#
|
554
|
+
#
|
555
555
|
|
556
556
|
def get(bucket, key, headers={}, &block)
|
557
557
|
req_hash = generate_rest_request('GET', headers.merge(:url=>"#{bucket}/#{CGI::escape key}"))
|
@@ -559,7 +559,7 @@ module RightAws
|
|
559
559
|
rescue
|
560
560
|
on_exception
|
561
561
|
end
|
562
|
-
|
562
|
+
|
563
563
|
# New experimental API for retrieving objects, introduced in RightAws 1.8.1.
|
564
564
|
# retrieve_object is similar in function to the older function get. It allows for optional verification
|
565
565
|
# of object md5 checksums on retrieval. Parameters are passed as hash entries and are checked for completeness as well as for spurious arguments.
|
@@ -575,27 +575,27 @@ module RightAws
|
|
575
575
|
# :headers - hash of additional HTTP headers to include with the request
|
576
576
|
# :md5 - MD5 checksum against which to verify the retrieved object
|
577
577
|
#
|
578
|
-
# s3.retrieve_object(:bucket => "foobucket", :key => "foo")
|
579
|
-
# => {:verified_md5=>false,
|
580
|
-
# :headers=>{"last-modified"=>"Mon, 29 Sep 2008 18:58:56 GMT",
|
581
|
-
# "x-amz-id-2"=>"2Aj3TDz6HP5109qly//18uHZ2a1TNHGLns9hyAtq2ved7wmzEXDOPGRHOYEa3Qnp",
|
582
|
-
# "content-type"=>"",
|
583
|
-
# "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
584
|
-
# "date"=>"Tue, 30 Sep 2008 00:52:44 GMT",
|
585
|
-
# "x-amz-request-id"=>"EE4855DE27A2688C",
|
586
|
-
# "server"=>"AmazonS3",
|
587
|
-
# "content-length"=>"10"},
|
578
|
+
# s3.retrieve_object(:bucket => "foobucket", :key => "foo")
|
579
|
+
# => {:verified_md5=>false,
|
580
|
+
# :headers=>{"last-modified"=>"Mon, 29 Sep 2008 18:58:56 GMT",
|
581
|
+
# "x-amz-id-2"=>"2Aj3TDz6HP5109qly//18uHZ2a1TNHGLns9hyAtq2ved7wmzEXDOPGRHOYEa3Qnp",
|
582
|
+
# "content-type"=>"",
|
583
|
+
# "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
584
|
+
# "date"=>"Tue, 30 Sep 2008 00:52:44 GMT",
|
585
|
+
# "x-amz-request-id"=>"EE4855DE27A2688C",
|
586
|
+
# "server"=>"AmazonS3",
|
587
|
+
# "content-length"=>"10"},
|
588
588
|
# :object=>"polemonium"}
|
589
589
|
#
|
590
|
-
# s3.retrieve_object(:bucket => "foobucket", :key => "foo", :md5=>'a507841b1bc8115094b00bbe8c1b2954')
|
591
|
-
# => {:verified_md5=>true,
|
592
|
-
# :headers=>{"last-modified"=>"Mon, 29 Sep 2008 18:58:56 GMT",
|
593
|
-
# "x-amz-id-2"=>"mLWQcI+VuKVIdpTaPXEo84g0cz+vzmRLbj79TS8eFPfw19cGFOPxuLy4uGYVCvdH",
|
594
|
-
# "content-type"=>"", "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
595
|
-
# "date"=>"Tue, 30 Sep 2008 00:53:08 GMT",
|
596
|
-
# "x-amz-request-id"=>"6E7F317356580599",
|
597
|
-
# "server"=>"AmazonS3",
|
598
|
-
# "content-length"=>"10"},
|
590
|
+
# s3.retrieve_object(:bucket => "foobucket", :key => "foo", :md5=>'a507841b1bc8115094b00bbe8c1b2954')
|
591
|
+
# => {:verified_md5=>true,
|
592
|
+
# :headers=>{"last-modified"=>"Mon, 29 Sep 2008 18:58:56 GMT",
|
593
|
+
# "x-amz-id-2"=>"mLWQcI+VuKVIdpTaPXEo84g0cz+vzmRLbj79TS8eFPfw19cGFOPxuLy4uGYVCvdH",
|
594
|
+
# "content-type"=>"", "etag"=>"\"a507841b1bc8115094b00bbe8c1b2954\"",
|
595
|
+
# "date"=>"Tue, 30 Sep 2008 00:53:08 GMT",
|
596
|
+
# "x-amz-request-id"=>"6E7F317356580599",
|
597
|
+
# "server"=>"AmazonS3",
|
598
|
+
# "content-length"=>"10"},
|
599
599
|
# :object=>"polemonium"}
|
600
600
|
# If a block is provided, yields incrementally to the block as
|
601
601
|
# the response is read. For large responses, this function is ideal as
|
@@ -615,7 +615,7 @@ module RightAws
|
|
615
615
|
rescue
|
616
616
|
on_exception
|
617
617
|
end
|
618
|
-
|
618
|
+
|
619
619
|
# Identical in function to retrieve_object, but requires verification that the returned ETag is identical to the checksum passed in by the user as the 'md5' argument.
|
620
620
|
# If the check passes, returns the response metadata with the "verified_md5" field set true. Raises an exception if the checksums conflict.
|
621
621
|
# This call is implemented as a wrapper around retrieve_object and the user may gain different semantics by creating a custom wrapper.
|
@@ -629,14 +629,14 @@ module RightAws
|
|
629
629
|
# Retrieves object metadata. Returns a +hash+ of http_response_headers.
|
630
630
|
#
|
631
631
|
# s3.head('my_awesome_bucket', 'log/curent/1.log') #=>
|
632
|
-
# {"last-modified" => "Wed, 23 May 2007 09:08:04 GMT",
|
633
|
-
# "content-type" => "",
|
634
|
-
# "etag" => "\"000000000096f4ee74bc4596443ef2a4\"",
|
635
|
-
# "date" => "Wed, 23 May 2007 09:08:03 GMT",
|
636
|
-
# "x-amz-id-2" => "ZZZZZZZZZZZZZZZZZZZZ1HJXZoehfrS4QxcxTdNGldR7w/FVqblP50fU8cuIMLiu",
|
632
|
+
# {"last-modified" => "Wed, 23 May 2007 09:08:04 GMT",
|
633
|
+
# "content-type" => "",
|
634
|
+
# "etag" => "\"000000000096f4ee74bc4596443ef2a4\"",
|
635
|
+
# "date" => "Wed, 23 May 2007 09:08:03 GMT",
|
636
|
+
# "x-amz-id-2" => "ZZZZZZZZZZZZZZZZZZZZ1HJXZoehfrS4QxcxTdNGldR7w/FVqblP50fU8cuIMLiu",
|
637
637
|
# "x-amz-meta-family" => "Woho556!",
|
638
|
-
# "x-amz-request-id" => "0000000C246D770C",
|
639
|
-
# "server" => "AmazonS3",
|
638
|
+
# "x-amz-request-id" => "0000000C246D770C",
|
639
|
+
# "server" => "AmazonS3",
|
640
640
|
# "content-length" => "7"}
|
641
641
|
#
|
642
642
|
def head(bucket, key, headers={})
|
@@ -685,13 +685,13 @@ module RightAws
|
|
685
685
|
on_exception
|
686
686
|
end
|
687
687
|
|
688
|
-
# Copy an object.
|
688
|
+
# Copy an object.
|
689
689
|
# directive: :copy - copy meta-headers from source (default value)
|
690
690
|
# :replace - replace meta-headers by passed ones
|
691
691
|
#
|
692
692
|
# # copy a key with meta-headers
|
693
693
|
# s3.copy('b1', 'key1', 'b1', 'key1_copy') #=> {:e_tag=>"\"e8b...8d\"", :last_modified=>"2008-05-11T10:25:22.000Z"}
|
694
|
-
#
|
694
|
+
#
|
695
695
|
# # copy a key, overwrite meta-headers
|
696
696
|
# s3.copy('b1', 'key2', 'b1', 'key2_copy', :replace, 'x-amz-meta-family'=>'Woho555!') #=> {:e_tag=>"\"e8b...8d\"", :last_modified=>"2008-05-11T10:26:22.000Z"}
|
697
697
|
#
|
@@ -707,17 +707,17 @@ module RightAws
|
|
707
707
|
rescue
|
708
708
|
on_exception
|
709
709
|
end
|
710
|
-
|
711
|
-
# Move an object.
|
710
|
+
|
711
|
+
# Move an object.
|
712
712
|
# directive: :copy - copy meta-headers from source (default value)
|
713
713
|
# :replace - replace meta-headers by passed ones
|
714
714
|
#
|
715
715
|
# # move bucket1/key1 to bucket1/key2
|
716
716
|
# s3.move('bucket1', 'key1', 'bucket1', 'key2') #=> {:e_tag=>"\"e8b...8d\"", :last_modified=>"2008-05-11T10:27:22.000Z"}
|
717
|
-
#
|
717
|
+
#
|
718
718
|
# # move bucket1/key1 to bucket2/key2 with new meta-headers assignment
|
719
719
|
# s3.copy('bucket1', 'key1', 'bucket2', 'key2', :replace, 'x-amz-meta-family'=>'Woho555!') #=> {:e_tag=>"\"e8b...8d\"", :last_modified=>"2008-05-11T10:28:22.000Z"}
|
720
|
-
#
|
720
|
+
#
|
721
721
|
def move(src_bucket, src_key, dest_bucket, dest_key=nil, directive=:copy, headers={})
|
722
722
|
copy_result = copy(src_bucket, src_key, dest_bucket, dest_key, directive, headers)
|
723
723
|
# delete an original key if it differs from a destination one
|
@@ -725,15 +725,15 @@ module RightAws
|
|
725
725
|
copy_result
|
726
726
|
end
|
727
727
|
|
728
|
-
# Rename an object.
|
729
|
-
#
|
728
|
+
# Rename an object.
|
729
|
+
#
|
730
730
|
# # rename bucket1/key1 to bucket1/key2
|
731
731
|
# s3.rename('bucket1', 'key1', 'key2') #=> {:e_tag=>"\"e8b...8d\"", :last_modified=>"2008-05-11T10:29:22.000Z"}
|
732
|
-
#
|
732
|
+
#
|
733
733
|
def rename(src_bucket, src_key, dest_key, headers={})
|
734
734
|
move(src_bucket, src_key, src_bucket, dest_key, :copy, headers)
|
735
735
|
end
|
736
|
-
|
736
|
+
|
737
737
|
# Retieves the ACL (access control policy) for a bucket or object. Returns a hash of headers and xml doc with ACL data. See: http://docs.amazonwebservices.com/AmazonS3/2006-03-01/RESTAccessPolicy.html.
|
738
738
|
#
|
739
739
|
# s3.get_acl('my_awesome_bucket', 'log/curent/1.log') #=>
|
@@ -752,12 +752,12 @@ module RightAws
|
|
752
752
|
def get_acl(bucket, key='', headers={})
|
753
753
|
key = key.right_blank? ? '' : "/#{CGI::escape key}"
|
754
754
|
req_hash = generate_rest_request('GET', headers.merge(:url=>"#{bucket}#{key}?acl"))
|
755
|
-
request_info(req_hash, S3HttpResponseBodyParser.new)
|
755
|
+
request_info(req_hash, S3HttpResponseBodyParser.new)
|
756
756
|
rescue
|
757
757
|
on_exception
|
758
758
|
end
|
759
|
-
|
760
|
-
# Retieves the ACL (access control policy) for a bucket or object.
|
759
|
+
|
760
|
+
# Retieves the ACL (access control policy) for a bucket or object.
|
761
761
|
# Returns a hash of {:owner, :grantees}
|
762
762
|
#
|
763
763
|
# s3.get_acl_parse('my_awesome_bucket', 'log/curent/1.log') #=>
|
@@ -791,7 +791,7 @@ module RightAws
|
|
791
791
|
if result[:grantees].key?(key)
|
792
792
|
result[:grantees][key][:permissions] << grantee[:permissions]
|
793
793
|
else
|
794
|
-
result[:grantees][key] =
|
794
|
+
result[:grantees][key] =
|
795
795
|
{ :display_name => grantee[:display_name] || grantee[:uri].to_s[/[^\/]*$/],
|
796
796
|
:permissions => Array(grantee[:permissions]),
|
797
797
|
:attributes => grantee[:attributes] }
|
@@ -801,7 +801,7 @@ module RightAws
|
|
801
801
|
rescue
|
802
802
|
on_exception
|
803
803
|
end
|
804
|
-
|
804
|
+
|
805
805
|
# Sets the ACL on a bucket or object.
|
806
806
|
def put_acl(bucket, key, acl_xml_doc, headers={})
|
807
807
|
key = key.right_blank? ? '' : "/#{CGI::escape key}"
|
@@ -810,14 +810,14 @@ module RightAws
|
|
810
810
|
rescue
|
811
811
|
on_exception
|
812
812
|
end
|
813
|
-
|
813
|
+
|
814
814
|
# Retieves the ACL (access control policy) for a bucket. Returns a hash of headers and xml doc with ACL data.
|
815
815
|
def get_bucket_acl(bucket, headers={})
|
816
816
|
return get_acl(bucket, '', headers)
|
817
817
|
rescue
|
818
818
|
on_exception
|
819
819
|
end
|
820
|
-
|
820
|
+
|
821
821
|
# Sets the ACL on a bucket only.
|
822
822
|
def put_bucket_acl(bucket, acl_xml_doc, headers={})
|
823
823
|
return put_acl(bucket, '', acl_xml_doc, headers)
|
@@ -838,7 +838,7 @@ module RightAws
|
|
838
838
|
rescue
|
839
839
|
on_exception
|
840
840
|
end
|
841
|
-
|
841
|
+
|
842
842
|
# Deletes all keys in bucket then deletes bucket. Returns +true+ or an exception.
|
843
843
|
#
|
844
844
|
# s3.force_delete_bucket('my_awesome_bucket')
|
@@ -849,7 +849,7 @@ module RightAws
|
|
849
849
|
rescue
|
850
850
|
on_exception
|
851
851
|
end
|
852
|
-
|
852
|
+
|
853
853
|
# Deletes all keys where the 'folder_key' may be assumed as 'folder' name. Returns an array of string keys that have been deleted.
|
854
854
|
#
|
855
855
|
# s3.list_bucket('my_awesome_bucket').map{|key_data| key_data[:key]} #=> ['test','test/2/34','test/3','test1','test1/logs']
|
@@ -867,7 +867,7 @@ module RightAws
|
|
867
867
|
rescue
|
868
868
|
on_exception
|
869
869
|
end
|
870
|
-
|
870
|
+
|
871
871
|
# Retrieves object data only (headers are omitted). Returns +string+ or an exception.
|
872
872
|
#
|
873
873
|
# s3.get('my_awesome_bucket', 'log/curent/1.log') #=> 'Ola-la!'
|
@@ -877,7 +877,7 @@ module RightAws
|
|
877
877
|
rescue
|
878
878
|
on_exception
|
879
879
|
end
|
880
|
-
|
880
|
+
|
881
881
|
#-----------------------------------------------------------------
|
882
882
|
# Query API: Links
|
883
883
|
#-----------------------------------------------------------------
|
@@ -903,7 +903,7 @@ module RightAws
|
|
903
903
|
rescue
|
904
904
|
on_exception
|
905
905
|
end
|
906
|
-
|
906
|
+
|
907
907
|
# Generates link for 'ListAllMyBuckets'.
|
908
908
|
#
|
909
909
|
# s3.list_all_my_buckets_link #=> url string
|
@@ -913,7 +913,7 @@ module RightAws
|
|
913
913
|
rescue
|
914
914
|
on_exception
|
915
915
|
end
|
916
|
-
|
916
|
+
|
917
917
|
# Generates link for 'CreateBucket'.
|
918
918
|
#
|
919
919
|
# s3.create_bucket_link('my_awesome_bucket') #=> url string
|
@@ -923,7 +923,7 @@ module RightAws
|
|
923
923
|
rescue
|
924
924
|
on_exception
|
925
925
|
end
|
926
|
-
|
926
|
+
|
927
927
|
# Generates link for 'DeleteBucket'.
|
928
928
|
#
|
929
929
|
# s3.delete_bucket_link('my_awesome_bucket') #=> url string
|
@@ -933,7 +933,7 @@ module RightAws
|
|
933
933
|
rescue
|
934
934
|
on_exception
|
935
935
|
end
|
936
|
-
|
936
|
+
|
937
937
|
# Generates link for 'ListBucket'.
|
938
938
|
#
|
939
939
|
# s3.list_bucket_link('my_awesome_bucket') #=> url string
|
@@ -944,7 +944,7 @@ module RightAws
|
|
944
944
|
rescue
|
945
945
|
on_exception
|
946
946
|
end
|
947
|
-
|
947
|
+
|
948
948
|
# Generates link for 'PutObject'.
|
949
949
|
#
|
950
950
|
# s3.put_link('my_awesome_bucket',key, object) #=> url string
|
@@ -954,16 +954,16 @@ module RightAws
|
|
954
954
|
rescue
|
955
955
|
on_exception
|
956
956
|
end
|
957
|
-
|
957
|
+
|
958
958
|
# Generates link for 'GetObject'.
|
959
959
|
#
|
960
|
-
# if a bucket comply with virtual hosting naming then retuns a link with the
|
960
|
+
# if a bucket comply with virtual hosting naming then retuns a link with the
|
961
961
|
# bucket as a part of host name:
|
962
|
-
#
|
962
|
+
#
|
963
963
|
# s3.get_link('my-awesome-bucket',key) #=> https://my-awesome-bucket.s3.amazonaws.com:443/asia%2Fcustomers?Signature=nh7...
|
964
|
-
#
|
964
|
+
#
|
965
965
|
# otherwise returns an old style link (the bucket is a part of path):
|
966
|
-
#
|
966
|
+
#
|
967
967
|
# s3.get_link('my_awesome_bucket',key) #=> https://s3.amazonaws.com:443/my_awesome_bucket/asia%2Fcustomers?Signature=QAO...
|
968
968
|
#
|
969
969
|
# see http://docs.amazonwebservices.com/AmazonS3/2006-03-01/VirtualHosting.html
|
@@ -984,7 +984,7 @@ module RightAws
|
|
984
984
|
rescue
|
985
985
|
on_exception
|
986
986
|
end
|
987
|
-
|
987
|
+
|
988
988
|
# Generates link for 'HeadObject'.
|
989
989
|
#
|
990
990
|
# s3.head_link('my_awesome_bucket',key) #=> url string
|
@@ -994,7 +994,7 @@ module RightAws
|
|
994
994
|
rescue
|
995
995
|
on_exception
|
996
996
|
end
|
997
|
-
|
997
|
+
|
998
998
|
# Generates link for 'DeleteObject'.
|
999
999
|
#
|
1000
1000
|
# s3.delete_link('my_awesome_bucket',key) #=> url string
|
@@ -1004,8 +1004,8 @@ module RightAws
|
|
1004
1004
|
rescue
|
1005
1005
|
on_exception
|
1006
1006
|
end
|
1007
|
-
|
1008
|
-
|
1007
|
+
|
1008
|
+
|
1009
1009
|
# Generates link for 'GetACL'.
|
1010
1010
|
#
|
1011
1011
|
# s3.get_acl_link('my_awesome_bucket',key) #=> url string
|
@@ -1015,7 +1015,7 @@ module RightAws
|
|
1015
1015
|
rescue
|
1016
1016
|
on_exception
|
1017
1017
|
end
|
1018
|
-
|
1018
|
+
|
1019
1019
|
# Generates link for 'PutACL'.
|
1020
1020
|
#
|
1021
1021
|
# s3.put_acl_link('my_awesome_bucket',key) #=> url string
|
@@ -1025,7 +1025,7 @@ module RightAws
|
|
1025
1025
|
rescue
|
1026
1026
|
on_exception
|
1027
1027
|
end
|
1028
|
-
|
1028
|
+
|
1029
1029
|
# Generates link for 'GetBucketACL'.
|
1030
1030
|
#
|
1031
1031
|
# s3.get_acl_link('my_awesome_bucket',key) #=> url string
|
@@ -1035,7 +1035,7 @@ module RightAws
|
|
1035
1035
|
rescue
|
1036
1036
|
on_exception
|
1037
1037
|
end
|
1038
|
-
|
1038
|
+
|
1039
1039
|
# Generates link for 'PutBucketACL'.
|
1040
1040
|
#
|
1041
1041
|
# s3.put_acl_link('my_awesome_bucket',key) #=> url string
|
@@ -1046,6 +1046,23 @@ module RightAws
|
|
1046
1046
|
on_exception
|
1047
1047
|
end
|
1048
1048
|
|
1049
|
+
class S3DeleteMultipleParser < RightAWSParser # :nodoc:
|
1050
|
+
def reset
|
1051
|
+
@result = []
|
1052
|
+
end
|
1053
|
+
def tagstart(name, attributes)
|
1054
|
+
@error = {} if name == 'Error'
|
1055
|
+
end
|
1056
|
+
def tagend(name)
|
1057
|
+
case name
|
1058
|
+
when 'Key' then @error[:key] = @text
|
1059
|
+
when 'Code' then @error[:code] = @text
|
1060
|
+
when 'Message' then @error[:message] = @text
|
1061
|
+
when 'Error' then @result << @error
|
1062
|
+
end
|
1063
|
+
end
|
1064
|
+
end
|
1065
|
+
|
1049
1066
|
#-----------------------------------------------------------------
|
1050
1067
|
# PARSERS:
|
1051
1068
|
#-----------------------------------------------------------------
|
@@ -1139,7 +1156,7 @@ module RightAws
|
|
1139
1156
|
when 'DisplayName' then @current_key[:owner_display_name] = @text
|
1140
1157
|
when 'Contents' then @result[:contents] << @current_key
|
1141
1158
|
# Common Prefix stuff
|
1142
|
-
when 'CommonPrefixes'
|
1159
|
+
when 'CommonPrefixes'
|
1143
1160
|
@result[:common_prefixes] = @common_prefixes
|
1144
1161
|
@in_common_prefixes = false
|
1145
1162
|
end
|
@@ -1187,7 +1204,7 @@ module RightAws
|
|
1187
1204
|
end
|
1188
1205
|
end
|
1189
1206
|
end
|
1190
|
-
|
1207
|
+
|
1191
1208
|
class S3LoggingParser < RightAWSParser # :nodoc:
|
1192
1209
|
def reset
|
1193
1210
|
@result = {:enabled => false, :targetbucket => '', :targetprefix => ''}
|
@@ -1221,24 +1238,7 @@ module RightAws
|
|
1221
1238
|
end
|
1222
1239
|
end
|
1223
1240
|
end
|
1224
|
-
|
1225
|
-
class S3DeleteMultipleParser < RightAWSParser # :nodoc:
|
1226
|
-
def reset
|
1227
|
-
@result = []
|
1228
|
-
end
|
1229
|
-
def tagstart(name, attributes)
|
1230
|
-
@error = {}
|
1231
|
-
end
|
1232
|
-
def tagend(name)
|
1233
|
-
case name
|
1234
|
-
when 'Key' then current[:key] = @text
|
1235
|
-
when 'Code' then current[:code] = @text
|
1236
|
-
when 'Message' then current[:message] = @text
|
1237
|
-
when 'Error' then @result << @error
|
1238
|
-
end
|
1239
|
-
end
|
1240
|
-
end
|
1241
|
-
|
1241
|
+
|
1242
1242
|
#-----------------------------------------------------------------
|
1243
1243
|
# PARSERS: Non XML
|
1244
1244
|
#-----------------------------------------------------------------
|
@@ -1260,8 +1260,8 @@ module RightAws
|
|
1260
1260
|
|
1261
1261
|
class S3HttpResponseBodyParser < S3HttpResponseParser # :nodoc:
|
1262
1262
|
def parse(response)
|
1263
|
-
@result = {
|
1264
|
-
:object => response.body,
|
1263
|
+
@result = {
|
1264
|
+
:object => response.body,
|
1265
1265
|
:headers => headers_to_string(response.to_hash)
|
1266
1266
|
}
|
1267
1267
|
end
|
@@ -1272,7 +1272,7 @@ module RightAws
|
|
1272
1272
|
@result = headers_to_string(response.to_hash)
|
1273
1273
|
end
|
1274
1274
|
end
|
1275
|
-
|
1275
|
+
|
1276
1276
|
end
|
1277
1277
|
|
1278
1278
|
end
|