yahns 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Documentation/.gitignore +5 -0
- data/Documentation/GNUmakefile +50 -0
- data/Documentation/yahns-rackup.txt +152 -0
- data/Documentation/yahns.txt +68 -0
- data/Documentation/yahns_config.txt +563 -0
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +14 -7
- data/HACKING +56 -0
- data/INSTALL +8 -0
- data/README +15 -2
- data/Rakefile +2 -2
- data/bin/yahns +1 -2
- data/bin/yahns-rackup +9 -0
- data/examples/yahns_multi.conf.rb +14 -4
- data/examples/yahns_rack_basic.conf.rb +17 -1
- data/extras/README +16 -0
- data/extras/autoindex.rb +151 -0
- data/extras/exec_cgi.rb +108 -0
- data/extras/proxy_pass.rb +210 -0
- data/extras/try_gzip_static.rb +208 -0
- data/lib/yahns.rb +5 -2
- data/lib/yahns/acceptor.rb +64 -22
- data/lib/yahns/cap_input.rb +2 -2
- data/lib/yahns/{client_expire_portable.rb → client_expire_generic.rb} +12 -11
- data/lib/yahns/{client_expire.rb → client_expire_tcpi.rb} +7 -6
- data/lib/yahns/config.rb +107 -22
- data/lib/yahns/daemon.rb +2 -0
- data/lib/yahns/fdmap.rb +28 -9
- data/lib/yahns/http_client.rb +123 -37
- data/lib/yahns/http_context.rb +21 -3
- data/lib/yahns/http_response.rb +80 -19
- data/lib/yahns/log.rb +23 -4
- data/lib/yahns/queue_epoll.rb +20 -9
- data/lib/yahns/queue_quitter.rb +16 -0
- data/lib/yahns/queue_quitter_pipe.rb +24 -0
- data/lib/yahns/rack.rb +0 -1
- data/lib/yahns/rackup_handler.rb +57 -0
- data/lib/yahns/server.rb +189 -59
- data/lib/yahns/server_mp.rb +43 -35
- data/lib/yahns/sigevent_pipe.rb +1 -0
- data/lib/yahns/socket_helper.rb +37 -11
- data/lib/yahns/stream_file.rb +14 -4
- data/lib/yahns/stream_input.rb +13 -7
- data/lib/yahns/tcp_server.rb +7 -0
- data/lib/yahns/tmpio.rb +10 -3
- data/lib/yahns/unix_server.rb +7 -0
- data/lib/yahns/wbuf.rb +19 -2
- data/lib/yahns/wbuf_common.rb +10 -3
- data/lib/yahns/wbuf_str.rb +24 -0
- data/lib/yahns/worker.rb +5 -26
- data/test/helper.rb +15 -5
- data/test/server_helper.rb +37 -1
- data/test/test_bin.rb +17 -8
- data/test/test_buffer_tmpdir.rb +103 -0
- data/test/test_client_expire.rb +71 -35
- data/test/test_client_max_body_size.rb +5 -13
- data/test/test_config.rb +1 -1
- data/test/test_expect_100.rb +176 -0
- data/test/test_extras_autoindex.rb +53 -0
- data/test/test_extras_exec_cgi.rb +81 -0
- data/test/test_extras_exec_cgi.sh +35 -0
- data/test/test_extras_try_gzip_static.rb +177 -0
- data/test/test_input.rb +128 -0
- data/test/test_mt_accept.rb +48 -0
- data/test/test_output_buffering.rb +90 -63
- data/test/test_rack.rb +1 -1
- data/test/test_rack_hijack.rb +2 -6
- data/test/test_reopen_logs.rb +2 -8
- data/test/test_serve_static.rb +104 -8
- data/test/test_server.rb +448 -73
- data/test/test_stream_file.rb +1 -1
- data/test/test_unix_socket.rb +72 -0
- data/test/test_wbuf.rb +20 -17
- data/yahns.gemspec +3 -0
- metadata +57 -5
data/test/test_stream_file.rb
CHANGED
@@ -0,0 +1,72 @@
|
|
1
|
+
# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors
|
2
|
+
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
|
3
|
+
require_relative 'server_helper'
|
4
|
+
|
5
|
+
class TestUnixSocket < Testcase
|
6
|
+
ENV["N"].to_i > 1 and parallelize_me!
|
7
|
+
include ServerHelper
|
8
|
+
alias setup server_helper_setup
|
9
|
+
alias teardown server_helper_teardown
|
10
|
+
|
11
|
+
def unix_socket(path)
|
12
|
+
Timeout.timeout(30) do
|
13
|
+
begin
|
14
|
+
c = UNIXSocket.new(path)
|
15
|
+
c.close_on_exec = true
|
16
|
+
return c
|
17
|
+
rescue Errno::ENOENT
|
18
|
+
sleep 0.01
|
19
|
+
retry
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_socket
|
25
|
+
tmpdir = Dir.mktmpdir
|
26
|
+
err, cfg = @err, Yahns::Config.new
|
27
|
+
sock = "#{tmpdir}/sock"
|
28
|
+
cfg.instance_eval do
|
29
|
+
ru = lambda { |_| [ 200, {'Content-Length'=>'2'}, ['HI'] ] }
|
30
|
+
GTL.synchronize { app(:rack, ru) { listen sock } }
|
31
|
+
stderr_path err.path
|
32
|
+
end
|
33
|
+
pid = mkserver(cfg)
|
34
|
+
c = unix_socket(sock)
|
35
|
+
c.write "GET / HTTP/1.0\r\n\r\n"
|
36
|
+
assert_equal c, c.wait(30)
|
37
|
+
buf = c.read
|
38
|
+
assert_match %r{\AHTTP/1\.1 200 OK\r\n}, buf
|
39
|
+
assert_match %r{\r\n\r\nHI\z}, buf
|
40
|
+
st = File.stat(sock)
|
41
|
+
assert st.world_readable?
|
42
|
+
assert st.world_writable?
|
43
|
+
c.close
|
44
|
+
ensure
|
45
|
+
quit_wait(pid)
|
46
|
+
FileUtils.rm_rf(tmpdir)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_socket_perms
|
50
|
+
tmpdir = Dir.mktmpdir
|
51
|
+
err, cfg = @err, Yahns::Config.new
|
52
|
+
sock = "#{tmpdir}/sock"
|
53
|
+
cfg.instance_eval do
|
54
|
+
ru = lambda { |_| [ 200, {'Content-Length'=>'2'}, ['HI'] ] }
|
55
|
+
GTL.synchronize { app(:rack, ru) { listen sock, umask: 0077 } }
|
56
|
+
stderr_path err.path
|
57
|
+
end
|
58
|
+
pid = mkserver(cfg)
|
59
|
+
c = unix_socket(sock)
|
60
|
+
c.write "GET / HTTP/1.0\r\n\r\n"
|
61
|
+
assert_equal c, c.wait(30)
|
62
|
+
buf = c.read
|
63
|
+
assert_match %r{\AHTTP/1\.1 200 OK\r\n}, buf
|
64
|
+
assert_match %r{\r\n\r\nHI\z}, buf
|
65
|
+
st = File.stat(sock)
|
66
|
+
refute st.world_readable?
|
67
|
+
refute st.world_writable?
|
68
|
+
ensure
|
69
|
+
quit_wait(pid)
|
70
|
+
FileUtils.rm_rf(tmpdir)
|
71
|
+
end
|
72
|
+
end
|
data/test/test_wbuf.rb
CHANGED
@@ -4,19 +4,27 @@ require_relative 'helper'
|
|
4
4
|
require 'timeout'
|
5
5
|
|
6
6
|
class TestWbuf < Testcase
|
7
|
-
parallelize_me!
|
7
|
+
ENV["N"].to_i > 1 and parallelize_me!
|
8
|
+
|
9
|
+
class KgioUS < UNIXSocket
|
10
|
+
include Kgio::SocketMethods
|
11
|
+
end
|
12
|
+
|
13
|
+
def socketpair
|
14
|
+
KgioUS.pair.each { |io| io.close_on_exec = true }
|
15
|
+
end
|
8
16
|
|
9
17
|
def test_wbuf
|
10
18
|
buf = "*" * (16384 * 2)
|
11
19
|
nr = 1000
|
12
20
|
[ true, false ].each do |persist|
|
13
|
-
wbuf = Yahns::Wbuf.new([], persist)
|
14
|
-
a, b =
|
21
|
+
wbuf = Yahns::Wbuf.new([], persist, Dir.tmpdir)
|
22
|
+
a, b = socketpair
|
15
23
|
assert_nil wbuf.wbuf_write(a, "HIHI")
|
16
24
|
assert_equal "HIHI", b.read(4)
|
17
25
|
nr.times { wbuf.wbuf_write(a, buf) }
|
18
26
|
assert_equal :wait_writable, wbuf.wbuf_flush(a)
|
19
|
-
done =
|
27
|
+
done = cloexec_pipe
|
20
28
|
thr = Thread.new do
|
21
29
|
rv = []
|
22
30
|
until rv[-1] == persist
|
@@ -33,7 +41,7 @@ class TestWbuf < Testcase
|
|
33
41
|
if wait
|
34
42
|
r = IO.select([b,done[0]], nil, nil, 5)
|
35
43
|
end
|
36
|
-
b.read_nonblock((rand * 1024) + 666, buf)
|
44
|
+
b.read_nonblock((rand * 1024).to_i + 666, buf)
|
37
45
|
wait = (r[0] & done).empty?
|
38
46
|
rescue Errno::EAGAIN
|
39
47
|
break
|
@@ -50,7 +58,7 @@ class TestWbuf < Testcase
|
|
50
58
|
end
|
51
59
|
|
52
60
|
def test_wbuf_blocked
|
53
|
-
a, b =
|
61
|
+
a, b = socketpair
|
54
62
|
buf = "." * 4096
|
55
63
|
4.times do
|
56
64
|
begin
|
@@ -59,7 +67,7 @@ class TestWbuf < Testcase
|
|
59
67
|
break
|
60
68
|
end while true
|
61
69
|
end
|
62
|
-
wbuf = Yahns::Wbuf.new([], true)
|
70
|
+
wbuf = Yahns::Wbuf.new([], true, Dir.tmpdir)
|
63
71
|
assert_equal :wait_writable, wbuf.wbuf_write(a, buf)
|
64
72
|
assert_equal :wait_writable, wbuf.wbuf_flush(a)
|
65
73
|
|
@@ -74,23 +82,18 @@ class TestWbuf < Testcase
|
|
74
82
|
b.read(nr - 2) if nr > 2
|
75
83
|
assert_equal b, IO.select([b], nil, nil, 5)[0][0]
|
76
84
|
assert_equal "HI", b.read(2)
|
77
|
-
|
78
|
-
wbuf.wbuf_flush(a)
|
79
|
-
assert false
|
80
|
-
rescue => e
|
81
|
-
end
|
82
|
-
assert_match(%r{BUG: EOF on tmpio}, e.message)
|
85
|
+
assert_equal false, wbuf.wbuf_flush(a)
|
83
86
|
ensure
|
84
87
|
a.close
|
85
88
|
b.close
|
86
89
|
end
|
87
90
|
|
88
91
|
def test_wbuf_flush_close
|
89
|
-
pipe =
|
92
|
+
pipe = cloexec_pipe
|
90
93
|
persist = true
|
91
|
-
wbuf = Yahns::Wbuf.new(pipe[0], persist)
|
94
|
+
wbuf = Yahns::Wbuf.new(pipe[0], persist, Dir.tmpdir)
|
92
95
|
refute wbuf.respond_to?(:close) # we don't want this for HttpResponse body
|
93
|
-
sp =
|
96
|
+
sp = socketpair
|
94
97
|
rv = nil
|
95
98
|
|
96
99
|
buf = ("*" * 16384) << "\n"
|
@@ -103,7 +106,7 @@ class TestWbuf < Testcase
|
|
103
106
|
assert_equal thr, thr.join(5)
|
104
107
|
assert_equal :wait_writable, rv
|
105
108
|
|
106
|
-
done =
|
109
|
+
done = cloexec_pipe
|
107
110
|
thr = Thread.new do
|
108
111
|
rv = []
|
109
112
|
until rv[-1] == persist
|
data/yahns.gemspec
CHANGED
@@ -14,6 +14,9 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.add_dependency(%q<sleepy_penguin>, '~> 3.2')
|
15
15
|
s.add_dependency(%q<sendfile>, '~> 1.2.1')
|
16
16
|
s.add_dependency(%q<unicorn>, '~> 4.6.3')
|
17
|
+
|
18
|
+
# minitest is standard in Ruby 2.0
|
19
|
+
s.add_development_dependency(%q<minitest>, '~> 4.3', '~> 5.0')
|
17
20
|
s.homepage = "http://yahns.yhbt.net/README"
|
18
21
|
s.licenses = "GPLv3+"
|
19
22
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yahns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yahns hackers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kgio
|
@@ -66,6 +66,26 @@ dependencies:
|
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 4.6.3
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '4.3'
|
76
|
+
- - ~>
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '5.0'
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '4.3'
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '5.0'
|
69
89
|
description: |-
|
70
90
|
A Free Software, multi-threaded, non-blocking network application server
|
71
91
|
designed for low _idle_ power consumption. It is primarily optimized
|
@@ -76,29 +96,43 @@ description: |-
|
|
76
96
|
email: yahns@yhbt.net
|
77
97
|
executables:
|
78
98
|
- yahns
|
99
|
+
- yahns-rackup
|
79
100
|
extensions: []
|
80
101
|
extra_rdoc_files: []
|
81
102
|
files:
|
82
103
|
- .gitignore
|
83
104
|
- COPYING
|
105
|
+
- Documentation/.gitignore
|
106
|
+
- Documentation/GNUmakefile
|
107
|
+
- Documentation/yahns-rackup.txt
|
108
|
+
- Documentation/yahns.txt
|
109
|
+
- Documentation/yahns_config.txt
|
84
110
|
- GIT-VERSION-FILE
|
85
111
|
- GIT-VERSION-GEN
|
86
112
|
- GNUmakefile
|
113
|
+
- HACKING
|
114
|
+
- INSTALL
|
87
115
|
- NEWS
|
88
116
|
- README
|
89
117
|
- Rakefile
|
90
118
|
- bin/yahns
|
119
|
+
- bin/yahns-rackup
|
91
120
|
- examples/README
|
92
121
|
- examples/init.sh
|
93
122
|
- examples/logger_mp_safe.rb
|
94
123
|
- examples/logrotate.conf
|
95
124
|
- examples/yahns_multi.conf.rb
|
96
125
|
- examples/yahns_rack_basic.conf.rb
|
126
|
+
- extras/README
|
127
|
+
- extras/autoindex.rb
|
128
|
+
- extras/exec_cgi.rb
|
129
|
+
- extras/proxy_pass.rb
|
130
|
+
- extras/try_gzip_static.rb
|
97
131
|
- lib/yahns.rb
|
98
132
|
- lib/yahns/acceptor.rb
|
99
133
|
- lib/yahns/cap_input.rb
|
100
|
-
- lib/yahns/
|
101
|
-
- lib/yahns/
|
134
|
+
- lib/yahns/client_expire_generic.rb
|
135
|
+
- lib/yahns/client_expire_tcpi.rb
|
102
136
|
- lib/yahns/config.rb
|
103
137
|
- lib/yahns/daemon.rb
|
104
138
|
- lib/yahns/fdmap.rb
|
@@ -112,7 +146,10 @@ files:
|
|
112
146
|
- lib/yahns/queue.rb
|
113
147
|
- lib/yahns/queue_egg.rb
|
114
148
|
- lib/yahns/queue_epoll.rb
|
149
|
+
- lib/yahns/queue_quitter.rb
|
150
|
+
- lib/yahns/queue_quitter_pipe.rb
|
115
151
|
- lib/yahns/rack.rb
|
152
|
+
- lib/yahns/rackup_handler.rb
|
116
153
|
- lib/yahns/server.rb
|
117
154
|
- lib/yahns/server_mp.rb
|
118
155
|
- lib/yahns/sigevent.rb
|
@@ -121,20 +158,34 @@ files:
|
|
121
158
|
- lib/yahns/socket_helper.rb
|
122
159
|
- lib/yahns/stream_file.rb
|
123
160
|
- lib/yahns/stream_input.rb
|
161
|
+
- lib/yahns/tcp_server.rb
|
124
162
|
- lib/yahns/tee_input.rb
|
125
163
|
- lib/yahns/tmpio.rb
|
164
|
+
- lib/yahns/unix_server.rb
|
126
165
|
- lib/yahns/version.rb
|
127
166
|
- lib/yahns/wbuf.rb
|
128
167
|
- lib/yahns/wbuf_common.rb
|
168
|
+
- lib/yahns/wbuf_str.rb
|
129
169
|
- lib/yahns/worker.rb
|
170
|
+
- man/yahns-rackup.1
|
171
|
+
- man/yahns.1
|
172
|
+
- man/yahns_config.5
|
130
173
|
- test/covshow.rb
|
131
174
|
- test/helper.rb
|
132
175
|
- test/server_helper.rb
|
133
176
|
- test/test_bin.rb
|
177
|
+
- test/test_buffer_tmpdir.rb
|
134
178
|
- test/test_client_expire.rb
|
135
179
|
- test/test_client_max_body_size.rb
|
136
180
|
- test/test_config.rb
|
181
|
+
- test/test_expect_100.rb
|
182
|
+
- test/test_extras_autoindex.rb
|
183
|
+
- test/test_extras_exec_cgi.rb
|
184
|
+
- test/test_extras_exec_cgi.sh
|
185
|
+
- test/test_extras_try_gzip_static.rb
|
137
186
|
- test/test_fdmap.rb
|
187
|
+
- test/test_input.rb
|
188
|
+
- test/test_mt_accept.rb
|
138
189
|
- test/test_output_buffering.rb
|
139
190
|
- test/test_rack.rb
|
140
191
|
- test/test_rack_hijack.rb
|
@@ -142,6 +193,7 @@ files:
|
|
142
193
|
- test/test_serve_static.rb
|
143
194
|
- test/test_server.rb
|
144
195
|
- test/test_stream_file.rb
|
196
|
+
- test/test_unix_socket.rb
|
145
197
|
- test/test_wbuf.rb
|
146
198
|
- yahns.gemspec
|
147
199
|
homepage: http://yahns.yhbt.net/README
|
@@ -164,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
216
|
version: '0'
|
165
217
|
requirements: []
|
166
218
|
rubyforge_project:
|
167
|
-
rubygems_version: 2.1.
|
219
|
+
rubygems_version: 2.1.9
|
168
220
|
signing_key:
|
169
221
|
specification_version: 4
|
170
222
|
summary: sleepy, multi-threaded, non-blocking application server
|