From: marios <[email protected]>

Signed-off-by: marios <[email protected]>
---
 .../lib/deltacloud/drivers/azure/azure_driver.rb   |    2 +-
 server/lib/deltacloud/drivers/ec2/ec2_driver.rb    |    4 ++--
 server/lib/deltacloud/drivers/mock/mock_driver.rb  |   11 +++++------
 .../drivers/rackspace/rackspace_driver.rb          |    4 ++--
 server/lib/deltacloud/helpers/blob_stream.rb       |   18 ++++++++++++++++--
 server/server.rb                                   |    6 ++----
 6 files changed, 28 insertions(+), 17 deletions(-)

diff --git a/server/lib/deltacloud/drivers/azure/azure_driver.rb 
b/server/lib/deltacloud/drivers/azure/azure_driver.rb
index 3dcb768..09372e0 100644
--- a/server/lib/deltacloud/drivers/azure/azure_driver.rb
+++ b/server/lib/deltacloud/drivers/azure/azure_driver.rb
@@ -105,7 +105,7 @@ class AzureDriver < Deltacloud::BaseDriver
   def create_blob(credentials, bucket_id, blob_id, blob_data, opts={})
     azure_connect(credentials)
     #insert azure-specific header for user metadata ... x-ms-meta-kEY = VALUE
-    opts.gsub_keys("HTTP_X_Deltacloud_Blobmeta_", "x-ms-meta-")
+    BlobHelper::rename_metadata_headers(opts, "x-ms-meta-")
     safely do
       #get a handle to the bucket in order to put there
       the_bucket = WAZ::Blobs::Container.find(bucket_id)
diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb 
b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
index 4fff243..0b7e846 100644
--- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
+++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
@@ -410,7 +410,7 @@ module Deltacloud
           # File stream needs to be reopened in binary mode for whatever reason
           file = File::open(data[:tempfile].path, 'rb')
           #insert ec2-specific header for user metadata ... x-amz-meta-KEY = 
