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.
Files changed (66) hide show
  1. data/README +1 -1
  2. data/Rakefile +12 -2
  3. data/conf/config.rb +1 -0
  4. data/lib/vines/config.rb +8 -0
  5. data/lib/vines/contact.rb +2 -4
  6. data/lib/vines/error.rb +1 -1
  7. data/lib/vines/router.rb +26 -18
  8. data/lib/vines/stanza/presence.rb +3 -1
  9. data/lib/vines/stanza.rb +8 -1
  10. data/lib/vines/stream/client/bind.rb +9 -1
  11. data/lib/vines/stream/client/session.rb +146 -0
  12. data/lib/vines/stream/client.rb +19 -78
  13. data/lib/vines/stream/component.rb +6 -2
  14. data/lib/vines/stream/http/auth.rb +22 -0
  15. data/lib/vines/stream/http/bind.rb +32 -0
  16. data/lib/vines/stream/http/bind_restart.rb +36 -0
  17. data/lib/vines/stream/http/ready.rb +25 -0
  18. data/lib/vines/stream/http/request.rb +33 -0
  19. data/lib/vines/stream/http/session.rb +116 -0
  20. data/lib/vines/stream/http/sessions.rb +65 -0
  21. data/lib/vines/stream/http/start.rb +23 -0
  22. data/lib/vines/stream/http.rb +119 -77
  23. data/lib/vines/stream/server.rb +8 -3
  24. data/lib/vines/stream/state.rb +6 -1
  25. data/lib/vines/stream.rb +31 -19
  26. data/lib/vines/user.rb +2 -4
  27. data/lib/vines/version.rb +1 -1
  28. data/lib/vines.rb +10 -4
  29. data/test/config_test.rb +34 -33
  30. data/test/contact_test.rb +42 -0
  31. data/test/error_test.rb +2 -2
  32. data/test/jid_test.rb +7 -7
  33. data/test/kit_test.rb +10 -10
  34. data/test/rake_test_loader.rb +9 -0
  35. data/test/router_test.rb +4 -3
  36. data/test/stanza/iq/roster_test.rb +8 -10
  37. data/test/stanza/iq/session_test.rb +2 -3
  38. data/test/stanza/iq/vcard_test.rb +4 -5
  39. data/test/stanza/message_test.rb +17 -11
  40. data/test/stanza/presence/subscribe_test.rb +3 -4
  41. data/test/storage/couchdb_test.rb +9 -10
  42. data/test/storage/ldap_test.rb +30 -37
  43. data/test/storage/local_test.rb +6 -6
  44. data/test/storage/redis_test.rb +6 -6
  45. data/test/storage/sql_test.rb +5 -5
  46. data/test/storage/storage_tests.rb +11 -11
  47. data/test/storage_test.rb +4 -5
  48. data/test/stream/client/auth_test.rb +15 -16
  49. data/test/stream/client/ready_test.rb +4 -5
  50. data/test/stream/client/session_test.rb +21 -0
  51. data/test/stream/component/handshake_test.rb +6 -7
  52. data/test/stream/component/ready_test.rb +9 -10
  53. data/test/stream/component/start_test.rb +6 -7
  54. data/test/stream/http/auth_test.rb +68 -0
  55. data/test/stream/http/ready_test.rb +56 -0
  56. data/test/stream/http/sessions_test.rb +50 -0
  57. data/test/stream/http/start_test.rb +51 -0
  58. data/test/stream/parser_test.rb +5 -5
  59. data/test/stream/server/outbound/auth_test.rb +12 -13
  60. data/test/stream/server/ready_test.rb +10 -11
  61. data/test/token_bucket_test.rb +7 -7
  62. data/test/user_test.rb +8 -6
  63. metadata +45 -14
  64. data/lib/vines/stream/http/http_request.rb +0 -22
  65. data/lib/vines/stream/http/http_state.rb +0 -139
  66. 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