kns_endpoint 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/kns_endpoint.rb +80 -91
  2. metadata +11 -4
data/lib/kns_endpoint.rb CHANGED
@@ -1,20 +1,30 @@
1
- require 'net/https'
2
- require 'open-uri'
1
+ require 'rest_client'
3
2
  require 'json'
4
3
 
5
4
  module Kynetx
6
5
 
7
6
  class Endpoint
8
- attr_accessor :session
7
+ attr_accessor :session, :environment, :ruleset, :use_session
9
8
 
10
9
  @@events = {}
11
10
  @@directives = {}
12
- @@use_single_session = true;
11
+ @@use_session = true;
12
+ @@environment = :production
13
+ @@ruleset = nil
13
14
 
14
15
  def initialize(opts={})
15
- @@ruleset = opts[:ruleset] if opts[:ruleset]
16
+ @environment = opts[:environment] if opts[:environment]
17
+ @ruleset = opts[:ruleset] if opts[:ruleset]
18
+ @use_session = opts[:use_session] if opts[:use_session]
19
+
20
+ # set the defaults
21
+ @environment ||= @@environment
22
+ @use_session ||= @@use_session
23
+ @ruleset ||= @@ruleset
24
+ raise "Undefined ruleset." unless @ruleset
16
25
  end
17
26
 
27
+ ## Endpoint DSL
18
28
 
19
29
  def self.event(e, params={}, &block)
20
30
  @@events[e] = { :params => params }
@@ -28,102 +38,95 @@ module Kynetx
28
38
 
29
39
  def self.ruleset(r); @@ruleset = r end
30
40
  def self.domain(d); @@domain = d end
31
- def use_single_session; @@use_single_session end
32
- def use_single_session=(uss); @@use_single_session = uss end
41
+ def self.environment(e); @@environment = e end
42
+ def self.use_session(s); @@use_session = s end
33
43
 
34
- def signal(e, params={}, ruleset=nil)
35
- raise "Undefined ruleset" unless @@ruleset || ruleset
36
-
37
- run_event(e, ruleset || @@ruleset, params)
44
+ ##########
45
+
46
+ def signal(e, params={})
47
+ run_event(e, params)
38
48
  end
39
49
 
40
- def self.signal(e, params, ruleset)
41
- tmp_endpoint = self.new({:ruleset => ruleset})
50
+ def self.signal(e, params)
51
+ tmp_endpoint = self.new({:ruleset => @@ruleset, :environment => @@environment})
42
52
  tmp_endpoint.signal(e, params)
43
53
  end
44
54
 
45
55
  # allow calling events directly
46
56
  def method_missing(meth, *args)
47
57
  if @@events.keys.include? meth.to_sym
48
- ruleset = nil
49
- params = {}
58
+ return run_event(meth.to_sym, args.first)
59
+ else
60
+ super
61
+ end
62
+ end
50
63
 
64
+ def self.method_missing(meth, *args)
65
+ if @@events.include? meth.to_sym
66
+ ruleset = @@ruleset
51
67
  if args.first.class == Symbol
52
68
  ruleset = args.first
53
- params = args.last if args.length > 1
69
+ params = args.length > 1 ? args.last : {}
54
70
  else
55
- params = args.first if args.first.class == Hash
71
+ params = args.first
56
72
  end
57
-
58
-
59
- return run_event(meth.to_sym, ruleset || @@ruleset, params)
60
-
73
+ e = self.new({:ruleset => ruleset})
74
+ e.signal(meth.to_sym, params)
61
75
  else
62
76
  super
63
77
  end
64
78
  end
65
79
 
66
- def self.method_missing(meth, *args)
67
- raise "Undefined ruleset" unless args.first.class == Symbol
68
- params = args.length > 1 ? args.last : {}
69
- e = self.new({:ruleset => args.first})
70
- e.signal(meth.to_sym, params)
71
- end
72
-
73
80
  private
74
81
 
75
- def run_event(e, ruleset, params)
76
-
77
- # setup the parameters and call the block
78
-
79
- if @@events.keys.include? e
80
- @@events[e][:block].call(params)
81
- else
82
- raise "Undefined event #{e.to_s}"
83
- end
84
-
85
-
82
+ def run_event(e, params)
86
83
  # run the event
87
84
 
88
85
  kns_json = {"directives" => []}
89
86
 
90
87
  begin
88
+ # setup the parameters and call the block
89
+
90
+ if @@events.keys.include? e
91
+ @@events[e][:block].call(params)
92
+ else
93
+ raise "Undefined event #{e.to_s}"
94
+ end
95
+
91
96
  raise "Undefined Domain" unless @@domain
92
97
 
93
- api_call = "https://cs.kobj.net/blue/event/#{@@domain.to_s}/#{e.to_s}/#{ruleset}"
94
- puts api_call if $KNS_ENDPOINT_DEBUG
95
- uri = URI.parse(api_call)
96
- http_session = Net::HTTP.new(uri.host, uri.port)
97
- http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE
98
- http_session.use_ssl = true
99
-
100
- headers = {
101
- 'Host'=> uri.host,
102
- }
103
-
104
- headers["Cookie"] = "SESSION_ID=#{@session}" if @session && @@use_single_session
98
+ api_call = "https://cs.kobj.net/blue/event/#{@@domain.to_s}/#{e.to_s}/#{@ruleset}"
99
+
100
+ headers = {}
101
+ headers[:cookies] = {"SESSION_ID" => @session} if @session && @use_session
105
102
 
106
103
  timeout(30) do
