rainbows 3.0.0 → 3.1.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.
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