Refuse to stream responses unless request Accept header has text/plain
authorTom Clegg <tom@clinicalfuture.com>
Tue, 19 Nov 2013 20:19:53 +0000 (12:19 -0800)
committerTom Clegg <tom@clinicalfuture.com>
Tue, 19 Nov 2013 20:21:19 +0000 (12:21 -0800)
or */*. Closes #1604

services/api/app/controllers/application_controller.rb
services/api/app/controllers/arvados/v1/jobs_controller.rb
services/api/app/controllers/arvados/v1/users_controller.rb

index 348ed13d534cc7c260529a9c87ce65c100415800..dfe615309010f7dcaef20661ddcf83eb5a50412e 100644 (file)
@@ -354,4 +354,9 @@ class ApplicationController < ActionController::Base
       order: { type: 'string', required: false }
     }
   end
+  
+  def client_accepts_plain_text_stream
+    (request.headers['Accept'].split(' ') &
+     ['text/plain', '*/*']).count > 0
+  end
 end
index 1b2f941805fe40f7cdfa7cb1988e59521ee201b1..2b64278fc6d531ce76ce0f0d734af1c1e846dffa 100644 (file)
@@ -118,10 +118,18 @@ class Arvados::V1::JobsController < ApplicationController
     if !@object.andand.uuid
       return render_not_found
     end
-    self.response.headers['Last-Modified'] = Time.now.ctime.to_s
-    self.response_body = LogStreamer.new @object, {
-      buffer_size: (params[:buffer_size] || 2**13)
-    }
+    if client_accepts_plain_text_stream
+      self.response.headers['Last-Modified'] = Time.now.ctime.to_s
+      self.response_body = LogStreamer.new @object, {
+        buffer_size: (params[:buffer_size] || 2**13)
+      }
+    else
+      render json: {
+        href: url_for(uuid: @object.uuid),
+        comment: ('To retrieve the log stream as plain text, ' +
+                  'use a request header like "Accept: text/plain"')
+      }
+    end
   end
 
   def queue
index 6fe1cdf5ddbe0a4b6a5482bf8e0476e1a9653f42..a0d2f54792d6a34f5bb0d9d05cd962495ccfccb6 100644 (file)
@@ -29,7 +29,15 @@ class Arvados::V1::UsersController < ApplicationController
     if current_user.andand.is_admin
       channel = params[:uuid] || channel
     end
-    self.response.headers['Last-Modified'] = Time.now.ctime.to_s
-    self.response_body = ChannelStreamer.new(channel: channel)
+    if client_accepts_plain_text_stream
+      self.response.headers['Last-Modified'] = Time.now.ctime.to_s
+      self.response_body = ChannelStreamer.new(channel: channel)
+    else
+      render json: {
+        href: url_for(uuid: channel),
+        comment: ('To retrieve the event stream as plain text, ' +
+                  'use a request header like "Accept: text/plain"')
+      }
+    end
   end
 end