em-rack-mongrel2 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -22,31 +22,40 @@ Download all dependencies.
22
22
  Run Mongrel2.
23
23
 
24
24
  cd example
25
- mkdir -p tmp/pids logs
25
+ mkdir -p tmp/pids logs run
26
26
  m2sh load
27
- m2sh start -name main
27
+ sudo m2sh start -name main
28
28
 
29
- Run a simple sinatra example or
29
+ Run a simple sinatra example,
30
30
 
31
31
  cd sinatra
32
- export RACK_MONGREL2_SEND=tcp://127.0.0.1:9996
33
- export RACK_MONGREL2_RECV=tcp://127.0.0.1:9997
34
- export RACK_MONGREL2_UUID=9539ED88-1B33-4D19-A9F9-283E5BF11AC7
35
- rackup -s Mongrel2
32
+ rackup -s Mongrel2 \
33
+ -O uuid=9539ED88-1B33-4D19-A9F9-283E5BF11AC7 \
34
+ -O send=tcp://127.0.0.1:9996 \
35
+ -O recv=tcp://127.0.0.1:9997
36
36
 
37
- Run an async sinatra example.
37
+ an async sinatra example or
38
38
 
39
39
  cd async_sinatra
40
- export RACK_MONGREL2_SEND=tcp://127.0.0.1:9998
41
- export RACK_MONGREL2_RECV=tcp://127.0.0.1:9999
42
- export RACK_MONGREL2_UUID=AEE66029-E420-42E7-A7C8-6C37BBFC7B9F
43
- rackup -s Mongrel2
40
+ rackup -s Mongrel2 \
41
+ -O uuid=AEE66029-E420-42E7-A7C8-6C37BBFC7B9F \
42
+ -O send=tcp://127.0.0.1:9998 \
43
+ -O recv=tcp://127.0.0.1:9999
44
44
 
45
- ## How to use in your projects (work in progress)
45
+ a big-upload example.
46
+
47
+ cd upload
48
+ rackup -s Mongrel2 \
49
+ -O uuid=51226E47-AE49-4BC8-A9C6-BD7F6827E8A4 \
50
+ -O send=tcp://127.0.0.1:10000 \
51
+ -O recv=tcp://127.0.0.1:10001 \
52
+ -O chroot=..
53
+
54
+ ## How to use in your projects
46
55
 
