lib/shuck/server.rb in shuck-0.0.3 vs lib/shuck/server.rb in shuck-0.0.4
- old
+ new
@@ -2,28 +2,41 @@
require 'shuck/file_store'
require 'shuck/xml_adapter'
module Shuck
class Servlet < WEBrick::HTTPServlet::AbstractServlet
- def initialize(server,store)
+ def initialize(server,store,hostname)
super(server)
@store = store
+ @hostname = hostname
end
def do_GET(request, response)
path = request.path
path_len = path.size
+ host = request["HOST"]
+ path_style_request = true
+ bucket = nil
+ if host != @hostname
+ bucket = host.split(".")[0]
+ path_style_request = false
+ end
- if path == "/"
+ if path == "/" and path_style_request
response.status = 200
response['Content-Type'] = 'text/xml'
buckets = @store.buckets
response.body = XmlAdapter.buckets(buckets)
else
- elems = path[1,path_len].split("/")
- bucket = elems[0]
- if elems.size == 1
+ if path_style_request
+ elems = path[1,path_len].split("/")
+ bucket = elems[0]
+ else
+ elems = path.split("/")
+ end
+
+ if elems.size == 1
bucket_obj = @store.get_bucket(bucket)
if bucket_obj
response.status = 200
response.body = XmlAdapter.bucket(bucket_obj)
response['Content-Type'] = "application/xml"
@@ -49,21 +62,43 @@
end
def do_PUT(request,response)
path = request.path
path_len = path.size
+ path_style_request = true
+ host = request["Host"]
+ bucket = nil
+ path_style_request = true
+ if host != @hostname
+ bucket = host.split(".")[0]
+ path_style_request = false
+ end
+
if path == "/"
- puts "Unsure what to do"
- else
- elems = path[1,path_len].split("/")
- bucket = elems[0]
- if elems.size == 1
+ if bucket
@store.create_bucket(bucket)
- else
- object = elems[1,elems.size].join('/')
- @store.store_object(bucket,object,request)
+ else
+ puts "Unsure what to do"
end
+ else
+ if path_style_request
+ elems = path[1,path_len].split("/")
+ bucket = elems[0]
+ else
+ elems = path.split("/")
+ end
+
+ if path_style_request
+ if elems.size == 1
+ @store.create_bucket(bucket)
+ else
+ object = elems[1,elems.size].join('/')
+ @store.store_object(bucket,object,request)
+ end
+ else
+ @store.store_object(bucket,path,request)
+ end
end
response.status = 200
response.body = ""
response['Content-Type'] = "text/xml"
end
@@ -78,17 +113,18 @@
p request
end
end
class Server
- def initialize(port,store)
+ def initialize(port,store,hostname = "localhost")
@port = port
@store = store
+ @hostname = hostname
end
def serve
@server = WEBrick::HTTPServer.new(:Port => @port)
- @server.mount "/", Servlet, @store
+ @server.mount "/", Servlet, @store,@hostname
trap "INT" do @server.shutdown end
@server.start
end
def shutdown