appoxy_api 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/lib/api/client.rb CHANGED
@@ -1,82 +1,90 @@
1
1
  module Appoxy
2
- module Api
2
+ module Api
3
3
 
4
- require 'rest_client'
4
+ require 'rest_client'
5
5
 
6
- # Subclass must define:
7
- # host: endpoint url for service
8
- class Client
6
+ # Subclass must define:
7
+ # host: endpoint url for service
8
+ class Client
9
9
 
10
- attr_accessor :host, :access_key, :secret_key
10
+ @@logger = Logger.new(STDOUT)
11
+ @@logger.level = Logger::INFO
11
12
 
13
+ def self.logger
14
+ @@logger
15
+ end
12
16
 
13
- def initialize(host, access_key, secret_key, options={})
14
- @host = host
15
- @access_key = access_key
16
- @secret_key = secret_key
17
- end
17
+ attr_accessor :host, :access_key, :secret_key
18
18
 
19
19
 
20
- def get(method, params={}, options={})
21
- begin
20
+ def initialize(host, access_key, secret_key, options={})
21
+ @host = host
22
+ @access_key = access_key
23
+ @secret_key = secret_key
24
+ end
25
+
26
+
27
+ def get(method, params={}, options={})
28
+ begin
22
29
  # ClientHelper.run_http(host, access_key, secret_key, :get, method, nil, params)
23
- parse_response RestClient.get(append_params(url(method), add_params(method, params)), headers)
24
- rescue RestClient::BadRequest => ex
30
+ parse_response RestClient.get(append_params(url(method), add_params(method, params)), headers), options
31
+ rescue RestClient::BadRequest => ex
25
32
  # puts ex.http_body
26
- raise "Bad Request: " + ActiveSupport::JSON.decode(ex.http_body)["msg"].to_s
27
- end
28
- end
33
+ raise "Bad Request: " + ActiveSupport::JSON.decode(ex.http_body)["msg"].to_s
34
+ end
35
+
36
+ end
29
37
 
30
38
 
31
- def post(method, params={}, options={})
32
- begin
33
- parse_response RestClient.post(url(method), add_params(method, params).to_json, headers)
34
- #ClientHelper.run_http(host, access_key, secret_key, :post, method, nil, params)
35
- rescue RestClient::BadRequest => ex
39
+ def post(method, params={}, options={})
40
+ begin
41
+ parse_response RestClient.post(url(method), add_params(method, params).to_json, headers), options
42
+ #ClientHelper.run_http(host, access_key, secret_key, :post, method, nil, params)
43
+ rescue RestClient::BadRequest => ex
36
44
  # puts ex.http_body
37
- raise "Bad Request: " + ActiveSupport::JSON.decode(ex.http_body)["msg"].to_s
38
- end
45
+ raise "Bad Request: " + ActiveSupport::JSON.decode(ex.http_body)["msg"].to_s
46
+ end
39
47
 
40
- end
48
+ end
41
49
 
42
50
 
43
- def put(method, body, options={})
44
- begin
45
- parse_response RestClient.put(url(method), add_params(method, body).to_json, headers)
46
- #ClientHelper.run_http(host, access_key, secret_key, :put, method, body, nil)
47
- rescue RestClient::BadRequest => ex
51
+ def put(method, body, options={})
52
+ begin
53
+ parse_response RestClient.put(url(method), add_params(method, body).to_json, headers), options
54
+ #ClientHelper.run_http(host, access_key, secret_key, :put, method, body, nil)
55
+ rescue RestClient::BadRequest => ex
48
56
  # puts ex.http_body
49
- raise "Bad Request: " + ActiveSupport::JSON.decode(ex.http_body)["msg"].to_s
50
- end
51
- end
57
+ raise "Bad Request: " + ActiveSupport::JSON.decode(ex.http_body)["msg"].to_s
58
+ end
59
+ end
52
60
 
53
61
 
54
- def delete(method, params={}, options={})
55
- begin
56
- parse_response RestClient.delete(append_params(url(method), add_params(method, params)))
57
- rescue RestClient::BadRequest => ex
58
- raise "Bad Request: " + ActiveSupport::JSON.decode(ex.http_body)["msg"].to_s
59
- end
60
- end
62
+ def delete(method, params={}, options={})
63
+ begin
64
+ parse_response RestClient.delete(append_params(url(method), add_params(method, params))), options
65
+ rescue RestClient::BadRequest => ex
66
+ raise "Bad Request: " + ActiveSupport::JSON.decode(ex.http_body)["msg"].to_s
67
+ end
68
+ end
61
69
 
