rack-mongrel2 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -19,4 +19,5 @@ rdoc
19
19
  pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
- .bundle/
22
+ .bundle/
23
+ *.rbc
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm use ree@rack-mongrel2
1
+ rvm use 1.9.2@rack-mongrel2
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- gem 'yajl-ruby', '~> 0.7.8', :require => 'yajl'
4
- gem 'zmq', '~> 2.0.9'
3
+ gem 'ffi', '~> 0.6.3'
4
+ gem 'ffi-rzmq', '~> 0.6.0'
5
5
 
6
6
  group :development do
7
7
  gem 'jeweler', '~> 1.4.0'
data/Gemfile.lock CHANGED
@@ -2,6 +2,9 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
4
  diff-lcs (1.1.2)
5
+ ffi (0.6.3)
6
+ rake (>= 0.8.7)
7
+ ffi-rzmq (0.6.0)
5
8
  gemcutter (0.6.1)
6
9
  git (1.2.5)
7
10
  jeweler (1.4.0)
@@ -9,6 +12,7 @@ GEM
9
12
  git (>= 1.2.5)
10
13
  rubyforge (>= 2.0.0)
11
14
  json_pure (1.4.6)
15
+ rake (0.8.7)
12
16
  rspec (2.0.1)
13
17
  rspec-core (~> 2.0.1)
14
18
  rspec-expectations (~> 2.0.1)
@@ -21,16 +25,14 @@ GEM
21
25
  rspec-expectations (~> 2.0.1)
22
26
  rubyforge (2.0.4)
23
27
  json_pure (>= 1.1.7)
24
- yajl-ruby (0.7.8)
25
28
  yard (0.6.1)
26
- zmq (2.0.9)
27
29
 
28
30
  PLATFORMS
29
31
  ruby
30
32
 
31
33
  DEPENDENCIES
34
+ ffi (~> 0.6.3)
35
+ ffi-rzmq (~> 0.6.0)
32
36
  jeweler (~> 1.4.0)
33
37
  rspec (~> 2.0.1)
34
- yajl-ruby (~> 0.7.8)
35
38
  yard (~> 0.6.1)
36
- zmq (~> 2.0.9)
data/README.rdoc CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  The only Mongrel2 Rack handler you'll ever need.
4
4
 
