Method: Grape::DSL::InsideRoute#stream

Defined in:
lib/grape/dsl/inside_route.rb

#stream(value = nil) ⇒ Object

Allows you to define the response as a streamable object.

If Content-Length and Transfer-Encoding are blank (among other conditions), Rack assumes this response can be streamed in chunks.

See:

Examples:

get '/stream' do
  stream FileStreamer.new(...)
end

GET /stream # => "chunked contents of file"


351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
# File 'lib/grape/dsl/inside_route.rb', line 351

def stream(value = nil)
  return if value.nil? && @stream.nil?

  header Rack::CONTENT_LENGTH, nil
  header Grape::Http::Headers::TRANSFER_ENCODING, nil
  header Rack::CACHE_CONTROL, 'no-cache' # Skips ETag generation (reading the response up front)
  if value.is_a?(String)
    file_body = Grape::ServeStream::FileBody.new(value)
    @stream = Grape::ServeStream::StreamResponse.new(file_body)
  elsif value.respond_to?(:each)
    @stream = Grape::ServeStream::StreamResponse.new(value)
  elsif !value.is_a?(NilClass)
    raise ArgumentError, 'Stream object must respond to :each.'
  else
    @stream
  end
end