scout 5.7.1 → 5.7.2.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (251) hide show
  1. data/CHANGELOG.markdown +5 -0
  2. data/lib/scout/command/run.rb +1 -1
  3. data/lib/scout/server.rb +2 -1
  4. data/lib/scout/streamer.rb +3 -2
  5. data/lib/scout/streamer_daemon.rb +4 -4
  6. data/lib/scout/version.rb +1 -1
  7. data/test/scout_test.rb +7 -8
  8. data/vendor/httpclient/README.txt +759 -0
  9. data/vendor/httpclient/bin/httpclient +65 -0
  10. data/vendor/httpclient/lib/hexdump.rb +50 -0
  11. data/vendor/httpclient/lib/http-access2.rb +55 -0
  12. data/vendor/httpclient/lib/http-access2/cookie.rb +1 -0
  13. data/vendor/httpclient/lib/http-access2/http.rb +1 -0
  14. data/vendor/httpclient/lib/httpclient.rb +1156 -0
  15. data/vendor/httpclient/lib/httpclient/auth.rb +899 -0
  16. data/vendor/httpclient/lib/httpclient/cacert.p7s +1912 -0
  17. data/vendor/httpclient/lib/httpclient/connection.rb +88 -0
  18. data/vendor/httpclient/lib/httpclient/cookie.rb +438 -0
  19. data/vendor/httpclient/lib/httpclient/http.rb +1046 -0
  20. data/vendor/httpclient/lib/httpclient/include_client.rb +83 -0
  21. data/vendor/httpclient/lib/httpclient/session.rb +1025 -0
  22. data/vendor/httpclient/lib/httpclient/ssl_config.rb +403 -0
  23. data/vendor/httpclient/lib/httpclient/timeout.rb +140 -0
  24. data/vendor/httpclient/lib/httpclient/util.rb +178 -0
  25. data/vendor/httpclient/lib/httpclient/version.rb +3 -0
  26. data/vendor/httpclient/lib/oauthclient.rb +110 -0
  27. data/vendor/httpclient/sample/async.rb +8 -0
  28. data/vendor/httpclient/sample/auth.rb +11 -0
  29. data/vendor/httpclient/sample/cookie.rb +18 -0
  30. data/vendor/httpclient/sample/dav.rb +103 -0
  31. data/vendor/httpclient/sample/howto.rb +49 -0
  32. data/vendor/httpclient/sample/oauth_buzz.rb +57 -0
  33. data/vendor/httpclient/sample/oauth_friendfeed.rb +59 -0
  34. data/vendor/httpclient/sample/oauth_salesforce_10.rb +63 -0
  35. data/vendor/httpclient/sample/oauth_twitter.rb +61 -0
  36. data/vendor/httpclient/sample/ssl/0cert.pem +22 -0
  37. data/vendor/httpclient/sample/ssl/0key.pem +30 -0
  38. data/vendor/httpclient/sample/ssl/1000cert.pem +19 -0
  39. data/vendor/httpclient/sample/ssl/1000key.pem +18 -0
  40. data/vendor/httpclient/sample/ssl/htdocs/index.html +10 -0
  41. data/vendor/httpclient/sample/ssl/ssl_client.rb +22 -0
  42. data/vendor/httpclient/sample/ssl/webrick_httpsd.rb +29 -0
  43. data/vendor/httpclient/sample/stream.rb +21 -0
  44. data/vendor/httpclient/sample/thread.rb +27 -0
  45. data/vendor/httpclient/sample/wcat.rb +21 -0
  46. data/vendor/httpclient/test/ca-chain.cert +44 -0
  47. data/vendor/httpclient/test/ca.cert +23 -0
  48. data/vendor/httpclient/test/client.cert +19 -0
  49. data/vendor/httpclient/test/client.key +15 -0
  50. data/vendor/httpclient/test/helper.rb +129 -0
  51. data/vendor/httpclient/test/htdigest +1 -0
  52. data/vendor/httpclient/test/htpasswd +2 -0
  53. data/vendor/httpclient/test/runner.rb +2 -0
  54. data/vendor/httpclient/test/server.cert +19 -0
  55. data/vendor/httpclient/test/server.key +15 -0
  56. data/vendor/httpclient/test/sslsvr.rb +65 -0
  57. data/vendor/httpclient/test/subca.cert +21 -0
  58. data/vendor/httpclient/test/test_auth.rb +321 -0
  59. data/vendor/httpclient/test/test_cookie.rb +391 -0
  60. data/vendor/httpclient/test/test_hexdump.rb +14 -0
  61. data/vendor/httpclient/test/test_http-access2.rb +507 -0
  62. data/vendor/httpclient/test/test_httpclient.rb +1783 -0
  63. data/vendor/httpclient/test/test_include_client.rb +52 -0
  64. data/vendor/httpclient/test/test_ssl.rb +235 -0
  65. data/vendor/multi_json/.document +5 -0
  66. data/vendor/multi_json/.rspec +3 -0
  67. data/vendor/multi_json/.travis.yml +11 -0
  68. data/vendor/multi_json/.yardopts +6 -0
  69. data/vendor/multi_json/CHANGELOG.md +169 -0
  70. data/vendor/multi_json/CONTRIBUTING.md +46 -0
  71. data/vendor/multi_json/Gemfile +31 -0
  72. data/vendor/multi_json/LICENSE.md +20 -0
  73. data/vendor/multi_json/README.md +109 -0
  74. data/vendor/multi_json/Rakefile +12 -0
  75. data/vendor/multi_json/lib/multi_json.rb +157 -0
  76. data/vendor/multi_json/lib/multi_json/adapter.rb +48 -0
  77. data/vendor/multi_json/lib/multi_json/adapters/gson.rb +19 -0
  78. data/vendor/multi_json/lib/multi_json/adapters/jr_jackson.rb +19 -0
  79. data/vendor/multi_json/lib/multi_json/adapters/json_common.rb +25 -0
  80. data/vendor/multi_json/lib/multi_json/adapters/json_gem.rb +11 -0
  81. data/vendor/multi_json/lib/multi_json/adapters/json_pure.rb +11 -0
  82. data/vendor/multi_json/lib/multi_json/adapters/nsjsonserialization.rb +34 -0
  83. data/vendor/multi_json/lib/multi_json/adapters/oj.rb +24 -0
  84. data/vendor/multi_json/lib/multi_json/adapters/ok_json.rb +22 -0
  85. data/vendor/multi_json/lib/multi_json/adapters/yajl.rb +19 -0
  86. data/vendor/multi_json/lib/multi_json/convertible_hash_keys.rb +43 -0
  87. data/vendor/multi_json/lib/multi_json/load_error.rb +11 -0
  88. data/vendor/multi_json/lib/multi_json/options.rb +48 -0
  89. data/vendor/multi_json/lib/multi_json/vendor/okjson.rb +606 -0
  90. data/vendor/multi_json/lib/multi_json/version.rb +20 -0
  91. data/vendor/multi_json/multi_json.gemspec +22 -0
  92. data/vendor/multi_json/spec/adapter_shared_example.rb +235 -0
  93. data/vendor/multi_json/spec/has_options.rb +119 -0
  94. data/vendor/multi_json/spec/helper.rb +35 -0
  95. data/vendor/multi_json/spec/json_common_shared_example.rb +30 -0
  96. data/vendor/multi_json/spec/multi_json_spec.rb +226 -0
  97. data/vendor/{signature → pusher}/.document +0 -0
  98. data/vendor/{json_pure/diagrams/.keep → pusher/.gemtest} +0 -0
  99. data/vendor/pusher/.gitignore +23 -0
  100. data/vendor/pusher/.travis.yml +15 -0
  101. data/vendor/pusher/Gemfile +2 -0
  102. data/vendor/{pusher-gem → pusher}/LICENSE +1 -1
  103. data/vendor/pusher/README.md +186 -0
  104. data/vendor/{pusher-gem → pusher}/Rakefile +0 -0
  105. data/vendor/{pusher-gem → pusher}/examples/async_message.rb +0 -0
  106. data/vendor/pusher/lib/pusher.rb +60 -0
  107. data/vendor/{pusher-gem → pusher}/lib/pusher/channel.rb +47 -54
  108. data/vendor/pusher/lib/pusher/client.rb +306 -0
  109. data/vendor/pusher/lib/pusher/request.rb +107 -0
  110. data/vendor/pusher/lib/pusher/resource.rb +36 -0
  111. data/vendor/pusher/lib/pusher/webhook.rb +110 -0
  112. data/vendor/{pusher-gem → pusher}/pusher.gemspec +6 -5
  113. data/vendor/pusher/spec/channel_spec.rb +127 -0
  114. data/vendor/pusher/spec/client_spec.rb +464 -0
  115. data/vendor/{pusher-gem → pusher}/spec/spec_helper.rb +12 -0
  116. data/vendor/pusher/spec/web_hook_spec.rb +117 -0
  117. data/vendor/signature/.travis.yml +15 -0
  118. data/vendor/signature/Gemfile +1 -1
  119. data/vendor/signature/README.md +38 -28
  120. data/vendor/signature/lib/signature.rb +97 -15
  121. data/vendor/signature/lib/signature/query_encoder.rb +47 -0
  122. data/vendor/signature/lib/signature/version.rb +1 -1
  123. data/vendor/signature/signature.gemspec +3 -2
  124. data/vendor/signature/spec/signature_spec.rb +164 -55
  125. data/vendor/signature/spec/spec_helper.rb +2 -3
  126. metadata +120 -145
  127. data/vendor/json_pure/.gitignore +0 -12
  128. data/vendor/json_pure/.travis.yml +0 -20
  129. data/vendor/json_pure/CHANGES +0 -282
  130. data/vendor/json_pure/COPYING +0 -58
  131. data/vendor/json_pure/COPYING-json-jruby +0 -57
  132. data/vendor/json_pure/GPL +0 -340
  133. data/vendor/json_pure/Gemfile +0 -11
  134. data/vendor/json_pure/README-json-jruby.markdown +0 -33
  135. data/vendor/json_pure/README.rdoc +0 -358
  136. data/vendor/json_pure/Rakefile +0 -412
  137. data/vendor/json_pure/TODO +0 -1
  138. data/vendor/json_pure/VERSION +0 -1
  139. data/vendor/json_pure/data/example.json +0 -1
  140. data/vendor/json_pure/data/index.html +0 -38
  141. data/vendor/json_pure/data/prototype.js +0 -4184
  142. data/vendor/json_pure/ext/json/ext/fbuffer/fbuffer.h +0 -181
  143. data/vendor/json_pure/ext/json/ext/generator/depend +0 -1
  144. data/vendor/json_pure/ext/json/ext/generator/extconf.rb +0 -14
  145. data/vendor/json_pure/ext/json/ext/generator/generator.c +0 -1435
  146. data/vendor/json_pure/ext/json/ext/generator/generator.h +0 -148
  147. data/vendor/json_pure/ext/json/ext/parser/depend +0 -1
  148. data/vendor/json_pure/ext/json/ext/parser/extconf.rb +0 -13
  149. data/vendor/json_pure/ext/json/ext/parser/parser.c +0 -2204
  150. data/vendor/json_pure/ext/json/ext/parser/parser.h +0 -77
  151. data/vendor/json_pure/ext/json/ext/parser/parser.rl +0 -927
  152. data/vendor/json_pure/install.rb +0 -23
  153. data/vendor/json_pure/java/src/json/ext/ByteListTranscoder.java +0 -167
  154. data/vendor/json_pure/java/src/json/ext/Generator.java +0 -444
  155. data/vendor/json_pure/java/src/json/ext/GeneratorMethods.java +0 -232
  156. data/vendor/json_pure/java/src/json/ext/GeneratorService.java +0 -43
  157. data/vendor/json_pure/java/src/json/ext/GeneratorState.java +0 -543
  158. data/vendor/json_pure/java/src/json/ext/OptionsReader.java +0 -114
  159. data/vendor/json_pure/java/src/json/ext/Parser.java +0 -2644
  160. data/vendor/json_pure/java/src/json/ext/Parser.rl +0 -968
  161. data/vendor/json_pure/java/src/json/ext/ParserService.java +0 -35
  162. data/vendor/json_pure/java/src/json/ext/RuntimeInfo.java +0 -121
  163. data/vendor/json_pure/java/src/json/ext/StringDecoder.java +0 -167
  164. data/vendor/json_pure/java/src/json/ext/StringEncoder.java +0 -106
  165. data/vendor/json_pure/java/src/json/ext/Utils.java +0 -89
  166. data/vendor/json_pure/json-java.gemspec +0 -23
  167. data/vendor/json_pure/json.gemspec +0 -37
  168. data/vendor/json_pure/json_pure.gemspec +0 -39
  169. data/vendor/json_pure/lib/json.rb +0 -62
  170. data/vendor/json_pure/lib/json/add/bigdecimal.rb +0 -28
  171. data/vendor/json_pure/lib/json/add/complex.rb +0 -22
  172. data/vendor/json_pure/lib/json/add/core.rb +0 -11
  173. data/vendor/json_pure/lib/json/add/date.rb +0 -34
  174. data/vendor/json_pure/lib/json/add/date_time.rb +0 -50
  175. data/vendor/json_pure/lib/json/add/exception.rb +0 -31
  176. data/vendor/json_pure/lib/json/add/ostruct.rb +0 -31
  177. data/vendor/json_pure/lib/json/add/range.rb +0 -29
  178. data/vendor/json_pure/lib/json/add/rational.rb +0 -22
  179. data/vendor/json_pure/lib/json/add/regexp.rb +0 -30
  180. data/vendor/json_pure/lib/json/add/struct.rb +0 -30
  181. data/vendor/json_pure/lib/json/add/symbol.rb +0 -25
  182. data/vendor/json_pure/lib/json/add/time.rb +0 -38
  183. data/vendor/json_pure/lib/json/common.rb +0 -487
  184. data/vendor/json_pure/lib/json/ext.rb +0 -21
  185. data/vendor/json_pure/lib/json/ext/.keep +0 -0
  186. data/vendor/json_pure/lib/json/generic_object.rb +0 -70
  187. data/vendor/json_pure/lib/json/pure.rb +0 -21
  188. data/vendor/json_pure/lib/json/pure/generator.rb +0 -522
  189. data/vendor/json_pure/lib/json/pure/parser.rb +0 -359
  190. data/vendor/json_pure/lib/json/version.rb +0 -8
  191. data/vendor/json_pure/tests/fixtures/fail1.json +0 -1
  192. data/vendor/json_pure/tests/fixtures/fail10.json +0 -1
  193. data/vendor/json_pure/tests/fixtures/fail11.json +0 -1
  194. data/vendor/json_pure/tests/fixtures/fail12.json +0 -1
  195. data/vendor/json_pure/tests/fixtures/fail13.json +0 -1
  196. data/vendor/json_pure/tests/fixtures/fail14.json +0 -1
  197. data/vendor/json_pure/tests/fixtures/fail18.json +0 -1
  198. data/vendor/json_pure/tests/fixtures/fail19.json +0 -1
  199. data/vendor/json_pure/tests/fixtures/fail2.json +0 -1
  200. data/vendor/json_pure/tests/fixtures/fail20.json +0 -1
  201. data/vendor/json_pure/tests/fixtures/fail21.json +0 -1
  202. data/vendor/json_pure/tests/fixtures/fail22.json +0 -1
  203. data/vendor/json_pure/tests/fixtures/fail23.json +0 -1
  204. data/vendor/json_pure/tests/fixtures/fail24.json +0 -1
  205. data/vendor/json_pure/tests/fixtures/fail25.json +0 -1
  206. data/vendor/json_pure/tests/fixtures/fail27.json +0 -2
  207. data/vendor/json_pure/tests/fixtures/fail28.json +0 -2
  208. data/vendor/json_pure/tests/fixtures/fail3.json +0 -1
  209. data/vendor/json_pure/tests/fixtures/fail4.json +0 -1
  210. data/vendor/json_pure/tests/fixtures/fail5.json +0 -1
  211. data/vendor/json_pure/tests/fixtures/fail6.json +0 -1
  212. data/vendor/json_pure/tests/fixtures/fail7.json +0 -1
  213. data/vendor/json_pure/tests/fixtures/fail8.json +0 -1
  214. data/vendor/json_pure/tests/fixtures/fail9.json +0 -1
  215. data/vendor/json_pure/tests/fixtures/pass1.json +0 -56
  216. data/vendor/json_pure/tests/fixtures/pass15.json +0 -1
  217. data/vendor/json_pure/tests/fixtures/pass16.json +0 -1
  218. data/vendor/json_pure/tests/fixtures/pass17.json +0 -1
  219. data/vendor/json_pure/tests/fixtures/pass2.json +0 -1
  220. data/vendor/json_pure/tests/fixtures/pass26.json +0 -1
  221. data/vendor/json_pure/tests/fixtures/pass3.json +0 -6
  222. data/vendor/json_pure/tests/setup_variant.rb +0 -11
  223. data/vendor/json_pure/tests/test_json.rb +0 -545
  224. data/vendor/json_pure/tests/test_json_addition.rb +0 -196
  225. data/vendor/json_pure/tests/test_json_encoding.rb +0 -65
  226. data/vendor/json_pure/tests/test_json_fixtures.rb +0 -35
  227. data/vendor/json_pure/tests/test_json_generate.rb +0 -322
  228. data/vendor/json_pure/tests/test_json_generic_object.rb +0 -75
  229. data/vendor/json_pure/tests/test_json_string_matching.rb +0 -39
  230. data/vendor/json_pure/tests/test_json_unicode.rb +0 -72
  231. data/vendor/json_pure/tools/fuzz.rb +0 -139
  232. data/vendor/json_pure/tools/server.rb +0 -62
  233. data/vendor/pusher-gem/Gemfile +0 -2
  234. data/vendor/pusher-gem/README.md +0 -80
  235. data/vendor/pusher-gem/lib/pusher.rb +0 -107
  236. data/vendor/pusher-gem/lib/pusher/request.rb +0 -107
  237. data/vendor/pusher-gem/spec/channel_spec.rb +0 -274
  238. data/vendor/pusher-gem/spec/pusher_spec.rb +0 -87
  239. data/vendor/ruby-hmac/History.txt +0 -15
  240. data/vendor/ruby-hmac/Manifest.txt +0 -11
  241. data/vendor/ruby-hmac/README.md +0 -41
  242. data/vendor/ruby-hmac/Rakefile +0 -23
  243. data/vendor/ruby-hmac/lib/hmac-md5.rb +0 -11
  244. data/vendor/ruby-hmac/lib/hmac-rmd160.rb +0 -11
  245. data/vendor/ruby-hmac/lib/hmac-sha1.rb +0 -11
  246. data/vendor/ruby-hmac/lib/hmac-sha2.rb +0 -25
  247. data/vendor/ruby-hmac/lib/hmac.rb +0 -118
  248. data/vendor/ruby-hmac/lib/ruby_hmac.rb +0 -2
  249. data/vendor/ruby-hmac/ruby-hmac.gemspec +0 -33
  250. data/vendor/ruby-hmac/test/test_hmac.rb +0 -89
  251. data/vendor/signature/VERSION +0 -1
