Skip to content

Instantly share code, notes, and snippets.

@dyoder
Created August 28, 2008 22:02
Show Gist options
  • Save dyoder/7839 to your computer and use it in GitHub Desktop.
Save dyoder/7839 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 )
begin
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
rescue
shutdown
end
end
private
def process( request, block )
@threads << Thread.new do
data = '' ; chunk = nil
loop do
chunk = request.recv_nonblock(16*1024)
data << chunk
puts "CHUNK #{chunk.size}"
break if chunk.size == 0
end
puts "READ #{data.size}"
request.close_read
IO.select([], [request])
request.print( block[ data ] )
request.close
end
end
def shutdown
@server.close
exit
end
end
load 'server.rb'
servlet = lambda do |data|
"HTTP/1.0 200 OK\r\nContent-Type: text/plain; charset=UTF-8\r\n\r\n#{"yes\n"*1000}"
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