class ThriftRack

Constants

THRIFT_HEADER
VERSION

Attributes

redis[W]

Public Class Methods

app(servers = nil) click to toggle source
# File lib/thrift_rack.rb, line 50
def app(servers = nil)
  Rack::Builder.new(ThriftRack.new(servers)) do
    use ThriftRack::LaunchTimestamp
    use ThriftRack::ActiveRecord if defined? ::ActiveRecord::Base
    # use(ActionDispatch::Executor, ::Rails.application.executor) if defined? ::Rails
    use ThriftRack::Downgrade
    use ThriftRack::Ping
    use ThriftRack::FormatCheck
    use ThriftRack::Atom
    use ThriftRack::Logger
    use ThriftRack::Sentry if defined? Raven
    use ThriftRack::ServerMetric
  end
end
new(servers = nil) click to toggle source
# File lib/thrift_rack.rb, line 22
def initialize(servers = nil)
  servers ||= ThriftRack::Server.children
  @maps = {}
  servers.each do |server|
    @maps[server.mount_path] = server
  end
end
redis() click to toggle source
# File lib/thrift_rack.rb, line 65
def redis
  @redis ||= Redis.new
end

Public Instance Methods

call(env) click to toggle source
# File lib/thrift_rack.rb, line 30
def call(env)
  req = Rack::Request.new(env)
  Thread.current["request"] = req
  server_class = @maps[req.path]
  return 400, { 'Content-Type' => 'text/plain' }, ["No Thrift Server For #{req.path}"] unless server_class

  resp = Rack::Response.new([], 200, { 'Content-Type' => THRIFT_HEADER })

  transport = Thrift::IOStreamTransport.new req.body, resp
  protocol = server_class.protocol_factory.get_protocol transport
  server_class.processor_class.new(server_class.new(req)).process(protocol, protocol)

  resp_a = resp.to_a
  [resp_a[0], resp_a[1], [resp_a[2].join]]
ensure
  Thread.current["request"] = nil
end