rack-mongrel2 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"