/usr/lib/ruby/vendor_ruby/rack/moneta_rest.rb is in ruby-moneta 0.7.20-2.2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | require 'moneta'
module Rack
# A Rack application which provides a REST interface to a Moneta store.
#
# @example config.ru
# map '/moneta' do
# run Rack::MonetaRest.new(:Memory)
# end
#
# @example config.ru
# # Pass it a block like the one passed to Moneta.build
# run Rack::MonetaRest.new do
# use :Transformer, :value => :zlib
# adapter :Memory
# end
#
# @api public
class MonetaRest
def initialize(store = nil, options = {}, &block)
if block
raise ArgumentError, 'Use either block or options' unless options.empty?
@store = ::Moneta.build(&block)
else
raise ArgumentError, 'Block or argument store is required' unless @store = store
@store = ::Moneta.new(@store, options) if Symbol === @store
end
end
def call(env)
key = env['PATH_INFO'][1..-1].to_s
case env['REQUEST_METHOD']
when 'HEAD'
if key.empty?
respond(400, 'Empty key')
elsif @store.key?(key)
empty(200)
else
empty(404)
end
when 'GET'
if key.empty?
respond(400, 'Empty key')
elsif value = @store[key]
respond(200, value)
else
empty(404)
end
when 'POST', 'PUT'
if key.empty?
respond(400, 'Empty key')
else
respond(200, @store[key] = env['rack.input'].read)
end
when 'DELETE'
if key.empty?
@store.clear
empty(200)
else
respond(200, @store.delete(key))
end
else
respond(400, 'Bad method')
end
rescue => ex
respond(500, "Exception: #{ex.message}")
end
private
def empty(status)
[status, {'Content-Type'=>'application/octet-stream', 'Content-Length' => '0'}, []]
end
def respond(status, value)
[status, {'Content-Type'=>'application/octet-stream', 'Content-Length' => value.bytesize.to_s}, [value]]
end
end
end
|