File without changes
@@ -0,0 +1,60 @@
1
+ autoload 'Logger', 'logger'
2
+ require 'uri'
3
+ require 'forwardable'
4
+
5
+ require 'pusher/client'
6
+
7
+ # Used for configuring API credentials and creating Channel objects
8
+ #
9
+ module Pusher
10
+ # All errors descend from this class so they can be easily rescued
11
+ #
12
+ # @example
13
+ # begin
14
+ # Pusher.trigger('channel_name', 'event_name, {:some => 'data'})
15
+ # rescue Pusher::Error => e
16
+ # # Do something on error
17
+ # end
18
+ class Error < RuntimeError; end
19
+ class AuthenticationError < Error; end
20
+ class ConfigurationError < Error; end
21
+ class HTTPError < Error; attr_accessor :original_error; end
22
+
23
+ class << self
24
+ extend Forwardable
25
+
26
+ def_delegators :default_client, :scheme, :host, :port, :app_id, :key, :secret, :http_proxy
27
+ def_delegators :default_client, :scheme=, :host=, :port=, :app_id=, :key=, :secret=, :http_proxy=
28
+
29
+ def_delegators :default_client, :authentication_token, :url
30
+ def_delegators :default_client, :encrypted=, :url=
31
+ def_delegators :default_client, :timeout=, :connect_timeout=, :send_timeout=, :receive_timeout=, :keep_alive_timeout=
32
+
33
+ def_delegators :default_client, :get, :get_async, :post, :post_async
34
+ def_delegators :default_client, :channels, :channel_info, :trigger, :trigger_async
35
+ def_delegators :default_client, :webhook, :channel, :[]
36
+
37
+ attr_writer :logger
38
+
39
+ def logger
40
+ @logger ||= begin
41
+ log = Logger.new($stdout)
42
+ log.level = Logger::INFO
43
+ log
44
+ end
45
+ end
46
+
47
+ def default_client
48
+ @default_client ||= Pusher::Client.new
49
+ end
50
+ end
51
+
52
+ if ENV['PUSHER_URL']
53
+ self.url = ENV['PUSHER_URL']
54
+ end
55
+ end
56
+
57
+ require 'pusher/channel'
58
+ require 'pusher/request'
59
+ require 'pusher/resource'
60
+ require 'pusher/webhook'
@@ -1,20 +1,23 @@
1
- require 'core_extensions'
2
- require 'hmac-sha2'
3
- require 'json'
1
+ require 'openssl'
2
+ require 'multi_json'
4
3
 