5
- I wrote this because I wanted to learn Mongrel2, and I didn't like what was out there. I copy-pasted a lot of code from Colin Curtin's m2r project (http://github.com/perplexes/m2r), but I also changed and reorganized it into what I believe is a good setup for a proper rubygem. I used the ruby zmq library instead of the ffi version, so we'll see how that works out.
5
+ I wrote this because I wanted to learn Mongrel2, and I didn't like what was out there. I copy-pasted a lot of code from Colin Curtin's m2r project (http://github.com/perplexes/m2r), but I also changed and reorganized it into what I believe is a good setup for a proper rubygem.
6
6
 
7
7
  == How to use
8
8
 
@@ -12,12 +12,13 @@ I wrote this because I wanted to learn Mongrel2, and I didn't like what was out
12
12
 
13
13
  gem 'rack-mongrel2', '~> 0.1.0', :require => nil
14
14
 
15
- 4. Run Mongrel2
16
- 5. Run your rails application
15
+ 4. You also need some sort of JSON parsing library installed, like Yajl or JSON (gem i yajl-ruby or gem i json). json-jruby will work too
16
+ 5. Run Mongrel2
17
+ 6. Run your rails application
17
18
 
18
19
  RACK_MONGREL2_UUID=<my uuid> rails s Mongrel2
19
20
 
20
- 6. Profit!
21
+ 7. Profit!
21
22
 
22
23
  I'll write a better blog post soon...
23
24
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.0
@@ -0,0 +1,3 @@
1
+ run/
2
+ tmp/
3
+ config.sqlite
@@ -1,24 +1,24 @@
1
1
  require 'sinatra'
2
- require 'yajl/json_gem'
3
2
 
4
3
  get '*' do
5
- items = request.env.map do |k,v|
6
- "<li><strong>#{k}</strong>: #{v}</li>\n"
7
- end
8
- %Q{
9
- <html>
10
- <head>
11
- <title>Sinatra Mongrel2 Test</title>
12
- </head>
13
- <body>
14
- <h1>env</h1>
15
- <ul>
16
- #{items}
17
- </ul>
18
- <hr />
19
- <h1>Params</h1>
20
- #{params.to_json}
21
- </body>
22
- </html>
23
- }
4
+ 'Hello, World!'
5
+ # items = request.env.map do |k,v|
6
+ # "<li><strong>#{k}</strong>: #{v}</li>"
7
+ # end.join("\n")
8
+ # %Q{
9
+ # <html>
10
+ # <head>
11
+ # <title>Sinatra Mongrel2 Test</title>
12
+ # </head>
13
+ # <body>
14
+ # <h1>env</h1>
15
+ # <ul>
16
+ # #{items}
17
+ # </ul>
18
+ # <hr />
19
+ # <h1>Params</h1>
20
+ # #{params}
21
+ # </body>
22
+ # </html>
23
+ # }
24
24
  end
@@ -1,6 +1,8 @@
1
1
  $: << File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
2
+ $:.unshift(File.expand_path('.')) # Ruby 1.9 doesn't have . in the load path...
2
3
 
3
4
  require 'rack/handler/mongrel2'
4
5
  require 'app'
5
6
 
6
- Rack::Handler::Mongrel2.run Sinatra::Application
7
+ Rack::Handler::Mongrel2.run Sinatra::Application, :uuid => 'sinatra', :block => true
8
+ exit(0)
@@ -0,0 +1,25 @@
1
+ darkblog2 = Host(name='localhost', routes={
2
+ '/': Handler(send_spec='tcp://127.0.0.1:9997',
3
+ send_ident='sinatra',
4
+ recv_spec='tcp://127.0.0.1:9996',
5
+ recv_ident='')
6
+ })
7
+
8
+ main = Server(
9
+ uuid='sinatra-example',
10
+ chroot='.',
11
+ access_log='/run/access.log',
12
+ error_log='/run/error.log',
13
+ pid_file='/run/mongrel2.pid',
14
+ default_host='localhost',
15
+ name='main',
16
+ port=8080,
17
+ hosts=[darkblog2]
18
+ )
19
+
20
+
21
+ settings = {
22
+ 'zeromq.threads': 1
23
+ }
24
+
25
+ servers = [main]
data/lib/mongrel2.rb ADDED
@@ -0,0 +1,13 @@
1
+ begin
2
+ require 'yajl'
3
+ rescue LoadError
4
+ begin
5
+ require 'json'
6
+ rescue LoadError
7
+ raise "You need either the yajl or json gems present in order to parse JSON!"
8
+ end
9
+ end
10
+
11
+ module Mongrel2
12
+ JSON = Object.const_defined?('Yajl') ? ::Yajl::Parser : ::JSON
13
+ end
@@ -1,4 +1,4 @@
1
- require 'zmq'
1
+ require 'ffi-rzmq'
2
2
  require 'mongrel2/request'
3
3
  require 'mongrel2/response'
4
4
 
@@ -20,7 +20,8 @@ module Mongrel2
20
20
  end
21
21
 
22
22
  def recv
23
- Request.parse(@reqs.recv)
23
+ msg = @reqs.recv_string(@block ? 0 : ZMQ::NOBLOCK)
24
+ msg.nil? ? nil : Request.parse(msg)
24
25
  end
25
26
 
26
27
  def reply(req, body, status = 200, headers = {})
@@ -1,4 +1,4 @@
1
- require 'yajl'
1
+ require 'mongrel2'
2
2
 
3
3
  module Mongrel2
4
4
  class Request
@@ -10,7 +10,7 @@ module Mongrel2
10
10
  uuid, conn_id, path, rest = msg.split(' ', 4)
11
11
  headers, rest = parse_netstring(rest)
12
12
  body, _ = parse_netstring(rest)
13
- headers = Yajl::Parser.parse(headers)
13
+ headers = Mongrel2::JSON.parse(headers)
14
14
  new(uuid, conn_id, path, headers, body)
15
15
  end
16
16
 
@@ -26,7 +26,7 @@ module Mongrel2
26
26
 
27
27
  def initialize(uuid, conn_id, path, headers, body)
28
28
  @uuid, @conn_id, @path, @headers, @body = uuid, conn_id, path, headers, body
29
- @data = headers['METHOD'] == 'JSON' ? Yajl::Parser.parse(body) : {}
29
+ @data = headers['METHOD'] == 'JSON' ? Mongrel2::JSON.parse(body) : {}
30
30
  end
31
31
 
32
32
  def disconnect?
@@ -54,7 +54,7 @@ module Mongrel2
54
54
  private
55
55
 
56
56
  def send_resp(uuid, conn_id, data)
57
- @resp.send('%s %d:%s, %s' % [uuid, conn_id.size, conn_id, data])
57
+ @resp.send_string('%s %d:%s, %s' % [uuid, conn_id.size, conn_id, data])
58
58
  end
59
59
 
60
60
  def build_http_response(body, status, headers)
@@ -9,25 +9,29 @@ module Rack
9
9
  options = {
10
10
  :recv => 'tcp://127.0.0.1:9997' || ENV['RACK_MONGREL2_RECV'],
11
11
  :send => 'tcp://127.0.0.1:9996' || ENV['RACK_MONGREL2_SEND'],
12
- :uuid => ENV['RACK_MONGREL2_UUID']
12
+ :uuid => ENV['RACK_MONGREL2_UUID'],
13
+ :block => ENV['RACK_MONGREL2_NONBLOCK'].to_s.match(/1|t(?:rue)?|y(?:es)/i).nil?
13
14
  }.merge(options)
15
+
14
16
  raise ArgumentError.new('Must specify an :uuid or set RACK_MONGREL2_UUID') if options[:uuid].nil?
15
17
 
16
- conn = ::Mongrel2::Connection.new(options[:uuid], options[:recv], options[:send])
18
+ conn = ::Mongrel2::Connection.new(options[:uuid], options[:recv], options[:send], options[:block])
17
19
 
18
20
  running = true
19
21
 
20
- # This doesn't work at all for some reason
21
- %w(INT TERM).each do |sig|
22
+ # This doesn't work at all until zmq fixes their shit
23
+ %w(INT TERM KILL).each do |sig|
22
24
  trap(sig) do
25
+ conn.close
23
26
  running = false
24
27
  end
25
28
  end
26
29
 
27
30
  while running
28
31
  req = conn.recv
29
- next if req.disconnect?
30
- return unless running
32
+ sleep(1) and next if req.nil? && options[:block]
33
+ next if req.nil? || req.disconnect?
34
+ return if !running
31
35
 
32
36
  script_name = ENV['RACK_RELATIVE_URL_ROOT'] || req.headers['PATTERN'].split('(', 2).first.gsub(/\/$/, '')
33
37
  env = {
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rack-mongrel2}
8
- s.version = "0.1.1"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Daniel Huckstep"]
@@ -27,8 +27,11 @@ Gem::Specification.new do |s|
27
27
  "Rakefile",
28
28
  "VERSION",
29
29
  "example/mongrel2.conf",
30
+ "example/sinatra/.gitignore",
30
31
  "example/sinatra/app.rb",
31
32
  "example/sinatra/config.ru",
33
+ "example/sinatra/mongrel2.conf",
34
+ "lib/mongrel2.rb",
32
35
  "lib/mongrel2/connection.rb",
33
36
  "lib/mongrel2/request.rb",
34
37
  "lib/mongrel2/response.rb",
@@ -53,21 +56,21 @@ Gem::Specification.new do |s|
53
56
  s.specification_version = 3
54
57
 
55
58
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
56
- s.add_runtime_dependency(%q<yajl-ruby>, ["~> 0.7.8"])
57
- s.add_runtime_dependency(%q<zmq>, ["~> 2.0.9"])
59
+ s.add_runtime_dependency(%q<ffi>, ["~> 0.6.3"])
60
+ s.add_runtime_dependency(%q<ffi-rzmq>, ["~> 0.6.0"])
58
61
  s.add_development_dependency(%q<jeweler>, ["~> 1.4.0"])
59
62
  s.add_development_dependency(%q<rspec>, ["~> 2.0.1"])
60
63
  s.add_development_dependency(%q<yard>, ["~> 0.6.1"])
61
64
  else
62
- s.add_dependency(%q<yajl-ruby>, ["~> 0.7.8"])
63
- s.add_dependency(%q<zmq>, ["~> 2.0.9"])
65
+ s.add_dependency(%q<ffi>, ["~> 0.6.3"])
66
+ s.add_dependency(%q<ffi-rzmq>, ["~> 0.6.0"])
64
67
  s.add_dependency(%q<jeweler>, ["~> 1.4.0"])
65
68
  s.add_dependency(%q<rspec>, ["~> 2.0.1"])
66
69
  s.add_dependency(%q<yard>, ["~> 0.6.1"])
67
70
  end
68
71
  else
69
- s.add_dependency(%q<yajl-ruby>, ["~> 0.7.8"])
70
- s.add_dependency(%q<zmq>, ["~> 2.0.9"])
72
+ s.add_dependency(%q<ffi>, ["~> 0.6.3"])
73
+ s.add_dependency(%q<ffi-rzmq>, ["~> 0.6.0"])
71
74
  s.add_dependency(%q<jeweler>, ["~> 1.4.0"])
72
75
  s.add_dependency(%q<rspec>, ["~> 2.0.1"])
73
76
  s.add_dependency(%q<yard>, ["~> 0.6.1"])
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-mongrel2
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
- - 1
9
- - 1
10
- version: 0.1.1
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Daniel Huckstep
@@ -19,85 +18,80 @@ date: 2010-10-24 00:00:00 -06:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- prerelease: false
23
- type: :runtime
24
- name: yajl-ruby
25
- version_requirements: &id001 !ruby/object:Gem::Requirement
21
+ name: ffi
22
+ requirement: &id001 !ruby/object:Gem::Requirement
26
23
  none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
30
- hash: 19
31
27
  segments:
32
28
  - 0
33
- - 7
34
- - 8
35
- version: 0.7.8
36
- requirement: *id001
37
- - !ruby/object:Gem::Dependency
38
- prerelease: false
29
+ - 6
30
+ - 3
31
+ version: 0.6.3
39
32
  type: :runtime
40
- name: zmq
41
- version_requirements: &id002 !ruby/object:Gem::Requirement
33
+ prerelease: false
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: ffi-rzmq
37
+ requirement: &id002 !ruby/object:Gem::Requirement
42
38
  none: false
43
39
  requirements:
44
40
  - - ~>
45
41
  - !ruby/object:Gem::Version
46
- hash: 29
47
42
  segments:
48
- - 2
49
43
  - 0
50
- - 9
51
- version: 2.0.9
52
- requirement: *id002
53
- - !ruby/object:Gem::Dependency
44
+ - 6
45
+ - 0
46
+ version: 0.6.0
47
+ type: :runtime
54
48
  prerelease: false
55
- type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
56
51
  name: jeweler
57
- version_requirements: &id003 !ruby/object:Gem::Requirement
52
+ requirement: &id003 !ruby/object:Gem::Requirement
58
53
  none: false
59
54
  requirements:
60
55
  - - ~>
61
56
  - !ruby/object:Gem::Version
62
- hash: 7
63
57
  segments:
64
58
  - 1
65
59
  - 4
66
60
  - 0
67
61
  version: 1.4.0
68
- requirement: *id003
69
- - !ruby/object:Gem::Dependency
70
- prerelease: false
71
62
  type: :development
63
+ prerelease: false
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
72
66
  name: rspec
73
- version_requirements: &id004 !ruby/object:Gem::Requirement
67
+ requirement: &id004 !ruby/object:Gem::Requirement
74
68
  none: false
75
69
  requirements:
76
70
  - - ~>
77
71
  - !ruby/object:Gem::Version
78
- hash: 13
79
72
  segments:
80
73
  - 2
81
74
  - 0
82
75
  - 1
83
76
  version: 2.0.1
84
- requirement: *id004
85
- - !ruby/object:Gem::Dependency
86
- prerelease: false
87
77
  type: :development
78
+ prerelease: false
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
88
81
  name: yard
89
- version_requirements: &id005 !ruby/object:Gem::Requirement
82
+ requirement: &id005 !ruby/object:Gem::Requirement
90
83
  none: false
91
84
  requirements:
92
85
  - - ~>
93
86
  - !ruby/object:Gem::Version
94
- hash: 5
95
87
  segments:
96
88
  - 0
97
89
  - 6
98
90
  - 1
99
91
  version: 0.6.1
100
- requirement: *id005
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: *id005
101
95
  description: A Rack handler for the Mongrel2 web server, by Zed Shaw. http://mongrel2.org/
102
96
  email: darkhelmet@darkhelmetlive.com
103
97
  executables: []
@@ -118,8 +112,11 @@ files:
118
112
  - Rakefile
119
113
  - VERSION
120
114
  - example/mongrel2.conf
115
+ - example/sinatra/.gitignore
121
116
  - example/sinatra/app.rb
122
117
  - example/sinatra/config.ru
118
+ - example/sinatra/mongrel2.conf
119
+ - lib/mongrel2.rb
123
120
  - lib/mongrel2/connection.rb
124
121
  - lib/mongrel2/request.rb
125
122
  - lib/mongrel2/response.rb
@@ -142,7 +139,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
142
139
  requirements:
143
140
  - - ">="
144
141
  - !ruby/object:Gem::Version
145
- hash: 3
146
142
  segments:
147
143
  - 0
148
144
  version: "0"
@@ -151,7 +147,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
147
  requirements:
152
148
  - - ">="
153
149
  - !ruby/object:Gem::Version
154
- hash: 3
155
150
  segments:
156
151
  - 0
157
152
  version: "0"