62
70
 
63
- def url(command_path)
64
- url = host + command_path
65
- url
66
- end
71
+ def url(command_path)
72
+ url = host + command_path
73
+ url
74
+ end
67
75
 
68
- # old way
69
- def add_params(command_path, hash)
70
- ts = Appoxy::Api::Signatures.generate_timestamp(Time.now.gmtime)
71
- # puts 'timestamp = ' + ts
72
- sig = Appoxy::Api::Signatures.generate_signature(command_path, ts, secret_key)
76
+ # old way
77
+ def add_params(command_path, hash)
78
+ ts = Appoxy::Api::Signatures.generate_timestamp(Time.now.gmtime)
79
+ # puts 'timestamp = ' + ts
80
+ sig = Appoxy::Api::Signatures.generate_signature(command_path, ts, secret_key)
73
81
 
74
- extra_params = {'sigv'=>"0.1", 'sig' => sig, 'timestamp' => ts, 'access_key' => access_key}
75
- hash.merge!(extra_params)
82
+ extra_params = {'sigv'=>"0.1", 'sig' => sig, 'timestamp' => ts, 'access_key' => access_key}
83
+ hash.merge!(extra_params)
76
84
 
77
- end
85
+ end
78
86
 
79
- # new way
87
+ # new way
80
88
  # def add_params(command_path, hash)
81
89
  # ts = Appoxy::Api::Signatures.generate_timestamp(Time.now.gmtime)
82
90
  # #p "hash_to s" + command_path + Appoxy::Api::Signatures.hash_to_s(hash)
@@ -87,35 +95,39 @@ module Appoxy
87
95
  # end
88
96
 
89
97
 
90
- def append_params(host, params)
91
- host += "?"
92
- i = 0
93
- params.each_pair do |k, v|
94
- host += "&" if i > 0
95
- host += k + "=" + CGI.escape(v)
96
- i+=1
97
- end
98
- return host
99
- end
100
-
101
-
102
- def headers
103
- user_agent = "Appoxy API Ruby Client"
104
- headers = {'User-Agent' => user_agent}
105
- end
106
-
107
-
108
- def parse_response(response)
109
- begin
110
- return ActiveSupport::JSON.decode(response.to_s)
111
- rescue => ex
112
- puts 'response that caused error = ' + response.to_s
113
- raise ex
114
- end
115
- end
116
-
117
-
98
+ def append_params(host, params)
99
+ host += "?"
100
+ i = 0
101
+ params.each_pair do |k, v|
102
+ host += "&" if i > 0
103
+ host += k + "=" + CGI.escape(v)
104
+ i +=1
105
+ end
106
+ return host
107
+ end
108
+
109
+
110
+ def headers
111
+ user_agent = "Appoxy API Ruby Client"
112
+ headers = {'User-Agent' => user_agent}
113
+ end
114
+
115
+
116
+ def parse_response(response, options={})
117
+ unless options[:parse] == false
118
+ begin
119
+ return ActiveSupport::JSON.decode(response.to_s)
120
+ rescue => ex
121
+ puts 'response that caused error = ' + response.to_s
122
+ raise ex
123
+ end
124
+ else
125
+ response
118
126
  end
127
+ end
128
+
119
129
 
120
130
  end
131
+
132
+ end
121
133
  end
@@ -1,32 +1,32 @@
1
1
  module Appoxy
2
- module Api
2
+ module Api
3
3
 
4
- require 'rest_client'
4
+ require 'rest_client'
5
5
 
6
- module ClientHelper
6
+ module ClientHelper
7
7
 
8
8
 
9
- end
9
+ end
10
10
 
11
- class ClientError < StandardError
11
+ class ClientError < StandardError
12
12
 
13
- attr_reader :response_hash
13
+ attr_reader :response_hash
14
14
 
15
- def initialize(class_name, response_hash)
16
- puts 'response-hash=' + response_hash.inspect
17
- super("#{class_name} - #{response_hash["msg"]}")
18
- @response_hash = response_hash
19
- end
20
- end
15
+ def initialize(class_name, response_hash)
16
+ puts 'response-hash=' + response_hash.inspect
17
+ super("#{class_name} - #{response_hash["msg"]}")
18
+ @response_hash = response_hash
19
+ end
20
+ end
21
21
 
22
- class ServiceError < StandardError
23
- attr_reader :body
22
+ class ServiceError < StandardError
23
+ attr_reader :body
24
24
 
