You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by mf...@apache.org on 2011/06/30 12:36:17 UTC

svn commit: r1141469 - in /incubator/deltacloud/trunk: client/specs/content_spec.rb server/lib/sinatra/rack_accept.rb server/server.rb

Author: mfojtik
Date: Thu Jun 30 10:36:17 2011
New Revision: 1141469

URL: http://svn.apache.org/viewvc?rev=1141469&view=rev
Log:
Fixed IE handling of Accept header where DC API returned 406 HTTP code instead of text/html

Modified:
    incubator/deltacloud/trunk/client/specs/content_spec.rb
    incubator/deltacloud/trunk/server/lib/sinatra/rack_accept.rb
    incubator/deltacloud/trunk/server/server.rb

Modified: incubator/deltacloud/trunk/client/specs/content_spec.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client/specs/content_spec.rb?rev=1141469&r1=1141468&r2=1141469&view=diff
==============================================================================
--- incubator/deltacloud/trunk/client/specs/content_spec.rb (original)
+++ incubator/deltacloud/trunk/client/specs/content_spec.rb Thu Jun 30 10:36:17 2011
@@ -60,6 +60,12 @@ describe "return HTML in different brows
     end
   end
 
+  it "raise 406 error on wrong accept" do
+    client['hardware_profiles'].get('Accept' => 'image/png;q=1') do |response, request, &block|
+      response.code.should == 406
+    end
+  end
+
   it "wants HTML using format parameter and accept set to XML" do
     client['?format=html'].get('Accept' => 'application/xml') do |response, request, &block|
       response.code.should == 200
@@ -96,7 +102,7 @@ describe "return HTML in different brows
 
   it "Internet Explorer" do
     header_hash = {
-      'Accept' => "text/html, application/xhtml+xml, */*",
+      'Accept' => "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*",
       'User-agent' => "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)"
     }
     client.get(header_hash) do |response, request, &block|
@@ -145,8 +151,4 @@ describe "return HTML in different brows
     end
   end
 
-
-
-  
-
 end

Modified: incubator/deltacloud/trunk/server/lib/sinatra/rack_accept.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/sinatra/rack_accept.rb?rev=1141469&r1=1141468&r2=1141469&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/sinatra/rack_accept.rb (original)
+++ incubator/deltacloud/trunk/server/lib/sinatra/rack_accept.rb Thu Jun 30 10:36:17 2011
@@ -32,7 +32,7 @@ module Rack
         def render(*args, &block)
           begin
             assumed_layout = args[1] == :layout
-            args[1] = "#{args[1]}.#{format}".to_sym if args[1].is_a?(::Symbol)
+            args[1] = "#{args[1]}.#{@media_type}".to_sym if args[1].is_a?(::Symbol)
             render_without_format *args, &block
           rescue Errno::ENOENT => e
             raise "ERROR: Missing template: #{args[1]}.#{args[0]}" unless assumed_layout
@@ -55,15 +55,14 @@ module Rack
             alias :content_type_without_save :content_type
             def content_type(*args)
               content_type_without_save *args
-              request.env['rack-accept.format'] = args.first.to_sym
+              request.env['rack-accept.formats'] = { args.first.to_sym => 1 }
               response['Content-Type']
             end
           end
         end
 
-        def format(val=nil)
-          request.env['rack-accept.format'] ||= val
-          request.env['rack-accept.format'].to_sym
+        def accepting_formats
+          request.env['rack-accept.formats']
         end
 
         def static_file?(path)
@@ -78,8 +77,17 @@ module Rack
             self[type] = handler
           end
           yield wants
-          raise Deltacloud::ExceptionHandler::UnknownMediaTypeError::new(nil, "Unknown format") unless wants[format]
-          wants[format].call
+          @media_type = accepting_formats.to_a.sort { |a,b| a[1]<=>b[1] }.reverse.select do |format, priority|
+            wants.keys.include?(format) == true
+          end.first
+          if @media_type and @media_type[0]
+            @media_type = @media_type[0]
+            headers 'Content-Type' => Rack::MediaType::ACCEPTED_MEDIA_TYPES[@media_type][:return]
+            wants[@media_type.to_sym].call
+          else
+            headers 'Content-Type' => nil
+            status 406
+          end
         end
 
     end
@@ -96,7 +104,7 @@ module Rack
     ACCEPTED_MEDIA_TYPES = {
       :xml => { :return => 'application/xml', :match => ['application/xml', 'text/xml'] },
       :json => { :return => 'application/json', :match => ['application/json'] },
-      :html => { :return => 'text/html', :match => ['application/xhtml+xml', 'text/html'] },
+      :html => { :return => 'text/html', :match => ['application/xhtml+xml', 'text/html', '*/*'] },
       :png => { :return => 'image/png', :match => ['image/png'] },
       :gv => { :return => 'application/ghostscript', :match => ['application/ghostscript'] }
     }
@@ -116,7 +124,7 @@ module Rack
         index[media_type] = 1 if media_type
       else
         # Sort all requested media types in Accept using their 'q' values
-        sorted_media_types = accept.media_type.qvalues.to_a.sort{ |a,b| b[1]<=>a[1] }.collect { |t| t.first }
+        sorted_media_types = accept.media_type.qvalues.to_a.sort{ |a,b| a[1]<=>b[1] }.collect { |t| t.first }
         # If Accept header is missing or is empty, fallback to XML format
         sorted_media_types << 'application/xml' if sorted_media_types.empty?
         # Choose the right format with the media type according to the priority
@@ -128,21 +136,18 @@ module Rack
         # Reject formats with no/nil priority
         index.reject! { |format, priority| not priority }
       end
+
+      #puts sorted_media_types.inspect
+      #puts index.inspect
       
       # If after all we don't have any matching format assume that client has
       # requested unknown/wrong media type and throw an 406 error with no body
       if index.keys.empty?
         status, headers, response = 406, {}, ""
       else
-        media_type = index.to_a.sort{ |a, b| a[1]<=>b[1] }.first[0]
-        # Set this environment variable for futher pickup by the 'format' helper
-        # on top
-        env['rack-accept.format'] = media_type
+        env['rack-accept.formats'] = index
         status, headers, response = @app.call(env)
-        # Overide the Content-type with :return value of matching format
-        headers['Content-Type'] = ACCEPTED_MEDIA_TYPES[media_type][:return]
       end
-
       [status, headers, response]
     end
 

Modified: incubator/deltacloud/trunk/server/server.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/server.rb?rev=1141469&r1=1141468&r2=1141469&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/server.rb (original)
+++ incubator/deltacloud/trunk/server/server.rb Thu Jun 30 10:36:17 2011
@@ -239,10 +239,7 @@ collection :instance_states do
         format.png do
           # Trick respond_to into looking up the right template for the
           # graphviz file
-          format_backup = format
-          format(:gv)
           gv = erb(:"instance_states/show")
-          format(format_backup)
           png =  ''
           cmd = 'dot -Kdot -Gpad="0.2,0.2" -Gsize="5.0,8.0" -Gdpi="180" -Tpng'
           Open3.popen3( cmd ) do |stdin, stdout, stderr|