You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2010/11/26 13:54:16 UTC

[PATCH core 2/2] Added Rack middleware which set driver/per request using HTTP headers

From: Michal Fojtik <mf...@redhat.com>

---
 server/lib/sinatra/rack_driver_select.rb |   23 +++++++++++++++++++++++
 server/server.rb                         |    3 +++
 server/views/api/drivers.xml.haml        |    6 ++++++
 3 files changed, 32 insertions(+), 0 deletions(-)
 create mode 100644 server/lib/sinatra/rack_driver_select.rb
 create mode 100644 server/views/api/drivers.xml.haml

diff --git a/server/lib/sinatra/rack_driver_select.rb b/server/lib/sinatra/rack_driver_select.rb
new file mode 100644
index 0000000..a1a3c63
--- /dev/null
+++ b/server/lib/sinatra/rack_driver_select.rb
@@ -0,0 +1,23 @@
+class RackDriverSelect
+  
+  def initialize(app, opts={})
+    @app = app
+    @opts = opts
+  end
+
+  def call(env)
+    original_driver = settings.driver
+    if env['HTTP_HEADERS'] and new_driver=extract_driver(env)
+      set :driver, new_driver
+    end
+    response = @app.call(env)
+    set :driver, original_driver
+    response
+  end
+
+  def extract_driver(env)
+    driver_name = env['HTTP_HEADERS'].match(/X\-Deltacloud\-Driver:(\w+)/).to_a
+    return driver_name[1] if driver_name[1]
+  end
+
+end
diff --git a/server/server.rb b/server/server.rb
index 297e556..f888af9 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -10,10 +10,13 @@ require 'erb'
 require 'haml'
 require 'open3'
 require 'lib/deltacloud/helpers/blob_stream'
+require 'sinatra/rack_driver_select'
 
 set :driver, (ENV['API_DRIVER'] ? ENV['API_DRIVER'] : :mock)
 set :version, '0.0.1'
 
+use RackDriverSelect
+
 configure do
   set :raise_errors => false
   set :show_exceptions, false
diff --git a/server/views/api/drivers.xml.haml b/server/views/api/drivers.xml.haml
new file mode 100644
index 0000000..7beb9c8
--- /dev/null
+++ b/server/views/api/drivers.xml.haml
@@ -0,0 +1,6 @@
+%api{ :version => settings.version }
+  %drivers
+    - DRIVERS.each do |id, details|
+      %driver{ :id => id }
+        %name<
+          =details[:name]
-- 
1.7.3.2