C extension to libevent library
C Ruby
Latest commit 4d922aa Nov 29, 2011 @ayanko v0.0.2
Permalink
Failed to load latest commit information.
ext/libevent_ext Fixed C warning about type casting Nov 28, 2011
lib v0.0.2 Nov 28, 2011
samples Updated README Nov 18, 2011
.gitignore Initial commit Nov 18, 2011
Gemfile Initial commit Nov 18, 2011
README.md Added reference section Nov 18, 2011
Rakefile Initial commit Nov 18, 2011
libevent.gemspec Initial commit Nov 18, 2011

README.md

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

  • libevent v2

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