rainbows 2.1.0 → 3.0.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 (71) hide show
  1. data/GIT-VERSION-GEN +1 -1
  2. data/GNUmakefile +2 -3
  3. data/Rakefile +5 -2
  4. data/lib/rainbows.rb +72 -54
  5. data/lib/rainbows/base.rb +7 -9
  6. data/lib/rainbows/client.rb +25 -4
  7. data/lib/rainbows/const.rb +1 -1
  8. data/lib/rainbows/coolio.rb +6 -3
  9. data/lib/rainbows/coolio/client.rb +78 -57
  10. data/lib/rainbows/coolio/core.rb +1 -4
  11. data/lib/rainbows/coolio/heartbeat.rb +2 -3
  12. data/lib/rainbows/coolio/master.rb +3 -2
  13. data/lib/rainbows/coolio/{deferred_chunk_response.rb → response_chunk_pipe.rb} +1 -2
  14. data/lib/rainbows/coolio/{deferred_response.rb → response_pipe.rb} +1 -1
  15. data/lib/rainbows/coolio/thread_client.rb +4 -6
  16. data/lib/rainbows/coolio_fiber_spawn.rb +1 -1
  17. data/lib/rainbows/coolio_thread_pool.rb +1 -1
  18. data/lib/rainbows/coolio_thread_pool/watcher.rb +2 -4
  19. data/lib/rainbows/coolio_thread_spawn.rb +1 -1
  20. data/lib/rainbows/dev_fd_response.rb +2 -2
  21. data/lib/rainbows/error.rb +5 -7
  22. data/lib/rainbows/ev_core.rb +20 -7
  23. data/lib/rainbows/event_machine.rb +6 -5
  24. data/lib/rainbows/event_machine/client.rb +46 -53
  25. data/lib/rainbows/event_machine/response_pipe.rb +2 -3
  26. data/lib/rainbows/fiber/base.rb +5 -5
  27. data/lib/rainbows/fiber/body.rb +4 -13
  28. data/lib/rainbows/fiber/coolio/heartbeat.rb +1 -3
  29. data/lib/rainbows/fiber/coolio/server.rb +4 -7
  30. data/lib/rainbows/fiber_pool.rb +1 -1
  31. data/lib/rainbows/fiber_spawn.rb +2 -2
  32. data/lib/rainbows/http_parser.rb +12 -0
  33. data/lib/rainbows/http_server.rb +5 -7
  34. data/lib/rainbows/max_body.rb +2 -2
  35. data/lib/rainbows/never_block/core.rb +1 -1
  36. data/lib/rainbows/process_client.rb +15 -29
  37. data/lib/rainbows/queue_pool.rb +1 -3
  38. data/lib/rainbows/rack_input.rb +3 -3
  39. data/lib/rainbows/response.rb +164 -38
  40. data/lib/rainbows/revactor.rb +5 -65
  41. data/lib/rainbows/revactor/client.rb +60 -0
  42. data/lib/rainbows/revactor/{body.rb → client/methods.rb} +14 -14
  43. data/lib/rainbows/revactor/{tee_socket.rb → client/tee_socket.rb} +1 -1
  44. data/lib/rainbows/sendfile.rb +1 -2
  45. data/lib/rainbows/server_token.rb +1 -1
  46. data/lib/rainbows/thread_pool.rb +9 -9
  47. data/lib/rainbows/thread_spawn.rb +7 -6
  48. data/lib/rainbows/thread_timeout.rb +1 -1
  49. data/lib/rainbows/writer_thread_pool.rb +9 -25
  50. data/lib/rainbows/writer_thread_pool/client.rb +44 -1
  51. data/lib/rainbows/writer_thread_spawn.rb +2 -11
  52. data/lib/rainbows/writer_thread_spawn/client.rb +53 -13
  53. data/rainbows.gemspec +3 -12
  54. data/t/async_chunk_app.ru +62 -0
  55. data/t/byte-range-common.sh +142 -0
  56. data/t/t0022-copy_stream-byte-range.sh +2 -111
  57. data/t/t0023-sendfile-byte-range.sh +2 -32
  58. data/t/t0025-write-on-close.sh +23 -0
  59. data/t/t0040-keepalive_requests-setting.sh +0 -5
  60. data/t/t0402-async-keepalive.sh +146 -0
  61. data/t/t0500-cramp-streaming.sh +2 -0
  62. data/t/t0501-cramp-rainsocket.sh +2 -0
  63. data/t/t9000-rack-app-pool.sh +1 -1
  64. data/t/test_isolate.rb +5 -10
  65. data/t/test_isolate_cramp.rb +26 -0
  66. data/t/write-on-close.ru +11 -0
  67. metadata +33 -30
  68. data/lib/rainbows/coolio/sendfile.rb +0 -17
  69. data/lib/rainbows/response/body.rb +0 -127
  70. data/lib/rainbows/response/range.rb +0 -34
  71. data/lib/rainbows/timed_read.rb +0 -28
