The close parameter specifies whether Stream#close
should be called
after the block has been executed. This is only relevant for evented
servers like Thin
or Rainbows.
Fichero sinatra/base.rb
:
class Stream ... def stream(keep_open = false) # Soporta el servidor callbacks asincronas? (webrick no, thin si) scheduler = env['async.callback'] ? EventMachine : Stream current = @params.dup body Stream.new(scheduler, keep_open) { |out| with_params(current) { yield(out) } # llamamos al bloque } end ... endSi
keep_open
es true
el navegador se queda esperando datos y no
ciera la conexión.
The body
method set or retrieve the response body.
When a block is given,
evaluation is deferred until the body is read with each
.
def body(value = nil, &block) if block_given? def block.each; yield(call) end response.body = block elsif value headers.delete 'Content-Length' unless request.head? || value.is_a?(Rack::File) || value.is_a?(Stream) response.body = value else response.body end end
class Stream def self.schedule(*) yield end def self.defer(*) yield end def initialize(scheduler = self.class, keep_open = false, &back) @back, @scheduler, @keep_open = back.to_proc, scheduler, keep_open @callbacks, @closed = [], false end ... end
class Stream ... def with_params(temp_params) original, @params = @params, temp_params # save params yield # call the block ensure @params = original if original # recover params end end