rainbows 3.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. data/.wrongdoc.yml +2 -2
  2. data/Documentation/comparison.haml +6 -6
  3. data/GIT-VERSION-GEN +1 -1
  4. data/GNUmakefile +16 -128
  5. data/README +2 -3
  6. data/Rakefile +3 -3
  7. data/examples/reverse_proxy.ru +9 -0
  8. data/lib/rainbows.rb +14 -6
  9. data/lib/rainbows/base.rb +0 -1
  10. data/lib/rainbows/const.rb +1 -10
  11. data/lib/rainbows/coolio/client.rb +8 -4
  12. data/lib/rainbows/coolio/core.rb +0 -3
  13. data/lib/rainbows/coolio/thread_client.rb +2 -2
  14. data/lib/rainbows/coolio_fiber_spawn.rb +6 -6
  15. data/lib/rainbows/dev_fd_response.rb +16 -9
  16. data/lib/rainbows/epoll.rb +43 -0
  17. data/lib/rainbows/epoll/client.rb +232 -0
  18. data/lib/rainbows/epoll/response_chunk_pipe.rb +18 -0
  19. data/lib/rainbows/epoll/response_pipe.rb +32 -0
  20. data/lib/rainbows/epoll/server.rb +31 -0
  21. data/lib/rainbows/error.rb +1 -9
  22. data/lib/rainbows/ev_core.rb +12 -12
  23. data/lib/rainbows/ev_core/cap_input.rb +1 -1
  24. data/lib/rainbows/event_machine.rb +0 -6
  25. data/lib/rainbows/event_machine/client.rb +3 -3
  26. data/lib/rainbows/event_machine/response_chunk_pipe.rb +5 -7
  27. data/lib/rainbows/event_machine/response_pipe.rb +7 -8
  28. data/lib/rainbows/fiber/base.rb +2 -2
  29. data/lib/rainbows/fiber/io.rb +21 -63
  30. data/lib/rainbows/fiber/io/methods.rb +1 -1
  31. data/lib/rainbows/http_server.rb +4 -4
  32. data/lib/rainbows/join_threads.rb +18 -0
  33. data/lib/rainbows/max_body.rb +2 -1
  34. data/lib/rainbows/max_body/wrapper.rb +1 -1
  35. data/lib/rainbows/never_block/event_machine.rb +2 -2
  36. data/lib/rainbows/process_client.rb +9 -1
  37. data/lib/rainbows/queue_pool.rb +2 -2
  38. data/lib/rainbows/response.rb +1 -1
  39. data/lib/rainbows/rev_fiber_spawn.rb +4 -4
  40. data/lib/rainbows/revactor/client.rb +4 -5
  41. data/lib/rainbows/revactor/proxy.rb +1 -1
  42. data/lib/rainbows/reverse_proxy.rb +189 -0
  43. data/lib/rainbows/reverse_proxy/coolio.rb +61 -0
  44. data/lib/rainbows/reverse_proxy/ev_client.rb +39 -0
  45. data/lib/rainbows/reverse_proxy/event_machine.rb +46 -0
  46. data/lib/rainbows/reverse_proxy/multi_thread.rb +7 -0
  47. data/lib/rainbows/reverse_proxy/synchronous.rb +21 -0
  48. data/lib/rainbows/sendfile.rb +1 -1
  49. data/lib/rainbows/sync_close.rb +2 -2
  50. data/lib/rainbows/thread_pool.rb +1 -1
  51. data/lib/rainbows/writer_thread_pool.rb +1 -1
  52. data/lib/rainbows/xepoll.rb +24 -0
  53. data/lib/rainbows/xepoll/client.rb +45 -0
  54. data/pkg.mk +171 -0
  55. data/rainbows.gemspec +2 -4
  56. data/t/GNUmakefile +4 -0
  57. data/t/bin/content-md5-put +1 -0
  58. data/t/kgio-pipe-response.ru +9 -1
  59. data/t/rack-fiber_pool/app.ru +6 -1
  60. data/t/simple-http_Epoll.ru +9 -0
  61. data/t/simple-http_XEpoll.ru +9 -0
  62. data/t/t0014-config-conflict.sh +5 -3
  63. data/t/t0023-sendfile-byte-range.sh +1 -7
  64. data/t/t0034-pipelined-pipe-response.sh +2 -1
  65. data/t/t0035-kgio-pipe-response.sh +0 -7
  66. data/t/t0041-optional-pool-size.sh +51 -0
  67. data/t/t0050-response-body-close-has-env.sh +2 -1
  68. data/t/t0104-rack-input-limit-tiny.sh +6 -4
  69. data/t/t0105-rack-input-limit-bigger.sh +6 -4
  70. data/t/t0106-rack-input-keepalive.sh +2 -0
  71. data/t/t0107-rack-input-limit-zero.sh +60 -0
  72. data/t/t0113-rewindable-input-false.sh +1 -0
  73. data/t/t0114-rewindable-input-true.sh +1 -0
  74. data/t/t0202-async-response-one-oh.sh +56 -0
  75. data/t/test_isolate.rb +5 -2
  76. metadata +42 -37
  77. data/lib/rainbows/rack_input.rb +0 -17
