Este código se encuentra en https://github.com/crguezl/rack-lobster
[~/local/src/ruby/sinatra/rack/rack-lobster(master)]$ cat lobster.rb
require 'rack/request'
require 'rack/response'
module Rack
class Lobster
LobsterString = "a lobster"
def call(env)
req = Request.new(env)
req.env.keys.sort.each { |x| puts "#{x} => #{req.env[x]}" }
if req.GET["flip"] == "left"
lobster = LobsterString.reverse
href = "?flip=right"
elsif req.GET["flip"] == "crash"
raise "Lobster crashed"
else
lobster = LobsterString
href = "?flip=left"
end
res = Response.new
res.write <<-"EOS"
<title>Lobstericious!</title>
<pre>
#{lobster}
</pre>
<p><a href='#{href}'>flip!</a></p>
<p><a href='?flip=crash'>crash!</a></p>
EOS
res.finish
end
end
end
if $0 == __FILE__
require 'rack'
require 'rack/showexceptions'
Rack::Server.start(
:app => Rack::ShowExceptions.new(
Rack::Lint.new(
Rack::Lobster.new)),
:Port => 9292,
:server => 'thin'
)
end
Véase:
(Rack::ShowExceptions catches all exceptions raised from the app it wraps. It shows a useful backtrace with the sourcefile and clickable context, the whole Rack environment and the request data.
Be careful when you use this on public-facing sites as it could reveal information helpful to attackers)
(Rack::Lint validates your application and the requests and responses according to the Rack spec)
call que recibe una variable env describiendo el entorno CGI.
Esto es, se trata de aplicaciones que siguen el protocolo Rack.
Así este código:
Rack::Server.start(
:app => Rack::ShowExceptions.new(
Rack::Lint.new(
Rack::Lobster.new)),
:Port => 9292,
:server => 'thin'
)
construye una nueva objeto/aplicación Rack que es la composición de los tres Racks.
[~/local/src/ruby/sinatra/rack/rack-lobster(master)]$ cat Rakefile
desc "run the server"
task :default do
sh "ruby lobster.rb"
end
desc "run the client flip left"
task :left do
sh %q{curl -v 'http://localhost:9292?flip=left'}
end
desc "run the client flip right"
task :right do
sh %q{curl -v 'http://localhost:9292?flip=right'}
end
desc "run the client. Generate exception"
task :crash do
sh %q{curl -v 'http://localhost:9292/?flip=crash'}
end
[~/local/src/ruby/sinatra/rack/rack-lobster(master)]$ rake left
curl -v 'http://localhost:9292?flip=left'
* About to connect() to localhost port 9292 (#0)
* Trying ::1... Connection refused
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 9292 (#0)
> GET /?flip=left HTTP/1.1
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8y zlib/1.2.5
> Host: localhost:9292
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 168
< Connection: keep-alive
< Server: thin 1.5.1 codename Straight Razor
<
<title>Lobstericious!</title>
<pre>
retsbol a
</pre>
<p><a href='?flip=right'>flip!</a></p>
<p><a href='?flip=crash'>crash!</a></p>
* Connection #0 to host localhost left intact
* Closing connection #0
[~/local/src/ruby/sinatra/rack/rack-lobster(master)]$ rake right
curl -v 'http://localhost:9292?flip=right'
* About to connect() to localhost port 9292 (#0)
* Trying ::1... Connection refused
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 9292 (#0)
> GET /?flip=right HTTP/1.1
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8y zlib/1.2.5
> Host: localhost:9292
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 167
< Connection: keep-alive
< Server: thin 1.5.1 codename Straight Razor
<
<title>Lobstericious!</title>
<pre>
a lobster
</pre>
<p><a href='?flip=left'>flip!</a></p>
<p><a href='?flip=crash'>crash!</a></p>
* Connection #0 to host localhost left intact
* Closing connection #0
Casiano Rodriguez León 2015-01-07