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.

# File lib/vines/stream/http/session.rb, line 76
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 95
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.

# File lib/vines/stream/http/session.rb, line 86
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 101
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 110
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