@@ -17,7 +17,7 @@ EventMachine|NeverBlock)
17
17
  *) ;;
18
18
  esac
19
19
 
20
- t_plan 7 "sendfile byte range response for $model"
20
+ t_plan 13 "sendfile byte range response for $model"
21
21
 
22
22
  t_begin "setup and startup" && {
23
23
  rtmpfiles out err
@@ -28,36 +28,6 @@ t_begin "setup and startup" && {
28
28
  # can't load Rack::Lint here since it clobbers body#to_path
29
29
  rainbows -E none -D large-file-response.ru -c $unicorn_config
30
30
  rainbows_wait_start
31
- range_head=-r-365
32
- range_tail=-r155-
33
- range_mid=-r200-300
34
31
  }
35
32
 
36
- t_begin "read random blob sha1s" && {
37
- sha1_head=$(curl -sSf $range_head file://random_blob | rsha1)
38
- sha1_tail=$(curl -sSf $range_tail file://random_blob | rsha1)
39
- sha1_mid=$(curl -sSf $range_mid file://random_blob | rsha1)
40
- }
41
-
42
- t_begin "head range matches" && {
43
- sha1="$(curl -sSv $range_head http://$listen/random_blob | rsha1)"
44
- test x"$sha1_head" = x"$sha1"
45
- }
46
-
47
- t_begin "tail range matches" && {
48
- sha1="$(curl -sS $range_tail http://$listen/random_blob | rsha1)"
49
- test x"$sha1_tail" = x"$sha1"
50
- }
51
-
52
- t_begin "mid range matches" && {
53
- sha1="$(curl -sS $range_mid http://$listen/random_blob | rsha1)"
54
- test x"$sha1_mid" = x"$sha1"
55
- }
56
-
57
- t_begin "shutdown server" && {
58
- kill -QUIT $rainbows_pid
59
- }
60
-
61
- t_begin "check stderr" && check_stderr
62
-
63
- t_done
33
+ . ./byte-range-common.sh
@@ -0,0 +1,23 @@
1
+ #!/bin/sh
2
+ . ./test-lib.sh
3
+ t_plan 4 "write-on-close tests for funky response-bodies"
4
+
5
+ t_begin "setup and start" && {
6
+ rainbows_setup
7
+ rainbows -D -c $unicorn_config write-on-close.ru
8
+ rainbows_wait_start
9
+ }
10
+
11
+ t_begin "write-on-close response body succeeds" && {
12
+ test xGoodbye = x"$(curl -sSf --http1.0 http://$listen/)"
13
+ }
14
+
15
+ t_begin "killing succeeds" && {
16
+ kill $rainbows_pid
17
+ }
18
+
19
+ t_begin "check stderr" && {
20
+ check_stderr
21
+ }
22
+
23
+ t_done
@@ -6,11 +6,6 @@ t_begin "setup and start" && {
6
6
  rainbows_setup $model 50 666
7
7
  rtmpfiles curl_out curl_err
8
8
  grep 'keepalive_timeout 666' $unicorn_config
9
- ed -s $unicorn_config <<EOF
10
- ,s/listen.*/&, :tcp_nodelay => true/
11
- w
12
- EOF
13
- grep nodelay $unicorn_config
14
9
  rainbows -E none -D env.ru -c $unicorn_config
15
10
  rainbows_wait_start
16
11
  }
@@ -0,0 +1,146 @@
1
+ #!/bin/sh
2
+ DELAY=${DELAY-1}
3
+ . ./test-lib.sh
4
+ case $model in
5
+ Coolio|NeverBlock|EventMachine) ;;
6
+ *)
7
+ t_info "skipping $T since it's not compatible with $model"
8
+ exit 0
9
+ ;;
10
+ esac
11
+
12
+ t_plan 12 "async_chunk_app test for test for $model"
13
+
14
+ CONFIG_RU=async_chunk_app.ru
15
+
16
+ t_begin "setup and start" && {
17
+ rainbows_setup
18
+ rtmpfiles a b c curl_err expect
19
+
20
+ # this does not does not support Rack::Lint
21
+ rainbows -E none -D $CONFIG_RU -c $unicorn_config
22
+ rainbows_wait_start
23
+
24
+ echo 'Hello World /0' >> $expect
25
+ echo 'Hello World /1' >> $expect
26
+ echo 'Hello World /2' >> $expect
27
+ }
28
+
29
+ t_begin "async.callback supports pipelining" && {
30
+ rm -f $tmp
31
+ t0=$(date +%s)
32
+ (
33
+ cat $fifo > $tmp &
34
+ printf 'GET /0 HTTP/1.1\r\nHost: example.com\r\n\r\n'
35
+ printf 'GET /1 HTTP/1.1\r\nHost: example.com\r\n\r\n'
36
+ printf 'GET /2 HTTP/1.0\r\nHost: example.com\r\n\r\n'
37
+ wait
38
+ ) | socat - TCP:$listen > $fifo
39
+ t1=$(date +%s)
40
+ elapsed=$(( $t1 - $t0 ))
41
+ t_info "elapsed=$elapsed $model.$0 ($t_current)"
42
+ test 3 -eq "$(fgrep 'HTTP/1.1 200 OK' $tmp | wc -l)"
43
+ test 3 -eq "$(grep '^Hello ' $tmp | wc -l)"
44
+ test 3 -eq "$(grep 'World ' $tmp | wc -l)"
45
+ }
46
+
47
+ t_begin "async.callback supports delayed pipelining" && {
48
+ rm -f $tmp
49
+ t0=$(date +%s)
50
+ (
51
+ cat $fifo > $tmp &
52
+ printf 'GET /0 HTTP/1.1\r\nHost: example.com\r\n\r\n'
53
+ sleep 1
54
+ printf 'GET /1 HTTP/1.1\r\nHost: example.com\r\n\r\n'
55
+ sleep 1
56
+ printf 'GET /2 HTTP/1.0\r\nHost: example.com\r\n\r\n'
57
+ wait
58
+ ) | socat - TCP:$listen > $fifo
59
+ t1=$(date +%s)
60
+ elapsed=$(( $t1 - $t0 ))
61
+ t_info "elapsed=$elapsed $model.$0 ($t_current)"
62
+ test 3 -eq "$(fgrep 'HTTP/1.1 200 OK' $tmp | wc -l)"
63
+ test 3 -eq "$(grep '^Hello ' $tmp | wc -l)"
64
+ test 3 -eq "$(grep 'World ' $tmp | wc -l)"
65
+ }
66
+
67
+ t_begin "async.callback supports pipelining with delay $DELAY" && {
68
+ rm -f $tmp
69
+ t0=$(date +%s)
70
+ (
71
+ cat $fifo > $tmp &
72
+ printf 'GET /0 HTTP/1.1\r\nX-Delay: %d\r\n' $DELAY
73
+ printf 'Host: example.com\r\n\r\n'
74
+ printf 'GET /1 HTTP/1.1\r\nX-Delay: %d\r\n' $DELAY
75
+ printf 'Host: example.com\r\n\r\n'
76
+ printf 'GET /2 HTTP/1.0\r\nX-Delay: %d\r\n' $DELAY
77
+ printf 'Host: example.com\r\n\r\n'
78
+ wait
79
+ ) | socat - TCP:$listen > $fifo
80
+ t1=$(date +%s)
81
+ elapsed=$(( $t1 - $t0 ))
82
+ min=$(( $DELAY * 3 ))
83
+ t_info "elapsed=$elapsed $model.$0 ($t_current) min=$min"
84
+ test $elapsed -ge $min
85
+ test 3 -eq "$(fgrep 'HTTP/1.1 200 OK' $tmp | wc -l)"
86
+ test 3 -eq "$(grep '^Hello ' $tmp | wc -l)"
87
+ test 3 -eq "$(grep 'World ' $tmp | wc -l)"
88
+ }
89
+
90
+ t_begin "async.callback supports keepalive" && {
91
+ t0=$(date +%s)
92
+ curl -v --no-buffer -sSf http://$listen/[0-2] > $tmp 2>> $curl_err
93
+ t1=$(date +%s)
94
+ elapsed=$(( $t1 - $t0 ))
95
+ t_info "elapsed=$elapsed $model.$0 ($t_current)"
96
+ cmp $expect $tmp
97
+ test 2 -eq "$(fgrep 'Re-using existing connection!' $curl_err |wc -l)"
98
+ rm -f $curl_err
99
+ }
100
+
101
+ t_begin "async.callback supports keepalive with delay $DELAY" && {
102
+ t0=$(date +%s)
103
+ curl -v --no-buffer -sSf -H "X-Delay: $DELAY" \
104
+ http://$listen/[0-2] > $tmp 2>> $curl_err
105
+ t1=$(date +%s)
106
+ elapsed=$(( $t1 - $t0 ))
107
+ min=$(( $DELAY * 3 ))
108
+ t_info "elapsed=$elapsed $model.$0 ($t_current) min=$min"
109
+ test $elapsed -ge $min
110
+ cmp $expect $tmp
111
+ test 2 -eq "$(fgrep 'Re-using existing connection!' $curl_err |wc -l)"
112
+ rm -f $curl_err
113
+ }
114
+
115
+ t_begin "send async requests off in parallel" && {
116
+ t0=$(date +%s)
117
+ curl --no-buffer -sSf http://$listen/[0-2] > $a 2>> $curl_err &
118
+ curl --no-buffer -sSf http://$listen/[0-2] > $b 2>> $curl_err &
119
+ curl --no-buffer -sSf http://$listen/[0-2] > $c 2>> $curl_err &
120
+ }
121
+
122
+ t_begin "wait for curl terminations" && {
123
+ wait
124
+ t1=$(date +%s)
125
+ elapsed=$(( $t1 - $t0 ))
126
+ t_info "elapsed=$elapsed"
127
+ }
128
+
129
+ t_begin "termination signal sent" && {
130
+ kill $rainbows_pid
131
+ }
132
+
133
+ t_begin "no errors from curl" && {
134
+ test ! -s $curl_err
135
+ }
136
+
137
+ t_begin "no errors in stderr" && check_stderr
138
+
139
+ t_begin "responses match expected" && {
140
+ cmp $expect $a
141
+ cmp $expect $b
142
+ cmp $expect $c
143
+ }
144
+
145
+ t_done
146
+
@@ -7,6 +7,8 @@ EventMachine) ;;
7
7
  exit 0
8
8
  ;;
9
9
  esac
10
+ RUBYLIB=$($RUBY test_isolate_cramp.rb):$RUBYLIB
11
+ export RUBYLIB
10
12
  require_check cramp Cramp::VERSION
11
13
 
12
14
  t_plan 7 "streaming test for Cramp"
@@ -7,6 +7,8 @@ EventMachine) ;;
7
7
  exit 0
