Class: Vines::Stream::Http::Session

Inherits:
Client::Session show all
Includes:
Nokogiri::XML
Defined in:
lib/vines/stream/http/session.rb

Constant Summary collapse

CONTENT_TYPE =
'text/xml; charset=utf-8'.freeze

Instance Attribute Summary collapse

Attributes inherited from Client::Session

#domain, #id, #last_broadcast_presence, #state, #user

Instance Method Summary collapse

Methods inherited from Client::Session

#<=>, #advance, #authenticated?, #available!, #available?, #available_subscribed_to_resources, #available_subscribers, #connected?, #hash, #interested?, #remote_subscribers, #requested_roster!, #stream_type

Constructor Details

#initialize(stream) ⇒ Session

Returns a new instance of Session.



13
14
15
16
17
18
19
20
# 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

Instance Attribute Details

#content_typeObject

Returns the value of attribute content_type.



9
10
11
# File 'lib/vines/stream/http/session.rb', line 9

def content_type
  @content_type
end

#holdObject

Returns the value of attribute hold.



9
10
11
# File 'lib/vines/stream/http/session.rb', line 9

def hold
  @hold
end

#inactivityObject

Returns the value of attribute inactivity.



9
10
11
# File 'lib/vines/stream/http/session.rb', line 9

def inactivity
  @inactivity
end

#waitObject

Returns the value of attribute wait.



9
10
11
# File 'lib/vines/stream/http/session.rb', line 9

def wait
  @wait
end

Instance Method Details

#closeObject



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/vines/stream/http/session.rb', line 22

def close
  Sessions.delete(@id)
  router.delete(self)
  @requests.each {|req| req.stream.close_connection }
  @requests.clear
  @responses.clear
  @state = Client::Closed.new(nil)
  @unbound = true
  @available = false
  broadcast_unavailable
end

#expired?Boolean

Returns:

  • (Boolean)


42
43
44
45
# File 'lib/vines/stream/http/session.rb', line 42

def expired?
  respond_to_expired_requests
  @requests.empty? && (Time.now - @replied > @inactivity)
end

#ready?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/vines/stream/http/session.rb', line 34

def ready?
  @state.class == Http::Ready
end

#reply(node) ⇒ Object

Send an HTTP 200 OK response wrapping the XMPP node content back to the client.



74
75
76
77
78
79
# File 'lib/vines/stream/http/session.rb', line 74

def reply(node)
  if request = @requests.shift
    request.reply(node, @content_type)
    @replied = Time.now
  end
end

#request(request) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/vines/stream/http/session.rb', line 58

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

#requestsObject



38
39
40
# File 'lib/vines/stream/http/session.rb', line 38

def requests
  @requests.clone
end

#resume(stream, node) ⇒ Object

Resume this session from its most recent state with a new client stream and incoming node.



49
50
51
52
53
54
55
56
# File 'lib/vines/stream/http/session.rb', line 49

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) ⇒ Object



93
94
95
# File 'lib/vines/stream/http/session.rb', line 93

def unbind!(stream)
  @requests.reject! {|req| req.stream == stream }
end

#write(node) ⇒ Object

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.



84
85
86
87
88
89
90
91
# File 'lib/vines/stream/http/session.rb', line 84

def write(node)
  if request = @requests.shift
    request.reply(wrap_body(node), @content_type)
    @replied = Time.now
  else
    @responses << node.to_s
  end
end