class Vines::Stream::Http::Session
Constants
- CONTENT_TYPE
Attributes
content_type[RW]
hold[RW]
inactivity[RW]
wait[RW]
Public Class Methods
new(stream)
click to toggle source
Calls superclass method
Vines::Stream::Client::Session::new
# File lib/vines/stream/http/session.rb, line 13 def initialize(stream) super @state = Http::Start.new(stream) @inactivity, @wait, @hold = 20, 60, 1 @replied = Time.now @requests, @responses = [], [] @content_type = CONTENT_TYPE end
Public Instance Methods
close()
click to toggle source
# File lib/vines/stream/http/session.rb, line 22 def close Sessions.delete(@id) router.delete(self) delete_from_cluster unsubscribe_pubsub @requests.each {|req| req.stream.close_connection } @requests.clear @responses.clear @state = Client::Closed.new(nil) @unbound = true @available = false broadcast_unavailable end
expired?()
click to toggle source
# File lib/vines/stream/http/session.rb, line 44 def expired? respond_to_expired_requests @requests.empty? && (Time.now - @replied > @inactivity) end
ready?()
click to toggle source
# File lib/vines/stream/http/session.rb, line 36 def ready? @state.class == Http::Ready end
reply(node)
click to toggle source
Send an HTTP 200 OK response wrapping the XMPP node content back to the client.
node - The XML::Node to send to the client.
Returns nothing.
# File lib/vines/stream/http/session.rb, line 80 def reply(node) if request = @requests.shift request.reply(node, @content_type) @replied = Time.now end end
request(request)
click to toggle source
# File lib/vines/stream/http/session.rb, line 60 def request(request) if @responses.any? request.reply(wrap_body(@responses.join), @content_type) @replied = Time.now @responses.clear else while @requests.size >= @hold @requests.shift.reply(wrap_body(''), @content_type) @replied = Time.now end @requests << request end end
requests()
click to toggle source
# File lib/vines/stream/http/session.rb, line 40 def requests @requests.clone end
resume(stream, node)
click to toggle source
Resume this session from its most recent state with a new client stream and incoming node.
# File lib/vines/stream/http/session.rb, line 51 def resume(stream, node) stream.session.requests.each do |req| request(req) end stream.session = self @state.stream = stream @state.node(node) end
unbind!(stream)
click to toggle source
# File lib/vines/stream/http/session.rb, line 103 def unbind!(stream) @requests.reject! {|req| req.stream == stream } end
write(node)
click to toggle source
Write the XMPP node to the client stream after wrapping it in a BOSH body tag. If there's a waiting request, the node is written immediately. If not, it's queued until the next request arrives.
data - The XML String or XML::Node to send in the next HTTP response.
Returns nothing.
# File lib/vines/stream/http/session.rb, line 94 def write(node) if request = @requests.shift request.reply(wrap_body(node), @content_type) @replied = Time.now else @responses << node.to_s end end
Private Instance Methods
respond_to_expired_requests()
click to toggle source
# File lib/vines/stream/http/session.rb, line 109 def respond_to_expired_requests expired = @requests.select {|req| req.age > @wait } expired.each do |request| request.reply(wrap_body(''), @content_type) @requests.delete(request) @replied = Time.now end end
wrap_body(data)
click to toggle source
# File lib/vines/stream/http/session.rb, line 118 def wrap_body(data) doc = Document.new doc.create_element('body') do |node| node.add_namespace(nil, NAMESPACES[:http_bind]) node.inner_html = data.to_s end end