VALUE
-          opts.gsub_keys('HTTP_X_Deltacloud_Blobmeta_', 'x-amz-meta-')
+          BlobHelper::rename_metadata_headers(opts, 'x-amz-meta-')
           opts["Content-Type"] = data[:type]
           safely do
             res = s3_client.interface.put(bucket_id,
@@ -456,7 +456,7 @@ module Deltacloud
           metadata = params[:metadata]
           signature_meta_string = ""
           unless metadata.nil?
-            metadata.gsub_keys('HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]', 
'x-amz-meta-')
+            BlobHelper::rename_metadata_headers(metadata, 'x-amz-meta-')
             keys_array = metadata.keys.sort!
             keys_array.each {|k| signature_meta_string << 
"#{k}:#{metadata[k]}\n"}
           end
diff --git a/server/lib/deltacloud/drivers/mock/mock_driver.rb 
b/server/lib/deltacloud/drivers/mock/mock_driver.rb
index 9697e5b..dd237a1 100644
--- a/server/lib/deltacloud/drivers/mock/mock_driver.rb
+++ b/server/lib/deltacloud/drivers/mock/mock_driver.rb
@@ -428,16 +428,15 @@ class MockDriver < Deltacloud::BaseDriver
 # Create blob
 #--
   def create_blob(credentials, bucket_id, blob_id, blob_data, opts={})
-    check_credentials(credentials)
-      blob_meta = {}
-      opts.inject({}){|result, (k,v)| blob_meta[k] = v if 
k.match(/X[_-]Deltacloud[_-]Blobmeta[_-]/i)} #select{|k,v| 
k.match(/X[_-]Deltacloud[_-]Blobmeta[_-]/i)}
-       blob = {
+      check_credentials(credentials)
+      blob_meta = BlobHelper::extract_blob_metadata_hash(opts)
+      blob = {
       :id => blob_id,
       :bucket => bucket_id,
       :content_length => blob_data[:tempfile].length,
       :content_type => blob_data[:type],
       :last_modified => Time.now,
-      :user_metadata => blob_meta.gsub_keys('X_Deltacloud_Blobmeta_', ''),
+      :user_metadata => BlobHelper::rename_metadata_headers(blob_meta, ''),
       :content => blob_data[:tempfile].read
     }
     File.open( File::join("#{@storage_root}", "buckets", "blobs", 
"#{blob_id}.yml"), 'w' ) {|b| YAML.dump( blob, b )}
@@ -482,7 +481,7 @@ class MockDriver < Deltacloud::BaseDriver
     safely do
       blob = YAML.load_file(blobfile)
       return false unless blob
-      blob[:user_metadata] = 
opts['meta_hash'].gsub_keys('HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]', '')
+      blob[:user_metadata] = 
BlobHelper::rename_metadata_headers(opts['meta_hash'], '')
       File.open(File::join("#{@storage_root}", "buckets", "blobs", 
"#{opts[:id]}.yml"), 'w' ) {|b| YAML.dump( blob, b )}
     end
   end
diff --git a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb 
b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
index 0cebb83..d09e0de 100644
--- a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
+++ b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
@@ -262,7 +262,7 @@ class RackspaceDriver < Deltacloud::BaseDriver
   def create_blob(credentials, bucket_id, blob_id, blob_data, opts={})
     cf = cloudfiles_client(credentials)
     #insert ec2-specific header for user metadata ... X-Object-Meta-KEY = VALUE
-    opts.gsub_keys("HTTP_X_Deltacloud_Blobmeta_", "X-Object-Meta-")
+    BlobHelper::rename_metadata_headers(opts, "X-Object-Meta-)"
     opts['Content-Type'] = blob_data[:type]
     object = nil
     safely do
@@ -311,7 +311,7 @@ class RackspaceDriver < Deltacloud::BaseDriver
     cf = cloudfiles_client(credentials)
     meta_hash = opts['meta_hash']
     #the set_metadata method actually places the 'X-Object-Meta-' prefix for 
us:
-    meta_hash.gsub_keys('HTTP_X_Deltacloud_Blobmeta_', '')
+    BlobHelper::rename_metadata_headers(meta_hash, '')
     safely do
       blob = cf.container(opts['bucket']).object(opts[:id])
       blob.set_metadata(meta_hash)
diff --git a/server/lib/deltacloud/helpers/blob_stream.rb 
b/server/lib/deltacloud/helpers/blob_stream.rb
index 440529b..c2f714c 100644
--- a/server/lib/deltacloud/helpers/blob_stream.rb
+++ b/server/lib/deltacloud/helpers/blob_stream.rb
@@ -81,6 +81,21 @@ class Hash
 
 end
 
+module BlobHelper
+
+  def self.extract_blob_metadata_hash(env_hash)
+    meta_array = env_hash.select{|k,v| 
k.match(/^HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]/i)}
+    metadata = meta_array.inject({}){ |result, array| 
result[array.first.upcase] = array.last; result}
+    metadata
+  end
+
+  #e.g. from HTTP-X-Deltacloud-Blobmeta-FOO:BAR to amz-meta-FOO:BAR
+  def self.rename_metadata_headers(metadata, rename_to)
+    metadata.gsub_keys('HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]', rename_to)
+  end
+
+end
+
 #Monkey patch for streaming blobs:
 # Normally a client will upload a blob to deltacloud and thin will put
 # this into a tempfile. Then deltacloud would stream up to the provider:
@@ -156,8 +171,7 @@ class BlobStreamIO
     user, password = parse_credentials(request.env['HTTP_AUTHORIZATION'])
     content_type = request.env['CONTENT_TYPE'] || ""
     #deal with blob_metadata: (X-Deltacloud-Blobmeta-name: value)
-    meta_array = request.env.select{|k,v| 
k.match(/^HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]/i)}
-    user_meta = meta_array.inject({}){ |result, array| 
result[array.first.upcase] = array.last; result}
+    user_meta = BlobHelper::extract_blob_metadata_hash(request.env)
     @content_length = request.env['CONTENT_LENGTH']
     @http, provider_request = driver.blob_stream_connection({:user=>user,
        :password=>password, :bucket=>bucket, :blob=>blob, :metadata=> 
user_meta,
diff --git a/server/server.rb b/server/server.rb
index 32d0e33..e6ccd7c 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -719,8 +719,7 @@ put 
"#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/buckets/:bucket/:blob" do
     temp_file.flush
     content_type = env['CONTENT_TYPE'] || ""
     blob_data = {:tempfile => temp_file, :type => content_type}
-    meta_array = request.env.select{|k,v| 
k.match(/^HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]/i)}
-    user_meta = meta_array.inject({}){ |result, array| 
result[array.first.upcase] = array.last; result}
+    user_meta = BlobHelper::extract_blob_metadata_hash(request.env)
     @blob = driver.create_blob(credentials, bucket_id, blob_id, blob_data, 
user_meta)
     temp_file.delete
     respond_to do |format|
@@ -780,8 +779,7 @@ end
 
 #update blob metadata
 post "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/buckets/:bucket/:blob" do
-  meta_hash = {}
-  request.env.inject({}){|current, (k,v)| meta_hash[k] = v if 
k.match(/^HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]/i)}
+  meta_hash = BlobHelper::extract_blob_metadata_hash(request.env)
   success = driver.update_blob_metadata(credentials, 
{'bucket'=>params[:bucket], :id =>params[:blob], 'meta_hash' => meta_hash})
   if(success)
     meta_hash.each do |k,v|
-- 
1.7.3.4

Reply via email to