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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Documentation/.gitignore +5 -0
  4. data/Documentation/GNUmakefile +50 -0
  5. data/Documentation/yahns-rackup.txt +152 -0
  6. data/Documentation/yahns.txt +68 -0
  7. data/Documentation/yahns_config.txt +563 -0
  8. data/GIT-VERSION-GEN +1 -1
  9. data/GNUmakefile +14 -7
  10. data/HACKING +56 -0
  11. data/INSTALL +8 -0
  12. data/README +15 -2
  13. data/Rakefile +2 -2
  14. data/bin/yahns +1 -2
  15. data/bin/yahns-rackup +9 -0
  16. data/examples/yahns_multi.conf.rb +14 -4
  17. data/examples/yahns_rack_basic.conf.rb +17 -1
  18. data/extras/README +16 -0
  19. data/extras/autoindex.rb +151 -0
  20. data/extras/exec_cgi.rb +108 -0
  21. data/extras/proxy_pass.rb +210 -0
  22. data/extras/try_gzip_static.rb +208 -0
  23. data/lib/yahns.rb +5 -2
  24. data/lib/yahns/acceptor.rb +64 -22
  25. data/lib/yahns/cap_input.rb +2 -2
  26. data/lib/yahns/{client_expire_portable.rb → client_expire_generic.rb} +12 -11
  27. data/lib/yahns/{client_expire.rb → client_expire_tcpi.rb} +7 -6
  28. data/lib/yahns/config.rb +107 -22
  29. data/lib/yahns/daemon.rb +2 -0
  30. data/lib/yahns/fdmap.rb +28 -9
  31. data/lib/yahns/http_client.rb +123 -37
  32. data/lib/yahns/http_context.rb +21 -3
  33. data/lib/yahns/http_response.rb +80 -19
  34. data/lib/yahns/log.rb +23 -4
  35. data/lib/yahns/queue_epoll.rb +20 -9
  36. data/lib/yahns/queue_quitter.rb +16 -0
  37. data/lib/yahns/queue_quitter_pipe.rb +24 -0
  38. data/lib/yahns/rack.rb +0 -1
  39. data/lib/yahns/rackup_handler.rb +57 -0
  40. data/lib/yahns/server.rb +189 -59
  41. data/lib/yahns/server_mp.rb +43 -35
  42. data/lib/yahns/sigevent_pipe.rb +1 -0
  43. data/lib/yahns/socket_helper.rb +37 -11
  44. data/lib/yahns/stream_file.rb +14 -4
  45. data/lib/yahns/stream_input.rb +13 -7
  46. data/lib/yahns/tcp_server.rb +7 -0
  47. data/lib/yahns/tmpio.rb +10 -3
  48. data/lib/yahns/unix_server.rb +7 -0
  49. data/lib/yahns/wbuf.rb +19 -2
  50. data/lib/yahns/wbuf_common.rb +10 -3
  51. data/lib/yahns/wbuf_str.rb +24 -0
  52. data/lib/yahns/worker.rb +5 -26
  53. data/test/helper.rb +15 -5
  54. data/test/server_helper.rb +37 -1
  55. data/test/test_bin.rb +17 -8
  56. data/test/test_buffer_tmpdir.rb +103 -0
  57. data/test/test_client_expire.rb +71 -35
  58. data/test/test_client_max_body_size.rb +5 -13
  59. data/test/test_config.rb +1 -1
  60. data/test/test_expect_100.rb +176 -0
  61. data/test/test_extras_autoindex.rb +53 -0
  62. data/test/test_extras_exec_cgi.rb +81 -0
  63. data/test/test_extras_exec_cgi.sh +35 -0
  64. data/test/test_extras_try_gzip_static.rb +177 -0
  65. data/test/test_input.rb +128 -0
  66. data/test/test_mt_accept.rb +48 -0
  67. data/test/test_output_buffering.rb +90 -63
  68. data/test/test_rack.rb +1 -1
  69. data/test/test_rack_hijack.rb +2 -6
  70. data/test/test_reopen_logs.rb +2 -8
  71. data/test/test_serve_static.rb +104 -8
  72. data/test/test_server.rb +448 -73
  73. data/test/test_stream_file.rb +1 -1
  74. data/test/test_unix_socket.rb +72 -0
  75. data/test/test_wbuf.rb +20 -17
  76. data/yahns.gemspec +3 -0
  77. metadata +57 -5
@@ -4,7 +4,7 @@ require_relative 'helper'
4
4
  require 'timeout'
5
5
 
6
6
  class TestStreamFile < Testcase
7
- parallelize_me!
7
+ ENV["N"].to_i > 1 and parallelize_me!
8
8
  DevFD = Struct.new(:to_path)
9
9
 
10
10
  def test_stream_file
@@ -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 = UNIXSocket.pair
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 = IO.pipe
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 = UNIXSocket.pair
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
- begin
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 = IO.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 = UNIXSocket.pair
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 = IO.pipe
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.1
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-10-20 00:00:00.000000000 Z
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/client_expire.rb
101
- - lib/yahns/client_expire_portable.rb
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.3
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