aws-sdk 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/aws/base_client.rb +1 -0
- data/lib/aws/ec2/client/xml.rb +1 -0
- data/lib/aws/http/request_param.rb +3 -9
- data/lib/aws/rails.rb +6 -26
- data/lib/aws/response.rb +1 -0
- data/lib/aws/s3/client.rb +32 -0
- data/lib/aws/s3/errors.rb +28 -0
- data/lib/aws/s3/request.rb +4 -1
- data/lib/aws/s3/s3_object.rb +33 -8
- data/lib/aws/uri_escape.rb +40 -0
- data/lib/aws/xml_grammar.rb +9 -7
- metadata +84 -51
data/lib/aws/base_client.rb
CHANGED
data/lib/aws/ec2/client/xml.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
# ANY KIND, either express or implied. See the License for the specific
|
12
12
|
# language governing permissions and limitations under the License.
|
13
13
|
|
14
|
-
require '
|
14
|
+
require 'aws/uri_escape'
|
15
15
|
|
16
16
|
module AWS
|
17
17
|
module Http
|
@@ -24,6 +24,8 @@ module AWS
|
|
24
24
|
# @private
|
25
25
|
class Param
|
26
26
|
|
27
|
+
include UriEscape
|
28
|
+
|
27
29
|
attr_accessor :name, :value
|
28
30
|
|
29
31
|
def initialize name, value = nil
|
@@ -56,14 +58,6 @@ module AWS
|
|
56
58
|
end
|
57
59
|
end
|
58
60
|
|
59
|
-
# @private
|
60
|
-
protected
|
61
|
-
def escape value
|
62
|
-
value = value.encode("UTF-8") if
|
63
|
-
value.respond_to?(:encode)
|
64
|
-
CGI::escape(value.to_s).gsub('+', '%20')
|
65
|
-
end
|
66
|
-
|
67
61
|
end
|
68
62
|
end
|
69
63
|
end
|
data/lib/aws/rails.rb
CHANGED
@@ -32,8 +32,8 @@ module AWS
|
|
32
32
|
# A handful of useful Rails integration methods.
|
33
33
|
#
|
34
34
|
# If you require this gem inside a Rails application (via config.gem
|
35
|
-
# for rails 2 and bundler for rails 3) then
|
36
|
-
#
|
35
|
+
# for rails 2 and bundler for rails 3) then {setup} is called
|
36
|
+
# automatically.
|
37
37
|
module Rails
|
38
38
|
|
39
39
|
# Adds extra functionality to Rails.
|
@@ -43,33 +43,12 @@ module AWS
|
|
43
43
|
#
|
44
44
|
# Rails 3+ (RAILS_ROOT/Gemfile)
|
45
45
|
#
|
46
|
-
# gem 'aws-sdk
|
46
|
+
# gem 'aws-sdk'
|
47
47
|
#
|
48
48
|
# Rails 2.1 - 2.3 (RAILS_ROOT/config/environment.rb)
|
49
49
|
#
|
50
|
-
# config.gem 'aws-sdk
|
50
|
+
# config.gem 'aws-sdk'
|
51
51
|
#
|
52
|
-
# === Selective Rails Features
|
53
|
-
#
|
54
|
-
# If you would prefer to cherry pick a few of the features added by this
|
55
|
-
# gem you can change your gem requirement to load 'aws/rails' instead:
|
56
|
-
#
|
57
|
-
# Rails 3+ (RAILS_ROOT/Gemfile)
|
58
|
-
#
|
59
|
-
# gem 'aws-sdk-rails', :require => 'aws/rails'
|
60
|
-
#
|
61
|
-
# Rails 2.1 - 2.3 (RAILS_ROOT/config/environment.rb)
|
62
|
-
#
|
63
|
-
# config.gem 'aws-sdk-rails', :lib => 'aws/rails'
|
64
|
-
#
|
65
|
-
# In both of the examples above you can now configure AWS and call the setup
|
66
|
-
# methods of choice inside a config initializer (e.g.
|
67
|
-
# RAILS_ROOT/config/initializers/aws.rb):
|
68
|
-
#
|
69
|
-
# AWS.config(...)
|
70
|
-
# AWS.log_to_rails_logger
|
71
|
-
# AWS.add_action_mailer_delivery_method
|
72
|
-
#
|
73
52
|
# @return [nil]
|
74
53
|
def self.setup
|
75
54
|
load_yaml_config
|
@@ -135,7 +114,8 @@ module AWS
|
|
135
114
|
|
136
115
|
end
|
137
116
|
|
138
|
-
# Adds a delivery method to ActionMailer that uses
|
117
|
+
# Adds a delivery method to ActionMailer that uses
|
118
|
+
# {AWS::SimpleEmailService}.
|
139
119
|
#
|
140
120
|
# Once you have an SES delivery method you can configure Rails to
|
141
121
|
# use this for ActionMailer in your environment configuration
|
data/lib/aws/response.rb
CHANGED
data/lib/aws/s3/client.rb
CHANGED
@@ -78,6 +78,11 @@ module AWS
|
|
78
78
|
|
79
79
|
XMLNS = "http://s3.amazonaws.com/doc/#{API_VERSION}/"
|
80
80
|
|
81
|
+
EMPTY_BODY_ERRORS = {
|
82
|
+
304 => Errors::NotModified,
|
83
|
+
404 => Errors::NoSuchKey
|
84
|
+
}
|
85
|
+
|
81
86
|
include DataOptions
|
82
87
|
|
83
88
|
configure_client
|
@@ -471,6 +476,9 @@ module AWS
|
|
471
476
|
MetaUtils.extend_method(response, :etag) do
|
472
477
|
response.http_response.header('ETag')
|
473
478
|
end
|
479
|
+
MetaUtils.extend_method(response, :last_modified) do
|
480
|
+
Time.parse(response.http_response.header('Last-Modified'))
|
481
|
+
end
|
474
482
|
end
|
475
483
|
|
476
484
|
simulate_response do |response|
|
@@ -610,6 +618,10 @@ module AWS
|
|
610
618
|
end
|
611
619
|
end
|
612
620
|
|
621
|
+
MetaUtils.extend_method(resp, :last_modified) do
|
622
|
+
Time.parse(resp.http_response.header('Last-Modified'))
|
623
|
+
end
|
624
|
+
|
613
625
|
MetaUtils.extend_method(resp, :content_length) do
|
614
626
|
http_response.header('content-length').to_i
|
615
627
|
end
|
@@ -695,6 +707,9 @@ module AWS
|
|
695
707
|
MetaUtils.extend_method(response, :etag) do
|
696
708
|
response.http_response.header('ETag')
|
697
709
|
end
|
710
|
+
MetaUtils.extend_method(response, :last_modified) do
|
711
|
+
Time.parse(response.http_response.header('Last-Modified'))
|
712
|
+
end
|
698
713
|
end
|
699
714
|
|
700
715
|
simulate_response do |response|
|
@@ -791,6 +806,9 @@ module AWS
|
|
791
806
|
MetaUtils.extend_method(response, :etag) do
|
792
807
|
response.http_response.header('ETag')
|
793
808
|
end
|
809
|
+
MetaUtils.extend_method(response, :last_modified) do
|
810
|
+
Time.parse(response.http_response.header('Last-Modified'))
|
811
|
+
end
|
794
812
|
end
|
795
813
|
|
796
814
|
end
|
@@ -799,9 +817,23 @@ module AWS
|
|
799
817
|
def xml_error_response? response
|
800
818
|
(response.http_response.status >= 300 ||
|
801
819
|
response.request_type == :complete_multipart_upload) and
|
820
|
+
response.http_response.body and
|
802
821
|
XmlGrammar.parse(response.http_response.body).respond_to?(:code)
|
803
822
|
end
|
804
823
|
|
824
|
+
protected
|
825
|
+
def populate_error response
|
826
|
+
code = response.http_response.status
|
827
|
+
if EMPTY_BODY_ERRORS.include?(code) and
|
828
|
+
response.http_response.body.nil?
|
829
|
+
response.error =
|
830
|
+
EMPTY_BODY_ERRORS[code].new(response.http_request,
|
831
|
+
response.http_response)
|
832
|
+
else
|
833
|
+
super
|
834
|
+
end
|
835
|
+
end
|
836
|
+
|
805
837
|
protected
|
806
838
|
def should_retry? response
|
807
839
|
super or
|
data/lib/aws/s3/errors.rb
CHANGED
@@ -38,6 +38,34 @@ module AWS
|
|
38
38
|
|
39
39
|
include LazyErrorClasses
|
40
40
|
|
41
|
+
# This error is special, because S3 does not (and must not
|
42
|
+
# according to RFC 2616) return a body with the HTTP response.
|
43
|
+
# The interface is the same as for any other client error.
|
44
|
+
class NotModified < AWS::Errors::Base
|
45
|
+
include AWS::Errors::ClientError
|
46
|
+
|
47
|
+
def code; "NotModified"; end
|
48
|
+
|
49
|
+
def initialize(req, resp)
|
50
|
+
super(req, resp, "Not Modified")
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
# This error is special, because S3 does not return a body with
|
56
|
+
# the HTTP response. The interface is the same as for any other
|
57
|
+
# client error.
|
58
|
+
class NoSuchKey < AWS::Errors::Base
|
59
|
+
include AWS::Errors::ClientError
|
60
|
+
|
61
|
+
def code; "NoSuchKey"; end
|
62
|
+
|
63
|
+
def initialize(req, resp)
|
64
|
+
super(req, resp, "No Such Key")
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
41
69
|
end
|
42
70
|
end
|
43
71
|
end
|
data/lib/aws/s3/request.rb
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
|
14
14
|
require 'aws/http/request'
|
15
15
|
require 'aws/base_client'
|
16
|
+
require 'aws/uri_escape'
|
16
17
|
require 'uri'
|
17
18
|
require 'time'
|
18
19
|
|
@@ -22,6 +23,8 @@ module AWS
|
|
22
23
|
# @private
|
23
24
|
class Request < AWS::Http::Request
|
24
25
|
|
26
|
+
include UriEscape
|
27
|
+
|
25
28
|
# @param [bucket] S3 bucket name
|
26
29
|
attr_accessor :bucket
|
27
30
|
|
@@ -59,7 +62,7 @@ module AWS
|
|
59
62
|
def path
|
60
63
|
parts = []
|
61
64
|
parts << bucket if bucket and Client.path_style_bucket_name?(bucket)
|
62
|
-
parts << key if key
|
65
|
+
parts << escape_path(key) if key
|
63
66
|
"/#{parts.join('/')}"
|
64
67
|
end
|
65
68
|
|
data/lib/aws/s3/s3_object.rb
CHANGED
@@ -74,6 +74,14 @@ module AWS
|
|
74
74
|
|
75
75
|
alias_method :eql?, :==
|
76
76
|
|
77
|
+
def exists?
|
78
|
+
head
|
79
|
+
rescue Errors::NoSuchKey => e
|
80
|
+
false
|
81
|
+
else
|
82
|
+
true
|
83
|
+
end
|
84
|
+
|
77
85
|
# Performs a HEAD request against this object and returns an object
|
78
86
|
# with useful information about the object, including:
|
79
87
|
#
|
@@ -103,6 +111,13 @@ module AWS
|
|
103
111
|
head.etag
|
104
112
|
end
|
105
113
|
|
114
|
+
# Returns the object's last modified time.
|
115
|
+
#
|
116
|
+
# @return [Time] Returns the object's last modified time.
|
117
|
+
def last_modified
|
118
|
+
head.last_modified
|
119
|
+
end
|
120
|
+
|
106
121
|
# @return [Integer] Size of the object in bytes.
|
107
122
|
def content_length
|
108
123
|
head.content_length
|
@@ -488,14 +503,24 @@ module AWS
|
|
488
503
|
# @param [Hash] options
|
489
504
|
# @option options [String] :version_id Reads data from a
|
490
505
|
# specific version of this object.
|
491
|
-
#
|
492
|
-
#
|
493
|
-
#
|
494
|
-
#
|
495
|
-
#
|
496
|
-
#
|
497
|
-
# @option options [
|
498
|
-
# will
|
506
|
+
#
|
507
|
+
# @option options [Time] :if_unmodified_since If specified, the
|
508
|
+
# method will raise
|
509
|
+
# <tt>AWS::S3::Errors::PreconditionFailed</tt> unless the
|
510
|
+
# object has not been modified since the given time.
|
511
|
+
#
|
512
|
+
# @option options [Time] :if_modified_since If specified, the
|
513
|
+
# method will raise <tt>AWS::S3::Errors::NotModified</tt> if
|
514
|
+
# the object has not been modified since the given time.
|
515
|
+
#
|
516
|
+
# @option options [String] :if_match If specified, the method
|
517
|
+
# will raise <tt>AWS::S3::Errors::PreconditionFailed</tt>
|
518
|
+
# unless the object ETag matches the provided value.
|
519
|
+
#
|
520
|
+
# @option options [String] :if_none_match If specified, the
|
521
|
+
# method will raise <tt>AWS::S3::Errors::NotModified</tt> if
|
522
|
+
# the object ETag matches the provided value.
|
523
|
+
#
|
499
524
|
# @option options [Range] :range A byte range to read data from
|
500
525
|
def read(options = {}, &blk)
|
501
526
|
options[:bucket_name] = bucket.name
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
5
|
+
# the License is located at
|
6
|
+
#
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
8
|
+
#
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
12
|
+
# language governing permissions and limitations under the License.
|
13
|
+
|
14
|
+
require 'cgi'
|
15
|
+
|
16
|
+
module AWS
|
17
|
+
|
18
|
+
# @private
|
19
|
+
module UriEscape
|
20
|
+
|
21
|
+
# Does URI escaping the way AWS expects it to be done.
|
22
|
+
#
|
23
|
+
# @private
|
24
|
+
protected
|
25
|
+
def escape value
|
26
|
+
value = value.encode("UTF-8") if
|
27
|
+
value.respond_to?(:encode)
|
28
|
+
CGI::escape(value.to_s).gsub('+', '%20')
|
29
|
+
end
|
30
|
+
|
31
|
+
# URI-escapes a path without escaping the separators
|
32
|
+
#
|
33
|
+
# @private
|
34
|
+
protected
|
35
|
+
def escape_path value
|
36
|
+
value.split("/").map { |part| escape(part) }.join("/")
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/lib/aws/xml_grammar.rb
CHANGED
@@ -66,14 +66,16 @@ module AWS
|
|
66
66
|
class CustomizationContext < Hash
|
67
67
|
|
68
68
|
def initialize(element_name = nil)
|
69
|
-
|
69
|
+
original_store(:children, {})
|
70
70
|
|
71
71
|
if element_name
|
72
|
-
|
72
|
+
original_store(:name, element_name)
|
73
73
|
recompute_accessors
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
+
alias_method :original_store, :[]=
|
78
|
+
|
77
79
|
def []=(name, value)
|
78
80
|
super
|
79
81
|
if respond_to?("changed_#{name}")
|
@@ -90,16 +92,16 @@ module AWS
|
|
90
92
|
end
|
91
93
|
|
92
94
|
def deep_copy(hash = self)
|
93
|
-
hash.inject(
|
95
|
+
fields = hash.inject({}) do |copy,(key,value)|
|
94
96
|
if value.is_a?(CustomizationContext)
|
95
|
-
|
97
|
+
value = value.deep_copy
|
96
98
|
elsif value.is_a?(Hash)
|
97
|
-
|
98
|
-
else
|
99
|
-
copy[key] = value
|
99
|
+
value = deep_copy(value)
|
100
100
|
end
|
101
|
+
copy[key] = value
|
101
102
|
copy
|
102
103
|
end
|
104
|
+
hash.merge(fields)
|
103
105
|
end
|
104
106
|
|
105
107
|
private
|
metadata
CHANGED
@@ -1,67 +1,93 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-sdk
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 3
|
10
|
+
version: 1.0.3
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Amazon Web Services
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
17
|
+
|
18
|
+
date: 2011-07-29 00:00:00 -07:00
|
13
19
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
|
17
|
-
requirement: &
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
24
|
none: false
|
19
|
-
requirements:
|
25
|
+
requirements:
|
20
26
|
- - ~>
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 1
|
29
|
+
segments:
|
30
|
+
- 2
|
31
|
+
- 1
|
32
|
+
version: "2.1"
|
23
33
|
type: :runtime
|
34
|
+
name: uuidtools
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
24
37
|
prerelease: false
|
25
|
-
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: httparty
|
28
|
-
requirement: &2155405080 !ruby/object:Gem::Requirement
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
29
39
|
none: false
|
30
|
-
requirements:
|
40
|
+
requirements:
|
31
41
|
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 5
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
- 7
|
47
|
+
version: "0.7"
|
34
48
|
type: :runtime
|
49
|
+
name: httparty
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
35
52
|
prerelease: false
|
36
|
-
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: nokogiri
|
39
|
-
requirement: &2155394520 !ruby/object:Gem::Requirement
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
54
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 15
|
59
|
+
segments:
|
60
|
+
- 1
|
61
|
+
- 4
|
62
|
+
- 4
|
44
63
|
version: 1.4.4
|
45
64
|
type: :runtime
|
65
|
+
name: nokogiri
|
66
|
+
version_requirements: *id003
|
67
|
+
- !ruby/object:Gem::Dependency
|
46
68
|
prerelease: false
|
47
|
-
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: json
|
50
|
-
requirement: &2155393900 !ruby/object:Gem::Requirement
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
51
70
|
none: false
|
52
|
-
requirements:
|
71
|
+
requirements:
|
53
72
|
- - ~>
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 7
|
75
|
+
segments:
|
76
|
+
- 1
|
77
|
+
- 4
|
78
|
+
version: "1.4"
|
56
79
|
type: :runtime
|
57
|
-
|
58
|
-
version_requirements: *
|
80
|
+
name: json
|
81
|
+
version_requirements: *id004
|
59
82
|
description: AWS SDK for Ruby
|
60
83
|
email:
|
61
84
|
executables: []
|
85
|
+
|
62
86
|
extensions: []
|
87
|
+
|
63
88
|
extra_rdoc_files: []
|
64
|
-
|
89
|
+
|
90
|
+
files:
|
65
91
|
- ca-bundle.crt
|
66
92
|
- rails/init.rb
|
67
93
|
- lib/aws/api_config.rb
|
@@ -255,6 +281,7 @@ files:
|
|
255
281
|
- lib/aws/sqs/received_sns_message.rb
|
256
282
|
- lib/aws/sqs/request.rb
|
257
283
|
- lib/aws/sqs.rb
|
284
|
+
- lib/aws/uri_escape.rb
|
258
285
|
- lib/aws/xml_grammar.rb
|
259
286
|
- lib/aws-sdk.rb
|
260
287
|
- lib/aws.rb
|
@@ -270,31 +297,37 @@ files:
|
|
270
297
|
- LICENSE.txt
|
271
298
|
has_rdoc: true
|
272
299
|
homepage: http://aws.amazon.com/sdkforruby
|
273
|
-
licenses:
|
300
|
+
licenses:
|
274
301
|
- Apache 2.0
|
275
302
|
post_install_message:
|
276
303
|
rdoc_options: []
|
277
|
-
|
304
|
+
|
305
|
+
require_paths:
|
278
306
|
- lib
|
279
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
307
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
280
308
|
none: false
|
281
|
-
requirements:
|
282
|
-
- -
|
283
|
-
- !ruby/object:Gem::Version
|
284
|
-
|
285
|
-
segments:
|
309
|
+
requirements:
|
310
|
+
- - ">="
|
311
|
+
- !ruby/object:Gem::Version
|
312
|
+
hash: 3
|
313
|
+
segments:
|
286
314
|
- 0
|
287
|
-
|
288
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
315
|
+
version: "0"
|
316
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
289
317
|
none: false
|
290
|
-
requirements:
|
291
|
-
- -
|
292
|
-
- !ruby/object:Gem::Version
|
293
|
-
|
318
|
+
requirements:
|
319
|
+
- - ">="
|
320
|
+
- !ruby/object:Gem::Version
|
321
|
+
hash: 3
|
322
|
+
segments:
|
323
|
+
- 0
|
324
|
+
version: "0"
|
294
325
|
requirements: []
|
326
|
+
|
295
327
|
rubyforge_project:
|
296
|
-
rubygems_version: 1.6.
|
328
|
+
rubygems_version: 1.6.2
|
297
329
|
signing_key:
|
298
330
|
specification_version: 3
|
299
331
|
summary: AWS SDK for Ruby
|
300
332
|
test_files: []
|
333
|
+
|