107
- http_session.start { |http|
108
- req = Net::HTTP::Post.new(uri.path)
109
- headers.each{|key, val| req.add_field(key, val)}
110
- puts "Params = \n#{params.to_url_params}" if $KNS_ENDPOINT_DEBUG
111
- resp, data = http.request(req, params.to_url_params)
112
- @session = parse_cookie(resp, 'SESSION_ID')
113
-
114
- puts 'Code = ' + resp.code if $KNS_ENDPOINT_DEBUG
115
- puts 'Message = ' + resp.message if $KNS_ENDPOINT_DEBUG
116
- resp.each {|key, val| puts key + ' = ' + val} if $KNS_ENDPOINT_DEBUG
117
- puts "Data = \n" + data if $KNS_ENDPOINT_DEBUG
118
-
119
-
120
- raise "Unexpected response from KNS (HTTP Error: #{resp.code} - #{resp.message})" unless resp.code == '200'
121
- begin
122
- kns_json = JSON.parse(data)
123
- rescue
124
- raise "Unexpected response from KNS (#{data})"
125
- end
126
- }
104
+ params[@ruleset.to_s + ":kynetx_app_version"] = "dev" unless @environment == :production
105
+
106
+ if $KNS_ENDPOINT_DEBUG
107
+ puts "-- NEW REQUEST --"
108
+ puts "-- URL: " + api_call
109
+ puts "-- HEADERS:\n#{headers.inspect}"
110
+ puts "-- PARAMS:\n#{params.inspect}"
111
+ end
112
+
113
+ response = RestClient.post(api_call, params, headers)
114
+ raise "Unexpected response from KNS (HTTP Error: #{response.code} - #{response})" unless response.code.to_s == "200"
115
+
116
+ @session = response.cookies["SESSION_ID"]
117
+ begin
118
+ kns_json = JSON.parse(response.to_s)
119
+ rescue
120
+ raise "Unexpected response from KNS (#{response.to_s})"
121
+ end
122
+
123
+ if $KNS_ENDPOINT_DEBUG
124
+ puts "-- RESPONSE --"
125
+ puts "-- CODE: #{response.code}"
126
+ puts "-- COOKIES: #{response.cookies.inspect}"
127
+ puts "-- HEADERS: #{response.headers.inspect}"
128
+ puts "-- BODY: \n" + response.to_s
129
+ end
127
130
  end
128
131
  rescue Exception => e
129
132
  raise "Unable to connect to KNS. (#{e.message})"
@@ -132,7 +135,7 @@ module Kynetx
132
135
  # execute the returned directives
133
136
  directive_output = []
134
137
  kns_json["directives"].each do |d|
135
- o = run_directive(d["name"].to_sym, symbolize_keys(d["options"])) if @@directives.keys.include?(d["name"].to_sym)
138
+ o = run_directive(d["name"].to_sym, d["options"]) if @@directives.keys.include?(d["name"].to_sym)
136
139
  directive_output.push o
137
140
  end
138
141
 
@@ -143,9 +146,9 @@ module Kynetx
143
146
 
144
147
  def run_directive(d, params)
145
148
  begin
146
- return @@directives[d].call(params)
149
+ return @@directives[d].call(symbolize_keys(params))
147
150
  rescue Exception => e
148
- puts "Error in directive (#{d.to_s}): #{e.message}\n#{e.backtrace.join("\n")}"
151
+ raise "Error in directive (#{d.to_s}): #{e.message}"
149
152
  end
150
153
 
151
154
  end
@@ -158,7 +161,7 @@ module Kynetx
158
161
  when String then key.to_sym
159
162
  else key
160
163
  end
161
- new_value = case value
164
+ new_value = case value
162
165
  when Hash then symbolize_keys(value)
163
166
  else value
164
167
  end
@@ -167,26 +170,12 @@ module Kynetx
167
170
  }
168
171
  end
169
172
 
170
- def parse_cookie(resp_hash, cookie)
171
- cookie_str = resp_hash['set-cookie']
172
- cookies = {}
173
- cookie_str.split(";").map{|e| k,v = e.split('='); cookies[k] = v}
174
- return cookies[cookie]
175
- end
176
-
177
- end
178
173
 
179
- end
180
174
 
181
- class Hash
182
- def to_url_params
183
- elements = []
184
- self.each_pair do |k,v|
185
- elements << "#{URI.escape(k.to_s)}=#{URI.escape(v.to_s)}"
186
- end
187
- elements.join('&')
188
175
  end
189
176
 
190
177
  end
191
178
 
192
179
 
180
+
181
+
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kns_endpoint
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 27
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
8
+ - 1
7
9
  - 0
8
- - 9
9
- version: 0.0.9
10
+ version: 0.1.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Michael Farmer
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-09-02 00:00:00 -06:00
18
+ date: 2010-09-15 00:00:00 -06:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: json
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ~>
26
28
  - !ruby/object:Gem::Version
29
+ hash: 23
27
30
  segments:
28
31
  - 1
29
32
  - 2
@@ -52,23 +55,27 @@ rdoc_options:
52
55
  require_paths:
53
56
  - lib
54
57
  required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
55
59
  requirements:
56
60
  - - ">="
57
61
  - !ruby/object:Gem::Version
62
+ hash: 3
58
63
  segments:
59
64
  - 0
60
65
  version: "0"
61
66
  required_rubygems_version: !ruby/object:Gem::Requirement
67
+ none: false
62
68
  requirements:
63
69
  - - ">="
64
70
  - !ruby/object:Gem::Version
71
+ hash: 3
65
72
  segments:
66
73
  - 0
67
74
  version: "0"
68
75
  requirements: []
69
76
 
70
77
  rubyforge_project:
71
- rubygems_version: 1.3.6
78
+ rubygems_version: 1.3.7
72
79
  signing_key:
73
80
  specification_version: 3
74
81
  summary: Creates a Kynetx KNS Endpoint