diff --git a/lib/remote_storage/swift.rb b/lib/remote_storage/swift.rb index 1889f18..00bda35 100644 --- a/lib/remote_storage/swift.rb +++ b/lib/remote_storage/swift.rb @@ -133,7 +133,7 @@ module RemoteStorage server.halt 400 if server.env["HTTP_CONTENT_RANGE"] server.halt 409 if has_name_collision?(user, directory, key) - existing_metadata = redis.hgetall "rs:m:#{user}:#{directory}/#{key}" + existing_metadata = redis.hgetall redis_metadata_object_key(user, directory, key) url = url_for_key(user, directory, key) if required_match = server.env["HTTP_IF_MATCH"] @@ -309,7 +309,7 @@ module RemoteStorage end def update_metadata_object(user, directory, key, metadata) - redis_key = "rs:m:#{user}:#{directory}/#{key}" + redis_key = redis_metadata_object_key(user, directory, key) redis.hmset(redis_key, *metadata) redis.sadd "rs:m:#{user}:#{directory}/:items", key @@ -328,8 +328,7 @@ module RemoteStorage end def delete_metadata_objects(user, directory, key) - redis_key = "rs:m:#{user}:#{directory}/#{key}" - redis.del(redis_key) + redis.del redis_metadata_object_key(user, directory, key) redis.srem "rs:m:#{user}:#{directory}/:items", key end @@ -353,6 +352,10 @@ module RemoteStorage redis.smembers("rs:m:#{user}:#{dir}/:items").empty? end + def redis_metadata_object_key(user, directory, key) + "rs:m:#{user}:#{[directory, key].delete_if(&:empty?).join("/")}" + end + def container_url_for(user) "#{base_url}/#{container_for(user)}" end diff --git a/spec/swift/app_spec.rb b/spec/swift/app_spec.rb index e29b629..6e8a7a7 100644 --- a/spec/swift/app_spec.rb +++ b/spec/swift/app_spec.rb @@ -74,6 +74,32 @@ describe "App" do root_items.must_equal ["food/"] end + describe "objects in root dir" do + before do + put_stub = OpenStruct.new(headers: { + etag: "bla", + last_modified: "Fri, 04 Mar 2016 12:20:18 GMT" + }) + + RestClient.stub :put, put_stub do + put "/phil/bamboo.txt", "shir kan" + end + end + + it "are listed in the directory listing with all metadata" do + get "phil/" + + last_response.status.must_equal 200 + last_response.content_type.must_equal "application/json" + + content = JSON.parse(last_response.body) + content["items"]["bamboo.txt"].wont_be_nil + content["items"]["bamboo.txt"]["ETag"].must_equal "bla" + content["items"]["bamboo.txt"]["Content-Type"].must_equal "text/plain; charset=utf-8" + content["items"]["bamboo.txt"]["Content-Length"].must_equal 8 + end + end + describe "name collision checks" do it "is successful when there is no name collision" do put_stub = OpenStruct.new(headers: {