celluloid / reel

UNMAINTAINED: See celluloid/celluloid#779 - Celluloid::IO-powered web server
https://celluloid.io
MIT License
596 stars 87 forks source link

NameError: uninitialized constant Reel::RequestBody::StateError #97

Closed robertjpayne closed 10 years ago

robertjpayne commented 10 years ago

I'm pretty new to Reel/Celluloid so mind my potentially amateur bug report. I'm attempting to create a small HTTP proxy server use Reel + The HTTP Gem

Below is my entire app and it's constantly crashing with the stack trace below it.

require 'celluloid'
require 'celluloid/io'
require 'reel'
require 'http'

class HttpProxy
  include Celluloid::IO

  def initialize(url)
    @url = url
  end

  def request(verb, uri, options={})
    url = "#{@url}#{uri}"
    options = options.merge({ssl_socket_class: Celluloid::IO::SSLSocket})
    HTTP.request(verb, url, options).response
  end

end

class Server < Reel::Server
  def initialize(host = "127.0.0.1", port = 5000)
    super(host, port, &method(:on_connection))
  end

  def on_connection(connection)
    connection.each_request do |request|
      if request.websocket?
        handle_websocket(request)
      else
        handle_request(request)
      end
    end
  end

  def handle_request(request)
    uri = "#{request.uri}"
    uri = "#{uri}?#{request.query_string}" unless request.query_string.nil?
    uri = "#{uri}##{request.fragment}" unless request.fragment.nil?
    options = {}
    options[:headers] = request.headers unless request.headers.nil?
    options[:body] = request.body unless request.body.nil?

    puts "proxying: #{request.method} #{uri} #{request.headers} #{request.body}"

    @proxy ||= HttpProxy.new('https://api.parse.com/2')
    request.respond @proxy.request(request.method, uri, options)
  end

  def handle_websocket(sock)
    sock.close
  end
end

Server.run
NameError: uninitialized constant Reel::RequestBody::StateError
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/reel-0.4.0/lib/reel/request_body.rb:52:in `stream!'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/reel-0.4.0/lib/reel/request_body.rb:20:in `readpartial'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/reel-0.4.0/lib/reel/request_body.rb:26:in `each'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/http-0.5.0/lib/http/request_stream.rb:68:in `send_request_body'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/http-0.5.0/lib/http/request_stream.rb:31:in `stream'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/http-0.5.0/lib/http/request.rb:68:in `stream'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/http-0.5.0/lib/http/client.rb:79:in `perform'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/http-0.5.0/lib/http/client.rb:58:in `request'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/http-0.5.0/lib/http/chainable.rb:50:in `request'
    /Users/robertjpayne/Desktop/app.rb:16:in `request'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/calls.rb:25:in `public_send'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/calls.rb:25:in `dispatch'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/calls.rb:67:in `dispatch'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/actor.rb:322:in `block in handle_message'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/actor.rb:416:in `block in task'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/tasks.rb:55:in `block in initialize'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/tasks/task_fiber.rb:13:in `block in create'
    (celluloid):0:in `remote procedure call'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/calls.rb:92:in `value'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/proxies/sync_proxy.rb:33:in `method_missing'
    /Users/robertjpayne/Desktop/app.rb:47:in `handle_request'
    /Users/robertjpayne/Desktop/app.rb:31:in `block in on_connection'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/reel-0.4.0/lib/reel/connection.rb:74:in `each_request'
    /Users/robertjpayne/Desktop/app.rb:27:in `on_connection'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/reel-0.4.0/lib/reel/server.rb:32:in `call'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/reel-0.4.0/lib/reel/server.rb:32:in `handle_connection'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/calls.rb:25:in `public_send'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/calls.rb:25:in `dispatch'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/calls.rb:122:in `dispatch'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/actor.rb:322:in `block in handle_message'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/actor.rb:416:in `block in task'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/tasks.rb:55:in `block in initialize'
    /Users/robertjpayne/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/celluloid-0.15.1/lib/celluloid/tasks/task_fiber.rb:13:in `block in create'
robertjpayne commented 10 years ago

Actually a tiny bit more investigation looks like this may be because body is being sent to the HttpProxy actor. If I change my code slightly to options[:body] = request.body.to_s it works just fine.

tarcieri commented 10 years ago

Looks like you managed to find a bug regardless. Will try to get this addressed...

digitalextremist commented 10 years ago

You will probably need to throw sleep in after Server.run I believe. Totally unrelated //

Asmod4n commented 10 years ago

Server.run does just that

Am 24.09.2013 um 05:21 schrieb digitalextremist notifications@github.com:

You will probably need to throw sleep in after Server.run I believe. Totally unrelated //

— Reply to this email directly or view it on GitHub.

digitalextremist commented 10 years ago

Ah, cool!

halorgium commented 10 years ago

It looks like the StateError is in the Connection module and is not in the scope of the RequestBody class.

Asmod4n commented 10 years ago

Shouldn't harm to put it in the Reel Module like the other Errors.

Does #99 Fix it?