lib/riak/client/http_backend/object_methods.rb in riak-client-1.0.5 vs lib/riak/client/http_backend/object_methods.rb in riak-client-1.1.0
- old
+ new
@@ -50,32 +50,19 @@
# Load object data from an HTTP response
# @param [Hash] response a response from {Riak::Client::HTTPBackend}
def load_object(robject, response)
extract_header(robject, response, "location", :key) {|v| URI.unescape(v.match(%r{.*/(.*?)(\?.*)?$})[1]) }
- extract_header(robject, response, "content-type", :content_type)
extract_header(robject, response, "x-riak-vclock", :vclock)
- extract_header(robject, response, "link", :links) {|v| Set.new(Link.parse(v)) }
- extract_header(robject, response, "etag", :etag)
- extract_header(robject, response, "last-modified", :last_modified) {|v| Time.httpdate(v) }
- robject.meta = response[:headers].inject({}) do |h,(k,v)|
- if k =~ /x-riak-meta-(.*)/i
- h[$1] = v
- end
- h
+ case response[:code] && response[:code].to_i
+ when 304
+ # Resulted from a reload, don't modify anything
+ when 300
+ robject.siblings = extract_siblings(robject, response[:body], response[:headers]['content-type'].first)
+ else
+ robject.siblings = [ load_content(response, RContent.new(robject)) ]
end
- robject.indexes = response[:headers].inject(Hash.new {|h,k| h[k] = Set.new }) do |h,(k,v)|
- if k =~ /x-riak-index-((?:.*)_(?:int|bin))$/i
- key = $1
- h[key].merge Array(v).map {|vals| vals.split(/,\s*/).map {|i| key =~ /int$/ ? i.to_i : i } }.flatten
- end
- h
- end
- robject.conflict = (response[:code] && response[:code].to_i == 300 && robject.content_type =~ /multipart\/mixed/)
- robject.siblings = robject.conflict? ? extract_siblings(robject, response[:body]) : nil
- robject.raw_data = response[:body] if response[:body].present? && !robject.conflict?
-
robject.conflict? ? robject.attempt_conflict_resolution : robject
end
private
def extract_header(robject, response, name, attribute=nil, &block)
@@ -90,16 +77,37 @@
value = block_given? ? yield(hash[key]) : hash[key]
robject.send("#{attribute}=", value)
end
end
- def extract_siblings(robject, data)
- Util::Multipart.parse(data, Util::Multipart.extract_boundary(robject.content_type)).map do |part|
- RObject.new(robject.bucket, robject.key) do |sibling|
- load_object(sibling, part)
- sibling.vclock = robject.vclock
+ def extract_siblings(robject, data, content_type)
+ Util::Multipart.parse(data, Util::Multipart.extract_boundary(content_type)).map do |part|
+ RContent.new(robject) do |sibling|
+ load_content(part, sibling)
end
end
+ end
+
+ def load_content(response, rcontent)
+ extract_header(rcontent, response, "link", :links) {|v| Set.new(Link.parse(v)) }
+ extract_header(rcontent, response, "etag", :etag)
+ extract_header(rcontent, response, "last-modified", :last_modified) {|v| Time.httpdate(v) }
+ extract_header(rcontent, response, "content-type", :content_type)
+ rcontent.meta = response[:headers].inject({}) do |h,(k,v)|
+ if k =~ /x-riak-meta-(.*)/i
+ h[$1] = v
+ end
+ h
+ end
+ rcontent.indexes = response[:headers].inject(Hash.new {|h,k| h[k] = Set.new }) do |h,(k,v)|
+ if k =~ /x-riak-index-((?:.*)_(?:int|bin))$/i
+ key = $1
+ h[key].merge Array(v).map {|vals| vals.split(/,\s*/).map {|i| key =~ /int$/ ? i.to_i : i } }.flatten
+ end
+ h
+ end
+ rcontent.raw_data = response[:body] if response[:body].present?
+ rcontent
end
end
end
end
end