mirror of
https://github.com/valitydev/thrift.git
synced 2024-11-07 10:48:51 +00:00
add simple Ruby HTTP server and client classes
Using Mongrel for the server. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@668894 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
52f23fa2a8
commit
32a1114a64
43
lib/rb/lib/thrift/server/thttpserver.rb
Normal file
43
lib/rb/lib/thrift/server/thttpserver.rb
Normal file
@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
require 'thrift/protocol/tprotocol'
|
||||
require 'thrift/protocol/tbinaryprotocol'
|
||||
require 'thrift/transport/ttransport'
|
||||
|
||||
require 'mongrel'
|
||||
|
||||
## Sticks a service on a URL, using mongrel to do the HTTP work
|
||||
class TSimpleMongrelHTTPServer
|
||||
class Handler < Mongrel::HttpHandler
|
||||
def initialize processor, protocol_factory
|
||||
@processor = processor
|
||||
@protocol_factory = protocol_factory
|
||||
end
|
||||
|
||||
def process request, response
|
||||
unless request.params["REQUEST_METHOD"] == "POST"
|
||||
response.start(404) { } # better way?
|
||||
return
|
||||
end
|
||||
response.start(200) do |head, out|
|
||||
head["Content-Type"] = "application/x-thrift"
|
||||
transport = TIOStreamTransport.new request.body, out
|
||||
protocol = @protocol_factory.getProtocol transport
|
||||
@processor.process protocol, protocol
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def initialize processor, opts={}
|
||||
port = opts[:port] || 80
|
||||
ip = opts[:ip] || "0.0.0.0"
|
||||
path = opts[:path] || ""
|
||||
protocol_factory = opts[:protocol_factory] || TBinaryProtocolFactory.new
|
||||
@server = Mongrel::HttpServer.new ip, port
|
||||
@server.register "/#{path}", Handler.new(processor, protocol_factory)
|
||||
end
|
||||
|
||||
def serve
|
||||
@server.run.join
|
||||
end
|
||||
end
|
25
lib/rb/lib/thrift/transport/thttpclient.rb
Normal file
25
lib/rb/lib/thrift/transport/thttpclient.rb
Normal file
@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
require 'thrift/transport/ttransport'
|
||||
|
||||
require 'net/http'
|
||||
require 'uri'
|
||||
require 'stringio'
|
||||
|
||||
## Very simple HTTP client
|
||||
class THttpClient < TTransport
|
||||
def initialize url
|
||||
@url = URI url
|
||||
@outbuf = ""
|
||||
end
|
||||
|
||||
def isOpen; true end
|
||||
def read sz; @inbuf.read sz end
|
||||
def write buf; @outbuf << buf end
|
||||
def flush
|
||||
http = Net::HTTP.new @url.host, @url.port
|
||||
resp, data = http.post(@url.path, @outbuf)
|
||||
@inbuf = StringIO.new data
|
||||
@outbuf = ""
|
||||
end
|
||||
end
|
@ -269,3 +269,18 @@ class TMemoryBuffer < TTransport
|
||||
def flush
|
||||
end
|
||||
end
|
||||
|
||||
## Very very simple implementation of wrapping two objects, one with a #read
|
||||
## method and one with a #write method, into a transport for thrift.
|
||||
##
|
||||
## Assumes both objects are open, remain open, don't require flushing, etc.
|
||||
class TIOStreamTransport < TTransport
|
||||
def initialize input, output
|
||||
@input = input
|
||||
@output = output
|
||||
end
|
||||
|
||||
def isOpen(); true end
|
||||
def read(sz); @input.read(sz) end
|
||||
def write(buf); @output.write(buf) end
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user