data/.wrongdoc.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
- cgit_url: http://git.bogomips.org/cgit/rainbows.git
3
- git_url: git://git.bogomips.org/rainbows.git
2
+ cgit_url: http://bogomips.org/rainbows.git
3
+ git_url: git://bogomips.org/rainbows.git
4
4
  rdoc_url: http://rainbows.rubyforge.org/
5
5
  changelog_start: v0.97.0
6
6
  merge_html:
@@ -278,14 +278,14 @@
278
278
  %td.app_pool Yes
279
279
  %td.lock No!
280
280
  %td.async Revactor itself
281
- %td.ws Sunshowers
281
+ %td.ws no
282
282
  %tr.comp_row
283
283
  %td.mod ThreadPool
284
284
  %td.devfd Yes
285
285
  %td.app_pool Yes
286
286
  %td.lock Yes
287
287
  %td.async standard Ruby
288
- %td.ws Sunshowers
288
+ %td.ws no
289
289
  %tr.comp_row
290
290
  %td.mod Coolio
291
291
  %td.devfd Yes
@@ -299,7 +299,7 @@
299
299
  %td.app_pool Yes
300
300
  %td.lock Yes
301
301
  %td.async standard Ruby
302
- %td.ws Sunshowers
302
+ %td.ws no
303
303
  %tr.comp_row
304
304
  %td.mod EventMachine
305
305
  %td.devfd Yes
@@ -320,21 +320,21 @@
320
320
  %td.app_pool Yes
321
321
  %td.lock No!
322
322
  %td.async Rainbows::Fiber::IO, Rainbows.sleep
323
- %td.ws Sunshowers
323
+ %td.ws no
324
324
  %tr.comp_row
325
325
  %td.mod FiberPool
326
326
  %td.devfd Yes
327
327
  %td.app_pool Yes
328
328
  %td.lock No!
329
329
  %td.async Rainbows::Fiber::IO, Rainbows.sleep
330
- %td.ws Sunshowers
330
+ %td.ws no
331
331
  %tr.comp_row
332
332
  %td.mod ActorSpawn
333
333
  %td.devfd no-op
334
334
  %td.app_pool Yes
335
335
  %td.lock Yes
336
336
  %td.async standard Ruby
337
- %td.ws Sunshowers
337
+ %td.ws no
338
338
  %tr.comp_row
339
339
  %td.mod NeverBlock
340
340
  %td.devfd Yes
data/GIT-VERSION-GEN CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
3
  GVF=GIT-VERSION-FILE
4
- DEF_VER=v3.0.0.GIT
4
+ DEF_VER=v3.1.0.GIT
5
5
 
6
6
  LF='
7
7
  '
data/GNUmakefile CHANGED
@@ -1,18 +1,20 @@
1
1
  # use GNU Make to run tests in parallel, and without depending on RubyGems
2
2
  all::
3
- MRI = ruby
4
- RUBY = ruby
5
- RAKE = rake
6
- RSYNC = rsync
3
+ RSYNC_DEST := rubyforge.org:/var/www/gforge-projects/rainbows
4
+ rfproject := rainbows
5
+ rfpackage := rainbows
7
6
 
8
- GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
9
- @./GIT-VERSION-GEN
10
- -include GIT-VERSION-FILE
11
- -include local.mk
12
- ifeq ($(RUBY_VERSION),)
13
- RUBY_VERSION := $(shell $(RUBY) -e 'puts RUBY_VERSION')
7
+ man-rdoc: man html
8
+ $(MAKE) -C Documentation comparison.html
9
+ for i in $(man1_rdoc); do echo > $$i; done
10
+ doc:: man-rdoc
11
+ include pkg.mk
12
+ ifneq ($(VERSION),)
13
+ release::
14
+ $(RAKE) raa_update VERSION=$(VERSION)
15
+ $(RAKE) publish_news VERSION=$(VERSION)
16
+ $(RAKE) fm_update VERSION=$(VERSION)
14
17
  endif