25
- def initialize(class_name, body)
26
- super("#{class_name}")
27
- @body = body
25
+ def initialize(class_name, body)
26
+ super("#{class_name}")
27
+ @body = body
28
28
 
29
- end
30
- end
29
+ end
31
30
  end
31
+ end
32
32
  end
@@ -1,26 +1,26 @@
1
1
  module Appoxy
2
- module Api
3
- module Signatures
2
+ module Api
3
+ module Signatures
4
4
 
5
5
 
6
- def self.generate_timestamp(gmtime)
7
- return gmtime.strftime("%Y-%m-%dT%H:%M:%SZ")
8
- end
6
+ def self.generate_timestamp(gmtime)
7
+ return gmtime.strftime("%Y-%m-%dT%H:%M:%SZ")
8
+ end
9
9
 
10
10
 
11
- def self.generate_signature(operation, timestamp, secret_key)
12
- my_sha_hmac = Digest::HMAC.digest(operation + timestamp, secret_key, Digest::SHA1)
13
- my_b64_hmac_digest = Base64.encode64(my_sha_hmac).strip
14
- return my_b64_hmac_digest
15
- end
11
+ def self.generate_signature(operation, timestamp, secret_key)
12
+ my_sha_hmac = Digest::HMAC.digest(operation + timestamp, secret_key, Digest::SHA1)
13
+ my_b64_hmac_digest = Base64.encode64(my_sha_hmac).strip
14
+ return my_b64_hmac_digest
15
+ end
16
16
 
17
17
 
18
- def self.hash_to_s(hash)
19
- str = ""
20
- hash.each_pair {|key, value| str+= "#{key}#{value}" }
21
- #removing all characters that could differ after parsing with rails
22
- return str.delete "\"\/:{}[]\' T"
23
- end
24
- end
18
+ def self.hash_to_s(hash)
19
+ str = ""
20
+ hash.each_pair { |key, value| str+= "#{key}#{value}" }
21
+ #removing all characters that could differ after parsing with rails
22
+ return str.delete "\"\/:{}[]\' T"
23
+ end
25
24
  end
25
+ end
26
26
  end
data/lib/appoxy_api.rb CHANGED
@@ -1,9 +1,8 @@
1
- require 'active_support'
1
+ require 'active_support/core_ext'
2
2
  require 'digest/hmac'
3
3
  require 'net/http'
4
4
  require 'base64'
5
-
6
- require File.join(File.dirname(__FILE__), "api", "api_controller")
5
+
7
6
  require File.join(File.dirname(__FILE__), "api", "client_helper")
8
7
  require File.join(File.dirname(__FILE__), "api", "signatures")
9
8
  require File.join(File.dirname(__FILE__), "api", "client")
metadata CHANGED
@@ -1,45 +1,35 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: appoxy_api
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 7
9
- version: 0.0.7
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.8
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Travis Reeder
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2010-12-29 00:00:00 -08:00
12
+ date: 2011-02-21 00:00:00.000000000 -08:00
18
13
  default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
21
16
  name: rest-client
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &26585748 !ruby/object:Gem::Requirement
24
18
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- version: "0"
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
31
23
  type: :runtime
32
- version_requirements: *id001
24
+ prerelease: false
25
+ version_requirements: *26585748
33
26
  description: Appoxy API Helper gem description...
34
27
  email: travis@appoxy.com
35
28
  executables: []
36
-
37
29
  extensions: []
38
-
39
- extra_rdoc_files:
30
+ extra_rdoc_files:
40
31
  - README.markdown
41
- files:
42
- - lib/api/api_controller.rb
32
+ files:
43
33
  - lib/api/client.rb
44
34
  - lib/api/client_helper.rb
45
35
  - lib/api/signatures.rb
@@ -48,34 +38,26 @@ files:
48
38
  has_rdoc: true
49
39
  homepage: http://www.appoxy.com
50
40
  licenses: []
51
-
52
41
  post_install_message:
53
42
  rdoc_options: []
54
-
55
- require_paths:
43
+ require_paths:
56
44
  - lib
57
- required_ruby_version: !ruby/object:Gem::Requirement
45
+ required_ruby_version: !ruby/object:Gem::Requirement
58
46
  none: false
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- segments:
63
- - 0
64
- version: "0"
65
- required_rubygems_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
52
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- segments:
71
- - 0
72
- version: "0"
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
73
57
  requirements: []
74
-
75
58
  rubyforge_project:
76
- rubygems_version: 1.3.7
59
+ rubygems_version: 1.5.2
77
60
  signing_key:
78
61
  specification_version: 3