5
4
  module Pusher
6
5
  # Trigger events on Channels
7
6
  class Channel
8
7
  attr_reader :name
9
8
 
10
- def initialize(base_url, name)
9
+ def initialize(base_url, name, client = Pusher)
11
10
  @uri = base_url.dup
12
11
  @uri.path = @uri.path + "/channels/#{name}/"
13
12
  @name = name
13
+ @client = client
14
14
  end
15
15
 
16
16
  # Trigger event asynchronously using EventMachine::HttpRequest
17
17
  #
18
+ # [Deprecated] This method will be removed in a future gem version. Please
19
+ # switch to Pusher.trigger_async or Pusher::Client#trigger_async instead
20
+ #
18
21
  # @param (see #trigger!)
19
22
  # @return [EM::DefaultDeferrable]
20
23
  # Attach a callback to be notified of success (with no parameters).
@@ -24,13 +27,17 @@ module Pusher
24
27
  # @raise [Pusher::Error] unless the eventmachine reactor is running. You
25
28
  # probably want to run your application inside a server such as thin
26
29
  #
27
- def trigger_async(event_name, data, socket_id = nil, &block)
28
- request = construct_event_request(event_name, data, socket_id)
29
- request.send_async
30
+ def trigger_async(event_name, data, socket_id = nil)
31
+ params = {}
32
+ params[:socket_id] = socket_id if socket_id
33
+ @client.trigger_async(name, event_name, data, params)
30
34
  end