15
- RUBY_ENGINE := $(shell $(RUBY) -e 'puts((RUBY_ENGINE rescue "ruby"))')
16
18
 
17
19
  base_bins := rainbows
18
20
  bins := $(addprefix bin/, $(base_bins))
@@ -20,134 +22,20 @@ man1_rdoc := $(addsuffix _1, $(base_bins))
20
22
  man1_bins := $(addsuffix .1, $(base_bins))
21
23
  man1_paths := $(addprefix man/man1/, $(man1_bins))
22
24
 
23
- install: $(bins)
24
- $(prep_setup_rb)
25
- $(RM) -r .install-tmp
26
- mkdir .install-tmp
27
- cp -p bin/* .install-tmp
28
- $(RUBY) setup.rb all
29
- $(RM) $^
30
- mv .install-tmp/* bin/
31
- $(RM) -r .install-tmp
32
- $(prep_setup_rb)
33
-
34
- setup_rb_files := .config InstalledFiles
35
- prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C $(ext) clean
36
-
37
25
  clean:
38
- -$(MAKE) -C $(ext) clean
39
26
  -$(MAKE) -C Documentation clean
40
- $(RM) $(setup_rb_files) $(t_log)
41
27
 
42
28
  man html:
43
29
  $(MAKE) -C Documentation install-$@
44
30
 
45
- pkg_extra := GIT-VERSION-FILE ChangeLog LATEST NEWS $(man1_paths)
46
-
47
- ChangeLog: GIT-VERSION-FILE .wrongdoc.yml
48
- wrongdoc prepare
49
-
50
- manifest: ChangeLog GIT-VERSION-FILE
51
- $(RM) -f .manifest
52
- $(MAKE) .manifest
53
-
54
- .manifest:
55
- (git ls-files && for i in $@ $(pkg_extra) ; do echo $$i; done) | \
56
- LC_ALL=C sort > $@+
57
- cmp $@+ $@ || mv $@+ $@
58
- $(RM) $@+
31
+ pkg_extra += $(man1_paths)
59
32
 
60
- doc: .document man html .wrongdoc.yml
61
- $(MAKE) -C Documentation comparison.html
62
- for i in $(man1_rdoc); do echo > $$i; done
63
- find bin lib -type f -name '*.rbc' -exec rm -f '{}' ';'
64
- $(RM) -r doc
65
- wrongdoc all
66
- install -m644 COPYING doc/COPYING
67
- install -m644 $(shell grep '^[A-Z]' .document) doc/
68
- install -m644 $(man1_paths) doc/
33
+ doc::
69
34
  cat Documentation/comparison.css >> doc/rdoc.css
70
35
  $(RM) $(man1_rdoc)
71
36
 
72
- publish_doc:
73
- -git set-file-times
74
- $(MAKE) doc
75
- -find doc/images -type f | \
76
- TZ=UTC xargs touch -d '1970-01-01 00:00:02' doc/rdoc.css
77
- chmod 644 $$(find doc -type f)
78
- $(RSYNC) -av doc/ rubyforge.org:/var/www/gforge-projects/rainbows/
79
- git ls-files | xargs touch
80
-
81
- ifneq ($(VERSION),)
82
- rfproject := rainbows
83
- rfpackage := rainbows
84
- pkggem := pkg/$(rfpackage)-$(VERSION).gem
85
- pkgtgz := pkg/$(rfpackage)-$(VERSION).tgz
86
- release_notes := release_notes-$(VERSION)
87
- release_changes := release_changes-$(VERSION)
88
-
89
- release-notes: $(release_notes)
90
- release-changes: $(release_changes)
91
- $(release_changes):
92
- wrongdoc release_changes > $@+
93
- $(VISUAL) $@+ && test -s $@+ && mv $@+ $@
94
- $(release_notes):
95
- wrongdoc release_notes > $@+
96
- $(VISUAL) $@+ && test -s $@+ && mv $@+ $@
97
-
98
- # ensures we're actually on the tagged $(VERSION), only used for release
99
- verify:
100
- test x"$(shell umask)" = x0022
101
- git rev-parse --verify refs/tags/v$(VERSION)^{}
102
- git diff-index --quiet HEAD^0
103
- test `git rev-parse --verify HEAD^0` = \
104
- `git rev-parse --verify refs/tags/v$(VERSION)^{}`
105
-
106
- fix-perms:
107
- -git ls-tree -r HEAD | awk '/^100644 / {print $$NF}' | xargs chmod 644
108
- -git ls-tree -r HEAD | awk '/^100755 / {print $$NF}' | xargs chmod 755
109
-
110
- gem: $(pkggem)
111
-
112
- install-gem: $(pkggem)
113
- gem install $(CURDIR)/$<
114
-
115
- $(pkggem): manifest fix-perms
116
- gem build $(rfpackage).gemspec
117
- mkdir -p pkg
118
- mv $(@F) $@
119
-
120
- $(pkgtgz): distdir = $(basename $@)
121
- $(pkgtgz): HEAD = v$(VERSION)
122
- $(pkgtgz): manifest fix-perms
123
- @test -n "$(distdir)"
124
- $(RM) -r $(distdir)
125
- mkdir -p $(distdir)
126
- tar cf - $$(cat .manifest) | (cd $(distdir) && tar xf -)
127
- cd pkg && tar cf - $(basename $(@F)) | gzip -9 > $(@F)+
128
- mv $@+ $@
129
-
130
- package: $(pkgtgz) $(pkggem)
131
-
132
- release: verify package $(release_notes) $(release_changes)
133
- # make tgz release on RubyForge
134
- rubyforge add_release -f -n $(release_notes) -a $(release_changes) \
135
- $(rfproject) $(rfpackage) $(VERSION) $(pkgtgz)
136
- # push gem to RubyGems.org
137
- gem push $(pkggem)
138
- # in case of gem downloads from RubyForge releases page
139
- -rubyforge add_file \
140
- $(rfproject) $(rfpackage) $(VERSION) $(pkggem)
141
- $(RAKE) raa_update VERSION=$(VERSION)
142
- $(RAKE) fm_update VERSION=$(VERSION)
143
- $(RAKE) publish_news VERSION=$(VERSION)
144
- else
145
- gem install-gem: GIT-VERSION-FILE
146
- $(MAKE) $@ VERSION=$(GIT_VERSION)
147
- endif
148
-
149
37
  all:: test
150
38
  test:
151
39
  $(MAKE) -C t
152
40
 
153
- .PHONY: .FORCE-GIT-VERSION-FILE doc manifest man test html
41
+ .PHONY: man html
data/README CHANGED
@@ -69,7 +69,6 @@ network concurrency.
69
69
 
70
70
  \Rainbows! is mainly designed for the odd things Unicorn sucks at:
71
71
 
72
- * Web Sockets (via {Sunshowers}[http://rainbows.rubyforge.org/sunshowers/])
73
72
  * 3rd-party APIs (to services outside your control/LAN)
74
73
  * OpenID consumers (to providers outside your control/LAN)
75
74
  * Reverse proxy implementations with editing/censoring
@@ -142,13 +141,13 @@ for more details.
142
141
  You can get the latest source via git from the following locations
143
142
  (these versions may not be stable):
144
143
 
145
- git://git.bogomips.org/rainbows.git
144
+ git://bogomips.org/rainbows.git
146
145
  git://repo.or.cz/rainbows.git (mirror)
147
146
 
148
147
  You may browse the code from the web and download the latest snapshot
149
148
  tarballs here:
150
149
 
151
- * http://git.bogomips.org/cgit/rainbows.git (cgit)
150
+ * http://bogomips.org/rainbows.git (cgit)
152
151
  * http://repo.or.cz/w/rainbows.git (gitweb)
153
152
 
154
153
  Inline patches (from "git format-patch") to the mailing list are
data/Rakefile CHANGED
@@ -1,10 +1,10 @@
1
1
  # -*- encoding: binary -*-
2
2
  autoload :Gem, 'rubygems'
3
3
  autoload :Tempfile, 'tempfile'
4
+ require 'wrongdoc'
4
5
 
5
- # most tasks are in the GNUmakefile which offers better parallelism
6
- cgit_url = "http://git.bogomips.org/cgit/rainbows.git"
7
- git_url = 'git://git.bogomips.org/rainbows.git'
6
+ cgit_url = Wrongdoc.config[:cgit_url]
7
+ git_url = Wrongdoc.config[:git_url]
8
8
 
9
9
  desc "read news article from STDIN and post to rubyforge"
10
10
  task :publish_news do
@@ -0,0 +1,9 @@
1
+ # see Rainbows::ReverseProxy RDoc
2
+ cfg = {
3
+ :upstreams => [
4
+ "/tmp/.r.sock",
5
+ "http://bogomips.org/",
6
+ [ "http://10.6.6.6:666/", { :weight => 666 } ],
7
+ ]
8
+ }
9
+ run Rainbows::ReverseProxy.new(cfg)
data/lib/rainbows.rb CHANGED
@@ -9,12 +9,15 @@ Unicorn::SocketHelper::DEFAULTS.merge!({
9
9
  # write(headers)-write(body)-read
10
10
  # because we always write headers and bodies with two calls
11
11
  :tcp_nodelay => true,
12
+
13
+ # we always want to send our headers out ASAP since Rainbows!
14
+ # is designed for apps that could trickle out the body slowly
15
+ :tcp_nopush => false,
12
16
  })
13
17
 
14
18
  module Rainbows
15
19
 
16
20
  O = {} # :nodoc:
17
- class Response416 < RangeError; end
18
21
 
19
22
  # map of numeric file descriptors to IO objects to avoid using IO.new
20
23
  # and potentially causing race conditions when using /dev/fd/
@@ -26,7 +29,6 @@ module Rainbows
26
29
  require 'rainbows/const'
27
30
  require 'rainbows/http_parser'
28
31
  require 'rainbows/http_server'
29
- autoload :RackInput, 'rainbows/rack_input'
30
32
  autoload :Response, 'rainbows/response'
31
33
  autoload :ProcessClient, 'rainbows/process_client'
32
34
  autoload :Client, 'rainbows/client'
@@ -96,10 +98,12 @@ module Rainbows
96
98
  end
97
99
 
98
100
  def self.quit!
99
- @alive = false
100
- Rainbows::HttpParser.quit
101
- @expire ||= Time.now + (@server.timeout * 2.0)
102
- @server.class.const_get(:LISTENERS).map! { |s| s.close rescue nil }
101
+ unless @expire
102
+ @alive = false
103
+ Rainbows::HttpParser.quit
104
+ @expire = Time.now + (@server.timeout * 2.0)
105
+ @server.class.const_get(:LISTENERS).map! { |s| s.close rescue nil }.clear
106
+ end
103
107
  false
104
108
  end
105
109
 
@@ -121,6 +125,8 @@ module Rainbows
121
125
  :CoolioThreadSpawn => 50,
122
126
  :CoolioThreadPool => 50,
123
127
  :CoolioFiberSpawn => 50,
128
+ :Epoll => 50,
129
+ :XEpoll => 50,
124
130
  :EventMachine => 50,
125
131
  :FiberSpawn => 50,
126
132
  :FiberPool => 50,
@@ -137,6 +143,8 @@ module Rainbows
137
143
  autoload :ThreadTimeout, 'rainbows/thread_timeout'
138
144
  autoload :WorkerYield, 'rainbows/worker_yield'
139
145
  autoload :SyncClose, 'rainbows/sync_close'
146
+ autoload :ReverseProxy, 'rainbows/reverse_proxy'
147
+ autoload :JoinThreads, 'rainbows/join_threads'
140
148
  end
141
149
 
142
150
  require 'rainbows/error'
data/lib/rainbows/base.rb CHANGED
@@ -13,7 +13,6 @@ module Rainbows::Base
13
13
  super(worker)
14
14
  Rainbows::Response.setup(self.class)
15
15
  Rainbows::MaxBody.setup
16
- Rainbows::RackInput.setup
17
16
  Rainbows.tick_io = worker.tmp
18
17
 
19
18
  listeners = Rainbows::HttpServer::LISTENERS
@@ -2,7 +2,7 @@
2
2
  # :enddoc:
3
3
  module Rainbows::Const
4
4
 
5
- RAINBOWS_VERSION = '3.0.0'
5
+ RAINBOWS_VERSION = '3.1.0'
6
6
 
7
7
  include Unicorn::Const
8
8
 
@@ -14,15 +14,6 @@ module Rainbows::Const
14
14
  # "rainbows.autochunk" => false,
15
15
  })
16
16
 
17
- # client IO object that supports reading and writing directly
18
- # without filtering it through the HTTP chunk parser.
19
- # Maybe we can get this renamed to "rack.io" if it becomes part
20
- # of the official spec, but for now it is "hack.io"
21
- CLIENT_IO = "hack.io".freeze
22
-
23
- ERROR_413_RESPONSE = "HTTP/1.1 413 Request Entity Too Large\r\n\r\n"
24
- ERROR_416_RESPONSE = "HTTP/1.1 416 Requested Range Not Satisfiable\r\n\r\n"
25
-
26
17
  RACK_INPUT = Unicorn::HttpRequest::RACK_INPUT
27
18
  REMOTE_ADDR = Unicorn::HttpRequest::REMOTE_ADDR
28
19
  end
@@ -2,6 +2,7 @@
2
2
  # :enddoc:
3
3
  class Rainbows::Coolio::Client < Coolio::IO
4
4
  include Rainbows::EvCore
5
+ APP = Rainbows.server.app
5
6
  CONN = Rainbows::Coolio::CONN
6
7
  KATO = Rainbows::Coolio::KATO
7
8
  LOOP = Coolio::Loop.default
@@ -44,7 +45,7 @@ class Rainbows::Coolio::Client < Coolio::IO
44
45
  end
45
46
 
46
47
  def on_readable
47
- buf = @_io.kgio_tryread(16384)
48
+ buf = @_io.kgio_tryread(16384, RBUF)
48
49
  case buf
49
50
  when :wait_readable
50
51
  when nil # eof
@@ -105,10 +106,10 @@ class Rainbows::Coolio::Client < Coolio::IO
105
106
  @state = :headers
106
107
  end
107
108
 
108
- def app_call
109
+ def app_call input
109
110
  KATO.delete(self)
110
111
  disable if enabled?
111
- @env[RACK_INPUT] = @input
112
+ @env[RACK_INPUT] = input
112
113
  @env[REMOTE_ADDR] = @_io.kgio_addr
113
114
  @env[ASYNC_CALLBACK] = method(:write_async_response)
114
115
  status, headers, body = catch(:async) {
@@ -136,12 +137,15 @@ class Rainbows::Coolio::Client < Coolio::IO
136
137
  close if @_write_buffer.empty?
137
138
  when :headers
138
139
  if @buf.empty?
140
+ buf = @_io.kgio_tryread(16384, RBUF) or return close
141
+ String === buf and return on_read(buf)
142
+ # buf == :wait_readable
139
143
  unless enabled?
140
144
  enable
141
145
  KATO[self] = Time.now
142
146
  end
143
147
  else
144
- on_read("")
148
+ on_read(Z)
145
149
  end
146
150
  end
147
151
  rescue => e
@@ -7,14 +7,11 @@ module Rainbows::Coolio::Core
7
7
  # for connections and doesn't die until the parent dies (or is
8
8
  # given a INT, QUIT, or TERM signal)
9
9
  def worker_loop(worker)
10
- Rainbows::Response.setup(Rainbows::Coolio::Client)
11
10
  init_worker_process(worker)
12
11
  mod = Rainbows.const_get(@use)
13
12
  rloop = Rainbows::Coolio::Server.const_set(:LOOP, Coolio::Loop.default)
14
13
  Rainbows::Coolio::Server.const_set(:MAX, @worker_connections)
15
14
  Rainbows::Coolio::Server.const_set(:CL, mod.const_get(:Client))
16
- Rainbows::EvCore.const_set(:APP, Rainbows.server.app)
17
- Rainbows::EvCore.setup
18
15
  Rainbows::Coolio::Heartbeat.new(1, true).attach(rloop)
19
16
  LISTENERS.map! { |s| Rainbows::Coolio::Server.new(s).attach(rloop) }
20
17
  rloop.run
@@ -5,10 +5,10 @@ RUBY_VERSION =~ %r{\A1\.8} and
5
5
  warn "Coolio and Threads do not mix well under Ruby 1.8"
6
6
 
7
7
  class Rainbows::Coolio::ThreadClient < Rainbows::Coolio::Client
8
- def app_call
8
+ def app_call input
9
9
  KATO.delete(self)
10
10
  disable if enabled?
11
- @env[RACK_INPUT] = @input
11
+ @env[RACK_INPUT] = input
12
12
  app_dispatch # must be implemented by subclass
13
13
  end
14
14