class Robe::Server

Attributes

port[R]
running[R]

Public Class Methods

new(handler, port) click to toggle source
# File lib/robe/server.rb, line 11
def initialize(handler, port)
  @handler = handler
  @server = TCPServer.new("127.0.0.1", port)
  @running = true
  @port = @server.addr[1]
end

Public Instance Methods

shutdown() click to toggle source
# File lib/robe/server.rb, line 77
def shutdown
  @running = false
  begin
    @server && @server.shutdown(Socket::SHUT_RDWR)
  rescue Errno::ENOTCONN
    # Hello JRuby
    @server.close
  end
end
start() click to toggle source
# File lib/robe/server.rb, line 18
def start
  access = File.open("#{Dir.tmpdir}/robe-access-#{@port}.log", "w")
  access.sync = true

  error_logger = Logger.new($stderr)
  access_logger = Logger.new(access)

  client = nil

  loop do
    begin
      client = @server.accept

      next if client.eof?

      req = WEBrick::HTTPRequest.new(:InputBufferSize => 1024,
                                     :Logger => error_logger)
      req.parse(client)
      access_logger.info "#{req.request_method} #{req.path}"

      begin
        body = @handler.call(req.path, req.body)
      rescue Exception => e
        error_logger.error "Request failed: #{req.path}. Please file an issue."
        error_logger.error "#{e.message}\n#{e.backtrace.join("\n")}"
      end

      resp = WEBrick::HTTPResponse.new(:OutputBufferSize => 1024,
                                       :Logger => error_logger,
                                       :HTTPVersion => "1.1")
      resp.status = 200
      resp.content_type = "application/json; charset=utf-8"
      resp.body = body

      begin
        resp.send_response(client)
        client.close
      rescue Errno::EPIPE
        error_logger.error "Connection lost, unsent response:"
        error_logger.error body
      end
    rescue Errno::EINVAL
      break
    rescue IOError
      # Hello JRuby
      break
    end
  end
end
wait_for_it() click to toggle source
# File lib/robe/server.rb, line 68
def wait_for_it
  begin
    TCPSocket.new("127.0.0.1", @port).close
  rescue
    sleep 0.05
    retry
  end
end