blob: f5266bb158e8562bc78b6a73c83149d55cfc7cf2 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require 'avro'
require 'webrick'
MAIL_PROTOCOL_JSON = <<-JSON
{"namespace": "example.proto",
"protocol": "Mail",
"types": [
{"name": "Message", "type": "record",
"fields": [
{"name": "to", "type": "string"},
{"name": "from", "type": "string"},
{"name": "body", "type": "string"}
]
}
],
"messages": {
"send": {
"request": [{"name": "message", "type": "Message"}],
"response": "string"
},
"replay": {
"request": [],
"response": "string"
}
}
}
JSON
MAIL_PROTOCOL = Avro::Protocol.parse(MAIL_PROTOCOL_JSON)
class MailResponder < Avro::IPC::Responder
def initialize
super(MAIL_PROTOCOL)
end
def call(message, request)
if message.name == 'send'
request_content = request['message']
"Sent message to #{request_content['to']} from #{request_content['from']} with body #{request_content['body']}"
elsif message.name == 'replay'
'replay'
end
end
end
class MailHandler < WEBrick::HTTPServlet::AbstractServlet
def do_POST(req, resp)
responder = MailResponder.new
call_request = Avro::IPC::FramedReader.new(StringIO.new(req.body)).read_framed_message
unframed_resp = responder.respond(call_request)
writer = Avro::IPC::FramedWriter.new(StringIO.new)
writer.write_framed_message(unframed_resp)
resp.body = writer.to_s
end
end
if $0 == __FILE__
server = WEBrick::HTTPServer.new(:Host => 'localhost', :Port => 9090)
server.mount '/', MailHandler
trap("INT") { server.shutdown }
server.start
end