El valor de retorno del bloque de una ruta determina
el cuerpo de respuesta pasado al cliente HTTP, o al menos al siguiente middleware en la pila de Rack.
Lo habitual es que sea una String pero puede ser otra cosa.
De hecho, podemos retornar cualquier tipo de objeto que sea una respuesta Rack válida,
un objeto que disponga de un each o un código de estatus HTTP:
Array con tres elementos: [status (Fixnum), headers (Hash), response body (responds to #each)]
Array con dos elementos:
[status (Fixnum), response body (responds to #each)]
#each y que le pasa strings al bloque dado
Fixnum que representa el status code
Así podemos, implementar el siguiente ejemplo que funciona en streaming cuando se usa con
puma:
[~/sinatra/sinatra-streaming/intro-streaming(master)]$ cat stream.rb
require 'sinatra'
before do
content_type :txt
end
class Flujo
def each
5.times do |i|
yield "#{i}: #{Time.now}\n"
sleep 1
end
end
end
get '/' do
puts env
Flujo.new
end
Véase el código en
https://github.com/crguezl/sinatra_intro/tree/master/streaming.
[~/sinatra/sinatra-streaming/intro-streaming(master)]$ cat Rakefile task :default => :puma desc "run stream.rb using puma server" task :puma do sh "ruby stream.rb -e production -s puma" end desc "run stream.rb using thin server" task :thin do sh "ruby stream.rb -e production -s thin" end
[~/sinatra/sinatra-streaming/intro-streaming(master)]$ rake ruby stream.rb -e production -s puma Puma 2.6.0 starting... * Min threads: 0, max threads: 16 * Environment: development * Listening on tcp://0.0.0.0:4567 == Sinatra/1.4.4 has taken the stage on 4567 for production with backup from Puma 127.0.0.1 - - [01/Dec/2013 21:05:32] "GET / HTTP/1.1" 200 - 5.0094
Nota: con thin no funciona en modo streaming.
Prepara la página completa y la suelta de golpe.
Cuando visitamos localhost:4567 obtenemos una salida en la que cada línea
aparece un segundo después que la anterior:
0: 2013-12-01 21:05:27 +0000 1: 2013-12-01 21:05:28 +0000 2: 2013-12-01 21:05:29 +0000 3: 2013-12-01 21:05:30 +0000 4: 2013-12-01 21:05:31 +0000
Casiano Rodriguez León 2015-01-07