79
62
  summary: Appoxy API Helper gem
80
63
  test_files: []
81
-
@@ -1,113 +0,0 @@
1
- module Appoxy
2
-
3
- module Api
4
-
5
- # The api controllers that use this should set:
6
- # protect_from_forgery :only => [] # can add methods to here, eg: :create, :update, :destroy
7
-
8
- # rescue_from SigError, :with => :send_error
9
- # rescue_from Api::ApiError, :with => :send_error
10
- # before_filter :verify_signature(params)
11
-
12
- # Your Controller must define a secret_key_for_signature method which will return the secret key to use to generate signature.
13
-
14
- module ApiController
15
-
16
- def verify_signature
17
- params2 = nil
18
- if request.put? || request.post?
19
- # We'll extract params from body instead here
20
- # todo: maybe check for json format first in case this is a file or something?
21
- body = request.body.read
22
- puts 'body=' + body.inspect
23
- params2 = ActiveSupport::JSON.decode(body)
24
- puts 'params2=' + params2.inspect
25
- params.merge! params2
26
- end
27
-
28
- #operation = "#{controller_name}/#{action_name}"
29
- #operation = request.env["PATH_INFO"].gsub(/\/api\//, "")# here we're getting original request url'
30
-
31
- # #getting clean params (without parsed via routes)
32
- # params_for_signature = params2||request.query_parameters
33
- # #removing mandatory params
34
- # params_for_signature = params_for_signature.delete_if {|key, value| ["access_key", "sigv", "sig", "timestamp"].include? key}
35
-
36
-
37
- #puts "params " +operation+Appoxy::Api::Signatures.hash_to_s(params_for_signature)
38
- access_key = params["access_key"]
39
- sigv = params["sigv"]
40
- timestamp = params["timestamp"]
41
- sig = params["sig"]
42
- signature = ""
43
- case sigv
44
- when "0.1"
45
- puts "outdated version of client"
46
- signature = "#{controller_name}/#{action_name}"
47
- when "0.2"
48
- puts "new version of client"
49
- operation = request.env["PATH_INFO"].gsub(/\/api\//, "")# here we're getting original request url'
50
- params_for_signature = params2||request.query_parameters
51
- params_for_signature = params_for_signature.delete_if {|key, value| ["access_key", "sigv", "sig", "timestamp"].include? key}
52
- signature = operation+Appoxy::Api::Signatures.hash_to_s(params_for_signature)
53
- end
54
- # puts "signature " + signature
55
- raise Appoxy::Api::ApiError, "No access_key" if access_key.nil?
56
- raise Appoxy::Api::ApiError, "No sigv" if sigv.nil?
57
- raise Appoxy::Api::ApiError, "No timestamp" if timestamp.nil?
58
- raise Appoxy::Api::ApiError, "No sig" if sig.nil?
59
- timestamp2 = Appoxy::Api::Signatures.generate_timestamp(Time.now.gmtime)
60
- raise Appoxy::Api::ApiError, "Request timed out!" unless (Time.parse(timestamp2)-Time.parse(timestamp))<60 # deny all requests older than 60 seconds
61
- sig2 = Appoxy::Api::Signatures.generate_signature(signature, timestamp, secret_key_for_signature(access_key))
62
- raise Appoxy::Api::ApiError, "Invalid signature!" unless sig == sig2
63
-
64
- puts 'Signature OK'
65
-
66
- end
67
-
68
-
69
- def sig_should
70
- raise "You didn't define a sig_should method in your controller!"
71
- end
72
-
73
-
74
- def send_ok(msg={})
75
- response_as_string = '' # in case we want to add debugging or something
76
- # respond_to do |format|
77
- # format.json { render :json=>msg }
78
- # response_as_string = render_to_string :json => msg
79
- render :json => msg
80
- # end
81
- true
82
- end
83
-
84
-
85
- def send_error(statuscode_or_error, msg=nil)
86
- exc = nil
87
- if statuscode_or_error.is_a? Exception
88
- exc = statuscode_or_error
89
- statuscode_or_error = 400
90
- msg = exc.message
91
- end
92
- # deprecate status, should use status_code
93
- json_msg = {"status_code"=>statuscode_or_error, "msg"=>msg}
94
- render :json=>json_msg, :status=>statuscode_or_error
95
- true
96
- end
97
-
98
-
99
- end
100
-
101
-
102
- class ApiError < StandardError
103
-
104
- def initialize(msg=nil)
105
- super(msg)
106
-
107
- end
108
-
109
- end
110
-
111
- end
112
-
113
- end