-
Notifications
You must be signed in to change notification settings - Fork 8
/
client.rb
71 lines (56 loc) · 1.86 KB
/
client.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# #--
# Copyright (C)2009 Ilya Grigorik
#
# You can redistribute this under the terms of the Ruby
# #--
module EventMachine
class PubSubHubbub
include EventMachine::Deferrable
HEADERS = {"User-Agent" => "PubSubHubbub Ruby", "Content-Type" => "application/x-www-form-urlencoded"}
# Options
# :basic -- to use basic auth with the hub. expects ['user','pass']
def initialize(hub,options={})
@basic_auth= options.delete(:basic)
@headers = if @basic_auth
HEADERS.merge 'authorization' => @basic_auth
else
HEADERS
end
@hub = hub.kind_of?(URI) ? hub : URI::parse(hub)
end
def publish(*feeds)
data = feeds.flatten.collect do |feed|
{'hub.url' => feed, 'hub.mode' => 'publish'}.to_params
end.join("&")
r = EventMachine::HttpRequest.new(@hub).post :body => data, :head => @headers
r.callback {
if r.response_header.status == 204
succeed r
else
fail r
end
}
r.errback { fail }
yield r if block_given?
r
end
# These command will work only if the callback URL supports confirmation.
def subscribe(feed, callback, options = {}); command('subscribe', feed, callback, options); end
def unsubscribe(feed, callback, options = {}); command('unsubscribe', feed, callback, options); end
private
def command(cmd, feed, callback, options)
options['hub.verify'] ||= "sync"
params = {'hub.topic' => feed, 'hub.mode' => cmd, 'hub.callback' => callback}.merge(options).to_params
r = EventMachine::HttpRequest.new(@hub).post :body => params, :head => @headers
r.callback {
if r.response_header.status == 204
succeed r
else
fail r
end
}
r.errback { fail }
r
end
end
end