require 'net/http'
require 'rexml/document'
module ActiveMessaging
module Adapters
module REST
class Connection
include ActiveMessaging::Adapter
register :rest
@@keep_alive = {"Connection" => "keep-alive", "Keep-Alive" => 300.to_s}
def initialize(cfg)
@user_agent = {"User-Agent" => self.class.to_s + " [a13g]"}
@host = cfg.key?(:host) ? cfg[:host] : "127.0.0.1"
@port = cfg.key?(:port) ? cfg[:port] : 8161.to_s
@app = cfg.key?(:app) ? cfg[:app] : '/demo/amq'
end
def disconnect(headers = {})
end
def unsubscribe(name, headers = {})
end
def received arg
end
def subscribe(name, headers = {})
req = Net::HTTP::Post.new(@app, @user_agent)
res = Net::HTTP.new(@host, @port).request(req, "destination=" + name + "&message=chat&type=listen")
fields = res.get_fields('set-cookie')
# assumes JSESSIONID from Servlet container, need be more defensive here
@session_id = fields[0].split(';')[0].split('=')[1]
puts "Subscribed to " + name.to_s + ", using session id of " + @session_id.to_s
end
def send destination, message, headers={}
req = Net::HTTP::Post.new(@app, @user_agent.merge({"destination" => destination.to_s}))
data = "message=" + message.to_s + "&type=send"
# needs error handling
Net::HTTP.new(@host, @port).request(req, data)
end
def receive
begin
# needs better error handling
req = Net::HTTP::Get.new(@app, @@keep_alive.merge(@user_agent.merge({"Cookie" => "JSESSIONID=" + @session_id.to_s})))
res = Net::HTTP.new(@host, @port).request(req)
parser = ResponseParser::new res.body
return parser.messages.size == 0 ? nil : parser.messages[0]
rescue
puts $!
raise $!
end
end
end # ssalc
class ResponseParser
include REXML
attr_reader :messages
def initialize response
@messages = []
parse response
end
def parse response
return if response.nil?
_parse response
end
private
def _parse response
doc = Document.new(response)
doc.root.elements.each do |e|
# this needs to be more defensive
headers = {"destination" => e.attributes['destination']}
message = e.elements['message']
@messages << Message.new(headers, message.text) unless message.nil?
end
end
end
class Message
attr_accessor :headers, :body, :command
def initialize headers, body, command='MESSAGE'
@headers, @body, @command = headers, body, command
end
def to_s
""
end
end
end
end
end