lib/vines/stream/http.rb in vines-0.1.1 vs lib/vines/stream/http.rb in vines-0.2.0
- old
+ new
@@ -15,41 +15,43 @@
router.delete(self)
@parser = ::Http::Parser.new.tap do |p|
body = ''
p.on_body = proc {|data| body << data }
p.on_message_complete = proc {
- process_request(body)
+ process_request(Request.new(self, @parser, body))
body = ''
}
end
end
- # Return true if this session ID matches the stream's session ID. Clients
- # are only allowed one session per stream so they must send the same
- # session ID on each request.
+ # If the session ID is valid, switch this stream's session to the new
+ # ID and return true. Some clients, like Google Chrome, reuse one stream
+ # for multiple sessions.
def valid_session?(sid)
- @session.id == sid
+ if session = Sessions[sid]
+ @session = session
+ end
+ !!session
end
- def max_stanza_size
- @config[:http].max_stanza_size
+ %w[max_stanza_size max_resources_per_account private_storage? bind root].each do |name|
+ define_method name do |*args|
+ @config[:http].send(name, *args)
+ end
end
- def max_resources_per_account
- @config[:http].max_resources_per_account
- end
-
- def process_request(body)
- # proxy server ping
- if body.empty?
- req = Request.new(self, nil, 'text/plain')
- req.reply('online')
- close_connection_after_writing
- else
- body = Nokogiri::XML(body).root
- req = Request.new(self, body['rid'], @session.content_type)
- @session.request(req)
+ def process_request(request)
+ if request.path == self.bind
+ body = Nokogiri::XML(request.body).root
+ if session = Sessions[body['sid']]
+ session.request(request)
+ else
+ @session = Http::Session.new(self)
+ @session.request(request)
+ end
@nodes.push(body)
+ else
+ request.reply_with_file(self.root)
end
end
# Alias the Stream#write method before overriding it so we can call
# it later from a Session instance.