31
35
 
32
36
  # Trigger event
33
37
  #
38
+ # [Deprecated] This method will be removed in a future gem version. Please
39
+ # switch to Pusher.trigger or Pusher::Client#trigger instead
40
+ #
34
41
  # @example
35
42
  # begin
36
43
  # Pusher['my-channel'].trigger!('an_event', {:some => 'data'})
@@ -44,15 +51,19 @@ module Pusher
44
51
  # event - see http://pusher.com/docs/publisher_api_guide/publisher_excluding_recipients for more info
45
52
  #
46
53
  # @raise [Pusher::Error] on invalid Pusher response - see the error message for more details
47
- # @raise [Pusher::HTTPError] on any error raised inside Net::HTTP - the original error is available in the original_error attribute
54
+ # @raise [Pusher::HTTPError] on any error raised inside http client - the original error is available in the original_error attribute
48
55
  #
49
56
  def trigger!(event_name, data, socket_id = nil)
50
- request = construct_event_request(event_name, data, socket_id)
51
- request.send_sync
57
+ params = {}
58
+ params[:socket_id] = socket_id if socket_id
59
+ @client.trigger(name, event_name, data, params)
52
60
  end
53
61
 
54
62
  # Trigger event, catching and logging any errors.
55
63
  #
64
+ # [Deprecated] This method will be removed in a future gem version. Please
65
+ # switch to Pusher.trigger or Pusher::Client#trigger instead
66
+ #
56
67
  # @note CAUTION! No exceptions will be raised on failure
