yahns 0.0.1 → 0.0.2
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.
- 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
|