Skip to content

Instantly share code, notes, and snippets.

@dyoder
Created August 28, 2008 04:58
Show Gist options
  • Save dyoder/7661 to your computer and use it in GitHub Desktop.
Save dyoder/7661 to your computer and use it in GitHub Desktop.
require 'socket'
class Server
def initialize( port )
@server = TCPServer.new( port )
@threads = []
end
def run( &block )
request = nil
trap ( 'INT' ) { shutdown }
loop do
begin
request = @server.accept_nonblock
rescue Errno::EAGAIN, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR
@threads.delete_if { |t| !t.alive? && t.join }
IO.select([@server])
retry
end
process( request, block )
end
end
private
def process( request, block )
@threads << Thread.new do
IO.select([request])
data = ''; chunk = nil
data << chunk until (( chunk = request.gets).chomp.empty? )
request.close_read
IO.select([], [request])
request.print( block[ data ] )
request.close
end
end
def shutdown
exit
end
end
load 'server.rb'
servlet = lambda do |data|
puts data
"HTTP/1.0 200 OK\r\nContent-Type: text/plain; charset=UTF-8\r\n\r\nYes.\n\r\n"
end
server = Server.new( 2201 )
server.run( &servlet )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment