macournoyer / mor7

My Montreal on Rails 7 presentation of Thin

This URL has Read+Write access

mor7 / demo.rb
ef4721aa » macournoyer 2008-02-20 Adding code and slides 1 %w(rubygems eventmachine thin thin_parser rack rack/lobster).each { |f| require f }
2
3 class Connection < EventMachine::Connection
4 attr_accessor :app
5
6 def initialize
7 @parser = Thin::HttpParser.new
8 @data = ''
9 @nparsed = 0
10 @env = {}
11 end
12
13 def receive_data(data)
14 @data << data
15 @nparsed = @parser.execute(@env, @data, @nparsed)
16
17 process if @parser.finished?
18 end
19
20 def process
21 status, headers, body = @app.call(@env)
22
23 body_output = ''
24 body.each { |l| body_output << l }
25
26 send_data "HTTP/1.1 #{status} OK\r\n" +
27 headers.inject('') { |h, (k,v)| h += "#k: #v\r\n" } +
28 "\r\n" +
29 body_output
30
31 close_connection_after_writing
32 end
33 end
34
35 welcome_app = proc do |env|
36 [
37 200, # Status
38 {'Content-Type' => 'text/html'}, # Headers
39 [
40 '<html><body>',
41 '<h1>Welcome</h1>',
42 '<p>Welcome to my server!</p>', # Body
43 '<p><a href="/rails">My Rails app!</a></p>',
44 '</body></html>'
45 ]
46 ]
47 end
48
49 rails_app = Rack::Adapter::Rails.new(:root => '/Users/marc/projects/refactormycode', :prefix => '/rails')
50
51 app = Rack::URLMap.new('/' => welcome_app, '/rails' => rails_app)
52
53 EventMachine.run do
54 EventMachine.start_server '0.0.0.0', 3000, Connection do |con|
55 con.app = app
56 end
57 end