3scale_client 2.2.10 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/3scale_client.gemspec +3 -3
- data/README.rdoc +31 -1
- data/Rakefile +2 -2
- data/lib/3scale/client.rb +43 -0
- data/test/client_test.rb +55 -0
- data/test/remote_test.rb +17 -0
- metadata +15 -13
data/3scale_client.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{3scale_client}
|
5
|
-
s.version = "2.
|
5
|
+
s.version = "2.3.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = ["Adam Cigánek", "Tiago Macedo"]
|
9
|
-
s.description = %q{
|
8
|
+
s.authors = ["Adam Cigánek", "Tiago Macedo", "Joaquin Rivera Padron (joahking)"]
|
9
|
+
s.description = %q{Ruby client for 3scale platform. 3scale is an API Infrastructure service which handles API Keys, Rate Limiting, Analytics, Billing Payments and Developer Management. Includes a configurable API dashboard and developer portal CMS. More information at http://www.3scale.net/ or http://support.3scale.net/.
|
10
10
|
}
|
11
11
|
s.email = %q{adam@3scale.net tiago@3scale.net}
|
12
12
|
s.extra_rdoc_files = [
|
data/README.rdoc
CHANGED
@@ -21,7 +21,7 @@ and do a bundle install.
|
|
21
21
|
|
22
22
|
If you are using Rails' config.gems, put this into your config/environment.rb
|
23
23
|
|
24
|
-
config.gem '3scale_client
|
24
|
+
config.gem '3scale_client'
|
25
25
|
|
26
26
|
Otherwise, require the gem in whatever way is natural to your framework of choice.
|
27
27
|
|
@@ -33,6 +33,36 @@ First, create an instance of the client, giving it your provider API key:
|
|
33
33
|
|
34
34
|
Because the object is stateless, you can create just one and store it globally.
|
35
35
|
|
36
|
+
==== Authrep
|
37
|
+
|
38
|
+
Authrep is a 'one-shot' operation to authorize an application and report the associated transaction at the same time.
|
39
|
+
The main difference between this call and the regular authorize call is that usage will be reported if the authorization is successful. Read more about authrep at the [active docs page on the 3scale's support site](https://support.3scale.net/reference/activedocs#operation/66)
|
40
|
+
|
41
|
+
You can make request to this backend operation like this:
|
42
|
+
|
43
|
+
response = client.authrep(:app_id => "the app id", :app_key => "the app key")
|
44
|
+
|
45
|
+
Then call the +success?+ method on the returned object to see if the authorization was
|
46
|
+
successful.
|
47
|
+
|
48
|
+
if response.success?
|
49
|
+
# All fine, the usage will be reported automatically. Proceeed.
|
50
|
+
else
|
51
|
+
# Something's wrong with this application.
|
52
|
+
end
|
53
|
+
|
54
|
+
The example is using the app_id authentication pattern, but you can also use other patterns.
|
55
|
+
|
56
|
+
=== Using Varnish to speed up things
|
57
|
+
|
58
|
+
3scale provides a [varnish module](https://github.com/3scale/libvmod-3scale) to cache the responses of its backend to help you achieve a close to zero latency. Go and install the module and [configure it the easy way](https://github.com/3scale/libvmod-3scale/blob/master/vcl/default_3scale_simple.vcl)
|
59
|
+
|
60
|
+
When that's done all you have to do is to initialize your 3scale client pointing to the location of your varnish, by passing the host parameter to it, like this:
|
61
|
+
|
62
|
+
client = ThreeScale::Client.new(:provider_key => "your provider key", :host => "your.varnish.net:8080")
|
63
|
+
|
64
|
+
that's it, your API should now be authorized and reported for you, and all that at full speed.
|
65
|
+
|
36
66
|
=== Authorize
|
37
67
|
|
38
68
|
To authorize an application, call the +authorize+ method passing it the application's id and
|
data/Rakefile
CHANGED
@@ -33,9 +33,9 @@ begin
|
|
33
33
|
gemspec.description = <<END
|
34
34
|
This gem allows to easily connect an application that provides a Web Service with the 3scale API Management System to authorize it's users and report the usage.
|
35
35
|
END
|
36
|
-
gemspec.email = '
|
36
|
+
gemspec.email = 'support@3scale.net'
|
37
37
|
gemspec.homepage = 'http://www.3scale.net'
|
38
|
-
gemspec.authors = ['Adam Cigánek']
|
38
|
+
gemspec.authors = ['Adam Cigánek', 'Tiago Macedo', 'Joaquin Rivera Padron (joahking)']
|
39
39
|
|
40
40
|
gemspec.add_dependency 'nokogiri'
|
41
41
|
end
|
data/lib/3scale/client.rb
CHANGED
@@ -51,6 +51,49 @@ module ThreeScale
|
|
51
51
|
attr_reader :provider_key
|
52
52
|
attr_reader :host
|
53
53
|
|
54
|
+
# Authorize and report an application.
|
55
|
+
# TODO (in the mean time read authorize comments or head over to https://support.3scale.net/reference/activedocs#operation/66 for details
|
56
|
+
#
|
57
|
+
def authrep(options)
|
58
|
+
path = "/transactions/authrep.xml?provider_key=#{CGI.escape(provider_key)}"
|
59
|
+
|
60
|
+
options_usage = options.delete :usage
|
61
|
+
options_log = options.delete :log
|
62
|
+
|
63
|
+
options.each_pair do |param, value|
|
64
|
+
path += "&#{param}=#{CGI.escape(value.to_s)}"
|
65
|
+
end
|
66
|
+
|
67
|
+
options_usage ||= {:hits => 1}
|
68
|
+
usage = []
|
69
|
+
options_usage.each_pair do |metric, value|
|
70
|
+
escaped_metric = CGI.escape "[usage][#{metric}]"
|
71
|
+
usage << "#{escaped_metric}=#{CGI.escape(value.to_s)}"
|
72
|
+
end
|
73
|
+
path += "&#{usage.join('&')}"
|
74
|
+
|
75
|
+
if options_log
|
76
|
+
log = []
|
77
|
+
options_log.each_pair do |key, value|
|
78
|
+
escaped_key = CGI.escape "[log][#{key}]"
|
79
|
+
log << "#{escaped_key}=#{CGI.escape(value)}"
|
80
|
+
end
|
81
|
+
path += "&#{log.join('&')}"
|
82
|
+
end
|
83
|
+
|
84
|
+
uri = URI.parse("http://#{host}#{path}")
|
85
|
+
http_response = Net::HTTP.get_response(uri)
|
86
|
+
|
87
|
+
case http_response
|
88
|
+
when Net::HTTPSuccess,Net::HTTPConflict
|
89
|
+
build_authorize_response(http_response.body)
|
90
|
+
when Net::HTTPClientError
|
91
|
+
build_error_response(http_response.body)
|
92
|
+
else
|
93
|
+
raise ServerError.new(http_response)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
54
97
|
# Report transaction(s).
|
55
98
|
#
|
56
99
|
# == Parameters
|
data/test/client_test.rb
CHANGED
@@ -25,6 +25,41 @@ class ThreeScale::ClientTest < Test::Unit::TestCase
|
|
25
25
|
assert_equal 'su1.3scale.net', client.host
|
26
26
|
end
|
27
27
|
|
28
|
+
def test_custom_host
|
29
|
+
client = ThreeScale::Client.new(:provider_key => '1234abcd', :host => "example.com")
|
30
|
+
|
31
|
+
assert_equal 'example.com', client.host
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_authrep_usage_is_encoded
|
35
|
+
assert_authrep_url_with_params "&%5Busage%5D%5Bmethod%5D=666"
|
36
|
+
|
37
|
+
@client.authrep({:usage => {:method=> 666}})
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_authrep_usage_values_are_encoded
|
41
|
+
assert_authrep_url_with_params "&%5Busage%5D%5Bhits%5D=%230"
|
42
|
+
|
43
|
+
@client.authrep({:usage => {:hits => "#0"}})
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_authrep_usage_defaults_to_hits_1
|
47
|
+
assert_authrep_url_with_params "&%5Busage%5D%5Bhits%5D=1"
|
48
|
+
|
49
|
+
@client.authrep({})
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_authrep_supports_app_id_app_key_auth_mode
|
53
|
+
assert_authrep_url_with_params "&app_id=appid&app_key=appkey&%5Busage%5D%5Bhits%5D=1"
|
54
|
+
|
55
|
+
@client.authrep(:app_id => "appid", :app_key => "appkey")
|
56
|
+
end
|
57
|
+
|
58
|
+
#TODO these authrep tests
|
59
|
+
def test_authrep_supports_api_key_auth_mode; end
|
60
|
+
def test_authrep_log_is_encoded;end
|
61
|
+
def test_authrep_passes_all_params_to_backend;end
|
62
|
+
|
28
63
|
def test_successful_authorize
|
29
64
|
body = '<status>
|
30
65
|
<authorized>true</authorized>
|
@@ -303,4 +338,24 @@ class ThreeScale::ClientTest < Test::Unit::TestCase
|
|
303
338
|
@client.report({:app_id => 'foo', :usage => {'hits' => 1}})
|
304
339
|
end
|
305
340
|
end
|
341
|
+
|
342
|
+
private
|
343
|
+
|
344
|
+
#OPTIMIZE this tricky test helper relies on fakeweb catching the urls requested by the client
|
345
|
+
# it is brittle: it depends in the correct order or params in the url
|
346
|
+
#
|
347
|
+
def assert_authrep_url_with_params(str)
|
348
|
+
authrep_url = "http://#{@host}/transactions/authrep.xml?provider_key=#{@client.provider_key}"
|
349
|
+
params = str # unless str.scan(/log/)
|
350
|
+
params << "&%5Busage%5D%5Bhits%5D=1" unless params.scan(/usage.*hits/)
|
351
|
+
parsed_authrep_url = URI.parse(authrep_url + params)
|
352
|
+
# set to have the client working
|
353
|
+
body = '<status>
|
354
|
+
<authorized>true</authorized>
|
355
|
+
<plan>Ultimate</plan>
|
356
|
+
</status>'
|
357
|
+
|
358
|
+
# this is the actual assertion, if fakeweb raises the client is submiting with wrong params
|
359
|
+
FakeWeb.register_uri(:get, parsed_authrep_url, :status => ['200', 'OK'], :body => body)
|
360
|
+
end
|
306
361
|
end
|
data/test/remote_test.rb
CHANGED
@@ -21,6 +21,23 @@ if ENV['TEST_3SCALE_PROVIDER_KEY'] &&
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
def test_successful_authrep
|
25
|
+
@app_keys.each do |app_key|
|
26
|
+
response = @client.authrep(:app_id => @app_ids[0], :app_key => app_key,
|
27
|
+
:usage => {:hits => 2},
|
28
|
+
:log => {:request => "a/a", :response => "b/b", :code => "c/c"})
|
29
|
+
assert response.success?, "AuthRep should succeed for app_id=#{@app_ids[0]} and app_key=#{app_key}, but it failed with: '#{response.error_message}'"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
def test_failed_authrep
|
35
|
+
response = @client.authrep(:app_id => 'invalid-id')
|
36
|
+
assert !response.success?
|
37
|
+
assert_equal 'application_not_found', response.error_code
|
38
|
+
assert_equal 'application with id="invalid-id" was not found', response.error_message
|
39
|
+
end
|
40
|
+
|
24
41
|
def test_successful_authorize
|
25
42
|
@app_keys.each do |app_key|
|
26
43
|
response = @client.authorize(:app_id => @app_ids[0], :app_key => app_key)
|
metadata
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: 3scale_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Adam Cigánek
|
9
9
|
- Tiago Macedo
|
10
|
+
- Joaquin Rivera Padron (joahking)
|
10
11
|
autorequire:
|
11
12
|
bindir: bin
|
12
13
|
cert_chain: []
|
13
|
-
date: 2012-
|
14
|
+
date: 2012-08-22 00:00:00.000000000 Z
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: nokogiri
|
17
|
-
requirement: &
|
18
|
+
requirement: &20757120 !ruby/object:Gem::Requirement
|
18
19
|
none: false
|
19
20
|
requirements:
|
20
21
|
- - ! '>='
|
@@ -22,10 +23,10 @@ dependencies:
|
|
22
23
|
version: '0'
|
23
24
|
type: :runtime
|
24
25
|
prerelease: false
|
25
|
-
version_requirements: *
|
26
|
+
version_requirements: *20757120
|
26
27
|
- !ruby/object:Gem::Dependency
|
27
28
|
name: fakeweb
|
28
|
-
requirement: &
|
29
|
+
requirement: &20756740 !ruby/object:Gem::Requirement
|
29
30
|
none: false
|
30
31
|
requirements:
|
31
32
|
- - ! '>='
|
@@ -33,10 +34,10 @@ dependencies:
|
|
33
34
|
version: '0'
|
34
35
|
type: :development
|
35
36
|
prerelease: false
|
36
|
-
version_requirements: *
|
37
|
+
version_requirements: *20756740
|
37
38
|
- !ruby/object:Gem::Dependency
|
38
39
|
name: jeweler
|
39
|
-
requirement: &
|
40
|
+
requirement: &20756260 !ruby/object:Gem::Requirement
|
40
41
|
none: false
|
41
42
|
requirements:
|
42
43
|
- - ! '>='
|
@@ -44,10 +45,10 @@ dependencies:
|
|
44
45
|
version: '0'
|
45
46
|
type: :development
|
46
47
|
prerelease: false
|
47
|
-
version_requirements: *
|
48
|
+
version_requirements: *20756260
|
48
49
|
- !ruby/object:Gem::Dependency
|
49
50
|
name: mocha
|
50
|
-
requirement: &
|
51
|
+
requirement: &20773160 !ruby/object:Gem::Requirement
|
51
52
|
none: false
|
52
53
|
requirements:
|
53
54
|
- - ! '>='
|
@@ -55,10 +56,11 @@ dependencies:
|
|
55
56
|
version: '0'
|
56
57
|
type: :development
|
57
58
|
prerelease: false
|
58
|
-
version_requirements: *
|
59
|
-
description: ! '
|
60
|
-
|
61
|
-
|
59
|
+
version_requirements: *20773160
|
60
|
+
description: ! 'Ruby client for 3scale platform. 3scale is an API Infrastructure service
|
61
|
+
which handles API Keys, Rate Limiting, Analytics, Billing Payments and Developer
|
62
|
+
Management. Includes a configurable API dashboard and developer portal CMS. More
|
63
|
+
information at http://www.3scale.net/ or http://support.3scale.net/.
|
62
64
|
|
63
65
|
'
|
64
66
|
email: adam@3scale.net tiago@3scale.net
|