3616: Use "ensure" to close response stream.
[arvados.git] / apps / workbench / app / controllers / collections_controller.rb
index 41b4771e4e87dd1012ec0bd9da9b91dad2c8171e..9882fa6a34a38f97e6615804038d107290604e4a 100644 (file)
@@ -1,4 +1,6 @@
 class CollectionsController < ApplicationController
+  include ActionController::Live
+
   skip_around_filter(:require_thread_api_token,
                      only: [:show_file, :show_file_links])
   skip_before_filter(:find_object_by_uuid,
@@ -145,7 +147,7 @@ class CollectionsController < ApplicationController
     end
     if usable_token.nil?
       return  # Response already rendered.
-    elsif params[:file].nil? or not file_in_collection?(coll, params[:file])
+    elsif params[:file].nil? or not coll.manifest.has_file?(params[:file])
       return render_not_found
     end
     opts = params.merge(arvados_api_token: usable_token)
@@ -154,7 +156,13 @@ class CollectionsController < ApplicationController
       Rack::Mime::MIME_TYPES[ext] || 'application/octet-stream'
     self.response.headers['Content-Length'] = params[:size] if params[:size]
     self.response.headers['Content-Disposition'] = params[:disposition] if params[:disposition]
-    self.response_body = file_enumerator opts
+    begin
+      file_enumerator(opts).each do |bytes|
+        response.stream.write bytes
+      end
+    ensure
+      response.stream.close
+    end
   end
 
   def sharing_scopes
@@ -277,13 +285,6 @@ class CollectionsController < ApplicationController
     return nil
   end
 
-  def file_in_collection?(collection, filename)
-    target = CollectionsHelper.file_path(File.split(filename))
-    collection.manifest.each_file.any? do |file_spec|
-      CollectionsHelper.file_path(file_spec) == target
-    end
-  end
-
   def file_enumerator(opts)
     FileStreamer.new opts
   end