The following example shows how to implement basic Sinatra-like routes in a basic web server.

require 'socket'

class RWServer

def initialize()
@route = {}
end

def get(arg,&block)
methodx = {String: :string_get, Regexp: :regex_get}
send (methodx[arg.class.to_s.to_sym]), arg, &block
end

def string_get(s, &block)
s.gsub!(/\:\w+/,'(\w+)')
@route[Regexp.new s] = block
end

def regex_get(r, &block)
@route[r] = block
end

# -- start of custom code

def application(params)
get '/sugar' do
'ffff'
end

get '/sweet' do
'gggg'
end

get '/hello/:name' do |name|
'Hello ' + name
end

get %r{/hello2/([\w]+)} do
'ready ' + params[:captures].first
end
end

# -- end of custom code

def start

params = {}
server = TCPServer.new('0.0.0.0', 4446)
application(params)

while (session = server.accept)

raw_request = session.gets
request = raw_request[/.[^\s]+(?= HTTP\/1\.\d)/].strip
result = nil

@route.each do |key, block|
match = request.match(key)
if match then

puts @route.inspect
args = match.captures
params[:captures] = *args
result = @route[key].call *args

break
end
end

result ||= "404: page not found"

session.print "HTTP/1.1 200/OK\rContent-type: text/plain\r\n\r\n"
session.print result
session.close
end
end

end

rws = RWServer.new
rws.start


Tested (localhost:4446) Observed
----------------------- ---------
/sugar ffff
/hello/kid Hello kid
/clouds 404: page not found
/hello2/you ready you

Read more: http://feeds.dzone.com/~r/dzone/snippets/~3/x2EMUD6pk2o/11213