57
68
  # @param (see #trigger!)
58
69
  #
@@ -62,21 +73,21 @@ module Pusher
62
73
  Pusher.logger.error("#{e.message} (#{e.class})")
63
74
  Pusher.logger.debug(e.backtrace.join("\n"))
64
75
  end
65
-
66
- # Request channel stats
76
+
77
+ # Request info for a channel
67
78
  #
68
- # @return [Hash] See Pusher api docs for reported stats
79
+ # @param info [Array] Array of attributes required (as lowercase strings)
80
+ # @return [Hash] Hash of requested attributes for this channel
69
81
  # @raise [Pusher::Error] on invalid Pusher response - see the error message for more details
70
- # @raise [Pusher::HTTPError] on any error raised inside Net::HTTP - the original error is available in the original_error attribute
82
+ # @raise [Pusher::HTTPError] on any error raised inside http client - the original error is available in the original_error attribute
71
83
  #
72
- def stats
73
- request = Pusher::Request.new(:get, @uri + 'stats', {})
74
- return request.send_sync
84
+ def info(attributes = [])
85
+ @client.get("/channels/#{name}", :info => attributes.join(','))
75
86
  end
76
87
 
77
- # Compute authentication string required to subscribe to this channel.
78
- #
79
- # See http://pusher.com/docs/auth_signatures for more details.
88
+ # Compute authentication string required as part of the authentication
89
+ # endpoint response. Generally the authenticate method should be used in
90
+ # preference to this one
80
91
  #
