rainbows 3.0.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.wrongdoc.yml +2 -2
- data/Documentation/comparison.haml +6 -6
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +16 -128
- data/README +2 -3
- data/Rakefile +3 -3
- data/examples/reverse_proxy.ru +9 -0
- data/lib/rainbows.rb +14 -6
- data/lib/rainbows/base.rb +0 -1
- data/lib/rainbows/const.rb +1 -10
- data/lib/rainbows/coolio/client.rb +8 -4
- data/lib/rainbows/coolio/core.rb +0 -3
- data/lib/rainbows/coolio/thread_client.rb +2 -2
- data/lib/rainbows/coolio_fiber_spawn.rb +6 -6
- data/lib/rainbows/dev_fd_response.rb +16 -9
- data/lib/rainbows/epoll.rb +43 -0
- data/lib/rainbows/epoll/client.rb +232 -0
- data/lib/rainbows/epoll/response_chunk_pipe.rb +18 -0
- data/lib/rainbows/epoll/response_pipe.rb +32 -0
- data/lib/rainbows/epoll/server.rb +31 -0
- data/lib/rainbows/error.rb +1 -9
- data/lib/rainbows/ev_core.rb +12 -12
- data/lib/rainbows/ev_core/cap_input.rb +1 -1
- data/lib/rainbows/event_machine.rb +0 -6
- data/lib/rainbows/event_machine/client.rb +3 -3
- data/lib/rainbows/event_machine/response_chunk_pipe.rb +5 -7
- data/lib/rainbows/event_machine/response_pipe.rb +7 -8
- data/lib/rainbows/fiber/base.rb +2 -2
- data/lib/rainbows/fiber/io.rb +21 -63
- data/lib/rainbows/fiber/io/methods.rb +1 -1
- data/lib/rainbows/http_server.rb +4 -4
- data/lib/rainbows/join_threads.rb +18 -0
- data/lib/rainbows/max_body.rb +2 -1
- data/lib/rainbows/max_body/wrapper.rb +1 -1
- data/lib/rainbows/never_block/event_machine.rb +2 -2
- data/lib/rainbows/process_client.rb +9 -1
- data/lib/rainbows/queue_pool.rb +2 -2
- data/lib/rainbows/response.rb +1 -1
- data/lib/rainbows/rev_fiber_spawn.rb +4 -4
- data/lib/rainbows/revactor/client.rb +4 -5
- data/lib/rainbows/revactor/proxy.rb +1 -1
- data/lib/rainbows/reverse_proxy.rb +189 -0
- data/lib/rainbows/reverse_proxy/coolio.rb +61 -0
- data/lib/rainbows/reverse_proxy/ev_client.rb +39 -0
- data/lib/rainbows/reverse_proxy/event_machine.rb +46 -0
- data/lib/rainbows/reverse_proxy/multi_thread.rb +7 -0
- data/lib/rainbows/reverse_proxy/synchronous.rb +21 -0
- data/lib/rainbows/sendfile.rb +1 -1
- data/lib/rainbows/sync_close.rb +2 -2
- data/lib/rainbows/thread_pool.rb +1 -1
- data/lib/rainbows/writer_thread_pool.rb +1 -1
- data/lib/rainbows/xepoll.rb +24 -0
- data/lib/rainbows/xepoll/client.rb +45 -0
- data/pkg.mk +171 -0
- data/rainbows.gemspec +2 -4
- data/t/GNUmakefile +4 -0
- data/t/bin/content-md5-put +1 -0
- data/t/kgio-pipe-response.ru +9 -1
- data/t/rack-fiber_pool/app.ru +6 -1
- data/t/simple-http_Epoll.ru +9 -0
- data/t/simple-http_XEpoll.ru +9 -0
- data/t/t0014-config-conflict.sh +5 -3
- data/t/t0023-sendfile-byte-range.sh +1 -7
- data/t/t0034-pipelined-pipe-response.sh +2 -1
- data/t/t0035-kgio-pipe-response.sh +0 -7
- data/t/t0041-optional-pool-size.sh +51 -0
- data/t/t0050-response-body-close-has-env.sh +2 -1
- data/t/t0104-rack-input-limit-tiny.sh +6 -4
- data/t/t0105-rack-input-limit-bigger.sh +6 -4
- data/t/t0106-rack-input-keepalive.sh +2 -0
- data/t/t0107-rack-input-limit-zero.sh +60 -0
- data/t/t0113-rewindable-input-false.sh +1 -0
- data/t/t0114-rewindable-input-true.sh +1 -0
- data/t/t0202-async-response-one-oh.sh +56 -0
- data/t/test_isolate.rb +5 -2
- metadata +42 -37
- data/lib/rainbows/rack_input.rb +0 -17
data/.wrongdoc.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
---
|
2
|
-
cgit_url: http://
|
3
|
-
git_url: 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
|
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
|
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
|
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
|
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
|
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
|
337
|
+
%td.ws no
|
338
338
|
%tr.comp_row
|
339
339
|
%td.mod NeverBlock
|
340
340
|
%td.devfd Yes
|
data/GIT-VERSION-GEN
CHANGED
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
|
-
|
4
|
-
|
5
|
-
|
6
|
-
RSYNC = rsync
|
3
|
+
RSYNC_DEST := rubyforge.org:/var/www/gforge-projects/rainbows
|
4
|
+
rfproject := rainbows
|
5
|
+
rfpackage := rainbows
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
-
|
12
|
-
|
13
|
-
|
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
|
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
|
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:
|
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://
|
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://
|
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
|
-
|
6
|
-
|
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
|
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
|
-
@
|
100
|
-
|
101
|
-
|
102
|
-
|
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
data/lib/rainbows/const.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# :enddoc:
|
3
3
|
module Rainbows::Const
|
4
4
|
|
5
|
-
RAINBOWS_VERSION = '3.
|
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] =
|
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
|
data/lib/rainbows/coolio/core.rb
CHANGED
@@ -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] =
|
11
|
+
@env[RACK_INPUT] = input
|
12
12
|
app_dispatch # must be implemented by subclass
|
13
13
|
end
|
14
14
|
|