Allow binary content (fixes #18)
This commit is contained in:
parent
fa6235cd1f
commit
483523b091
@ -5,6 +5,7 @@ defaults: &defaults
|
|||||||
buckets:
|
buckets:
|
||||||
data: "user_data"
|
data: "user_data"
|
||||||
directories: "rs_directories"
|
directories: "rs_directories"
|
||||||
|
binaries: "rs_binaries"
|
||||||
authorizations: "authorizations"
|
authorizations: "authorizations"
|
||||||
|
|
||||||
development:
|
development:
|
||||||
@ -15,6 +16,7 @@ test:
|
|||||||
buckets:
|
buckets:
|
||||||
data: "user_data_test"
|
data: "user_data_test"
|
||||||
directories: "rs_directories_test"
|
directories: "rs_directories_test"
|
||||||
|
binaries: "rs_binaries_test"
|
||||||
authorizations: "authorizations_test"
|
authorizations: "authorizations_test"
|
||||||
|
|
||||||
production:
|
production:
|
||||||
|
@ -23,6 +23,10 @@ module RemoteStorage
|
|||||||
@auth_bucket ||= client.bucket(LiquorCabinet.config['buckets']['authorizations'])
|
@auth_bucket ||= client.bucket(LiquorCabinet.config['buckets']['authorizations'])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def binary_bucket
|
||||||
|
@binary_bucket ||= client.bucket(LiquorCabinet.config['buckets']['binaries'])
|
||||||
|
end
|
||||||
|
|
||||||
def authorize_request(user, directory, token, listing=false)
|
def authorize_request(user, directory, token, listing=false)
|
||||||
request_method = env["REQUEST_METHOD"]
|
request_method = env["REQUEST_METHOD"]
|
||||||
|
|
||||||
@ -47,6 +51,10 @@ module RemoteStorage
|
|||||||
headers["Content-Type"] = object.content_type
|
headers["Content-Type"] = object.content_type
|
||||||
headers["Last-Modified"] = last_modified_date_for(object)
|
headers["Last-Modified"] = last_modified_date_for(object)
|
||||||
|
|
||||||
|
if binary_link = object.links.select {|l| l.tag == "binary"}.first
|
||||||
|
object = client[binary_link.bucket].get(binary_link.key)
|
||||||
|
end
|
||||||
|
|
||||||
case object.content_type[/^[^;\s]+/]
|
case object.content_type[/^[^;\s]+/]
|
||||||
when "application/json"
|
when "application/json"
|
||||||
return object.data.to_json
|
return object.data.to_json
|
||||||
@ -76,8 +84,10 @@ module RemoteStorage
|
|||||||
object = data_bucket.new("#{user}:#{directory}:#{key}")
|
object = data_bucket.new("#{user}:#{directory}:#{key}")
|
||||||
object.content_type = content_type || "text/plain; charset=utf-8"
|
object.content_type = content_type || "text/plain; charset=utf-8"
|
||||||
|
|
||||||
unless set_object_data(object, data)
|
if binary_data?(content_type)
|
||||||
halt 422
|
save_binary_data(object, data) or halt 422
|
||||||
|
else
|
||||||
|
set_object_data(object, data) or halt 422
|
||||||
end
|
end
|
||||||
|
|
||||||
directory_index = directory == "" ? "/" : directory
|
directory_index = directory == "" ? "/" : directory
|
||||||
@ -279,6 +289,21 @@ module RemoteStorage
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def save_binary_data(object, data)
|
||||||
|
binary_object = binary_bucket.new(object.key)
|
||||||
|
binary_object.content_type = object.content_type
|
||||||
|
binary_object.raw_data = data
|
||||||
|
binary_object.store
|
||||||
|
|
||||||
|
link = ::Riak::Link.new(binary_bucket.name, binary_object.key, "binary")
|
||||||
|
object.links << link
|
||||||
|
object.raw_data = ""
|
||||||
|
end
|
||||||
|
|
||||||
|
def binary_data?(content_type)
|
||||||
|
content_type[/[^;\s]+$/] == "charset=binary"
|
||||||
|
end
|
||||||
|
|
||||||
def parent_directories_for(directory)
|
def parent_directories_for(directory)
|
||||||
directories = directory.split("/")
|
directories = directory.split("/")
|
||||||
parent_directories = []
|
parent_directories = []
|
||||||
|
@ -123,6 +123,26 @@ describe "Directories" do
|
|||||||
directory.data.to_i.must_equal object.meta['timestamp'][0].to_i
|
directory.data.to_i.must_equal object.meta['timestamp'][0].to_i
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "with binary data" do
|
||||||
|
before do
|
||||||
|
header "Content-Type", "image/jpeg; charset=binary"
|
||||||
|
filename = File.join(File.expand_path(File.dirname(__FILE__)), "fixtures", "rockrule.jpeg")
|
||||||
|
@image = File.open(filename, "r").read
|
||||||
|
put "/jimmy/tasks/jaypeg.jpg", @image
|
||||||
|
end
|
||||||
|
|
||||||
|
it "lists the binary files" do
|
||||||
|
get "/jimmy/tasks/"
|
||||||
|
|
||||||
|
last_response.status.must_equal 200
|
||||||
|
|
||||||
|
content = JSON.parse(last_response.body)
|
||||||
|
content.must_include "jaypeg.jpg"
|
||||||
|
content["jaypeg.jpg"].must_be_kind_of Integer
|
||||||
|
content["jaypeg.jpg"].to_s.length.must_equal 13
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "for a sub-directory" do
|
context "for a sub-directory" do
|
||||||
|
Loading…
x
Reference in New Issue
Block a user