radosgw-s3 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/Gemfile +2 -0
- data/LICENSE +202 -0
- data/README.rdoc +126 -0
- data/Rakefile +21 -0
- data/lib/ceph/radosgw.rb +35 -0
- data/lib/radosgw-s3.rb +29 -0
- data/lib/s3/bucket.rb +217 -0
- data/lib/s3/buckets_extension.rb +29 -0
- data/lib/s3/connection.rb +225 -0
- data/lib/s3/exceptions.rb +111 -0
- data/lib/s3/object.rb +262 -0
- data/lib/s3/objects_extension.rb +37 -0
- data/lib/s3/parser.rb +90 -0
- data/lib/s3/request.rb +31 -0
- data/lib/s3/service.rb +98 -0
- data/lib/s3/signature.rb +261 -0
- data/lib/s3/version.rb +3 -0
- data/radosgw-s3.gemspec +30 -0
- data/test/bucket_test.rb +245 -0
- data/test/connection_test.rb +215 -0
- data/test/object_test.rb +223 -0
- data/test/service_test.rb +133 -0
- data/test/signature_test.rb +228 -0
- data/test/test_helper.rb +3 -0
- metadata +157 -0
data/test/object_test.rb
ADDED
@@ -0,0 +1,223 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "test_helper"
|
3
|
+
|
4
|
+
class ObjectTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@service = S3::Service.new(
|
7
|
+
:access_key_id => "1234",
|
8
|
+
:host => "192.168.1.248",
|
9
|
+
:secret_access_key => "1337"
|
10
|
+
)
|
11
|
+
@bucket_images = S3::Bucket.send(:new, @service, "images")
|
12
|
+
@object_lena = S3::Object.send(:new, @bucket_images, :key => "Lena.png")
|
13
|
+
@object_lena.content = "test"
|
14
|
+
@object_carmen = S3::Object.send(:new, @bucket_images, :key => "Carmen.png")
|
15
|
+
@object_mac = S3::Object.send(:new, @bucket_images, :key => "Mac.png", :cache_control => "max-age=315360000")
|
16
|
+
@object_mac.content = "test2"
|
17
|
+
|
18
|
+
@response_binary = Net::HTTPOK.new("1.1", "200", "OK")
|
19
|
+
@response_binary.stubs(:body).returns("test".respond_to?(:force_encoding) ? "test".force_encoding(Encoding::BINARY) : "test")
|
20
|
+
@response_binary["etag"] = ""
|
21
|
+
@response_binary["content-type"] = "image/png"
|
22
|
+
@response_binary["content-disposition"] = "inline"
|
23
|
+
@response_binary["content-encoding"] = nil
|
24
|
+
@response_binary["last-modified"] = Time.now.httpdate
|
25
|
+
@response_binary["content-length"] = 20
|
26
|
+
@response_binary["x-amz-meta-test"] = "metadata"
|
27
|
+
|
28
|
+
@xml_body = <<-EOXML
|
29
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
30
|
+
<CopyObjectResult> <LastModified>#{Time.now.httpdate}</LastModified> <ETag>"etag"</ETag> </CopyObjectResult>
|
31
|
+
EOXML
|
32
|
+
@response_xml = Net::HTTPOK.new("1.1", "200", "OK")
|
33
|
+
@response_xml.stubs(:body).returns(@xml_body)
|
34
|
+
end
|
35
|
+
|
36
|
+
test "initializing" do
|
37
|
+
assert_raise ArgumentError do S3::Object.send(:new, nil, :key => "") end # should not allow empty key
|
38
|
+
|
39
|
+
assert_nothing_raised do
|
40
|
+
S3::Object.send(:new, nil, :key => "Lena.png")
|
41
|
+
S3::Object.send(:new, nil, :key => "Lena playboy.png")
|
42
|
+
S3::Object.send(:new, nil, :key => "Lena Söderberg.png")
|
43
|
+
S3::Object.send(:new, nil, :key => "/images/pictures/test images/Lena not full.png")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
test "==" do
|
48
|
+
expected = false
|
49
|
+
actual = @object_lena == nil
|
50
|
+
assert_equal(expected, actual)
|
51
|
+
end
|
52
|
+
|
53
|
+
test "full key" do
|
54
|
+
expected = "images/Lena.png"
|
55
|
+
actual = @object_lena.full_key
|
56
|
+
assert_equal expected, actual
|
57
|
+
end
|
58
|
+
|
59
|
+
test "url" do
|
60
|
+
bucket1 = S3::Bucket.send(:new, @service, "images")
|
61
|
+
|
62
|
+
object11 = S3::Object.send(:new, bucket1, :key => "Lena.png")
|
63
|
+
expected = "http://images.s3.amazonaws.com/Lena.png"
|
64
|
+
actual = object11.url
|
65
|
+
assert_equal expected, actual
|
66
|
+
|
67
|
+
object12 = S3::Object.send(:new, bucket1, :key => "Lena Söderberg.png")
|
68
|
+
expected = "http://images.s3.amazonaws.com/Lena%20S%C3%B6derberg.png"
|
69
|
+
actual = object12.url
|
70
|
+
assert_equal expected, actual
|
71
|
+
|
72
|
+
object13 = S3::Object.send(:new, bucket1, :key => "Lena Söderberg [1].png")
|
73
|
+
expected = "http://images.s3.amazonaws.com/Lena%20S%C3%B6derberg%20%5B1%5D.png"
|
74
|
+
actual = object13.url
|
75
|
+
assert_equal expected, actual
|
76
|
+
|
77
|
+
bucket2 = S3::Bucket.send(:new, @service, "images_new")
|
78
|
+
|
79
|
+
object21 = S3::Object.send(:new, bucket2, :key => "Lena.png")
|
80
|
+
expected = "http://s3.amazonaws.com/images_new/Lena.png"
|
81
|
+
actual = object21.url
|
82
|
+
assert_equal expected, actual
|
83
|
+
end
|
84
|
+
|
85
|
+
test "cname url" do
|
86
|
+
bucket1 = S3::Bucket.send(:new, @service, "images.example.com")
|
87
|
+
|
88
|
+
object11 = S3::Object.send(:new, bucket1, :key => "Lena.png")
|
89
|
+
expected = "http://images.example.com/Lena.png"
|
90
|
+
actual = object11.cname_url
|
91
|
+
assert_equal expected, actual
|
92
|
+
|
93
|
+
object12 = S3::Object.send(:new, bucket1, :key => "Lena Söderberg.png")
|
94
|
+
expected = "http://images.example.com/Lena%20S%C3%B6derberg.png"
|
95
|
+
actual = object12.cname_url
|
96
|
+
assert_equal expected, actual
|
97
|
+
|
98
|
+
bucket2 = S3::Bucket.send(:new, @service, "images_new")
|
99
|
+
|
100
|
+
object21 = S3::Object.send(:new, bucket2, :key => "Lena.png")
|
101
|
+
expected = nil
|
102
|
+
actual = object21.cname_url
|
103
|
+
assert_equal expected, actual
|
104
|
+
end
|
105
|
+
|
106
|
+
test "destroy" do
|
107
|
+
@object_lena.expects(:object_request).with(:delete)
|
108
|
+
assert @object_lena.destroy
|
109
|
+
end
|
110
|
+
|
111
|
+
test "save" do
|
112
|
+
@object_lena.expects(:object_request).with(:put, :body=>"test", :headers=>{ :x_amz_acl=>"private", :x_amz_storage_class=>"STANDARD", :content_type=>"application/octet-stream" }).returns(@response_binary)
|
113
|
+
assert @object_lena.save
|
114
|
+
end
|
115
|
+
|
116
|
+
test "save with cache control headers" do
|
117
|
+
assert_equal "max-age=315360000", @object_mac.cache_control
|
118
|
+
@object_mac.expects(:object_request).with(:put, :body=>"test2", :headers=>{ :x_amz_acl=>"private", :x_amz_storage_class=>"STANDARD", :content_type=>"application/octet-stream", :cache_control=>"max-age=315360000" }).returns(@response_binary)
|
119
|
+
assert @object_mac.save
|
120
|
+
end
|
121
|
+
|
122
|
+
test "content and parse headers" do
|
123
|
+
@object_lena.expects(:object_request).with(:get, {}).returns(@response_binary)
|
124
|
+
|
125
|
+
expected = /test/n
|
126
|
+
actual = @object_lena.content(true)
|
127
|
+
assert_match expected, actual
|
128
|
+
assert_equal "image/png", @object_lena.content_type
|
129
|
+
|
130
|
+
assert @object_lena.content
|
131
|
+
|
132
|
+
@object_lena.expects(:object_request).with(:get, {}).returns(@response_binary)
|
133
|
+
assert @object_lena.content(true)
|
134
|
+
end
|
135
|
+
|
136
|
+
test "retrieve" do
|
137
|
+
@object_lena.expects(:object_request).with(:head, {}).returns(@response_binary)
|
138
|
+
assert @object_lena.retrieve
|
139
|
+
end
|
140
|
+
|
141
|
+
test "retrieve headers" do
|
142
|
+
@object_lena.expects(:object_request).twice.with(:head, {}).returns(@response_binary)
|
143
|
+
assert @object_lena.retrieve
|
144
|
+
|
145
|
+
meta = {"x-amz-meta-test" => ["metadata"]}
|
146
|
+
assert_equal meta, @object_lena.retrieve.metadata
|
147
|
+
end
|
148
|
+
|
149
|
+
test "retrieve dont set content" do
|
150
|
+
@object_lena.send(:remove_instance_variable, :@content)
|
151
|
+
|
152
|
+
@response_binary.stubs(:body).returns(nil)
|
153
|
+
@object_lena.expects(:object_request).with(:head, {}).returns(@response_binary)
|
154
|
+
assert @object_lena.retrieve
|
155
|
+
|
156
|
+
@object_lena.expects(:object_request).with(:get, {}).returns(@response_binary)
|
157
|
+
@response_binary.stubs(:body).returns("hello")
|
158
|
+
|
159
|
+
assert_equal "hello", @object_lena.content
|
160
|
+
end
|
161
|
+
|
162
|
+
test "exists" do
|
163
|
+
@object_lena.expects(:retrieve).returns(true)
|
164
|
+
assert @object_lena.exists?
|
165
|
+
|
166
|
+
@object_carmen.expects(:retrieve).raises(S3::Error::NoSuchKey.new(nil, nil))
|
167
|
+
assert ! @object_carmen.exists?
|
168
|
+
end
|
169
|
+
|
170
|
+
test "ACL writer" do
|
171
|
+
expected = nil
|
172
|
+
actual = @object_lena.acl
|
173
|
+
assert_equal expected, actual
|
174
|
+
|
175
|
+
assert @object_lena.acl = :public_read
|
176
|
+
|
177
|
+
expected = "public-read"
|
178
|
+
actual = @object_lena.acl
|
179
|
+
assert_equal expected, actual
|
180
|
+
|
181
|
+
assert @object_lena.acl = :private
|
182
|
+
|
183
|
+
expected = "private"
|
184
|
+
actual = @object_lena.acl
|
185
|
+
assert_equal expected, actual
|
186
|
+
end
|
187
|
+
|
188
|
+
test "storage-class writer" do
|
189
|
+
expected = nil
|
190
|
+
actual = @object_lena.storage_class
|
191
|
+
assert_equal expected, actual
|
192
|
+
|
193
|
+
assert @object_lena.storage_class = :standard
|
194
|
+
|
195
|
+
expected = "STANDARD"
|
196
|
+
actual = @object_lena.storage_class
|
197
|
+
assert_equal expected, actual
|
198
|
+
|
199
|
+
assert @object_lena.storage_class = :reduced_redundancy
|
200
|
+
|
201
|
+
expected = "REDUCED_REDUNDANCY"
|
202
|
+
actual = @object_lena.storage_class
|
203
|
+
assert_equal expected, actual
|
204
|
+
end
|
205
|
+
|
206
|
+
test "replace" do
|
207
|
+
@bucket_images.expects(:bucket_request).with(:put, :path => "Lena-copy.png", :headers => { :x_amz_acl => "private", :content_type => "application/octet-stream", :x_amz_copy_source => "images/Lena.png", :x_amz_metadata_directive => "REPLACE" }).returns(@response_xml)
|
208
|
+
|
209
|
+
new_object = @object_lena.copy(:key => "Lena-copy.png")
|
210
|
+
|
211
|
+
assert_equal "Lena-copy.png", new_object.key
|
212
|
+
assert_equal "Lena.png", @object_lena.key
|
213
|
+
end
|
214
|
+
|
215
|
+
test "copy" do
|
216
|
+
@bucket_images.expects(:bucket_request).with(:put, :path => "Lena-copy.png", :headers => { :x_amz_acl => "private", :content_type => "application/octet-stream", :x_amz_copy_source => "images/Lena.png", :x_amz_metadata_directive => "COPY" }).returns(@response_xml)
|
217
|
+
|
218
|
+
new_object = @object_lena.copy(:key => "Lena-copy.png", :replace => false)
|
219
|
+
|
220
|
+
assert_equal "Lena-copy.png", new_object.key
|
221
|
+
assert_equal "Lena.png", @object_lena.key
|
222
|
+
end
|
223
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ServiceTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@buckets_list_body = <<-EOBuckets
|
6
|
+
<?xml version="1.0" encoding="UTF-8"?>\n<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Owner> <ID>123u1odhkhfoadf</ID> <DisplayName>JohnDoe</DisplayName> </Owner> <Buckets> <Bucket> <Name>data.example.com</Name> <CreationDate>2009-07-02T11:56:58.000Z</CreationDate> </Bucket> <Bucket> <Name>images</Name> <CreationDate>2009-06-05T12:26:33.000Z</CreationDate> </Bucket> </Buckets> </ListAllMyBucketsResult>
|
7
|
+
EOBuckets
|
8
|
+
|
9
|
+
@bucket_not_exists = <<-EOBucketNoexists
|
10
|
+
<?xml version="1.0" encoding="UTF-8"?>\n<Error> <Code>NoSuchBucket</Code> <Message>The specified bucket does not exists</Message> <BucketName>data2.example.com</BucketName> <RequestId>8D7519AAE74E9E99</RequestId> <HostId>DvKnnNSMnPHd1oXukyRaFNv8Lg/bpwhuUtY8Kj7eDLbaIrIT8JebSnHwi89AK1P+</HostId> </Error>
|
11
|
+
EOBucketNoexists
|
12
|
+
|
13
|
+
@bucket_exists = <<-EOBucketexists
|
14
|
+
<?xml version="1.0" encoding="UTF-8"?>\n<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>data.synergypeople.net</Name> <Prefix></Prefix> <Marker></Marker> <MaxKeys>1000</MaxKeys> <IsTruncated>false</IsTruncated> </ListBucketResult>
|
15
|
+
EOBucketexists
|
16
|
+
|
17
|
+
@service_empty_buckets_list = S3::Service.new(
|
18
|
+
:access_key_id => "12345678901234567890",
|
19
|
+
:host => "192.168.1.248",
|
20
|
+
:secret_access_key => "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDF"
|
21
|
+
)
|
22
|
+
@response_empty_buckets_list = Net::HTTPOK.new("1.1", "200", "OK")
|
23
|
+
@service_empty_buckets_list.stubs(:service_request).returns(@response_empty_buckets_list)
|
24
|
+
@response_empty_buckets_list.stubs(:body).returns(@buckets_empty_list_body)
|
25
|
+
|
26
|
+
@service_buckets_list = S3::Service.new(
|
27
|
+
:access_key_id => "12345678901234567890",
|
28
|
+
:host => "192.168.1.248",
|
29
|
+
:secret_access_key => "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDF"
|
30
|
+
)
|
31
|
+
@response_buckets_list = Net::HTTPOK.new("1.1", "200", "OK")
|
32
|
+
@service_buckets_list.stubs(:service_request).returns(@response_buckets_list)
|
33
|
+
@response_buckets_list.stubs(:body).returns(@buckets_list_body)
|
34
|
+
|
35
|
+
@service_bucket_exists = S3::Service.new(
|
36
|
+
:access_key_id => "12345678901234567890",
|
37
|
+
:host => "192.168.1.248",
|
38
|
+
:secret_access_key => "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDF"
|
39
|
+
)
|
40
|
+
@response_bucket_exists = Net::HTTPNotFound.new("1.1", "200", "OK")
|
41
|
+
@service_bucket_exists.stubs(:service_request).returns(@response_bucket_exists)
|
42
|
+
@response_bucket_exists.stubs(:body).returns(@bucket_exists)
|
43
|
+
|
44
|
+
@service_bucket_not_exists = S3::Service.new(
|
45
|
+
:access_key_id => "12345678901234567890",
|
46
|
+
:host => "192.168.1.248",
|
47
|
+
:secret_access_key => "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDF"
|
48
|
+
)
|
49
|
+
@response_bucket_not_exists = Net::HTTPNotFound.new("1.1", "404", "Not Found")
|
50
|
+
@service_bucket_not_exists.stubs(:service_request).raises(S3::Error::NoSuchBucket.new(404, @response_bucket_not_exists))
|
51
|
+
@response_bucket_not_exists.stubs(:body).returns(@bucket_not_exists)
|
52
|
+
|
53
|
+
@buckets_empty_list = []
|
54
|
+
@buckets_empty_list_body = <<-EOEmptyBuckets
|
55
|
+
<?xml version="1.0" encoding="UTF-8"?>\n<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Owner> <ID>123u1odhkhfoadf</ID> <DisplayName>JohnDoe</DisplayName> </Owner> <Buckets> </Buckets> </ListAllMyBucketsResult>
|
56
|
+
EOEmptyBuckets
|
57
|
+
|
58
|
+
@buckets_list = [
|
59
|
+
S3::Bucket.send(:new, @service_buckets_list, "data.example.com"),
|
60
|
+
S3::Bucket.send(:new, @service_buckets_list, "images")
|
61
|
+
]
|
62
|
+
end
|
63
|
+
|
64
|
+
test "no :access_key_id" do
|
65
|
+
assert_raise ArgumentError do
|
66
|
+
@service_bucket_exists = S3::Service.new(
|
67
|
+
:access_key_id => nil,
|
68
|
+
:host => "192.168.1.248",
|
69
|
+
:secret_access_key => "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDF"
|
70
|
+
)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
test "no :secret_access_key" do
|
75
|
+
assert_raise ArgumentError do
|
76
|
+
@service_bucket_exists = S3::Service.new(
|
77
|
+
:access_key_id => "12345678901234567890",
|
78
|
+
:host => "192.168.1.248",
|
79
|
+
:secret_access_key => nil
|
80
|
+
)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
test "buckets and parse buckets empty" do
|
85
|
+
expected = @buckets_empty_list
|
86
|
+
actual = @service_empty_buckets_list.buckets
|
87
|
+
assert_equal expected.length, actual.length
|
88
|
+
assert_equal expected, actual
|
89
|
+
end
|
90
|
+
|
91
|
+
test "buckets and parse buckets" do
|
92
|
+
expected = @buckets_list
|
93
|
+
# ugly hack
|
94
|
+
actual = @service_buckets_list.buckets.map { |obj| obj }
|
95
|
+
assert_equal expected, actual
|
96
|
+
end
|
97
|
+
|
98
|
+
test "buckets build" do
|
99
|
+
@service_empty_buckets_list.stubs(:service_request)
|
100
|
+
|
101
|
+
expected = "bucket_name"
|
102
|
+
actual = @service_empty_buckets_list.buckets.build("bucket_name")
|
103
|
+
assert_kind_of S3::Bucket, actual
|
104
|
+
assert_equal expected, actual.name
|
105
|
+
end
|
106
|
+
|
107
|
+
test "buckets find first" do
|
108
|
+
assert_nothing_raised do
|
109
|
+
actual = @service_buckets_list.buckets.find_first("data.example.com")
|
110
|
+
assert_equal "data.example.com", actual.name
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
test "buckets find first return nil" do
|
115
|
+
assert_equal nil, @service_bucket_not_exists.buckets.find_first("data2.example.com")
|
116
|
+
end
|
117
|
+
|
118
|
+
test "buckets find all on empty list" do
|
119
|
+
assert_nothing_raised do
|
120
|
+
expected = @buckets_empty_list
|
121
|
+
actual = @service_empty_buckets_list.buckets.find_all
|
122
|
+
assert_equal expected, actual
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
test "buckets find all" do
|
127
|
+
assert_nothing_raised do
|
128
|
+
expected = @buckets_list
|
129
|
+
actual = @service_buckets_list.buckets.find_all
|
130
|
+
assert_equal expected, actual
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,228 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class SignatureTest < Test::Unit::TestCase
|
4
|
+
# from http://docs.amazonwebservices.com/AmazonS3/latest/RESTAuthentication.html
|
5
|
+
test "signature for object get" do
|
6
|
+
request = Net::HTTP::Get.new("/photos/puppy.jpg")
|
7
|
+
request["host"] = "johnsmith.s3.amazonaws.com"
|
8
|
+
request["date"] = "Tue, 27 Mar 2007 19:36:42 +0000"
|
9
|
+
|
10
|
+
actual = S3::Signature.generate(
|
11
|
+
:host => request["host"],
|
12
|
+
:request => request,
|
13
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
14
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
15
|
+
)
|
16
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:xXjDGYUmKxnwqr5KXNPGldn5LbA="
|
17
|
+
assert_equal expected, actual
|
18
|
+
end
|
19
|
+
|
20
|
+
test "signature for object put" do
|
21
|
+
request = Net::HTTP::Put.new("/photos/puppy.jpg");
|
22
|
+
request["content-type"] = "image/jpeg"
|
23
|
+
request["content-length"] = "94328"
|
24
|
+
request["host"] = "johnsmith.s3.amazonaws.com"
|
25
|
+
request["date"] = "Tue, 27 Mar 2007 21:15:45 +0000"
|
26
|
+
|
27
|
+
actual = S3::Signature.generate(
|
28
|
+
:host => request["host"],
|
29
|
+
:request => request,
|
30
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
31
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
32
|
+
)
|
33
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:hcicpDDvL9SsO6AkvxqmIWkmOuQ="
|
34
|
+
assert_equal expected, actual
|
35
|
+
end
|
36
|
+
|
37
|
+
test "signature for list" do
|
38
|
+
request = Net::HTTP::Get.new("/?prefix=photos&max-keys=50&marker=puppy");
|
39
|
+
request["user-agent"] = "Mozilla/5.0"
|
40
|
+
request["host"] = "johnsmith.s3.amazonaws.com"
|
41
|
+
request["date"] = "Tue, 27 Mar 2007 19:42:41 +0000"
|
42
|
+
|
43
|
+
actual = S3::Signature.generate(
|
44
|
+
:host => request["host"],
|
45
|
+
:request => request,
|
46
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
47
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
48
|
+
)
|
49
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:jsRt/rhG+Vtp88HrYL706QhE4w4="
|
50
|
+
assert_equal expected, actual
|
51
|
+
end
|
52
|
+
|
53
|
+
test "signature for fetch" do
|
54
|
+
request = Net::HTTP::Get.new("/?acl");
|
55
|
+
request["host"] = "johnsmith.s3.amazonaws.com"
|
56
|
+
request["date"] = "Tue, 27 Mar 2007 19:44:46 +0000"
|
57
|
+
|
58
|
+
actual = S3::Signature.generate(
|
59
|
+
:host => request["host"],
|
60
|
+
:request => request,
|
61
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
62
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
63
|
+
)
|
64
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:thdUi9VAkzhkniLj96JIrOPGi0g="
|
65
|
+
assert_equal expected, actual
|
66
|
+
end
|
67
|
+
|
68
|
+
test "signature for delete" do
|
69
|
+
request = Net::HTTP::Delete.new("/johnsmith/photos/puppy.jpg");
|
70
|
+
request["user-agent"] = "dotnet"
|
71
|
+
request["host"] = "s3.amazonaws.com"
|
72
|
+
request["date"] = "Tue, 27 Mar 2007 21:20:27 +0000"
|
73
|
+
request["x-amz-date"] = "Tue, 27 Mar 2007 21:20:26 +0000"
|
74
|
+
|
75
|
+
actual = S3::Signature.generate(
|
76
|
+
:host => request["host"],
|
77
|
+
:request => request,
|
78
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
79
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
80
|
+
)
|
81
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:k3nL7gH3+PadhTEVn5Ip83xlYzk="
|
82
|
+
assert_equal expected, actual
|
83
|
+
end
|
84
|
+
|
85
|
+
test "signature for upload" do
|
86
|
+
request = Net::HTTP::Put.new("/db-backup.dat.gz");
|
87
|
+
request["user-agent"] = "curl/7.15.5"
|
88
|
+
request["host"] = "static.johnsmith.net:8080"
|
89
|
+
request["date"] = "Tue, 27 Mar 2007 21:06:08 +0000"
|
90
|
+
request["x-amz-acl"] = "public-read"
|
91
|
+
request["content-type"] = "application/x-download"
|
92
|
+
request["content-md5"] = "4gJE4saaMU4BqNR0kLY+lw=="
|
93
|
+
# FIXME: Net::HTTP doesn't allow to have multiple headers with the same name
|
94
|
+
# request.add_field add additional spaces (breaks signature)
|
95
|
+
#request["x-amz-meta-reviewedby"] = "joe@johnsmith.net"
|
96
|
+
#request["x-amz-meta-reviewedby"] = "jane@johnsmith.net"
|
97
|
+
request["x-amz-meta-reviewedby"] = "joe@johnsmith.net,jane@johnsmith.net"
|
98
|
+
request["x-amz-meta-filechecksum"] = "0x02661779"
|
99
|
+
request["x-amz-meta-checksumalgorithm"] = "crc32"
|
100
|
+
request["content-disposition"] = "attachment; filename=database.dat"
|
101
|
+
request["content-encoding"] = "gzip"
|
102
|
+
request["content-length"] = "5913339"
|
103
|
+
|
104
|
+
actual = S3::Signature.generate(
|
105
|
+
:host => "static.johnsmith.net",
|
106
|
+
:request => request,
|
107
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
108
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
109
|
+
)
|
110
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:C0FlOtU8Ylb9KDTpZqYkZPX91iI="
|
111
|
+
assert_equal expected, actual
|
112
|
+
end
|
113
|
+
|
114
|
+
test "signature for list all my buckets" do
|
115
|
+
request = Net::HTTP::Get.new("/");
|
116
|
+
request["host"] = "s3.amazonaws.com"
|
117
|
+
request["date"] = "Wed, 28 Mar 2007 01:29:59 +0000"
|
118
|
+
|
119
|
+
actual = S3::Signature.generate(
|
120
|
+
:host => request["host"],
|
121
|
+
:request => request,
|
122
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
123
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
124
|
+
)
|
125
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:Db+gepJSUbZKwpx1FR0DLtEYoZA="
|
126
|
+
assert_equal expected, actual
|
127
|
+
end
|
128
|
+
|
129
|
+
test "signature for unicode keys" do
|
130
|
+
request = Net::HTTP::Get.new("/dictionary/fran%C3%A7ais/pr%c3%a9f%c3%a8re");
|
131
|
+
request["host"] = "s3.amazonaws.com"
|
132
|
+
request["date"] = "Wed, 28 Mar 2007 01:49:49 +0000"
|
133
|
+
|
134
|
+
actual = S3::Signature.generate(
|
135
|
+
:host => request["host"],
|
136
|
+
:request => request,
|
137
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
138
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
139
|
+
)
|
140
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:dxhSBHoI6eVSPcXJqEghlUzZMnY="
|
141
|
+
assert_equal expected, actual
|
142
|
+
end
|
143
|
+
|
144
|
+
test "temporary signature for object get" do
|
145
|
+
actual = S3::Signature.generate_temporary_url_signature(
|
146
|
+
:bucket => "johnsmith",
|
147
|
+
:resource => "photos/puppy.jpg",
|
148
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o",
|
149
|
+
:expires_at => 1175046589
|
150
|
+
)
|
151
|
+
expected = "gs6xNznrLJ4Bd%2B1y9pcy2HOSVeg%3D"
|
152
|
+
assert_equal expected, actual
|
153
|
+
end
|
154
|
+
|
155
|
+
test "temporary signature for object get with non-unreserved URI characters" do
|
156
|
+
actual = S3::Signature.generate_temporary_url_signature(
|
157
|
+
:bucket => "johnsmith",
|
158
|
+
:resource => "photos/puppy[1].jpg",
|
159
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o",
|
160
|
+
:expires_at => 1175046589
|
161
|
+
)
|
162
|
+
expected = "gwCM0mVb9IrEPiUf8iaml6EISPc%3D"
|
163
|
+
assert_equal expected, actual
|
164
|
+
end
|
165
|
+
|
166
|
+
test "temporary signature for object post" do
|
167
|
+
actual = S3::Signature.generate_temporary_url_signature(
|
168
|
+
:bucket => "johnsmith",
|
169
|
+
:resource => "photos/puppy.jpg",
|
170
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o",
|
171
|
+
:expires_at => 1175046589,
|
172
|
+
:method => :post
|
173
|
+
)
|
174
|
+
expected = "duIzwO2KTEMIlbSYbFFS86Wj0LI%3D"
|
175
|
+
assert_equal expected, actual
|
176
|
+
end
|
177
|
+
|
178
|
+
test "temporary signature for object put with headers" do
|
179
|
+
actual = S3::Signature.generate_temporary_url_signature(
|
180
|
+
:bucket => "johnsmith",
|
181
|
+
:resource => "photos/puppy.jpg",
|
182
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o",
|
183
|
+
:expires_at => 1175046589,
|
184
|
+
:method => :put,
|
185
|
+
:headers => {'x-amz-acl' => 'public-read'}
|
186
|
+
)
|
187
|
+
expected = "SDMxjIkOKIVR47nWfJ57UNPXxFM%3D"
|
188
|
+
assert_equal expected, actual
|
189
|
+
end
|
190
|
+
|
191
|
+
test "temporary signature for object delete" do
|
192
|
+
actual = S3::Signature.generate_temporary_url_signature(
|
193
|
+
:bucket => "johnsmith",
|
194
|
+
:resource => "photos/puppy.jpg",
|
195
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o",
|
196
|
+
:expires_at => 1175046589,
|
197
|
+
:method => :delete
|
198
|
+
)
|
199
|
+
expected = "5Vg7A4HxgS6tVCYzBx%2BkMR8sztY%3D"
|
200
|
+
assert_equal expected, actual
|
201
|
+
end
|
202
|
+
|
203
|
+
test "temporary url for object get with bucket in the hostname" do
|
204
|
+
actual = S3::Signature.generate_temporary_url(
|
205
|
+
:bucket => "johnsmith",
|
206
|
+
:resource => "photos/puppy.jpg",
|
207
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o",
|
208
|
+
:expires_at => 1175046589,
|
209
|
+
:add_bucket_to_host => true
|
210
|
+
)
|
211
|
+
expected = "http://johnsmith.s3.amazonaws.com/photos/puppy.jpg?AWSAccessKeyId=&Expires=1175046589&Signature=gs6xNznrLJ4Bd%2B1y9pcy2HOSVeg%3D"
|
212
|
+
assert_equal expected, actual
|
213
|
+
end
|
214
|
+
|
215
|
+
test "temporary url for object put with headers" do
|
216
|
+
actual = S3::Signature.generate_temporary_url(
|
217
|
+
:bucket => "johnsmith",
|
218
|
+
:resource => "photos/puppy.jpg",
|
219
|
+
:access_key => '0PN5J17HBGZHT7JJ3X82',
|
220
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o",
|
221
|
+
:expires_at => 1175046589,
|
222
|
+
:method => :put,
|
223
|
+
:headers => {'x-amz-acl' => 'public-read'}
|
224
|
+
)
|
225
|
+
expected = "http://s3.amazonaws.com/johnsmith/photos/puppy.jpg?AWSAccessKeyId=0PN5J17HBGZHT7JJ3X82&Expires=1175046589&Signature=SDMxjIkOKIVR47nWfJ57UNPXxFM%3D"
|
226
|
+
assert_equal expected, actual
|
227
|
+
end
|
228
|
+
end
|