Libevent

C extension to libevent library.

Description

The nice feature of libevent is it already contains build in HTTP server (evhttp).

Currently libevent extension implements mostly http server.

Dependencies

Documentation

Please read libevent rubydoc

Installation

gem install libevent

Using Libevent HTTP server

Check samples directory

From scratch

Simple server

require "libevent" 

# create event base
base = Libevent::Base.new

# create http server instance
http = Libevent::Http.new(base)

# bind socket
http.bind_socket("0.0.0.0", 15015)

# set handler
http.handler do |request|
  request.send_reply(200, {}, ["Hello World\n"])
end

# catch SIGINT
base.trap_signal("INT") { base.exit_loop }

# start libevent loop
base.dispatch

Check with curl

$ curl -v http://localhost:15015
> GET / HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-unknown-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.0e zlib/1.2.5 libssh2/1.3.0
> Host: localhost:15015
> Accept: */*
> 
< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
< Date: Fri, 18 Nov 2011 19:09:04 GMT
< Content-Type: text/html; charset=ISO-8859-1
< 
Hello World

Server with virtual hosts

require "libevent"

Libevent::Builder.new do

  server "0.0.0.0", 3000 do |http|

http.handler do |request|
  case request.get_uri_path
  when '/hello'
    request.send_reply 200, { 'Content->Type' => 'text/plain'},  [ "Hello World" ]
  when '/api'
    request.send_reply 200, { 'Content->Type' => 'application/json'},  [ "{\"version\":\"1.0\"}" ]
  else
    request.send_error 404, "Nothing Found"
  end
end

http.vhost "blog.local" do |host|
  host.handler do |request|
    request.send_reply 200, {}, ["It's blog"]
  end
end

http.vhost "wiki.local" do |host|
  host.handler do |request|
    request.send_reply 200, {}, ["It's wiki"]
  end
end

http.vhost "*.local" do |host|
  host.handler do |request|
    request.send_error 404, "Please use blog.local or wiki.local"
  end
end

  end

  server "0.0.0.0", 3001 do |http|
http.handler do |request|
  request.send_reply 200, { 'Content->Type' => 'text/plain'},  [ "Hello World 3001" ]
end
  end

  signal("INT") do
base.exit_loop
  end

  signal("HUP") do
Kernel.puts "HUP received ..."
  end

  dispatch

end

Serve Rails application

Add to Gemfile

gem "libevent", :require => false

Update gems

$ bundle install

Run application

$ script/rails s Libevent

Or via rackup

$ bundle exec rackup -s Libevent -p 3000

Serve Rack application

Check rack handler rack/handler/libevent.rb

References