yahns 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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