Sha256: f609091dd334049403522212173ee05a0755502770f33db15a9314070207b265
Contents?: true
Size: 1.97 KB
Versions: 10
Compression:
Stored size: 1.97 KB
Contents
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
Version data entries
10 entries across 10 versions & 1 rubygems