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 endVé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