happening 0.0.6 → 0.0.7
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.
- data/README.md +17 -0
- data/lib/happening/s3/item.rb +14 -2
- data/test/s3/item_test.rb +47 -0
- metadata +2 -2
data/README.md
CHANGED
@@ -90,6 +90,23 @@ Setting permissions looks like this:
|
|
90
90
|
item = Happening::S3::Item.new('bucket', 'item_id', :aws_access_key_id => 'Your-ID', :aws_secret_access_key => 'secret', :permissions => 'public-write')
|
91
91
|
item.get(:on_success => on_success, :on_error => on_error)
|
92
92
|
end
|
93
|
+
|
94
|
+
Custom headers:
|
95
|
+
|
96
|
+
EM.run do
|
97
|
+
on_error = Proc.new {|http| puts "An error occured: #{http.response_header.status}"; EM.stop }
|
98
|
+
on_success = Proc.new {|http| puts "the response is: #{http.response}"; EM.stop }
|
99
|
+
item = Happening::S3::Item.new('bucket', 'item_id', :aws_access_key_id => 'Your-ID', :aws_secret_access_key => 'secret', :permissions => 'public-write')
|
100
|
+
item.put(:on_success => on_success,
|
101
|
+
:on_error => on_error,
|
102
|
+
:headers => {
|
103
|
+
'Cache-Control' => "max-age=252460800",
|
104
|
+
'Content-Type' => 'text/html',
|
105
|
+
'Expires' => 'Fri, 16 Nov 2018 22:09:29 GMT',
|
106
|
+
'x-amz-meta-abc' => 'ABC'
|
107
|
+
})
|
108
|
+
end
|
109
|
+
|
93
110
|
|
94
111
|
Deleting
|
95
112
|
=============
|
data/lib/happening/s3/item.rb
CHANGED
@@ -6,6 +6,7 @@ module Happening
|
|
6
6
|
class Item
|
7
7
|
|
8
8
|
REQUIRED_FIELDS = [:server]
|
9
|
+
VALID_HEADERS = ['Cache-Control', 'Content-Disposition', 'Content-Encoding', 'Content-Length', 'Content-MD5', 'Content-Type', 'Expect', 'Expires']
|
9
10
|
|
10
11
|
attr_accessor :bucket, :aws_id, :options
|
11
12
|
|
@@ -34,8 +35,7 @@ module Happening
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def put(data, request_options = {}, &blk)
|
37
|
-
|
38
|
-
headers = needs_to_sign? ? aws.sign("PUT", path, permissions.update({'url' => path})) : {}
|
38
|
+
headers = construct_aws_headers('PUT', request_options.delete(:headers) || {})
|
39
39
|
request_options[:on_success] = blk if blk
|
40
40
|
request_options.update(:headers => headers, :data => data)
|
41
41
|
Happening::S3::Request.new(:put, url, request_options).execute
|
@@ -93,6 +93,18 @@ module Happening
|
|
93
93
|
def aws
|
94
94
|
@aws ||= Happening::AWS.new(options[:aws_access_key_id], options[:aws_secret_access_key])
|
95
95
|
end
|
96
|
+
|
97
|
+
def construct_aws_headers(http_method, headers = {})
|
98
|
+
unless headers.keys.all?{|header| VALID_HEADERS.include?(header) || header.to_s.match(/\Ax-amz-/) }
|
99
|
+
raise ArgumentError, "invalid headers. All headers must either one of #{VALID_HEADERS} or start with 'x-amz-'"
|
100
|
+
end
|
101
|
+
|
102
|
+
permissions = options[:permissions] != 'private' ? {'x-amz-acl' => options[:permissions] } : {}
|
103
|
+
headers.update(permissions)
|
104
|
+
headers.update({'url' => path})
|
105
|
+
|
106
|
+
headers = needs_to_sign? ? aws.sign(http_method, path, headers) : headers
|
107
|
+
end
|
96
108
|
|
97
109
|
end
|
98
110
|
end
|
data/test/s3/item_test.rb
CHANGED
@@ -329,6 +329,53 @@ class ItemTest < Test::Unit::TestCase
|
|
329
329
|
end
|
330
330
|
end
|
331
331
|
|
332
|
+
should "allow to set custom headers" do
|
333
|
+
EventMachine::MockHttpRequest.register('https://bucket.s3.amazonaws.com:443/the-key', :put, {
|
334
|
+
"Authorization"=>"AWS abc:wrPkGKrlwH2AtNzBVS80vU73TDc=",
|
335
|
+
'date' => @time,
|
336
|
+
'url' => "/bucket/the-key",
|
337
|
+
"x-amz-acl" => 'public-read',
|
338
|
+
'Cache-Control' => "max-age=252460800",
|
339
|
+
'Expires' => 'Fri, 16 Nov 2018 22:09:29 GMT',
|
340
|
+
'x-amz-meta-abc' => 'ABC'}, fake_response("data-here"))
|
341
|
+
|
342
|
+
@item = Happening::S3::Item.new('bucket', 'the-key', :aws_access_key_id => 'abc',
|
343
|
+
:aws_secret_access_key => '123' ,
|
344
|
+
:permissions => 'public-read')
|
345
|
+
run_in_em_loop do
|
346
|
+
@item.put('content', :headers => {
|
347
|
+
'Expires' => 'Fri, 16 Nov 2018 22:09:29 GMT',
|
348
|
+
'Cache-Control' => "max-age=252460800",
|
349
|
+
'x-amz-meta-abc' => 'ABC'})
|
350
|
+
|
351
|
+
EM.add_timer(1) {
|
352
|
+
EM.stop_event_loop
|
353
|
+
assert_equal 1, EventMachine::MockHttpRequest.count('https://bucket.s3.amazonaws.com:443/the-key', :put, {
|
354
|
+
"Authorization"=>"AWS abc:wrPkGKrlwH2AtNzBVS80vU73TDc=",
|
355
|
+
'date' => @time,
|
356
|
+
'url' => "/bucket/the-key",
|
357
|
+
'x-amz-acl' => 'public-read',
|
358
|
+
'Cache-Control' => "max-age=252460800",
|
359
|
+
'Expires' => 'Fri, 16 Nov 2018 22:09:29 GMT',
|
360
|
+
'x-amz-meta-abc' => 'ABC'})
|
361
|
+
}
|
362
|
+
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
should "validate the headers" do
|
367
|
+
|
368
|
+
@item = Happening::S3::Item.new('bucket', 'the-key', :aws_access_key_id => 'abc',
|
369
|
+
:aws_secret_access_key => '123' ,
|
370
|
+
:permissions => 'public-read')
|
371
|
+
|
372
|
+
assert_raise(ArgumentError) do
|
373
|
+
@item.put('content', :headers => {
|
374
|
+
'expires' => 'Fri, 16 Nov 2018 22:09:29 GMT',
|
375
|
+
'cache_control' => "max-age=252460800"})
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
332
379
|
should "re-post to a new location" do
|
333
380
|
EventMachine::MockHttpRequest.register('https://bucket.s3.amazonaws.com:443/the-key', :put, {
|
334
381
|
"Authorization"=>"AWS abc:lZMKxGDKcQ1PH8yjbpyN7o2sPWg=",
|