s33r 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.txt +9 -0
- data/MIT-LICENSE +21 -0
- data/README.txt +16 -0
- data/bin/config.yml +5 -0
- data/bin/s3cli.rb +96 -0
- data/lib/s33r.rb +7 -0
- data/lib/s33r/client.rb +188 -0
- data/lib/s33r/core.rb +131 -0
- data/lib/s33r/external/mimetypes.rb +1558 -0
- data/lib/s33r/list_bucket_result.rb +1 -0
- data/lib/s33r/named_bucket.rb +28 -0
- data/lib/s33r/net_http_overrides.rb +42 -0
- data/lib/s33r/s3_exception.rb +20 -0
- data/test/spec/spec_core.rb +87 -0
- metadata +61 -0
@@ -0,0 +1 @@
|
|
1
|
+
# TODO: parser to provide a tree representation of keys in a bucket
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module S3
|
2
|
+
# a client for dealing with a single bucket
|
3
|
+
class NamedBucket < Client
|
4
|
+
attr_accessor :bucket_name
|
5
|
+
|
6
|
+
# TODO: check bucket exists before setting it
|
7
|
+
# options available:
|
8
|
+
# :public_contents => true: all items put into bucket are made public
|
9
|
+
def initialize(aws_access_key, aws_secret_access_key, bucket_name, options={}, &block)
|
10
|
+
super(aws_access_key, aws_secret_access_key)
|
11
|
+
@bucket_name = bucket_name
|
12
|
+
@client_headers.merge!(canned_acl_header('public-read')) if options[:public_contents]
|
13
|
+
yield self if block_given?
|
14
|
+
end
|
15
|
+
|
16
|
+
def root
|
17
|
+
list_bucket(@bucket_name)
|
18
|
+
end
|
19
|
+
|
20
|
+
def put_text(string, resource_key, headers={})
|
21
|
+
super(string, @bucket_name, resource_key, headers)
|
22
|
+
end
|
23
|
+
|
24
|
+
def put_file(filename, resource_key=nil, headers={})
|
25
|
+
super(filename, @bucket_name, resource_key, headers)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
class Net::HTTPResponse
|
4
|
+
attr_accessor :success
|
5
|
+
|
6
|
+
def ok?
|
7
|
+
success
|
8
|
+
end
|
9
|
+
|
10
|
+
def success
|
11
|
+
response.is_a?(Net::HTTPOK)
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
body
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Net::HTTPGenericRequest
|
20
|
+
attr_accessor :chunk_size
|
21
|
+
|
22
|
+
private
|
23
|
+
def send_request_with_body_stream(sock, ver, path, f)
|
24
|
+
raise ArgumentError, "Content-Length not given and Transfer-Encoding is not `chunked'" unless content_length() or chunked?
|
25
|
+
unless content_type()
|
26
|
+
warn 'net/http: warning: Content-Type did not set; using application/x-www-form-urlencoded' if $VERBOSE
|
27
|
+
set_content_type 'application/x-www-form-urlencoded'
|
28
|
+
end
|
29
|
+
@chunk_size ||= 1024
|
30
|
+
write_header sock, ver, path
|
31
|
+
if chunked?
|
32
|
+
while s = f.read(@chunk_size)
|
33
|
+
sock.write(sprintf("%x\r\n", s.length) << s << "\r\n")
|
34
|
+
end
|
35
|
+
sock.write "0\r\n\r\n"
|
36
|
+
else
|
37
|
+
while s = f.read(@chunk_size)
|
38
|
+
sock.write s
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module S3
|
2
|
+
module S3Exception
|
3
|
+
|
4
|
+
class MethodNotAvailable < Exception
|
5
|
+
end
|
6
|
+
|
7
|
+
class MissingRequiredHeaders < Exception
|
8
|
+
end
|
9
|
+
|
10
|
+
class UnsupportedCannedACL < Exception
|
11
|
+
end
|
12
|
+
|
13
|
+
class UnsupportedHTTPMethod < Exception
|
14
|
+
end
|
15
|
+
|
16
|
+
class MalformedBucketName < Exception
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require_gem 'rspec'
|
3
|
+
|
4
|
+
require File.dirname(__FILE__) + '/../../lib/s33r.rb'
|
5
|
+
include S3
|
6
|
+
|
7
|
+
context 'S3 module' do
|
8
|
+
|
9
|
+
setup do
|
10
|
+
@for_request_method = 'PUT'
|
11
|
+
@for_request_path = "/quotes/nelson"
|
12
|
+
@for_request_headers = {
|
13
|
+
"Content-Md5" => "c8fdb181845a4ca6b8fec737b3581d76",
|
14
|
+
"Content-Type" => "text/html",
|
15
|
+
"Date" => "Thu, 17 Nov 2005 18:49:58 GMT",
|
16
|
+
"X-Amz-Meta-Author" => "foo@bar.com",
|
17
|
+
"X-Amz-Magic" => "abracadabra"
|
18
|
+
}
|
19
|
+
@with_access_key = '44CF9590006BF252F707'
|
20
|
+
@with_secret_access_key = 'OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV'
|
21
|
+
|
22
|
+
@for_incomplete_headers = @for_request_headers.clone.delete_if do |key,value|
|
23
|
+
'Content-Type' == key or 'Date' == key
|
24
|
+
end
|
25
|
+
|
26
|
+
@correct_canonical_string = "PUT\nc8fdb181845a4ca6b8fec737b3581d76\n" +
|
27
|
+
"text/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-amz-magic:abracadabra\n" +
|
28
|
+
"x-amz-meta-author:foo@bar.com\n/quotes/nelson"
|
29
|
+
@correct_signature = "jZNOcbfWmD/A/f3hSvVzXZjM2HU="
|
30
|
+
@correct_auth_header = "AWS #{@with_access_key}:#{@correct_signature}"
|
31
|
+
end
|
32
|
+
|
33
|
+
specify 'should generate correct canonical strings' do
|
34
|
+
generate_canonical_string(@for_request_method, @for_request_path,
|
35
|
+
@for_request_headers).should.equal @correct_canonical_string
|
36
|
+
end
|
37
|
+
|
38
|
+
specify 'should generate correct signatures' do
|
39
|
+
generate_signature(@with_secret_access_key,
|
40
|
+
@correct_canonical_string).should.equal @correct_signature
|
41
|
+
end
|
42
|
+
|
43
|
+
specify 'should generate correct auth headers' do
|
44
|
+
generate_auth_header_value(@for_request_method, @for_request_path, @for_request_headers,
|
45
|
+
@with_access_key, @with_secret_access_key).should.equal @correct_auth_header
|
46
|
+
end
|
47
|
+
|
48
|
+
specify 'should not generate auth header if bad HTTP method passed' do
|
49
|
+
lambda { generate_auth_header_value('duff', nil, nil, nil, nil) }.should.raise
|
50
|
+
S3Exception::MethodNotAvailable
|
51
|
+
end
|
52
|
+
|
53
|
+
specify 'should not generate auth header if required headers missing' do
|
54
|
+
lambda { generate_auth_header_value('PUT', '/', @for_incomplete_headers,
|
55
|
+
nil, nil) }.should.raise S3Exception::MissingRequiredHeaders
|
56
|
+
end
|
57
|
+
|
58
|
+
specify 'when generating auth header, should allow addition of Date and Content-Type headers' do
|
59
|
+
now = Time.now
|
60
|
+
|
61
|
+
fixed_headers = add_default_headers(@for_incomplete_headers, :date => now,
|
62
|
+
:content_type => 'text/html')
|
63
|
+
|
64
|
+
fixed_headers['Date'].should.equal now.httpdate
|
65
|
+
fixed_headers['Content-Type'].should.equal 'text/html'
|
66
|
+
end
|
67
|
+
|
68
|
+
specify 'should not generate canned ACL header if invalid canned ACL supplied' do
|
69
|
+
lambda { canned_acl_header('duff') }.should.raise
|
70
|
+
S3Exception::UnsupportedCannedACL
|
71
|
+
end
|
72
|
+
|
73
|
+
specify 'should correctly add canned ACL headers' do
|
74
|
+
new_headers = canned_acl_header('private', { 'Content-Type' => 'text/html' })
|
75
|
+
new_headers.should.have(2).keys
|
76
|
+
new_headers.keys.should.include 'Content-Type'
|
77
|
+
new_headers.keys.should.include 'x-amz-acl'
|
78
|
+
new_headers['x-amz-acl'].should.equal 'private'
|
79
|
+
end
|
80
|
+
|
81
|
+
specify 'should set sensible defaults for missing Content-Type and Date headers' do
|
82
|
+
fixed_headers = add_default_headers(@for_incomplete_headers)
|
83
|
+
fixed_headers['Content-Type'].should.equal ''
|
84
|
+
fixed_headers.include?('Date').should.not.be nil
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.11
|
3
|
+
specification_version: 1
|
4
|
+
name: s33r
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: "0.1"
|
7
|
+
date: 2006-07-25 00:00:00 +01:00
|
8
|
+
summary: A library for accessing Amazon S3
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: elliot@moochlabs.com/
|
12
|
+
homepage: http://moochlabs.com/
|
13
|
+
rubyforge_project:
|
14
|
+
description:
|
15
|
+
autorequire: s33r
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
authors:
|
29
|
+
- Elliot Smith
|
30
|
+
files:
|
31
|
+
- bin/s3cli.rb
|
32
|
+
- bin/config.yml
|
33
|
+
- lib/s33r
|
34
|
+
- lib/s33r.rb
|
35
|
+
- lib/s33r/external
|
36
|
+
- lib/s33r/client.rb
|
37
|
+
- lib/s33r/list_bucket_result.rb
|
38
|
+
- lib/s33r/net_http_overrides.rb
|
39
|
+
- lib/s33r/s3_exception.rb
|
40
|
+
- lib/s33r/core.rb
|
41
|
+
- lib/s33r/named_bucket.rb
|
42
|
+
- lib/s33r/external/mimetypes.rb
|
43
|
+
- test/spec
|
44
|
+
- test/spec/spec_core.rb
|
45
|
+
- LICENSE.txt
|
46
|
+
- README.txt
|
47
|
+
- MIT-LICENSE
|
48
|
+
test_files:
|
49
|
+
- test/spec/spec_core.rb
|
50
|
+
rdoc_options: []
|
51
|
+
|
52
|
+
extra_rdoc_files: []
|
53
|
+
|
54
|
+
executables: []
|
55
|
+
|
56
|
+
extensions: []
|
57
|
+
|
58
|
+
requirements: []
|
59
|
+
|
60
|
+
dependencies: []
|
61
|
+
|