81
92
  # @param socket_id [String] Each Pusher socket connection receives a
82
93
  # unique socket_id. This is sent from pusher.js to your server when
@@ -85,21 +96,26 @@ module Pusher
85
96
  # @return [String]
86
97
  #
87
98
  def authentication_string(socket_id, custom_string = nil)
88
- raise "Invalid socket_id" if socket_id.nil? || socket_id.empty?
89
- raise 'Custom argument must be a string' unless custom_string.nil? || custom_string.kind_of?(String)
99
+ if socket_id.nil? || socket_id.empty?
100
+ raise Error, "Invalid socket_id #{socket_id}"
101
+ end
90
102
 
91
- string_to_sign = [socket_id, name, custom_string].compact.map{|e|e.to_s}.join(':')
103
+ unless custom_string.nil? || custom_string.kind_of?(String)
104
+ raise Error, 'Custom argument must be a string'
105
+ end
106
+
107
+ string_to_sign = [socket_id, name, custom_string].
108
+ compact.map(&:to_s).join(':')
92
109
  Pusher.logger.debug "Signing #{string_to_sign}"
93
- token = Pusher.authentication_token
94
- signature = HMAC::SHA256.hexdigest(token.secret, string_to_sign)
110
+ token = @client.authentication_token
111
+ digest = OpenSSL::Digest::SHA256.new
112
+ signature = OpenSSL::HMAC.hexdigest(digest, token.secret, string_to_sign)
95
113
 
96
114
  return "#{token.key}:#{signature}"
97
115
  end
98
-
99
- # Deprecated - for backward compatibility
100
- alias :socket_auth :authentication_string
101
116
 
102
- # Generate an authentication endpoint response
117
+ # Generate the expected response for an authentication endpoint.
118
+ # See http://pusher.com/docs/authenticating_users for details.
103
119
  #
104
120
  # @example Private channels
105
121
  # render :json => Pusher['private-my_channel'].authenticate(params[:socket_id])
@@ -121,34 +137,11 @@ module Pusher
121
137
  # @private Custom data is sent to server as JSON-encoded string
122
138
  #
123
139
  def authenticate(socket_id, custom_data = nil)
124
- custom_data = custom_data.to_json if custom_data
125
- auth = socket_auth(socket_id, custom_data)
140
+ custom_data = MultiJson.encode(custom_data) if custom_data
141
+ auth = authentication_string(socket_id, custom_data)
126
142
  r = {:auth => auth}
127
143
  r[:channel_data] = custom_data if custom_data
128
144
  r
129
145
  end
130
-
131
- private
132
-
133
- def construct_event_request(event_name, data, socket_id)
134
- params = {
135
- :name => event_name,
136
- }
137
- params[:socket_id] = socket_id if socket_id
138
-
139
- body = case data
140
- when String
141
- data
142
- else
143
- begin
144
- data.to_json
145
- rescue Exception => e
146
- Pusher.logger.error("Could not convert #{data.inspect} into JSON")
147
- raise e
148
- end
149
- end
150
-
151
- Pusher::Request.new(:post, @uri + 'events', params, body)
152
- end
153
146
  end
154
147
  end