47
56
  1. Get mongrel2 installed (http://mongrel2.org/wiki/quick_start.html)
48
57
  1. Get your config for mongrel2 setup (see example directory)
49
- 1. Add it to your Gemfile (gem 'em-rack-mongrel2', '~> 0.0.0' # This is not available yet.)
58
+ 1. Add it to your Gemfile (gem 'em-rack-mongrel2')
50
59
  1. 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
51
60
  1. Run Mongrel2
52
61
  1. Run your rack application
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
13
13
  ## If your rubyforge_project name is different, then edit it and comment out
14
14
  ## the sub! line in the Rakefile
15
15
  s.name = 'em-rack-mongrel2'
16
- s.version = '0.1.0'
17
- s.date = '2012-01-13'
16
+ s.version = '0.2.0'
17
+ s.date = '2012-02-12'
18
18
  s.rubyforge_project = 'em-rack-mongrel2'
19
19
 
20
20
  ## Make sure your summary is short. The description may be as long
@@ -42,6 +42,8 @@ Gem::Specification.new do |s|
42
42
  ## that are needed for an end user to actually USE your code.
43
43
  s.add_dependency('ffi', ['~> 1.0.0'])
44
44
  s.add_dependency('em-zeromq', ['~> 0.2.2'])
45
+ s.add_dependency('multi_json', ['~> 1.0.3'])
46
+ s.add_dependency('tnetstring', ['~> 0.3.4'])
45
47
 
46
48
  ## List your development dependencies here. Development dependencies are
47
49
  ## those that are only needed during development
@@ -66,6 +68,8 @@ Gem::Specification.new do |s|
66
68
  example/sinatra/.gitignore
67
69
  example/sinatra/app.rb
68
70
  example/sinatra/config.ru
71
+ example/upload/app.rb
72
+ example/upload/config.ru
69
73
  lib/mongrel2.rb
70
74
  lib/mongrel2/connection.rb
71
75
  lib/mongrel2/request.rb
@@ -81,4 +85,4 @@ Gem::Specification.new do |s|
81
85
  ## Test files will be grabbed from the file list. Make sure the path glob
82
86
  ## matches what you actually use.
83
87
  s.test_files = s.files.select { |path| path =~ /^spec\/.*_spec\.rb/ }
84
- end
88
+ end
@@ -5,8 +5,8 @@ require 'yajl/json_gem'
5
5
  class AsyncExample < Sinatra::Base
6
6
  register Sinatra::Async
7
7
 
8
- aget '*' do
9
- EM.add_timer(5) do
8
+ aget '/' do
9
+ EM.add_timer(1) do
10
10
  body request.env.to_json
11
11
  end
12
12
  end
@@ -1,8 +1,7 @@
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...
1
+ $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
2
+ $LOAD_PATH.unshift File.expand_path('.') # Ruby 1.9 doesn't have . in the load path...
3
3
 
4
4
  require 'rack/handler/mongrel2'
5
5
  require 'app'
6
6
 
7
- Rack::Handler::Mongrel2.run AsyncExample, :uuid => 'sinatra', :block => true
8
- exit(0)
7
+ run AsyncExample
@@ -7,6 +7,10 @@ darkblog2 = Host(name='localhost', routes={
7
7
  send_ident='AEE66029-E420-42E7-A7C8-6C37BBFC7B9F',
8
8
  recv_spec='tcp://127.0.0.1:9998',
9
9
  recv_ident='')
10
+ '/upload/': Handler(send_spec='tcp://127.0.0.1:10001',
11
+ send_ident='51226E47-AE49-4BC8-A9C6-BD7F6827E8A4',
12
+ recv_spec='tcp://127.0.0.1:10000',
13
+ recv_ident='')
10
14
  })
11
15
 
12
16
  main = Server(
@@ -24,7 +28,9 @@ main = Server(
24
28
 
25
29
  settings = {
26
30
  'zeromq.threads': 1,
27
- 'control_port': 'ipc://tmp/mongrel2_control'
31
+ 'control_port': 'ipc://tmp/mongrel2_control',
32
+ 'upload.temp_store': '/tmp/mongrel2.upload.XXXXXX',
33
+ 'limits.content_length': 1024
28
34
  }
29
35
 
30
36
  servers = [main]
@@ -1,7 +1,7 @@
1
1
  require 'sinatra'
2
2
  require 'yajl/json_gem'
3
3
 
4
- get '*' do
5
- sleep(5)
4
+ get '/' do
5
+ sleep 1
6
6
  request.env.to_json
7
- end
7
+ end
@@ -1,8 +1,7 @@
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...
1
+ $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
2
+ $LOAD_PATH.unshift File.expand_path('.') # Ruby 1.9 doesn't have . in the load path...
3
3
 
4
4
  require 'rack/handler/mongrel2'
5
5
  require 'app'
6
6
 
7
- Rack::Handler::Mongrel2.run Sinatra::Application, :uuid => 'sinatra', :block => true
8
- exit(0)
7
+ run Sinatra::Application
@@ -0,0 +1,36 @@
1
+ require 'sinatra'
2
+ require 'yajl/json_gem'
3
+ require 'pp'
4
+
5
+ set(:mongrel2_upload) do |value|
6
+ condition do
7
+ case value
8
+ when :start
9
+ request.env.key?('HTTP_X_MONGREL2_UPLOAD_START')
10
+ when :done
11
+ request.env.key?('HTTP_X_MONGREL2_UPLOAD_DONE')
12
+ else
13
+ false
14
+ end
15
+ end
16
+ end
17
+
18
+ before do
19
+ pp request
20
+ end
21
+
22
+ put '/ok', :mongrel2_upload => :done do
23
+ 'upload done'
24
+ end
25
+
26
+ put '/ok', :mongrel2_upload => :start do
27
+ throw :async # continue the upload
28
+ end
29
+
30
+ put '/ng', :mongrel2_upload => :done do
31
+ 'this will never happen'
32
+ end
33
+
34
+ put '/ng', :mongrel2_upload => :start do
35
+ '' # cancel the upload
36
+ end
@@ -0,0 +1,7 @@
1
+ $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
2
+ $LOAD_PATH.unshift File.expand_path('.') # Ruby 1.9 doesn't have . in the load path...
3
+
4
+ require 'rack/handler/mongrel2'
5
+ require 'app'
6
+
7
+ run Sinatra::Application
@@ -1,18 +1,14 @@
1
- require 'em-zeromq'
2
- require 'mongrel2/request'
3
- require 'mongrel2/response'
4
-
5
1
  module Mongrel2
6
2
  class Connection
7
- attr_reader :received
3
+ attr_reader :chroot
8
4
  @context = nil
9
5
 
10
6
  def self.context
11
- @context ||= EM::ZeroMQ::Context.new(1)
7
+ @context ||= EM::ZeroMQ::Context.new(1)
12
8
  end
13
9
 
14
- def initialize(uuid, sub, pub, app)
15
- @uuid, @sub, @pub, @app = uuid, sub, pub, app
10
+ def initialize(uuid, sub, pub, chroot, app)
11
+ @uuid, @sub, @pub, @chroot, @app = uuid, sub, pub, chroot, app
16
12
 
17
13
  # Connect to receive requests
18
14
  @reqs = self.class.context.connect(ZMQ::PULL, sub, self)
@@ -1,7 +1,3 @@
1
- require 'mongrel2'
2
- require 'rack'
3
- require 'eventmachine'
4
-
5
1
  module Mongrel2
6
2
  class Request
7
3
  attr_reader :headers, :body, :uuid, :conn_id, :path, :connection
@@ -10,25 +6,21 @@ module Mongrel2
10
6
  def parse(msg, connection)
11
7
  # UUID CONN_ID PATH SIZE:HEADERS,SIZE:BODY,
12
8
  uuid, conn_id, path, rest = msg.split(' ', 4)
13
- headers, rest = parse_netstring(rest)
14
- body, _ = parse_netstring(rest)
15
- headers = Mongrel2::JSON.parse(headers)
9
+ headers, rest = TNetstring.parse(rest)
10
+ headers = MultiJson.decode(headers)
11
+ body, _ = TNetstring.parse(rest)
16
12
  new(uuid, conn_id, path, headers, body, connection)
17
13
  end
18
-
19
- def parse_netstring(ns)
20
- # SIZE:HEADERS,
21
-
22
- len, rest = ns.split(':', 2)
23
- len = len.to_i
24
- raise "Netstring did not end in ','" unless rest[len].chr == ','
25
- [rest[0, len], rest[(len + 1)..-1]]
26
- end
27
14
  end
28
15
 
29
16
  def initialize(uuid, conn_id, path, headers, body, connection)
30
- @uuid, @conn_id, @path, @headers, @body = uuid, conn_id, path, headers, body
31
- @data = headers['METHOD'] == 'JSON' ? Mongrel2::JSON.parse(body) : {}
17
+ @uuid, @conn_id, @path, @headers = uuid, conn_id, path, headers
18
+ if (body_path = headers['x-mongrel2-upload-done'])
19
+ @body = File.open(File.join(connection.chroot, body_path))
20
+ else
21
+ @body = StringIO.new(body)
22
+ end
23
+ @data = headers['METHOD'] == 'JSON' ? MultiJson.decode(body) : {}
32
24
  @connection = connection
33
25
  end
34
26
 
@@ -41,18 +33,18 @@ module Mongrel2
41
33
  end
42
34
 
43
35
  def env
36
+ return @env if @env
44
37
  script_name = ENV['RACK_RELATIVE_URL_ROOT'] || headers['PATTERN'].split('(', 2).first.gsub(/\/$/, '')
45
- env = {
38
+ @env = {
46
39
  'rack.version' => Rack::VERSION,
47
40
  'rack.url_scheme' => 'http', # Only HTTP for now
48
- 'rack.input' => StringIO.new(body),
41
+ 'rack.input' => body,
49
42
  'rack.errors' => $stderr,
50
43
  'rack.multithread' => true,
51
44
  'rack.multiprocess' => true,
52
45
  'rack.run_once' => false,
53
46
  'mongrel2.pattern' => headers['PATTERN'],
54
47
  'REQUEST_METHOD' => headers['METHOD'],
55
- 'CONTENT_TYPE' => headers['content-type'],
56
48
  'SCRIPT_NAME' => script_name,
57
49
  'PATH_INFO' => headers['PATH'].gsub(script_name, ''),
58
50
  'QUERY_STRING' => headers['QUERY'] || '',
@@ -62,15 +54,16 @@ module Mongrel2
62
54
  'async.close' => EM::DefaultDeferrable.new
63
55
  }
64
56
 
65
- env['SERVER_NAME'], env['SERVER_PORT'] = headers['host'].split(':', 2)
57
+ @env['SERVER_NAME'], @env['SERVER_PORT'] = headers['host'].split(':', 2)
66
58
  headers.each do |key, val|
67
- unless key =~ /content_(type|length)/i
68
- key = "HTTP_#{key.upcase.gsub('-', '_')}"
59
+ key = key.upcase.gsub('-', '_')
60
+ unless %w[CONTENT_TYPE CONTENT_LENGTH].include?(key)
61
+ key = "HTTP_#{key}"
69
62
  end
70
- env[key] = val
63
+ @env[key] = val
71
64
  end
72
65
 
73
- env
66
+ @env
74
67
  end
75
68
  end
76
69
  end
data/lib/mongrel2.rb CHANGED
@@ -1,14 +1,14 @@
1
- begin
2
- require 'yajl'
3
- rescue LoadError
4
- begin
5
- require 'json'
6
- rescue LoadError
7
- raise "You need either the yajl-ruby or json gems present in order to parse JSON!"
8
- end
9
- end
1
+ require 'rack'
2
+ require 'stringio'
3
+ require 'eventmachine'
4
+ require 'em-zeromq'
5
+ require 'multi_json'
6
+ require 'tnetstring'
7
+
8
+ require 'mongrel2/connection'
9
+ require 'mongrel2/request'
10
+ require 'mongrel2/response'
10
11
 
11
12
  module Mongrel2
12
- JSON = Object.const_defined?('Yajl') ? ::Yajl::Parser : ::JSON
13
- VERSION = '0.1.0'
13
+ VERSION = '0.2.0'
14
14
  end
@@ -1,6 +1,6 @@
1
- require 'mongrel2/connection'
2
- require 'stringio'
3
- require 'eventmachine'
1
+ $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
2
+
3
+ require 'mongrel2'
4
4
 
5
5
  module Rack
6
6
  module Handler
@@ -10,7 +10,8 @@ module Rack
10
10
  options = {
11
11
  :recv => ENV['RACK_MONGREL2_RECV'] || 'tcp://127.0.0.1:9997',
12
12
  :send => ENV['RACK_MONGREL2_SEND'] || 'tcp://127.0.0.1:9996',
13
- :uuid => ENV['RACK_MONGREL2_UUID']
13
+ :uuid => ENV['RACK_MONGREL2_UUID'],
14
+ :chroot => ENV['RACK_MONGREL2_CHROOT'] || '.'
14
15
  }.merge(options)
15
16
 
16
17
  raise ArgumentError.new('Must specify an :uuid or set RACK_MONGREL2_UUID') if options[:uuid].nil?
@@ -18,7 +19,7 @@ module Rack
18
19
  conn = nil
19
20
 
20
21
  EM.run do
21
- conn = ::Mongrel2::Connection.new(options[:uuid], options[:recv], options[:send], app)
22
+ conn = ::Mongrel2::Connection.new(options[:uuid], options[:recv], options[:send], options[:chroot], app)
22
23
 
23
24
  # This doesn't work at all until zmq fixes their shit (in 2.1.x I think), but trap it now anyway.
24
25
  %w(INT TERM KILL).each do |sig|
data/spec/request_spec.rb CHANGED
@@ -1,32 +1,45 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
- require 'mongrel2/request'
3
2
 
4
3
  describe Mongrel2::Request do
5
- it 'should parse a netstring and ignore the contents of the netstring as well as the trailing comma' do
6
- netstring = '9:aoeu:snth,'
7
- result = Mongrel2::Request.parse_netstring(netstring)
8
- result.length.should == 2
9
- result[0].length.should == 9
10
- result[0].should eql('aoeu:snth')
4
+ it "should parse a Mongrel2 message" do
5
+ message = "UUID CON PATH 253:{\"PATH\":\"/\",\"user-agent\":\"curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3\",\"host\":\"localhost:6767\",\"accept\":\"*/*\",\"connection\":\"close\",\"x-forwarded-for\":\"::1\",\"METHOD\":\"GET\",\"VERSION\":\"HTTP/1.1\",\"URI\":\"/\",\"PATTERN\":\"/\"},0:,"
6
+ connection = double('connection')
7
+ uuid = 'UUID'
8
+ conn_id = 'CON'
9
+ path = 'PATH'
10
+ headers = {
11
+ 'PATH' => '/',
12
+ 'user-agent' => 'curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3',
13
+ 'host' => 'localhost:6767',
14
+ 'accept' => '*/*',
15
+ 'connection' => 'close',
16
+ 'x-forwarded-for' => '::1',
17
+ 'METHOD' => 'GET',
18
+ 'VERSION' => 'HTTP/1.1',
19
+ 'URI' => '/',
20
+ 'PATTERN' => '/'
21
+ }
22
+ body = ''
23
+ request = double('request')
24
+ Mongrel2::Request.should_receive(:new).with(uuid, conn_id, path, headers, body, connection).and_return(request)
25
+ r = Mongrel2::Request.parse(message, connection)
26
+ r.should eql(request)
11
27
  end
12
28
 
13
- it 'should parse a netstring made up of multiple netstrings' do
14
- netstring = '9:aoeu:snth,16:aeou snth qwerty,'
15
- result = Mongrel2::Request.parse_netstring(netstring)
16
- result.length.should == 2
17
- result[0].length.should == 9
18
- result[0].should eql('aoeu:snth')
19
- result[1].length.should == 20
20
- result[1].should eql('16:aeou snth qwerty,')
21
- end
22
-
23
- it 'should fail if the netstring does not end in a comma' do
24
- expect { Mongrel2::Request.parse_netstring('3:foo') }.to raise_error(NameError)
25
- end
26
-
27
- it "should parse a Mongrel2 message and have all parts populated" do
28
- netstring = "UUID CON PATH 253:{\"PATH\":\"/\",\"user-agent\":\"curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3\",\"host\":\"localhost:6767\",\"accept\":\"*/*\",\"connection\":\"close\",\"x-forwarded-for\":\"::1\",\"METHOD\":\"GET\",\"VERSION\":\"HTTP/1.1\",\"URI\":\"/\",\"PATTERN\":\"/\"},0:,"
29
- r = Mongrel2::Request.parse(netstring, double())
29
+ it "should have all parts populated" do
30
+ headers = {
31
+ "PATH" => "/",
32
+ "user-agent" => "curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3",
33
+ "host" => "localhost:6767",
34
+ "accept" => "*/*",
35
+ "connection" => "close",
36
+ "x-forwarded-for" => "::1",
37
+ "METHOD" => "GET",
38
+ "VERSION" => "HTTP/1.1",
39
+ "URI" => "/",
40
+ "PATTERN" => "/"
41
+ }
42
+ r = Mongrel2::Request.new('UUID', 'CON', 'PATH', headers, '', double())
30
43
  r.should_not be_nil
31
44
  r.uuid.should eql('UUID')
32
45
  r.conn_id.should eql('CON')
@@ -46,13 +59,55 @@ describe Mongrel2::Request do
46
59
  end
47
60
 
48
61
  it "should return rack env with async callbacks" do
49
- netstring = "UUID CON PATH 253:{\"PATH\":\"/\",\"user-agent\":\"curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3\",\"host\":\"localhost:6767\",\"accept\":\"*/*\",\"connection\":\"close\",\"x-forwarded-for\":\"::1\",\"METHOD\":\"GET\",\"VERSION\":\"HTTP/1.1\",\"URI\":\"/\",\"PATTERN\":\"/\"},0:,"
50
62
  response = double("response")
63
+ uuid = double('uuid')
64
+ conn_id = double('conn_id')
65
+ path = double('path')
66
+ headers = {
67
+ "PATH" => "/",
68
+ "user-agent" => "curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3",
69
+ "host" => "localhost:6767",
70
+ "accept" => "*/*",
71
+ "connection" => "close",
72
+ "x-forwarded-for" => "::1",
73
+ "METHOD" => "GET",
74
+ "VERSION" => "HTTP/1.1",
75
+ "URI" => "/",
76
+ "PATTERN" => "/"
77
+ }
78
+ body = double('body')
51
79
  connection = double("connection")
52
- r = Mongrel2::Request.parse(netstring, connection)
80
+ r = Mongrel2::Request.new(uuid, conn_id, path, headers, body, connection)
53
81
  connection.should_receive(:post_process).with(response, r)
54
82
  env = r.env
55
83
  env['async.callback'].call(response)
56
84
  env['async.close'].should_not be_nil
57
85
  end
86
+
87
+ it "should open an async uploaded file for body" do
88
+ response = double("response")
89
+ uuid = double('uuid')
90
+ conn_id = double('conn_id')
91
+ path = double('path')
92
+ headers = {
93
+ "PATH" => "/",
94
+ "user-agent" => "curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3",
95
+ "host" => "localhost:6767",
96
+ "accept" => "*/*",
97
+ "connection" => "close",
98
+ "x-forwarded-for" => "::1",
99
+ "METHOD" => "GET",
100
+ "VERSION" => "HTTP/1.1",
101
+ "URI" => "/",
102
+ "PATTERN" => "/",
103
+ 'x-mongrel2-upload-done' => 'tmp/upload.file'
104
+ }
105
+ body = double('body')
106
+ connection = double("connection")
107
+ connection.stub(:chroot).and_return('.')
108
+ io = double('io')
109
+ File.should_receive(:open).with('./tmp/upload.file').and_return(io)
110
+ r = Mongrel2::Request.new(uuid, conn_id, path, headers, body, connection)
111
+ r.body.should eql(io)
112
+ end
58
113
  end
@@ -1,5 +1,4 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
- require 'mongrel2/response'
3
2
 
4
3
  describe Mongrel2::Response do
5
4
  before(:each) do
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
- require 'rspec'
3
+ require 'rspec'
4
+ require 'rack/handler/mongrel2'
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-rack-mongrel2
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
4
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
5
+ version: 0.2.0
11
6
  platform: ruby
12
7
  authors:
13
8
  - ICHIBANGASE, Yutaka
@@ -15,7 +10,8 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2012-01-13 00:00:00 Z
13
+ date: 2012-02-12 00:00:00 +09:00
14
+ default_executable:
19
15
  dependencies:
20
16
  - !ruby/object:Gem::Dependency
21
17
  name: ffi
@@ -25,11 +21,6 @@ dependencies:
25
21
  requirements:
26
22
  - - ~>
27
23
  - !ruby/object:Gem::Version
28
- hash: 23
29
- segments:
30
- - 1
31
- - 0
32
- - 0
33
24
  version: 1.0.0
34
25
  type: :runtime
35
26
  version_requirements: *id001
@@ -41,62 +32,64 @@ dependencies:
41
32
  requirements:
42
33
  - - ~>
43
34
  - !ruby/object:Gem::Version
44
- hash: 19
45
- segments:
46
- - 0
47
- - 2
48
- - 2
49
35
  version: 0.2.2
50
36
  type: :runtime
51
37
  version_requirements: *id002
52
38
  - !ruby/object:Gem::Dependency
53
- name: rspec
39
+ name: multi_json
54
40
  prerelease: false
55
41
  requirement: &id003 !ruby/object:Gem::Requirement
56
42
  none: false
57
43
  requirements:
58
44
  - - ~>
59
45
  - !ruby/object:Gem::Version
60
- hash: 3
61
- segments:
62
- - 2
63
- - 3
64
- - 0
46
+ version: 1.0.3
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: tnetstring
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ version: 0.3.4
58
+ type: :runtime
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: rspec
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
65
68
  version: 2.3.0
66
69
  type: :development
67
- version_requirements: *id003
70
+ version_requirements: *id005
68
71
  - !ruby/object:Gem::Dependency
69
72
  name: fuubar
70
73
  prerelease: false
71
- requirement: &id004 !ruby/object:Gem::Requirement
74
+ requirement: &id006 !ruby/object:Gem::Requirement
72
75
  none: false
73
76
  requirements:
74
77
  - - ~>
75
78
  - !ruby/object:Gem::Version
76
- hash: 25
77
- segments:
78
- - 0
79
- - 0
80
- - 3
81
79
  version: 0.0.3
82
80
  type: :development
83
- version_requirements: *id004
81
+ version_requirements: *id006
84
82
  - !ruby/object:Gem::Dependency
85
83
  name: yard
86
84
  prerelease: false
87
- requirement: &id005 !ruby/object:Gem::Requirement
85
+ requirement: &id007 !ruby/object:Gem::Requirement
88
86
  none: false
89
87
  requirements:
90
88
  - - ~>
91
89
  - !ruby/object:Gem::Version
92
- hash: 15
93
- segments:
94
- - 0
95
- - 6
96
- - 4
97
90
  version: 0.6.4
98
91
  type: :development
99
- version_requirements: *id005
92
+ version_requirements: *id007
100
93
  description: A Rack handler for the Mongrel2 web server with EventMachine support, by Zed Shaw. http://mongrel2.org/
101
94
  email: yichiban@gmail.com
102
95
  executables: []
@@ -119,6 +112,8 @@ files:
119
112
  - example/sinatra/.gitignore
120
113
  - example/sinatra/app.rb
121
114
  - example/sinatra/config.ru
115
+ - example/upload/app.rb
116
+ - example/upload/config.ru
122
117
  - lib/mongrel2.rb
123
118
  - lib/mongrel2/connection.rb
124
119
  - lib/mongrel2/request.rb
@@ -128,6 +123,7 @@ files:
128
123
  - spec/response_spec.rb
129
124
  - spec/spec.opts
130
125
  - spec/spec_helper.rb
126
+ has_rdoc: true
131
127
  homepage: http://github.com/ichiban/em-rack-mongrel2
132
128
  licenses: []
133
129
 
@@ -141,23 +137,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
141
137
  requirements:
142
138
  - - ">="
143
139
  - !ruby/object:Gem::Version
144
- hash: 3
145
- segments:
146
- - 0
147
140
  version: "0"
148
141
  required_rubygems_version: !ruby/object:Gem::Requirement
149
142
  none: false
150
143
  requirements:
151
144
  - - ">="
152
145
  - !ruby/object:Gem::Version
153
- hash: 3
154
- segments:
155
- - 0
156
146
  version: "0"
157
147
  requirements: []
158
148
 
159
149
  rubyforge_project: em-rack-mongrel2
160
- rubygems_version: 1.8.11
150
+ rubygems_version: 1.6.2
161
151
  signing_key:
162
152
  specification_version: 2
163
153
  summary: A Mongrel2 Rack handler with EventMachine.