gstore 0.1.0 → 0.2.0
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.textile +31 -2
- data/lib/gstore.rb +1 -1
- data/lib/gstore/client.rb +14 -10
- data/lib/gstore/object.rb +2 -2
- data/lib/gstore/request.rb +20 -8
- metadata +2 -2
data/README.textile
CHANGED
@@ -12,7 +12,7 @@ Visit "The Google Storage Key Manager":https://sandbox.google.com/storage/m/mana
|
|
12
12
|
|
13
13
|
In your code just: <code>require 'gstore'</code>
|
14
14
|
|
15
|
-
h2.
|
15
|
+
h2. Basic Examples
|
16
16
|
|
17
17
|
Create an instance of the client with your credentials:
|
18
18
|
|
@@ -50,4 +50,33 @@ client.get_object('my_unique_bucket', 'my_first_object', :outfile => 'retrieved_
|
|
50
50
|
|
51
51
|
# Delete an object from the bucket
|
52
52
|
client.delete_object('my_unique_bucket', 'my_first_object')
|
53
|
-
</code></pre>
|
53
|
+
</code></pre>
|
54
|
+
|
55
|
+
h2. Advanced Examples
|
56
|
+
|
57
|
+
h3. Query parameters
|
58
|
+
|
59
|
+
For certain requests like <code>get_bucket('my_unique_bucket')</code> you can specify query parameters like <code>max-keys</code>, <code>prefix</code>, <code>delimiter</code> and <code>marker</code> (see "The Google Developer Guide":http://code.google.com/apis/storage/docs/developer-guide.html) for more information.
|
60
|
+
|
61
|
+
Here's an example with gstore:
|
62
|
+
|
63
|
+
<pre><code>client.get_bucket('my_unique_bucket', :params => {:max_keys => 2, :prefix => 'backup'})
|
64
|
+
</code></pre>
|
65
|
+
|
66
|
+
* <code>max_keys</code> is converted to <code>max-keys</code> so you can use the ruby symbol without quotes. <code>:"max-keys"</code> and <code>"max-keys"</code> also work
|
67
|
+
|
68
|
+
h3. Access Control
|
69
|
+
|
70
|
+
Here is how you retrieve the ACL for a bucket or object:
|
71
|
+
|
72
|
+
<pre><code>client.get_bucket('my_unique_bucket', :params => {:acl => ''})
|
73
|
+
client.get_bucket('my_unique_bucket', 'my_first_object', :params => {:acl => ''})
|
74
|
+
</pre></code>
|
75
|
+
|
76
|
+
To create a bucket or object with one of the pre-defined ACL's:
|
77
|
+
|
78
|
+
<pre><code>client.create_bucket('my_public_bucket', :headers => {:x_goog_acl => 'public-read'})
|
79
|
+
client.create_object('my_public_bucket', 'my_public_object', :headers => {:x_goog_acl => 'public-read-write'})
|
80
|
+
</code></pre>
|
81
|
+
|
82
|
+
* <code>x_goog_acl</code> is converted to <code>x-goog-acl</code> so you can use the ruby symbol without quotes. <code>:"x-goog-acl"</code> and <code>"x-goog-acl"</code> also work
|
data/lib/gstore.rb
CHANGED
data/lib/gstore/client.rb
CHANGED
@@ -14,26 +14,30 @@ module GStore
|
|
14
14
|
|
15
15
|
private
|
16
16
|
|
17
|
-
def get(bucket, path,
|
18
|
-
_http_request(Net::HTTP::Get, bucket, path,
|
17
|
+
def get(bucket, path, options={})
|
18
|
+
_http_request(Net::HTTP::Get, bucket, path, options)
|
19
19
|
end
|
20
20
|
|
21
|
-
def put(bucket, path,
|
22
|
-
_http_request(Net::HTTP::Put, bucket, path,
|
21
|
+
def put(bucket, path, options={})
|
22
|
+
_http_request(Net::HTTP::Put, bucket, path, options)
|
23
23
|
end
|
24
24
|
|
25
|
-
def delete(bucket, path,
|
26
|
-
_http_request(Net::HTTP::Delete, bucket, path,
|
25
|
+
def delete(bucket, path, options={})
|
26
|
+
_http_request(Net::HTTP::Delete, bucket, path, options)
|
27
27
|
end
|
28
28
|
|
29
|
-
def head(bucket, path,
|
30
|
-
_http_request(Net::HTTP::Head, bucket, path,
|
29
|
+
def head(bucket, path, options={})
|
30
|
+
_http_request(Net::HTTP::Head, bucket, path, options)
|
31
31
|
end
|
32
32
|
|
33
|
-
def _http_request(method, bucket, path,
|
33
|
+
def _http_request(method, bucket, path, options={})
|
34
34
|
host = @host
|
35
35
|
host = "#{bucket}.#{@host}" if bucket
|
36
|
-
|
36
|
+
params = options.delete(:params) || {}
|
37
|
+
headers = options.delete(:headers) || {}
|
38
|
+
params[:"max-keys"] = params.delete(:max_keys) if params and params[:max_keys]
|
39
|
+
headers[:"x-goog-acl"] = headers.delete(:x_goog_acl) if headers and headers[:x_goog_acl]
|
40
|
+
signed_request(method, host, path, params, headers, options)
|
37
41
|
end
|
38
42
|
|
39
43
|
end
|
data/lib/gstore/object.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module GStore
|
2
2
|
class Client
|
3
|
-
def put_object(bucket, filename,
|
4
|
-
put(bucket, "/#{filename}", options
|
3
|
+
def put_object(bucket, filename, options={})
|
4
|
+
put(bucket, "/#{filename}", options)
|
5
5
|
end
|
6
6
|
|
7
7
|
def get_object(bucket, filename, options={})
|
data/lib/gstore/request.rb
CHANGED
@@ -9,7 +9,7 @@ require 'cgi'
|
|
9
9
|
module GStore
|
10
10
|
class Client
|
11
11
|
|
12
|
-
def signed_request(method, host, path, params={}, options={})
|
12
|
+
def signed_request(method, host, path, params={}, headers={}, options={})
|
13
13
|
|
14
14
|
if @debug
|
15
15
|
puts
|
@@ -17,21 +17,24 @@ module GStore
|
|
17
17
|
puts "***** HOST: #{host}"
|
18
18
|
puts "***** PATH: #{path}"
|
19
19
|
puts "***** PARAMS: #{params.inspect}"
|
20
|
+
puts "***** HEADERS: #{headers.inspect}"
|
20
21
|
puts "***** OPTIONS: #{options.inspect}"
|
21
22
|
puts
|
22
23
|
end
|
23
24
|
|
24
|
-
headers
|
25
|
+
headers.merge!({
|
25
26
|
:Host => host,
|
26
|
-
:Date => Time.now.utc.strftime('%a, %d %b %Y %H:%M:%S -0000')
|
27
|
-
:"Content-Type" => 'text/plain',
|
27
|
+
:Date => Time.now.utc.strftime('%a, %d %b %Y %H:%M:%S -0000')
|
28
28
|
#:"Content-MD5" => ''
|
29
|
-
}
|
29
|
+
})
|
30
|
+
|
30
31
|
if options[:data]
|
31
32
|
headers = headers.merge(:"Content-Length" => options[:data].size)
|
32
33
|
else
|
33
34
|
headers = headers.merge(:"Content-Length" => 0)
|
34
35
|
end
|
36
|
+
headers[:"Content-Type"] ||= 'text/plain'
|
37
|
+
|
35
38
|
|
36
39
|
bucket = nil
|
37
40
|
if host =~ /(\S+).#{@host}/
|
@@ -42,10 +45,16 @@ module GStore
|
|
42
45
|
'' + "\n" + # Content-MD5
|
43
46
|
headers[:"Content-Type"] + "\n" + # Content-Type
|
44
47
|
headers[:Date] + "\n" # Date
|
48
|
+
headers.each do |key,value|
|
49
|
+
if key.to_s =~ /^x-goog/
|
50
|
+
canonical_headers += "#{key}:#{value}\n"
|
51
|
+
end
|
52
|
+
end
|
45
53
|
|
46
54
|
canonical_resource = ""
|
47
55
|
canonical_resource += "/#{bucket}" if bucket
|
48
56
|
canonical_resource += path
|
57
|
+
canonical_resource += '?acl' if params[:acl]
|
49
58
|
|
50
59
|
authorization = 'GOOG1 ' + @access_key + ':' + sign((canonical_headers + canonical_resource).toutf8)
|
51
60
|
|
@@ -71,15 +80,17 @@ module GStore
|
|
71
80
|
def _http_do(method, host, path, params, headers, data=nil)
|
72
81
|
http = Net::HTTP.new(host, 443)
|
73
82
|
http.use_ssl = true
|
83
|
+
http.set_debug_output $stderr if @debug
|
84
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
74
85
|
|
75
86
|
http.start do
|
76
|
-
req = method.new(path)
|
87
|
+
req = method.new(path + params)
|
77
88
|
req.content_type = 'application/x-www-form-urlencoded'
|
78
89
|
req['User-Agent'] = "moomerman-gstore-gem"
|
79
90
|
headers.each do |key, value|
|
80
91
|
req[key.to_s] = value
|
81
92
|
end
|
82
|
-
|
93
|
+
|
83
94
|
response = http.request(req, data)
|
84
95
|
|
85
96
|
return response.body
|
@@ -87,12 +98,13 @@ module GStore
|
|
87
98
|
end
|
88
99
|
|
89
100
|
def params_to_request_string(params)
|
101
|
+
return "" if params.empty?
|
90
102
|
sorted_params = params.sort {|x,y| x[0].to_s <=> y[0].to_s}
|
91
103
|
escaped_params = sorted_params.collect do |p|
|
92
104
|
encoded = (CGI::escape(p[0].to_s) + "=" + CGI::escape(p[1].to_s))
|
93
105
|
encoded.gsub('+', '%20')
|
94
106
|
end
|
95
|
-
escaped_params.join('&')
|
107
|
+
"?#{escaped_params.join('&')}"
|
96
108
|
end
|
97
109
|
end
|
98
110
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gstore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Taylor
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-06-
|
12
|
+
date: 2010-06-16 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|