@@ -0,0 +1,306 @@
1
+ require 'signature'
2
+
3
+ module Pusher
4
+ class Client
5
+ attr_accessor :scheme, :host, :port, :app_id, :key, :secret
6
+ attr_reader :http_proxy, :proxy
7
+ attr_writer :connect_timeout, :send_timeout, :receive_timeout,
8
+ :keep_alive_timeout
9
+
10
+ ## CONFIGURATION ##
11
+
12
+ def initialize(options = {})
13
+ options = {
14
+ :scheme => 'http',
15
+ :host => 'api.pusherapp.com',
16
+ :port => 80,
17
+ }.merge(options)
18
+ @scheme, @host, @port, @app_id, @key, @secret = options.values_at(
19
+ :scheme, :host, :port, :app_id, :key, :secret
20
+ )
21
+ @http_proxy = nil
22
+ self.http_proxy = options[:http_proxy] if options[:http_proxy]
23
+
24
+ # Default timeouts
25
+ @connect_timeout = 5
26
+ @send_timeout = 5
27
+ @receive_timeout = 5
28
+ @keep_alive_timeout = 30
29
+ end
30
+
31
+ # @private Returns the authentication token for the client
32
+ def authentication_token
33
+ Signature::Token.new(@key, @secret)
34
+ end
35
+
36
+ # @private Builds a url for this app, optionally appending a path
37
+ def url(path = nil)
38
+ URI::Generic.build({
39
+ :scheme => @scheme,
40
+ :host => @host,
41
+ :port => @port,
42
+ :path => "/apps/#{@app_id}#{path}"
43
+ })
44
+ end
45
+
46
+ # Configure Pusher connection by providing a url rather than specifying
47
+ # scheme, key, secret, and app_id separately.
48
+ #
49
+ # @example
50
+ # Pusher.url = http://KEY:SECRET@api.pusherapp.com/apps/APP_ID
51
+ #
52
+ def url=(url)
53
+ uri = URI.parse(url)
54
+ @scheme = uri.scheme
55
+ @app_id = uri.path.split('/').last
56
+ @key = uri.user
57
+ @secret = uri.password
58
+ @host = uri.host
59
+ @port = uri.port
60
+ end
61
+
62
+ def http_proxy=(http_proxy)
63
+ @http_proxy = http_proxy
64
+ uri = URI.parse(http_proxy)
65
+ @proxy = {
66
+ :scheme => uri.scheme,
67
+ :host => uri.host,
68
+ :port => uri.port,
69
+ :user => uri.user,
70
+ :password => uri.password
71
+ }
72
+ @http_proxy
73
+ end
74
+
75
+ # Configure whether Pusher API calls should be made over SSL
76
+ # (default false)
77
+ #
78
+ # @example
79
+ # Pusher.encrypted = true
80
+ #
81
+ def encrypted=(boolean)
82
+ @scheme = boolean ? 'https' : 'http'
83
+ # Configure port if it hasn't already been configured
84
+ @port = boolean ? 443 : 80
85
+ end
86
+
87
+ def encrypted?
88
+ @scheme == 'https'
89
+ end
90
+
91
+ # Convenience method to set all timeouts to the same value (in seconds).
92
+ # For more control, use the individual writers.
93
+ def timeout=(value)
94
+ @connect_timeout, @send_timeout, @receive_timeout = value, value, value
95
+ end
96
+
97
+ ## INTERACE WITH THE API ##
98
+
99
+ def resource(path)
100
+ Resource.new(self, path)
101
+ end
102
+
103
+ # GET arbitrary REST API resource using a synchronous http client.
104
+ # All request signing is handled automatically.
105
+ #
106
+ # @example
107
+ # begin
108
+ # Pusher.get('/channels', filter_by_prefix: 'private-')
109
+ # rescue Pusher::Error => e
110
+ # # Handle error
111
+ # end
112
+ #
113
+ # @param path [String] Path excluding /apps/APP_ID
114
+ # @param params [Hash] API params (see http://pusher.com/docs/rest_api)
115
+ #
116
+ # @return [Hash] See Pusher API docs
117
+ #
118
+ # @raise [Pusher::Error] Unsuccessful response - see the error message
119
+ # @raise [Pusher::HTTPError] Error raised inside http client. The original error is wrapped in error.original_error
120
+ #
121
+ def get(path, params = {})
122
+ Resource.new(self, path).get(params)
123
+ end
124
+
125
+ # GET arbitrary REST API resource using an asynchronous http client.
126
+ # All request signing is handled automatically.
127
+ #
128
+ # When the eventmachine reactor is running, the em-http-request gem is used;
129
+ # otherwise an async request is made using httpclient. See README for
130
+ # details and examples.
131
+ #
132
+ # @param path [String] Path excluding /apps/APP_ID
133
+ # @param params [Hash] API params (see http://pusher.com/docs/rest_api)
134
+ #
135
+ # @return Either an EM::DefaultDeferrable or a HTTPClient::Connection
136
+ #
137
+ def get_async(path, params = {})
138
+ Resource.new(self, path).get_async(params)
139
+ end
140
+
141
+ # POST arbitrary REST API resource using a synchronous http client.
142
+ # Works identially to get method, but posts params as JSON in post body.
143
+ def post(path, params = {})
144
+ Resource.new(self, path).post(params)
145
+ end
146
+
147
+ # POST arbitrary REST API resource using an asynchronous http client.
148
+ # Works identially to get_async method, but posts params as JSON in post
149
+ # body.
150
+ def post_async(path, params = {})
151
+ Resource.new(self, path).post_async(params)
152
+ end
153
+
154
+ ## HELPER METHODS ##
155
+
156
+ # Convenience method for creating a new WebHook instance for validating
157
+ # and extracting info from a received WebHook
158
+ #
159
+ # @param request [Rack::Request] Either a Rack::Request or a Hash containing :key, :signature, :body, and optionally :content_type.
160
+ #
161
+ def webhook(request)
162
+ WebHook.new(request, self)
163
+ end
164
+
165
+ # Return a convenience channel object by name. No API request is made.
166
+ #
167
+ # @example
168
+ # Pusher['my-channel']
169
+ # @return [Channel]
170
+ # @raise [ConfigurationError] unless key, secret and app_id have been
171
+ # configured
172
+ def channel(channel_name)
173
+ raise ConfigurationError, 'Missing client configuration: please check that key, secret and app_id are configured.' unless configured?
174
+ Channel.new(url, channel_name, self)
175
+ end
176
+
177
+ alias :[] :channel
178
+
179
+ # Request a list of occupied channels from the API
180
+ #
181
+ # GET /apps/[id]/channels
182
+ #
183
+ # @param params [Hash] Hash of parameters for the API - see REST API docs
184
+ #
185
+ # @return [Hash] See Pusher API docs
186
+ #
187
+ # @raise [Pusher::Error] Unsuccessful response - see the error message
188
+ # @raise [Pusher::HTTPError] Error raised inside http client. The original error is wrapped in error.original_error
189
+ #
190
+ def channels(params = {})
191
+ get('/channels', params)
192
+ end
193
+
194
+ # Request info for a specific channel
195
+ #
196
+ # GET /apps/[id]/channels/[channel_name]
197
+ #
198
+ # @param channel_name [String] Channel name
199
+ # @param params [Hash] Hash of parameters for the API - see REST API docs
200
+ #
201
+ # @return [Hash] See Pusher API docs
202
+ #
203
+ # @raise [Pusher::Error] Unsuccessful response - see the error message
204
+ # @raise [Pusher::HTTPError] Error raised inside http client. The original error is wrapped in error.original_error
205
+ #
206
+ def channel_info(channel_name, params = {})
207
+ get("/channels/#{channel_name}", params)
208
+ end
209
+
210
+ # Trigger an event on one or more channels
211
+ #
212
+ # POST /apps/[app_id]/events
213
+ #
214
+ # @param channels [String or Array] One of more channel names
215
+ # @param event_name [String]
216
+ # @param data [Object] Event data to be triggered in javascript.
217
+ # Objects other than strings will be converted to JSON
218
+ # @param params [Hash] Additional parameters to send to api, e.g socket_id
219
+ #
220
+ # @return [Hash] See Pusher API docs
221
+ #
222
+ # @raise [Pusher::Error] Unsuccessful response - see the error message
223
+ # @raise [Pusher::HTTPError] Error raised inside http client. The original error is wrapped in error.original_error
224
+ #
225
+ def trigger(channels, event_name, data, params = {})
226
+ post('/events', trigger_params(channels, event_name, data, params))
227
+ end
228
+
229
+ # Trigger an event on one or more channels asynchronously.
230
+ # For parameters see #trigger
231
+ #
232
+ def trigger_async(channels, event_name, data, params = {})
233
+ post_async('/events', trigger_params(channels, event_name, data, params))
234
+ end
235
+
236
+ # @private Construct a net/http http client
237
+ def sync_http_client
238
+ @client ||= begin
239
+ require 'httpclient'
240
+
241
+ HTTPClient.new(@http_proxy).tap do |c|
242
+ c.connect_timeout = @connect_timeout
243
+ c.send_timeout = @send_timeout
244
+ c.receive_timeout = @receive_timeout
245
+ c.keep_alive_timeout = @keep_alive_timeout
246
+ end
247
+ end
248
+ end
249
+
250
+ # @private Construct an em-http-request http client
251
+ def em_http_client(uri)
252
+ begin
253
+ unless defined?(EventMachine) && EventMachine.reactor_running?
254
+ raise Error, "In order to use async calling you must be running inside an eventmachine loop"
255
+ end
256
+ require 'em-http' unless defined?(EventMachine::HttpRequest)
257
+
258
+ connection_opts = {
259
+ :connect_timeout => @connect_timeout,
260
+ :inactivity_timeout => @receive_timeout,
261
+ }
262
+
263
+ if defined?(@proxy)
264
+ proxy_opts = {
265
+ :host => @proxy[:host],
266
+ :port => @proxy[:port]
267
+ }
268
+ if @proxy[:user]
269
+ proxy_opts[:authorization] = [@proxy[:user], @proxy[:password]]
270
+ end
271
+ connection_opts[:proxy] = proxy_opts
272
+ end
273
+
274
+ EventMachine::HttpRequest.new(uri, connection_opts)
275
+ end
276
+ end
277
+
278
+ private
279
+
280
+ def trigger_params(channels, event_name, data, params)
281
+ channels = Array(channels).map(&:to_s)
282
+
283
+ encoded_data = case data
284
+ when String
285
+ data
286
+ else
287
+ begin
288
+ MultiJson.encode(data)
289
+ rescue MultiJson::DecodeError => e
290
+ Pusher.logger.error("Could not convert #{data.inspect} into JSON")
291
+ raise e
292
+ end
293
+ end
294
+
295
+ return params.merge({
296
+ :name => event_name,
297
+ :channels => channels,
298
+ :data => encoded_data,
299
+ })
300
+ end
301
+
302
+ def configured?
303
+ host && scheme && key && secret && app_id
304
+ end
305
+ end
306
+ end