Ejemplo con POST

[~/local/src/ruby/sinatra/rack/rack-debugging]$ cat hello_response.rb 
# encoding: utf-8
require 'rack'
require 'pry-debugger'

class HelloWorld

  def call env
    req = Rack::Request.new(env)
    res = Rack::Response.new 
    binding.pry if ARGV[0]
    res['Content-Type'] = 'text/html'
    name = (req["firstname"] && req["firstname"] != '') ? req["firstname"] :'World'
    res.write <<-"EOS"
      <!DOCTYPE HTML>
      <html>
        <title>Rack::Response</title>
        <body>
          <h1>
             Hello #{name}!
             <form action="/" method="post">
               Your name: <input type="text" name="firstname" autofocus><br>
               <input type="submit" value="Submit">
             </form>
          </h1>
        </body>
      </html>
    EOS
    res.finish
  end
end

Rack::Server.start(
  :app => HelloWorld.new,
  :Port => 9292,
  :server => 'thin'
)

[~/local/src/ruby/sinatra/rack/rack-debugging]$ ruby hello_response.rb debug
>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:9292, CTRL+C to stop

Ahora cuando visitamos la página http://localhost:9292 el navegador queda a la espera del servidor y el servidor alcanza la línea de break.

From: /Users/casiano/local/src/ruby/sinatra/rack/rack-debugging/hello_response.rb @ line 10 HelloWorld#call:

     7: def call env
     8:   req = Rack::Request.new(env)
     9:   res = Rack::Response.new 
 => 10:   binding.pry if ARGV[0]
    11:   res['Content-Type'] = 'text/html'
    12:   name = (req["firstname"] && req["firstname"] != '') ? req["firstname"] :'World'
    13:   res.write <<-"EOS"
    14:     <!DOCTYPE HTML>
    15:     <html>
    16:       <title>Rack::Response</title>
    17:       <body>
    18:         <h1>
    19:            Hello #{name}!
    20:            <form action="/" method="post">
    21:              Your name: <input type="text" name="firstname" autofocus><br>
    22:              <input type="submit" value="Submit">
    23:            </form>
    24:         </h1>
    25:       </body>
    26:     </html>
    27:   EOS
    28:   res.finish
    29: end

[1] pry(#<HelloWorld>)>
Consultemos los contenidos de res:
[1] pry(#<HelloWorld>)> res
=> #<Rack::Response:0x007fe3fb1e6180
 @block=nil,
 @body=[],
 @chunked=false,
 @header={},
 @length=0,
 @status=200,
 @writer=
  #<Proc:0x007fe3fb1e5f50@/Users/casiano/.rvm/gems/ruby-1.9.3-p392/gems/rack-1.5.2/lib/rack/response.rb:27 (lambda)>>
Después de un par de continue el servidor se queda a la espera:
[3] pry(#<HelloWorld>)> continue
...
[1] pry(#<HelloWorld>)> continue

Rellenamos la entrada con un nombre (Pedro) y de nuevo el servidor alcanza el punto de ruptura:

[2] pry(#<HelloWorld>)> req.params
=> {"firstname"=>"Pedro"}

[7] pry(#<HelloWorld>)> break 28
Breakpoint 1: /Users/casiano/local/src/ruby/sinatra/rack/rack-debugging/hello_response.rb @ line 28 (Enabled) :

    26:       </html>
    27:     EOS
 => 28:     res.finish
    29:   end

[8] pry(#<HelloWorld>)> continue
Breakpoint 1. First hit.
...
[9] pry(#<HelloWorld>)> res.headers
=> {"Content-Type"=>"text/html", "Content-Length"=>"370"}
[10] pry(#<HelloWorld>)>



Casiano Rodriguez León 2015-01-07