Pregunta

Tengo un problema extraño que ejecuta mi sitio web estático localmente (para pruebas). Tanto Webrick como Unicorn están causando una falla de afirmación en Rack al navegar a la raíz. Sin embargo, el delgado funciona perfectamente.

Mi archivo de acorden 'config.ru':

# This is the root of our app
@root = File.expand_path(File.dirname(__FILE__)) + '/site'
default_charset = "; charset=UTF-8"

run Proc.new { |env|

    # Extract the requested path from the request
    path = Rack::Utils.unescape(env['PATH_INFO'])
    index_file = @root + "#{path}/index.html"

    if File.exists?(index_file)
        # Return the index
        [200, {'Content-Type' => 'text/html' + default_charset}, File.read(index_file)]
    else
        # Pass the request to the directory app
        response = Rack::Directory.new(@root).call(env)
        if response[1]['Content-Type']
            response[1]['Content-Type'] += default_charset
        end
        response
    end
}

La lista de gemas es la siguiente:

$ bundle exec gem list

*** LOCAL GEMS ***

bundler (1.0.18)
coderay (0.9.8)
daemons (1.1.4)
erector (0.8.3)
eventmachine (0.12.10)
kgio (2.6.0)
kramdown (0.13.3)
polyglot (0.3.2)
rack (1.3.2)
raindrops (0.7.0)
rake (0.9.2)
thin (1.2.11)
treetop (1.4.10)
unicorn (4.1.1)

Y estos son los errores que recibo:

$ bundle exec rackup
[2011-09-12 21:19:50] INFO  WEBrick 1.3.1
[2011-09-12 21:19:50] INFO  ruby 1.9.2 (2010-08-18) [x86_64-linux]
[2011-09-12 21:19:50] INFO  WEBrick::HTTPServer#start: pid=2556 port=9292
127.0.0.1 - - [12/Sep/2011 21:20:05] "GET / HTTP/1.1" 200 - 0.0027
[2011-09-12 21:20:05] ERROR Rack::Lint::LintError: Response body must respond to each
        /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/lint.rb:19:in `assert'
        /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/lint.rb:513:in `each'
        /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/body_proxy.rb:26:in `method_missing'
        /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/chunked.rb:23:in `each'
        /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/handler/webrick.rb:71:in `service'
        /usr/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'
        /usr/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'
        /usr/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'

$ bundle exec unicorn
I, [2011-09-12T21:20:33.219694 #2567]  INFO -- : listening on addr=0.0.0.0:8080 fd=3
I, [2011-09-12T21:20:33.219883 #2567]  INFO -- : worker=0 spawning...
I, [2011-09-12T21:20:33.220771 #2567]  INFO -- : master process ready
I, [2011-09-12T21:20:33.221535 #2570]  INFO -- : worker=0 spawned pid=2570
I, [2011-09-12T21:20:33.221787 #2570]  INFO -- : Refreshing Gem list
I, [2011-09-12T21:20:33.253184 #2570]  INFO -- : worker=0 ready
127.0.0.1 - - [12/Sep/2011 21:20:41] "GET / HTTP/1.1" 200 - 0.0030
E, [2011-09-12T21:20:41.087884 #2570] ERROR -- : app error: Response body must respond to each (Rack::Lint::LintError)
E, [2011-09-12T21:20:41.087935 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/lint.rb:19:in `assert'
E, [2011-09-12T21:20:41.087968 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/lint.rb:513:in `each'
E, [2011-09-12T21:20:41.087991 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/body_proxy.rb:26:in `method_missing'
E, [2011-09-12T21:20:41.088013 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/chunked.rb:23:in `each'
E, [2011-09-12T21:20:41.088035 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/lib/unicorn/http_response.rb:41:in `http_response_write'
E, [2011-09-12T21:20:41.088057 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/lib/unicorn/http_server.rb:536:in `process_client'
E, [2011-09-12T21:20:41.088078 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/lib/unicorn/http_server.rb:600:in `worker_loop'
E, [2011-09-12T21:20:41.088100 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/lib/unicorn/http_server.rb:485:in `spawn_missing_workers'
E, [2011-09-12T21:20:41.088124 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/lib/unicorn/http_server.rb:135:in `start'
E, [2011-09-12T21:20:41.088147 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/bin/unicorn:121:in `<top (required)>'
E, [2011-09-12T21:20:41.088168 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/bin/unicorn:19:in `load'
E, [2011-09-12T21:20:41.088190 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/bin/unicorn:19:in `<main>'

Y delgado funcionando bien:

$bundle exec thin start
>> Using rack adapter
>> Thin web server (v1.2.11 codename Bat-Shit Crazy)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:3000, CTRL+C to stop
^C>> Stopping ...

¿Por qué está sucediendo esto, cuando se supone que los tres servidores deben adherirse a la especificación del bastidor?

¿Fue útil?

Solución

¿Están los tres corriendo en Ruby 1.9?

Si revisa la especificación del rack (que se encuentra aquí: http://rack.rubyforge.org/doc/spec.html) debajo de la sección del cuerpo dice:

El cuerpo debe responder a cada uno y solo debe producir valores de cadena. El cuerpo en sí no debe ser una instancia de cadena, ya que esto se romperá en Ruby 1.9.

Entonces, de acuerdo con la especificación, supongo que cualquiera de los delgadas es un poco más flojo al verificarlo, responde a cada uno o tal vez hay una diferencia en las versiones de Ruby.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top