8
8
  ;;
9
9
  esac
10
+ RUBYLIB=$($RUBY test_isolate_cramp.rb):$RUBYLIB
11
+ export RUBYLIB
10
12
  require_check cramp Cramp::VERSION
11
13
 
12
14
  t_plan 4 "WebSocket monkey patch validity test for Cramp"
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
  . ./test-lib.sh
3
3
  case $model in
4
- *RevThread*|Thread*|*Fiber*|Revactor|NeverBlock) ;;
4
+ *CoolioThread*|*RevThread*|Thread*|*Fiber*|Revactor|NeverBlock) ;;
5
5
  *)
6
6
  t_info "skipping $T since it's not compatible with $model"
7
7
  exit 0
data/t/test_isolate.rb CHANGED
@@ -13,28 +13,23 @@ opts = {
13
13
  old_out = $stdout.dup
14
14
  $stdout.reopen($stderr)
15
15
 
16
+ lock = File.open(__FILE__, "rb")
17
+ lock.flock(File::LOCK_EX)
16
18
  Isolate.now!(opts) do
17
- gem 'rack', '1.1.0' # Cramp currently requires ~> 1.1.0
18
- gem 'kgio', '2.1.1'
19
- gem 'unicorn', '3.2.1'
20
- gem 'kcar', '0.1.1'
19
+ gem 'unicorn', '3.3.1'
20
+ gem 'kcar', '0.1.2'
21
21
 
22
22
  if engine == "ruby"
23
23
  gem 'sendfile', '1.0.0' # next Rubinius should support this
24
-
25
- gem 'iobuffer', '0.1.3'
26
24
  gem 'cool.io', '1.0.0'
27
25
 
28
26
  gem 'eventmachine', '0.12.10'
29
- gem 'sinatra', '1.0.0'
30
- gem 'async_sinatra', '0.2.1'
27
+ gem 'async_sinatra', '0.4.0'
31
28
 
32
29
  gem 'neverblock', '0.1.6.2'
33
- gem 'cramp', '0.11'
34
30
  end
35
31
 
36
32
  if defined?(::Fiber) && engine == "ruby"
37
- gem 'case', '0.5'
38
33
  gem 'revactor', '0.1.5'
39
34
  gem 'rack-fiber_pool', '0.9.0'
40
35
  end
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'isolate'
3
+ engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'
4
+
5
+ path = "tmp/isolate/#{engine}-#{RUBY_VERSION}/cramp"
6
+ opts = {
7
+ :system => false,
8
+ # we want "ruby-1.8.7" and not "ruby-1.8", so disable multiruby
9
+ :multiruby => false,
10
+ :path => path,
11
+ }
12
+
13
+ old_out = $stdout.dup
14
+ $stdout.reopen($stderr)
15
+
16
+ lock = File.open(__FILE__, "rb")
17
+ lock.flock(File::LOCK_EX)
18
+ Isolate.now!(opts) do
19
+ if engine == "ruby"
20
+ gem 'cramp', '0.11'
21
+ end
22
+ end
23
+
24
+ $stdout.reopen(old_out)
25
+ dirs = Dir["#{path}/gems/*-*/lib"]
26
+ puts dirs.map { |x| File.expand_path(x) }.join(':')
@@ -0,0 +1,11 @@
1
+ class WriteOnClose
2
+ def each(&block)
3
+ @callback = block
4
+ end
5
+
6
+ def close
7
+ @callback.call "7\r\nGoodbye\r\n0\r\n\r\n"
8
+ end
9
+ end
10
+ use Rack::ContentType, "text/plain"
11
+ run(lambda { |_| [ 200, [%w(Transfer-Encoding chunked)], WriteOnClose.new ] })
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rainbows
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 7
5
5
  prerelease: false
6
6
  segments:
7
- - 2
8
- - 1
7
+ - 3
9
8
  - 0
10
- version: 2.1.0
9
+ - 0
10
+ version: 3.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Rainbows! hackers
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-29 00:00:00 +00:00
18
+ date: 2011-01-12 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -41,11 +41,11 @@ dependencies:
41
41
  requirements:
42
42
  - - ~>
43
43
  - !ruby/object:Gem::Version
44
- hash: 3
44
+ hash: 1
45
45
  segments:
46
46
  - 3
47
- - 2
48
- version: "3.2"
47
+ - 3
48
+ version: "3.3"
49
49
  type: :runtime
50
50
  version_requirements: *id002
51
51
  - !ruby/object:Gem::Dependency
@@ -72,12 +72,11 @@ dependencies:
72
72
  requirements:
73
73
  - - ~>
74
74
  - !ruby/object:Gem::Version
75
- hash: 21
75
+ hash: 13
76
76
  segments:
77
77
  - 1
78
- - 0
79
78
  - 1
80
- version: 1.0.1
79
+ version: "1.1"
81
80
  type: :development
82
81
  version_requirements: *id004
83
82
  description: |-
@@ -103,11 +102,10 @@ extra_rdoc_files:
103
102
  - lib/rainbows/coolio.rb
104
103
  - lib/rainbows/coolio/client.rb
105
104
  - lib/rainbows/coolio/core.rb
106
- - lib/rainbows/coolio/deferred_chunk_response.rb
107
- - lib/rainbows/coolio/deferred_response.rb
108
105
  - lib/rainbows/coolio/heartbeat.rb
109
106
  - lib/rainbows/coolio/master.rb
110
- - lib/rainbows/coolio/sendfile.rb
107
+ - lib/rainbows/coolio/response_chunk_pipe.rb
108
+ - lib/rainbows/coolio/response_pipe.rb
111
109
  - lib/rainbows/coolio/server.rb
112
110
  - lib/rainbows/coolio/thread_client.rb
113
111
  - lib/rainbows/coolio_fiber_spawn.rb
@@ -143,6 +141,7 @@ extra_rdoc_files:
143
141
  - lib/rainbows/fiber/queue.rb
144
142
  - lib/rainbows/fiber_pool.rb
145
143
  - lib/rainbows/fiber_spawn.rb
144
+ - lib/rainbows/http_parser.rb
146
145
  - lib/rainbows/http_response.rb
147
146
  - lib/rainbows/http_server.rb
148
147
  - lib/rainbows/max_body.rb
@@ -155,16 +154,15 @@ extra_rdoc_files:
155
154
  - lib/rainbows/queue_pool.rb
156
155
  - lib/rainbows/rack_input.rb
157
156
  - lib/rainbows/response.rb
158
- - lib/rainbows/response/body.rb
159
- - lib/rainbows/response/range.rb
160
157
  - lib/rainbows/rev.rb
161
158
  - lib/rainbows/rev_fiber_spawn.rb
162
159
  - lib/rainbows/rev_thread_pool.rb
163
160
  - lib/rainbows/rev_thread_spawn.rb
164
161
  - lib/rainbows/revactor.rb
165
- - lib/rainbows/revactor/body.rb
162
+ - lib/rainbows/revactor/client.rb
163
+ - lib/rainbows/revactor/client/methods.rb
164
+ - lib/rainbows/revactor/client/tee_socket.rb
166
165
  - lib/rainbows/revactor/proxy.rb
167
- - lib/rainbows/revactor/tee_socket.rb
168
166
  - lib/rainbows/sendfile.rb
169
167
  - lib/rainbows/server_token.rb
170
168
  - lib/rainbows/socket_proxy.rb
@@ -173,7 +171,6 @@ extra_rdoc_files:
173
171
  - lib/rainbows/thread_pool.rb
174
172
  - lib/rainbows/thread_spawn.rb
175
173
  - lib/rainbows/thread_timeout.rb
176
- - lib/rainbows/timed_read.rb
177
174
  - lib/rainbows/worker_yield.rb
178
175
  - lib/rainbows/writer_thread_pool.rb
179
176
  - lib/rainbows/writer_thread_pool/client.rb
@@ -196,6 +193,7 @@ files:
196
193
  - .manifest
197
194
  - .wrongdoc.yml
198
195
  - COPYING
196
+ - ChangeLog
199
197
  - DEPLOY
200
198
  - Documentation/.gitignore
201
199
  - Documentation/GNUmakefile
@@ -203,9 +201,12 @@ files:
203
201
  - Documentation/comparison.haml
204
202
  - Documentation/rainbows.1.txt
205
203
  - FAQ
204
+ - GIT-VERSION-FILE
206
205
  - GIT-VERSION-GEN
207
206
  - GNUmakefile
207
+ - LATEST
208
208
  - LICENSE
209
+ - NEWS
209
210
  - README
210
211
  - Rakefile
211
212
  - SIGNALS
@@ -225,11 +226,10 @@ files:
225
226
  - lib/rainbows/coolio.rb
226
227
  - lib/rainbows/coolio/client.rb
227
228
  - lib/rainbows/coolio/core.rb
228
- - lib/rainbows/coolio/deferred_chunk_response.rb
229
- - lib/rainbows/coolio/deferred_response.rb
230
229
  - lib/rainbows/coolio/heartbeat.rb
231
230
  - lib/rainbows/coolio/master.rb
232
- - lib/rainbows/coolio/sendfile.rb
231
+ - lib/rainbows/coolio/response_chunk_pipe.rb
232
+ - lib/rainbows/coolio/response_pipe.rb
233
233
  - lib/rainbows/coolio/server.rb
234
234
  - lib/rainbows/coolio/thread_client.rb
235
235
  - lib/rainbows/coolio_fiber_spawn.rb
@@ -265,6 +265,7 @@ files:
265
265
  - lib/rainbows/fiber/queue.rb
266
266
  - lib/rainbows/fiber_pool.rb
267
267
  - lib/rainbows/fiber_spawn.rb
268
+ - lib/rainbows/http_parser.rb
268
269
  - lib/rainbows/http_response.rb
269
270
  - lib/rainbows/http_server.rb
270
271
  - lib/rainbows/max_body.rb
@@ -277,16 +278,15 @@ files:
277
278
  - lib/rainbows/queue_pool.rb
278
279
  - lib/rainbows/rack_input.rb
279
280
  - lib/rainbows/response.rb
280
- - lib/rainbows/response/body.rb
281
- - lib/rainbows/response/range.rb
282
281
  - lib/rainbows/rev.rb
283
282
  - lib/rainbows/rev_fiber_spawn.rb
284
283
  - lib/rainbows/rev_thread_pool.rb
285
284
  - lib/rainbows/rev_thread_spawn.rb
286
285
  - lib/rainbows/revactor.rb
287
- - lib/rainbows/revactor/body.rb
286
+ - lib/rainbows/revactor/client.rb
287
+ - lib/rainbows/revactor/client/methods.rb
288
+ - lib/rainbows/revactor/client/tee_socket.rb
288
289
  - lib/rainbows/revactor/proxy.rb
289
- - lib/rainbows/revactor/tee_socket.rb
290
290
  - lib/rainbows/sendfile.rb
291
291
  - lib/rainbows/server_token.rb
292
292
  - lib/rainbows/socket_proxy.rb
@@ -295,13 +295,13 @@ files:
295
295
  - lib/rainbows/thread_pool.rb
296
296
  - lib/rainbows/thread_spawn.rb
297
297
  - lib/rainbows/thread_timeout.rb
298
- - lib/rainbows/timed_read.rb
299
298
  - lib/rainbows/worker_yield.rb
300
299
  - lib/rainbows/writer_thread_pool.rb
301
300
  - lib/rainbows/writer_thread_pool/client.rb
302
301
  - lib/rainbows/writer_thread_spawn.rb
303
302
  - lib/rainbows/writer_thread_spawn/client.rb
304
303
  - local.mk.sample
304
+ - man/man1/rainbows.1
305
305
  - rainbows.gemspec
306
306
  - setup.rb
307
307
  - t/.gitignore
@@ -310,6 +310,7 @@ files:
310
310
  - t/app_deferred.ru
311
311
  - t/async-response-no-autochunk.ru
312
312
  - t/async-response.ru
313
+ - t/async_chunk_app.ru
313
314
  - t/async_examples/README
314
315
  - t/async_examples/async_app.ru
315
316
  - t/async_examples/async_tailer.ru
@@ -318,6 +319,7 @@ files:
318
319
  - t/bin/sha1sum.rb
319
320
  - t/bin/unused_listen
320
321
  - t/bin/utee
322
+ - t/byte-range-common.sh
321
323
  - t/close-has-env.ru
322
324
  - t/close-pipe-response.ru
323
325
  - t/close-pipe-to_path-response.ru
@@ -386,6 +388,7 @@ files:
386
388
  - t/t0022-copy_stream-byte-range.sh
387
389
  - t/t0023-sendfile-byte-range.sh
388
390
  - t/t0024-pipelined-sendfile-response.sh
391
+ - t/t0025-write-on-close.sh
389
392
  - t/t0030-fast-pipe-response.sh
390
393
  - t/t0031-close-pipe-response.sh
391
394
  - t/t0032-close-pipe-to_path-response.sh
@@ -410,6 +413,7 @@ files:
410
413
  - t/t0300-async_sinatra.sh
411
414
  - t/t0400-em-async-app.sh
412
415
  - t/t0401-em-async-tailer.sh
416
+ - t/t0402-async-keepalive.sh
413
417
  - t/t0500-cramp-streaming.sh
414
418
  - t/t0501-cramp-rainsocket.sh
415
419
  - t/t0600-rack-fiber_pool.sh
@@ -426,12 +430,11 @@ files:
426
430
  - t/t9101.ru
427
431
  - t/test-lib.sh
428
432
  - t/test_isolate.rb
433
+ - t/test_isolate_cramp.rb
429
434
  - t/times.ru
430
435
  - t/worker-follows-master-to-death.ru
436
+ - t/write-on-close.ru
431
437
  - vs_Unicorn
432
- - ChangeLog
433
- - LATEST
434
- - NEWS
435
438
  has_rdoc: true
436
439
  homepage: http://rainbows.rubyforge.org/
437
440
  licenses: []