# File lib/deltacloud/helpers/blob_stream_helper.rb, line 65 def self.extract_blob_metadata_hash(env_hash) meta_array = env_hash.select{|k,v| k.match(/^HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]/)} metadata = meta_array.inject({}){ |result, array| result[array.first.upcase] = array.last; result} metadata end
in “1=abc , 2=def , 3=ghi” out {“1”=>“abc”, “2”=>“def”, “3”=>“ghi”}
# File lib/deltacloud/helpers/blob_stream_helper.rb, line 107 def self.extract_segmented_blob_manifest(request) manifest_hash = request.body.read.split(",").inject({}) do |res,current| k,v=current.strip.split("=") res[k]=v res end end
e.g. from HTTP-X-Deltacloud-Blobmeta-FOO:BAR to amz-meta-FOO:BAR
# File lib/deltacloud/helpers/blob_stream_helper.rb, line 74 def self.rename_metadata_headers(metadata, rename_to) metadata.gsub_keys(DELTACLOUD_BLOBMETA_HEADER, rename_to) end
# File lib/deltacloud/helpers/blob_stream_helper.rb, line 84 def self.segment_order(request_context) (request_context.env["HTTP_X_DELTACLOUD_SEGMENTORDER"] || request_context.env["QUERY_STRING"].match(/segment_order=(\w)*/){|m| m[0].split("=").pop}) end
in the following segment* methods, using context.env rather than context.params so it works for both Thin and Sinatra request objects (streaming)
# File lib/deltacloud/helpers/blob_stream_helper.rb, line 79 def self.segmented_blob(request_context) return true if (request_context.env["HTTP_X_DELTACLOUD_BLOBTYPE"] == 'segmented' || request_context.env["QUERY_STRING"].match(/blob_type=segmented/)) false end
# File lib/deltacloud/helpers/blob_stream_helper.rb, line 88 def self.segmented_blob_id(request_context) (request_context.env["HTTP_X_DELTACLOUD_SEGMENTEDBLOB"] || request_context.env["QUERY_STRING"].match(/segmented_blob=(\w)*/){|m| m[0].split("=").pop}) end
# File lib/deltacloud/helpers/blob_stream_helper.rb, line 92 def self.segmented_blob_op_type(request_context) is_segmented = segmented_blob(request_context) blob_id = segmented_blob_id(request_context) segment_order = segment_order(request_context) #if blob_type=segmented AND segmented_blob_id AND segment_order then it is a "SEGMENT" #if blob_type=segmented AND segmented_blob_id then it is a "FINALIZE" #if blob_type=segmented then it is "INIT" return "segment" if (is_segmented && blob_id && segment_order) return "finalize" if (is_segmented && blob_id) return "init" if is_segmented nil # should explode something instead end