vines 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +1 -1
- data/Rakefile +12 -2
- data/conf/config.rb +1 -0
- data/lib/vines/config.rb +8 -0
- data/lib/vines/contact.rb +2 -4
- data/lib/vines/error.rb +1 -1
- data/lib/vines/router.rb +26 -18
- data/lib/vines/stanza/presence.rb +3 -1
- data/lib/vines/stanza.rb +8 -1
- data/lib/vines/stream/client/bind.rb +9 -1
- data/lib/vines/stream/client/session.rb +146 -0
- data/lib/vines/stream/client.rb +19 -78
- data/lib/vines/stream/component.rb +6 -2
- data/lib/vines/stream/http/auth.rb +22 -0
- data/lib/vines/stream/http/bind.rb +32 -0
- data/lib/vines/stream/http/bind_restart.rb +36 -0
- data/lib/vines/stream/http/ready.rb +25 -0
- data/lib/vines/stream/http/request.rb +33 -0
- data/lib/vines/stream/http/session.rb +116 -0
- data/lib/vines/stream/http/sessions.rb +65 -0
- data/lib/vines/stream/http/start.rb +23 -0
- data/lib/vines/stream/http.rb +119 -77
- data/lib/vines/stream/server.rb +8 -3
- data/lib/vines/stream/state.rb +6 -1
- data/lib/vines/stream.rb +31 -19
- data/lib/vines/user.rb +2 -4
- data/lib/vines/version.rb +1 -1
- data/lib/vines.rb +10 -4
- data/test/config_test.rb +34 -33
- data/test/contact_test.rb +42 -0
- data/test/error_test.rb +2 -2
- data/test/jid_test.rb +7 -7
- data/test/kit_test.rb +10 -10
- data/test/rake_test_loader.rb +9 -0
- data/test/router_test.rb +4 -3
- data/test/stanza/iq/roster_test.rb +8 -10
- data/test/stanza/iq/session_test.rb +2 -3
- data/test/stanza/iq/vcard_test.rb +4 -5
- data/test/stanza/message_test.rb +17 -11
- data/test/stanza/presence/subscribe_test.rb +3 -4
- data/test/storage/couchdb_test.rb +9 -10
- data/test/storage/ldap_test.rb +30 -37
- data/test/storage/local_test.rb +6 -6
- data/test/storage/redis_test.rb +6 -6
- data/test/storage/sql_test.rb +5 -5
- data/test/storage/storage_tests.rb +11 -11
- data/test/storage_test.rb +4 -5
- data/test/stream/client/auth_test.rb +15 -16
- data/test/stream/client/ready_test.rb +4 -5
- data/test/stream/client/session_test.rb +21 -0
- data/test/stream/component/handshake_test.rb +6 -7
- data/test/stream/component/ready_test.rb +9 -10
- data/test/stream/component/start_test.rb +6 -7
- data/test/stream/http/auth_test.rb +68 -0
- data/test/stream/http/ready_test.rb +56 -0
- data/test/stream/http/sessions_test.rb +50 -0
- data/test/stream/http/start_test.rb +51 -0
- data/test/stream/parser_test.rb +5 -5
- data/test/stream/server/outbound/auth_test.rb +12 -13
- data/test/stream/server/ready_test.rb +10 -11
- data/test/token_bucket_test.rb +7 -7
- data/test/user_test.rb +8 -6
- metadata +45 -14
- data/lib/vines/stream/http/http_request.rb +0 -22
- data/lib/vines/stream/http/http_state.rb +0 -139
- data/lib/vines/stream/http/http_states.rb +0 -53
@@ -1,22 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
module Vines
|
4
|
-
class Stream
|
5
|
-
class Http
|
6
|
-
class HttpState
|
7
|
-
class HttpRequest
|
8
|
-
attr_accessor :rid
|
9
|
-
|
10
|
-
def initialize(rid)
|
11
|
-
@rid = rid
|
12
|
-
@received = Time.now
|
13
|
-
end
|
14
|
-
|
15
|
-
def timed_out?
|
16
|
-
Time.now - @received > 55
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,139 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
module Vines
|
4
|
-
class Stream
|
5
|
-
class Http
|
6
|
-
class HttpState
|
7
|
-
include Nokogiri::XML
|
8
|
-
|
9
|
-
attr_reader :domain
|
10
|
-
attr_accessor :last_broadcast_presence, :expiration, :domain
|
11
|
-
attr_accessor :last_activity, :queued_stanzas, :queued_requests, :user
|
12
|
-
|
13
|
-
def initialize(stream, sid, rid, domain=nil)
|
14
|
-
@stream, @sid, @domain = stream, sid, domain
|
15
|
-
@last_activity = Time.now
|
16
|
-
@state = Stream::Client::Start.new(self)
|
17
|
-
@queued_stanzas = []
|
18
|
-
@queued_requests = []
|
19
|
-
@expiration = 65
|
20
|
-
@pinged = false
|
21
|
-
create_session(rid, sid)
|
22
|
-
end
|
23
|
-
|
24
|
-
def method_missing(method, *args, &block)
|
25
|
-
@stream.send(method, *args, &block)
|
26
|
-
end
|
27
|
-
|
28
|
-
def send_response(data, sid, rid)
|
29
|
-
doc = Document.new
|
30
|
-
body = doc.create_element('body',
|
31
|
-
'rid' => rid,
|
32
|
-
'sid' => sid,
|
33
|
-
'xmlns' => NAMESPACES[:http_bind]) do |node|
|
34
|
-
node.inner_html = data
|
35
|
-
end.to_s
|
36
|
-
@stream.log_node(body, :out)
|
37
|
-
@stream.send_data([create_header(body.bytesize), body].join("\r\n\r\n"))
|
38
|
-
end
|
39
|
-
|
40
|
-
def create_header(content_length)
|
41
|
-
["HTTP/1.1 200 OK",
|
42
|
-
"Content-Type: text/xml; charset=utf-8",
|
43
|
-
"Content-Length: #{content_length}"].join("\r\n")
|
44
|
-
end
|
45
|
-
|
46
|
-
def expired?
|
47
|
-
cleanup_requests
|
48
|
-
(Time.now - @last_activity > @expiration) && @queued_requests.empty?
|
49
|
-
end
|
50
|
-
|
51
|
-
def cleanup_requests
|
52
|
-
timed_out_requests.each do |request|
|
53
|
-
log.debug("Clearing out #{request.rid}")
|
54
|
-
send_response("", @sid, request.rid)
|
55
|
-
@queued_requests.delete(request)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def ping
|
60
|
-
log.debug("Pinging #{self}. Request queue: #{@queued_requests}")
|
61
|
-
@last_activity = Time.now
|
62
|
-
write("")
|
63
|
-
@pinged = true
|
64
|
-
end
|
65
|
-
|
66
|
-
def pinged?
|
67
|
-
@pinged
|
68
|
-
end
|
69
|
-
|
70
|
-
def create_session(rid, sid)
|
71
|
-
doc = Document.new
|
72
|
-
node = doc.create_element('body',
|
73
|
-
'accept' => 'deflate,gzip',
|
74
|
-
'ack' => rid,
|
75
|
-
'charsets' => 'UTF-8',
|
76
|
-
'from' => domain,
|
77
|
-
'hold' => '1',
|
78
|
-
'inactivity' => '30',
|
79
|
-
'maxpause' => '120',
|
80
|
-
'polling' => '5',
|
81
|
-
'requests' => '2',
|
82
|
-
'sid' => sid,
|
83
|
-
'ver' => '1.6',
|
84
|
-
'wait' => '60',
|
85
|
-
'xmlns' => 'http://jabber.org/protocol/httpbind')
|
86
|
-
|
87
|
-
node << doc.create_element('features', 'xmlns' => 'jabber:client') do |el|
|
88
|
-
el << doc.create_element('mechanisms') do |parent|
|
89
|
-
parent.default_namespace = NAMESPACES[:sasl]
|
90
|
-
mechanisms.each {|name| parent << doc.create_element('mechanism', name) }
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
@stream.send_data([create_header(node.to_s.bytesize), node.to_s].join("\r\n\r\n"))
|
95
|
-
end
|
96
|
-
|
97
|
-
def request(rid)
|
98
|
-
@pinged = false
|
99
|
-
@last_activity = Time.now
|
100
|
-
if @queued_stanzas.size > 0
|
101
|
-
send_response(@queued_stanzas.join(" "), @sid, rid)
|
102
|
-
@queued_stanzas.clear
|
103
|
-
else
|
104
|
-
@queued_requests << HttpRequest.new(rid)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def write(node)
|
109
|
-
request = @queued_requests.shift
|
110
|
-
unless request.nil?
|
111
|
-
send_response(node.to_s, @sid, request.rid)
|
112
|
-
else
|
113
|
-
@queued_stanzas << node.to_s
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def timed_out_requests
|
118
|
-
@queued_requests.select {|request| request.timed_out? }
|
119
|
-
end
|
120
|
-
|
121
|
-
def mechanisms
|
122
|
-
['EXTERNAL', 'PLAIN']
|
123
|
-
end
|
124
|
-
|
125
|
-
def handle_restart
|
126
|
-
doc = Document.new
|
127
|
-
node = doc.create_element('body',
|
128
|
-
'xmlns' => NAMESPACES[:http_bind],
|
129
|
-
'xmlns:stream' => NAMESPACES[:stream])
|
130
|
-
node << doc.create_element('stream:features') do |features|
|
131
|
-
features << doc.create_element('bind', 'xmlns' => NAMESPACES[:bind])
|
132
|
-
end
|
133
|
-
@available = true
|
134
|
-
@stream.send_data([create_header(node.to_s.bytesize), node.to_s].join("\r\n\r\n"))
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
module Vines
|
4
|
-
class Stream
|
5
|
-
class Http
|
6
|
-
class HttpStates
|
7
|
-
include Vines::Log
|
8
|
-
|
9
|
-
def start_timer
|
10
|
-
@timer ||= EventMachine::PeriodicTimer.new(5) { cleanup }
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize
|
14
|
-
@http_states = {}
|
15
|
-
start_timer
|
16
|
-
end
|
17
|
-
|
18
|
-
def cleanup
|
19
|
-
# An expired HTTP client is one that has no queued requests
|
20
|
-
# and has no activity in more than 60 seconds
|
21
|
-
expired.each do |sid, http_state|
|
22
|
-
@http_states.delete(sid)
|
23
|
-
log.debug("Removed expired HTTP client #{sid}")
|
24
|
-
end
|
25
|
-
rescue Exception => e
|
26
|
-
log.error("Failed to cleanup HTTP connections: #{e}")
|
27
|
-
end
|
28
|
-
|
29
|
-
def []=(sid, http_state)
|
30
|
-
@http_states[sid] = http_state
|
31
|
-
end
|
32
|
-
|
33
|
-
def [](sid)
|
34
|
-
@http_states[sid]
|
35
|
-
end
|
36
|
-
|
37
|
-
def connected_http_clients
|
38
|
-
@http_states
|
39
|
-
end
|
40
|
-
|
41
|
-
def delete
|
42
|
-
@http_states
|
43
|
-
end
|
44
|
-
|
45
|
-
private
|
46
|
-
|
47
|
-
def expired
|
48
|
-
@http_states.select {|sid, http_state| http_state.expired? }
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|