From 26d6c4f0c484598d4a42756f02ec6d03b1b1f01f Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Thu, 12 Jan 2017 20:29:12 -0500 Subject: [PATCH] Basic webhook handler using Goliath Demonstrates how to integrate Goliath into your EM reactor alongside Blather. And also how to send an XMPP stanza in response to a webhook. --- Gemfile | 3 +++ sgx-catapult.rb | 29 +++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index f3d8dac6244d28942ce4e4f75be34efcc282c96a..e3bcf88e28929883bd81e234b6f08621b5a7ec58 100644 --- a/Gemfile +++ b/Gemfile @@ -6,3 +6,6 @@ gem 'eventmachine', '1.0.0' gem 'hiredis', '~> 0.6.0' gem 'redis', '>= 3.2.0' + +gem 'goliath' +gem 'log4r' diff --git a/sgx-catapult.rb b/sgx-catapult.rb index 9f3a4fcfee20b7ce6eb15f0ea515779e61cd9c76..b2a1be1b2cf18b0a96e6f50be66b44c891aca713 100755 --- a/sgx-catapult.rb +++ b/sgx-catapult.rb @@ -22,10 +22,14 @@ require 'json' require 'net/http' require 'redis/connection/hiredis' require 'uri' +require 'goliath/api' +require 'goliath/server' +require 'log4r' -if ARGV.size != 7 then +if ARGV.size != 8 then puts "Usage: sgx-catapult.rb " + " " + + " " + " " exit 0 end @@ -37,6 +41,10 @@ module SGXcatapult client.run end + def self.write(stanza) + client.write(stanza) + end + def self.error_msg(orig, query_node, type, name, text = nil) orig.add_child(query_node) orig.type = :error @@ -70,7 +78,7 @@ module SGXcatapult cred_key = "catapult_cred-" + bare_jid conn = Hiredis::Connection.new - conn.connect(ARGV[4], ARGV[5].to_i) + conn.connect(ARGV[5], ARGV[6].to_i) conn.write ["EXISTS", cred_key] if conn.read == 0 @@ -365,6 +373,23 @@ end } end +class WebhookHandler < Goliath::API + def response(env) + msg = Blather::Stanza::Message.new('test@localhost', 'hi') + SGXcatapult.write(msg) + + [200, {}, "OK"] + end +end + EM.run do SGXcatapult.run + + server = Goliath::Server.new('127.0.0.1', ARGV[4].to_i) + server.api = WebhookHandler.new + server.app = Goliath::Rack::Builder.build(server.api.class, server.api) + server.logger = Log4r::Logger.new('goliath') + server.logger.add(Log4r::StdoutOutputter.new('console')) + server.logger.level = Log4r::INFO + server.start end