require 'webrick' require 'shuck/store' module Shuck class Servlet < WEBrick::HTTPServlet::AbstractServlet def initialize(server,root) super(server) @store = Store.new(root) end def do_GET(request, response) path = request.path path_len = path.size if path == "/" response.status = 200 response['Content-Type'] = 'text/xml' response.body = @store.buckets else elems = path[1,path_len].split("/") bucket = elems[0] if elems.size == 1 bucket_list = @store.get_bucket(bucket) response.status = 200 response.body = bucket_list response['Content-Type'] = "text/xml" else object = elems[1,elems.size].join('/') io = @store.get_object(bucket,object) if io response.status = 200 response['Content-Type'] = "application/octet-stream" response.body = io response.chunked = true else response.status = 404 response.body = "" end end end end def do_PUT(request,response) path = request.path path_len = path.size if path == "/" puts "Unsure what to do" else elems = path[1,path_len].split("/") bucket = elems[0] if elems.size == 1 @store.create_bucket(bucket) else object = elems[1,elems.size].join('/') @store.store_object(bucket,object,request) end end response.status = 200 response.body = "" response['Content-Type'] = "text/xml" end def do_POST(request,response) puts "Put" p request end def do_DELETE(request,response) puts "Delete" p request end end class Server def initialize(port,root) @port = port @root = root end def serve @server = WEBrick::HTTPServer.new(:Port => @port) @server.mount "/", Servlet, @root trap "INT" do @server.shutdown end @server.start end end end