skyfallsin-ruby_bosh 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +4 -0
- data/lib/ruby_bosh.rb +27 -19
- metadata +1 -1
data/VERSION.yml
ADDED
data/lib/ruby_bosh.rb
CHANGED
@@ -3,6 +3,7 @@ require 'builder'
|
|
3
3
|
require 'rexml/document'
|
4
4
|
require 'base64'
|
5
5
|
require 'hpricot'
|
6
|
+
require 'system_timer'
|
6
7
|
|
7
8
|
# based on
|
8
9
|
# http://code.stanziq.com/svn/strophe/trunk/strophejs/examples/attach/boshclient.py
|
@@ -13,17 +14,33 @@ class RubyBOSHClient
|
|
13
14
|
BIND_XMLNS = 'urn:ietf:params:xml:ns:xmpp-bind'
|
14
15
|
SESSION_XMLNS = 'urn:ietf:params:xml:ns:xmpp-session'
|
15
16
|
|
17
|
+
class Timeout < StandardError; end
|
18
|
+
|
16
19
|
attr_accessor :jid, :rid, :sid, :success
|
17
|
-
def initialize(jid, pw, service_url)
|
20
|
+
def initialize(jid, pw, service_url, opts={})
|
18
21
|
@service_url = service_url
|
19
22
|
@jid, @pw = jid, pw
|
20
23
|
@host = jid.split("@").last
|
21
24
|
@success = false
|
25
|
+
@timeout = opts[:timeout] || 3 #seconds
|
22
26
|
@headers = {"Content-Type" => "text/xml; charset=utf-8",
|
23
27
|
"Accept" => "text/xml"}
|
24
28
|
connect
|
25
29
|
end
|
26
30
|
|
31
|
+
def initialize_bosh_session
|
32
|
+
response = deliver(construct_body(:wait => 5, :to => @host,
|
33
|
+
:hold => 3, :window => 5,
|
34
|
+
"xmpp:version" => '1.0'))
|
35
|
+
parse(response)
|
36
|
+
end
|
37
|
+
|
38
|
+
def success?
|
39
|
+
success == true
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
27
44
|
def connect
|
28
45
|
initialize_bosh_session
|
29
46
|
if send_auth_request
|
@@ -36,13 +53,6 @@ class RubyBOSHClient
|
|
36
53
|
@rid+=1 #send this directly to the browser
|
37
54
|
end
|
38
55
|
end
|
39
|
-
|
40
|
-
def initialize_bosh_session
|
41
|
-
response = deliver(construct_body(:wait => 5, :to => @host,
|
42
|
-
:hold => 3, :window => 5,
|
43
|
-
"xmpp:version" => '1.0'))
|
44
|
-
parse(response)
|
45
|
-
end
|
46
56
|
|
47
57
|
def construct_body(params={}, &block)
|
48
58
|
@rid ? @rid+=1 : @rid=rand(100000)
|
@@ -65,7 +75,6 @@ class RubyBOSHClient
|
|
65
75
|
end
|
66
76
|
|
67
77
|
response = deliver(request)
|
68
|
-
# TODO: make the following more robust
|
69
78
|
response.include?("success")
|
70
79
|
end
|
71
80
|
|
@@ -108,14 +117,13 @@ class RubyBOSHClient
|
|
108
117
|
_response
|
109
118
|
end
|
110
119
|
|
111
|
-
def success?
|
112
|
-
success == true
|
113
|
-
end
|
114
|
-
|
115
|
-
private
|
116
120
|
def deliver(xml)
|
117
|
-
|
118
|
-
|
121
|
+
SystemTimer.timeout(@timeout) do
|
122
|
+
send(xml)
|
123
|
+
recv(RestClient.post(@service_url, xml, @headers))
|
124
|
+
end
|
125
|
+
rescue SystemTimer::Error => e
|
126
|
+
raise RubyBOSHClient::Timeout, e.message
|
119
127
|
end
|
120
128
|
|
121
129
|
def send(msg)
|
@@ -129,8 +137,8 @@ end
|
|
129
137
|
|
130
138
|
|
131
139
|
class RubyBOSH
|
132
|
-
def self.initialize_session(jid, pw, service_url)
|
133
|
-
conn = RubyBOSHClient.new(jid, pw, service_url)
|
140
|
+
def self.initialize_session(jid, pw, service_url, opts={})
|
141
|
+
conn = RubyBOSHClient.new(jid, pw, service_url, opts)
|
134
142
|
if conn.success?
|
135
143
|
[conn.jid, conn.sid, conn.rid]
|
136
144
|
else
|
@@ -140,6 +148,6 @@ class RubyBOSH
|
|
140
148
|
end
|
141
149
|
|
142
150
|
if __FILE__ == $0
|
143
|
-
p RubyBOSH.initialize_session(
|
151
|
+
p RubyBOSH.initialize_session(ARGV[0], ARGV[1],
|
144
152
|
"http://localhost:5280/http-bind")
|
145
153
|
end
|