DIR = File.dirname(__FILE__) def fib(n) return 1 if n <= 1 fib(n-1) + fib(n-2) end def wait(seconds) n = (seconds / 0.01).to_i n.times do sleep(0.01) #File.read(DIR + '/yahoo.html') end end class SimpleApp @@responses = {} def initialize @count = 0 end def deferred?(env) false end def call(env) path = env['PATH_INFO'] || env['REQUEST_URI'] commands = path.split('/') @count += 1 if commands.include?('periodical_activity') and @count % 10 != 1 return [200, {'Content-Type'=>'text/plain'}, "quick response!\r\n"] end if commands.include?('fibonacci') n = commands.last.to_i raise "fibonacci called with n <= 0" if n <= 0 body = (1..n).to_a.map { |i| fib(i).to_s }.join(' ') status = 200 elsif commands.include?('wait') n = commands.last.to_f raise "wait called with n <= 0" if n <= 0 wait(n) body = "waited about #{n} seconds" status = 200 elsif commands.include?('bytes') n = commands.last.to_i raise "bytes called with n <= 0" if n <= 0 body = @@responses[n] || "C"*n status = 200 elsif commands.include?('fixed') n = 20 * 1024; body = @@responses[n] || "C"*n status = 200 elsif commands.include?('test_post_length') input_body = "" while chunk = env['rack.input'].read(512) input_body << chunk end if env['CONTENT_LENGTH'].to_i == input_body.length body = "Content-Length matches input length" status = 200 else body = "Content-Length doesn't matches input length! content_length = #{env['CONTENT_LENGTH'].to_i} input_body.length = #{input_body.length}" status = 500 end else status = 404 body = "Undefined url" end body += "\r\n" headers = {'Content-Type' => 'text/plain', 'Content-Length' => body.length.to_s } [status, headers, [body]] end end if $0 == __FILE__ #require DIR + '/../lib/ebb' require 'rubygems' require 'rack' require 'thin' require 'ebb' # Rack::Handler::Mongrel.run(SimpleApp.new, :Port => 8000) Thin::Server.start("0.0.0.0", 8000, SimpleApp.new) # Ebb::start_server(SimpleApp.new, :port => 8000) end