unicorn 4.8.0 → 6.1.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.
- checksums.yaml +7 -0
- data/.document +0 -1
- data/.gitattributes +5 -0
- data/.gitignore +2 -2
- data/.manifest +17 -21
- data/.olddoc.yml +25 -0
- data/Application_Timeouts +7 -7
- data/CONTRIBUTORS +6 -2
- data/DESIGN +2 -4
- data/Documentation/.gitignore +1 -3
- data/Documentation/unicorn.1 +222 -0
- data/Documentation/unicorn_rails.1 +207 -0
- data/FAQ +23 -6
- data/GIT-VERSION-FILE +1 -1
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +138 -92
- data/HACKING +10 -32
- data/ISSUES +80 -19
- data/KNOWN_ISSUES +18 -18
- data/LATEST +23 -27
- data/LICENSE +2 -2
- data/Links +24 -22
- data/NEWS +823 -0
- data/PHILOSOPHY +0 -6
- data/README +49 -48
- data/Rakefile +0 -44
- data/SIGNALS +2 -2
- data/Sandbox +11 -10
- data/TODO +0 -2
- data/TUNING +30 -9
- data/archive/.gitignore +3 -0
- data/archive/slrnpull.conf +4 -0
- data/bin/unicorn +4 -2
- data/bin/unicorn_rails +3 -3
- data/examples/big_app_gc.rb +1 -1
- data/examples/init.sh +36 -8
- data/examples/logrotate.conf +17 -2
- data/examples/nginx.conf +14 -14
- data/examples/unicorn.conf.minimal.rb +2 -2
- data/examples/unicorn.conf.rb +14 -6
- data/examples/unicorn.socket +11 -0
- data/examples/unicorn@.service +40 -0
- data/ext/unicorn_http/c_util.h +5 -13
- data/ext/unicorn_http/common_field_optimization.h +22 -5
- data/ext/unicorn_http/epollexclusive.h +124 -0
- data/ext/unicorn_http/ext_help.h +0 -44
- data/ext/unicorn_http/extconf.rb +32 -5
- data/ext/unicorn_http/global_variables.h +2 -2
- data/ext/unicorn_http/httpdate.c +3 -2
- data/ext/unicorn_http/unicorn_http.c +926 -638
- data/ext/unicorn_http/unicorn_http.rl +159 -170
- data/ext/unicorn_http/unicorn_http_common.rl +1 -1
- data/lib/unicorn/configurator.rb +110 -46
- data/lib/unicorn/const.rb +2 -25
- data/lib/unicorn/http_request.rb +110 -31
- data/lib/unicorn/http_response.rb +17 -31
- data/lib/unicorn/http_server.rb +272 -180
- data/lib/unicorn/launcher.rb +1 -1
- data/lib/unicorn/oob_gc.rb +16 -6
- data/lib/unicorn/select_waiter.rb +6 -0
- data/lib/unicorn/socket_helper.rb +58 -78
- data/lib/unicorn/stream_input.rb +8 -7
- data/lib/unicorn/tee_input.rb +16 -11
- data/lib/unicorn/tmpio.rb +10 -6
- data/lib/unicorn/util.rb +5 -4
- data/lib/unicorn/version.rb +1 -1
- data/lib/unicorn/worker.rb +36 -23
- data/lib/unicorn.rb +64 -44
- data/man/man1/unicorn.1 +124 -122
- data/man/man1/unicorn_rails.1 +113 -127
- data/t/.gitignore +0 -1
- data/t/GNUmakefile +3 -80
- data/t/README +4 -4
- data/t/t0002-parser-error.sh +3 -3
- data/t/t0011-active-unix-socket.sh +1 -1
- data/t/t0012-reload-empty-config.sh +2 -1
- data/t/t0301-no-default-middleware-ignored-in-config.sh +25 -0
- data/t/t0301.ru +13 -0
- data/t/test-lib.sh +4 -3
- data/test/benchmark/README +14 -4
- data/test/benchmark/ddstream.ru +50 -0
- data/test/benchmark/readinput.ru +40 -0
- data/test/benchmark/uconnect.perl +66 -0
- data/test/exec/test_exec.rb +74 -20
- data/test/test_helper.rb +42 -33
- data/test/unit/test_ccc.rb +91 -0
- data/test/unit/test_droplet.rb +1 -1
- data/test/unit/test_http_parser.rb +49 -19
- data/test/unit/test_http_parser_ng.rb +98 -115
- data/test/unit/test_request.rb +11 -11
- data/test/unit/test_response.rb +31 -19
- data/test/unit/test_server.rb +89 -15
- data/test/unit/test_signals.rb +9 -9
- data/test/unit/test_socket_helper.rb +16 -12
- data/test/unit/test_tee_input.rb +10 -0
- data/test/unit/test_upload.rb +10 -15
- data/test/unit/test_util.rb +32 -6
- data/test/unit/test_waiter.rb +34 -0
- data/unicorn.gemspec +28 -23
- data/unicorn_1 +1 -0
- data/unicorn_rails_1 +1 -0
- metadata +68 -134
- data/.wrongdoc.yml +0 -10
- data/ChangeLog +0 -4861
- data/Documentation/GNUmakefile +0 -30
- data/Documentation/unicorn.1.txt +0 -178
- data/Documentation/unicorn_rails.1.txt +0 -175
- data/examples/git.ru +0 -13
- data/lib/unicorn/app/exec_cgi.rb +0 -154
- data/lib/unicorn/app/inetd.rb +0 -109
- data/lib/unicorn/ssl_client.rb +0 -11
- data/lib/unicorn/ssl_configurator.rb +0 -104
- data/lib/unicorn/ssl_server.rb +0 -42
- data/local.mk.sample +0 -59
- data/script/isolate_for_tests +0 -32
- data/t/hijack.ru +0 -42
- data/t/sslgen.sh +0 -71
- data/t/t0016-trust-x-forwarded-false.sh +0 -30
- data/t/t0017-trust-x-forwarded-true.sh +0 -30
- data/t/t0200-rack-hijack.sh +0 -27
- data/t/t0600-https-server-basic.sh +0 -48
- data/test/unit/test_http_parser_xftrust.rb +0 -38
- data/test/unit/test_sni_hostnames.rb +0 -47
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- encoding: binary -*-
|
|
2
2
|
|
|
3
|
-
require 'test/test_helper'
|
|
3
|
+
require './test/test_helper'
|
|
4
4
|
require 'tempfile'
|
|
5
5
|
|
|
6
6
|
class TestSocketHelper < Test::Unit::TestCase
|
|
@@ -57,8 +57,8 @@ class TestSocketHelper < Test::Unit::TestCase
|
|
|
57
57
|
assert File.readable?(@unix_listener_path), "not readable"
|
|
58
58
|
assert File.writable?(@unix_listener_path), "not writable"
|
|
59
59
|
assert_equal 0777, File.umask
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
ensure
|
|
61
|
+
File.umask(old_umask)
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
def test_bind_listen_unix_umask
|
|
@@ -71,8 +71,8 @@ class TestSocketHelper < Test::Unit::TestCase
|
|
|
71
71
|
assert_equal @unix_listener_path, sock_name(@unix_listener)
|
|
72
72
|
assert_equal 0140700, File.stat(@unix_listener_path).mode
|
|
73
73
|
assert_equal 0777, File.umask
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
ensure
|
|
75
|
+
File.umask(old_umask)
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def test_bind_listen_unix_idempotent
|
|
@@ -116,7 +116,7 @@ class TestSocketHelper < Test::Unit::TestCase
|
|
|
116
116
|
client.syswrite('abcde')
|
|
117
117
|
exit 0
|
|
118
118
|
end
|
|
119
|
-
s =
|
|
119
|
+
s = unix_socket(@unix_listener_path)
|
|
120
120
|
IO.select([s])
|
|
121
121
|
assert_equal 'abcde', s.sysread(5)
|
|
122
122
|
pid, status = Process.waitpid2(pid)
|
|
@@ -150,28 +150,31 @@ class TestSocketHelper < Test::Unit::TestCase
|
|
|
150
150
|
end
|
|
151
151
|
|
|
152
152
|
def test_tcp_defer_accept_default
|
|
153
|
+
return unless defined?(TCP_DEFER_ACCEPT)
|
|
153
154
|
port = unused_port @test_addr
|
|
154
155
|
name = "#@test_addr:#{port}"
|
|
155
156
|
sock = bind_listen(name)
|
|
156
157
|
cur = sock.getsockopt(Socket::SOL_TCP, TCP_DEFER_ACCEPT).unpack('i')[0]
|
|
157
158
|
assert cur >= 1
|
|
158
|
-
end
|
|
159
|
+
end
|
|
159
160
|
|
|
160
161
|
def test_tcp_defer_accept_disable
|
|
162
|
+
return unless defined?(TCP_DEFER_ACCEPT)
|
|
161
163
|
port = unused_port @test_addr
|
|
162
164
|
name = "#@test_addr:#{port}"
|
|
163
165
|
sock = bind_listen(name, :tcp_defer_accept => false)
|
|
164
166
|
cur = sock.getsockopt(Socket::SOL_TCP, TCP_DEFER_ACCEPT).unpack('i')[0]
|
|
165
167
|
assert_equal 0, cur
|
|
166
|
-
end
|
|
168
|
+
end
|
|
167
169
|
|
|
168
170
|
def test_tcp_defer_accept_nr
|
|
171
|
+
return unless defined?(TCP_DEFER_ACCEPT)
|
|
169
172
|
port = unused_port @test_addr
|
|
170
173
|
name = "#@test_addr:#{port}"
|
|
171
174
|
sock = bind_listen(name, :tcp_defer_accept => 60)
|
|
172
175
|
cur = sock.getsockopt(Socket::SOL_TCP, TCP_DEFER_ACCEPT).unpack('i')[0]
|
|
173
176
|
assert cur > 1
|
|
174
|
-
end
|
|
177
|
+
end
|
|
175
178
|
|
|
176
179
|
def test_ipv6only
|
|
177
180
|
port = begin
|
|
@@ -182,14 +185,15 @@ class TestSocketHelper < Test::Unit::TestCase
|
|
|
182
185
|
sock = bind_listen "[#@test6_addr]:#{port}", :ipv6only => true
|
|
183
186
|
cur = sock.getsockopt(:IPPROTO_IPV6, :IPV6_V6ONLY).unpack('i')[0]
|
|
184
187
|
assert_equal 1, cur
|
|
185
|
-
|
|
186
|
-
end
|
|
188
|
+
rescue Errno::EAFNOSUPPORT
|
|
189
|
+
end
|
|
187
190
|
|
|
188
191
|
def test_reuseport
|
|
192
|
+
return unless defined?(Socket::SO_REUSEPORT)
|
|
189
193
|
port = unused_port @test_addr
|
|
190
194
|
name = "#@test_addr:#{port}"
|
|
191
195
|
sock = bind_listen(name, :reuseport => true)
|
|
192
|
-
cur = sock.getsockopt(
|
|
196
|
+
cur = sock.getsockopt(:SOL_SOCKET, :SO_REUSEPORT).int
|
|
193
197
|
assert_operator cur, :>, 0
|
|
194
198
|
rescue Errno::ENOPROTOOPT
|
|
195
199
|
# kernel does not support SO_REUSEPORT (older Linux)
|
data/test/unit/test_tee_input.rb
CHANGED
|
@@ -29,6 +29,13 @@ class TestTeeInput < Test::Unit::TestCase
|
|
|
29
29
|
end while true
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
+
def check_tempfiles
|
|
33
|
+
tmp = @parser.env["rack.tempfiles"]
|
|
34
|
+
assert_instance_of Array, tmp
|
|
35
|
+
assert_operator tmp.size, :>=, 1
|
|
36
|
+
assert_instance_of Unicorn::TmpIO, tmp[0]
|
|
37
|
+
end
|
|
38
|
+
|
|
32
39
|
def test_gets_long
|
|
33
40
|
r = init_request("hello", 5 + (4096 * 4 * 3) + "#$/foo#$/".size)
|
|
34
41
|
ti = TeeInput.new(@rd, r)
|
|
@@ -106,6 +113,7 @@ class TestTeeInput < Test::Unit::TestCase
|
|
|
106
113
|
assert_kind_of File, ti.tmp
|
|
107
114
|
assert_equal 0, ti.tmp.pos
|
|
108
115
|
assert_equal Unicorn::Const::MAX_BODY + 1, ti.size
|
|
116
|
+
check_tempfiles
|
|
109
117
|
end
|
|
110
118
|
|
|
111
119
|
def test_read_in_full_if_content_length
|
|
@@ -148,6 +156,7 @@ class TestTeeInput < Test::Unit::TestCase
|
|
|
148
156
|
assert_nil ti.read(1)
|
|
149
157
|
pid, status = Process.waitpid2(pid)
|
|
150
158
|
assert status.success?
|
|
159
|
+
check_tempfiles
|
|
151
160
|
end
|
|
152
161
|
|
|
153
162
|
def test_chunked
|
|
@@ -183,6 +192,7 @@ class TestTeeInput < Test::Unit::TestCase
|
|
|
183
192
|
status = nil
|
|
184
193
|
pid, status = Process.waitpid2(pid)
|
|
185
194
|
assert status.success?
|
|
195
|
+
check_tempfiles
|
|
186
196
|
end
|
|
187
197
|
|
|
188
198
|
def test_chunked_ping_pong
|
data/test/unit/test_upload.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# -*- encoding: binary -*-
|
|
2
2
|
|
|
3
3
|
# Copyright (c) 2009 Eric Wong
|
|
4
|
-
require 'test/test_helper'
|
|
4
|
+
require './test/test_helper'
|
|
5
5
|
require 'digest/md5'
|
|
6
6
|
|
|
7
7
|
include Unicorn
|
|
@@ -60,7 +60,7 @@ class UploadTest < Test::Unit::TestCase
|
|
|
60
60
|
|
|
61
61
|
def test_put
|
|
62
62
|
start_server(@sha1_app)
|
|
63
|
-
sock =
|
|
63
|
+
sock = tcp_socket(@addr, @port)
|
|
64
64
|
sock.syswrite("PUT / HTTP/1.0\r\nContent-Length: #{length}\r\n\r\n")
|
|
65
65
|
@count.times do |i|
|
|
66
66
|
buf = @random.sysread(@bs)
|
|
@@ -77,7 +77,7 @@ class UploadTest < Test::Unit::TestCase
|
|
|
77
77
|
def test_put_content_md5
|
|
78
78
|
md5 = Digest::MD5.new
|
|
79
79
|
start_server(@sha1_app)
|
|
80
|
-
sock =
|
|
80
|
+
sock = tcp_socket(@addr, @port)
|
|
81
81
|
sock.syswrite("PUT / HTTP/1.0\r\nTransfer-Encoding: chunked\r\n" \
|
|
82
82
|
"Trailer: Content-MD5\r\n\r\n")
|
|
83
83
|
@count.times do |i|
|
|
@@ -103,7 +103,7 @@ class UploadTest < Test::Unit::TestCase
|
|
|
103
103
|
@count, @bs = 2, 128
|
|
104
104
|
start_server(@sha1_app)
|
|
105
105
|
assert_equal 256, length
|
|
106
|
-
sock =
|
|
106
|
+
sock = tcp_socket(@addr, @port)
|
|
107
107
|
hdr = "PUT / HTTP/1.0\r\nContent-Length: #{length}\r\n\r\n"
|
|
108
108
|
@count.times do
|
|
109
109
|
buf = @random.sysread(@bs)
|
|
@@ -122,7 +122,7 @@ class UploadTest < Test::Unit::TestCase
|
|
|
122
122
|
|
|
123
123
|
def test_put_keepalive_truncates_small_overwrite
|
|
124
124
|
start_server(@sha1_app)
|
|
125
|
-
sock =
|
|
125
|
+
sock = tcp_socket(@addr, @port)
|
|
126
126
|
to_upload = length + 1
|
|
127
127
|
sock.syswrite("PUT / HTTP/1.0\r\nContent-Length: #{to_upload}\r\n\r\n")
|
|
128
128
|
@count.times do
|
|
@@ -155,7 +155,7 @@ class UploadTest < Test::Unit::TestCase
|
|
|
155
155
|
tmp.write(nr.to_s)
|
|
156
156
|
[ 200, @hdr, [] ]
|
|
157
157
|
})
|
|
158
|
-
sock =
|
|
158
|
+
sock = tcp_socket(@addr, @port)
|
|
159
159
|
buf = ' ' * @bs
|
|
160
160
|
sock.syswrite("PUT / HTTP/1.0\r\nContent-Length: #{length}\r\n\r\n")
|
|
161
161
|
|
|
@@ -236,15 +236,10 @@ class UploadTest < Test::Unit::TestCase
|
|
|
236
236
|
resp = Tempfile.new('resp')
|
|
237
237
|
resp.sync = true
|
|
238
238
|
|
|
239
|
-
rd, wr = IO.pipe
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
rd.close
|
|
244
|
-
wr.close
|
|
245
|
-
STDOUT.reopen(resp)
|
|
246
|
-
exec cmd
|
|
247
|
-
}
|
|
239
|
+
rd, wr = IO.pipe.each do |io|
|
|
240
|
+
io.sync = io.close_on_exec = true
|
|
241
|
+
end
|
|
242
|
+
pid = spawn(*cmd, { 0 => rd, 1 => resp })
|
|
248
243
|
rd.close
|
|
249
244
|
|
|
250
245
|
tmp.rewind
|
data/test/unit/test_util.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- encoding: binary -*-
|
|
2
2
|
|
|
3
|
-
require 'test/test_helper'
|
|
3
|
+
require './test/test_helper'
|
|
4
4
|
require 'tempfile'
|
|
5
5
|
|
|
6
6
|
class TestUtil < Test::Unit::TestCase
|
|
@@ -51,7 +51,7 @@ class TestUtil < Test::Unit::TestCase
|
|
|
51
51
|
def test_reopen_logs_renamed_with_encoding
|
|
52
52
|
tmp = Tempfile.new('')
|
|
53
53
|
tmp_path = tmp.path.dup.freeze
|
|
54
|
-
Encoding.list.each { |encoding|
|
|
54
|
+
Encoding.list.sample(5).each { |encoding|
|
|
55
55
|
File.open(tmp_path, "a:#{encoding.to_s}") { |fp|
|
|
56
56
|
fp.sync = true
|
|
57
57
|
assert_equal encoding, fp.external_encoding
|
|
@@ -69,13 +69,14 @@ class TestUtil < Test::Unit::TestCase
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
tmp.close!
|
|
72
|
-
end
|
|
72
|
+
end
|
|
73
73
|
|
|
74
74
|
def test_reopen_logs_renamed_with_internal_encoding
|
|
75
75
|
tmp = Tempfile.new('')
|
|
76
76
|
tmp_path = tmp.path.dup.freeze
|
|
77
|
-
Encoding.list
|
|
78
|
-
|
|
77
|
+
full = Encoding.list
|
|
78
|
+
full.sample(2).each { |ext|
|
|
79
|
+
full.sample(2).each { |int|
|
|
79
80
|
next if ext == int
|
|
80
81
|
File.open(tmp_path, "a:#{ext.to_s}:#{int.to_s}") { |fp|
|
|
81
82
|
fp.sync = true
|
|
@@ -101,5 +102,30 @@ class TestUtil < Test::Unit::TestCase
|
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
104
|
tmp.close!
|
|
104
|
-
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def test_pipe
|
|
108
|
+
r, w = Unicorn.pipe
|
|
109
|
+
assert r
|
|
110
|
+
assert w
|
|
111
|
+
|
|
112
|
+
return if RUBY_PLATFORM !~ /linux/
|
|
113
|
+
|
|
114
|
+
begin
|
|
115
|
+
f_getpipe_sz = 1032
|
|
116
|
+
IO.pipe do |a, b|
|
|
117
|
+
a_sz = a.fcntl(f_getpipe_sz)
|
|
118
|
+
b.fcntl(f_getpipe_sz)
|
|
119
|
+
assert_kind_of Integer, a_sz
|
|
120
|
+
r_sz = r.fcntl(f_getpipe_sz)
|
|
121
|
+
assert_equal Raindrops::PAGE_SIZE, r_sz
|
|
122
|
+
assert_operator a_sz, :>=, r_sz
|
|
123
|
+
end
|
|
124
|
+
rescue Errno::EINVAL
|
|
125
|
+
# Linux <= 2.6.34
|
|
126
|
+
end
|
|
127
|
+
ensure
|
|
128
|
+
w.close
|
|
129
|
+
r.close
|
|
130
|
+
end
|
|
105
131
|
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'unicorn'
|
|
3
|
+
require 'unicorn/select_waiter'
|
|
4
|
+
class TestSelectWaiter < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def test_select_timeout # n.b. this is level-triggered
|
|
7
|
+
sw = Unicorn::SelectWaiter.new
|
|
8
|
+
IO.pipe do |r,w|
|
|
9
|
+
sw.get_readers(ready = [], [r], 0)
|
|
10
|
+
assert_equal [], ready
|
|
11
|
+
w.syswrite '.'
|
|
12
|
+
sw.get_readers(ready, [r], 1000)
|
|
13
|
+
assert_equal [r], ready
|
|
14
|
+
sw.get_readers(ready, [r], 0)
|
|
15
|
+
assert_equal [r], ready
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_linux # ugh, also level-triggered, unlikely to change
|
|
20
|
+
IO.pipe do |r,w|
|
|
21
|
+
wtr = Unicorn::Waiter.prep_readers([r])
|
|
22
|
+
wtr.get_readers(ready = [], [r], 0)
|
|
23
|
+
assert_equal [], ready
|
|
24
|
+
w.syswrite '.'
|
|
25
|
+
wtr.get_readers(ready = [], [r], 1000)
|
|
26
|
+
assert_equal [r], ready
|
|
27
|
+
wtr.get_readers(ready = [], [r], 1000)
|
|
28
|
+
assert_equal [r], ready, 'still ready (level-triggered :<)'
|
|
29
|
+
assert_nil wtr.close
|
|
30
|
+
end
|
|
31
|
+
rescue SystemCallError => e
|
|
32
|
+
warn "#{e.message} (#{e.class})"
|
|
33
|
+
end if Unicorn.const_defined?(:Waiter)
|
|
34
|
+
end
|
data/unicorn.gemspec
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
# -*- encoding: binary -*-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
require 'wrongdoc'
|
|
5
|
-
extend Wrongdoc::Gemspec
|
|
6
|
-
name, summary, title = readme_metadata
|
|
2
|
+
manifest = File.exist?('.manifest') ?
|
|
3
|
+
IO.readlines('.manifest').map!(&:chomp!) : `git ls-files`.split("\n")
|
|
7
4
|
|
|
8
5
|
# don't bother with tests that fork, not worth our time to get working
|
|
9
6
|
# with `gem check -t` ... (of course we care for them when testing with
|
|
@@ -14,31 +11,39 @@ end.compact
|
|
|
14
11
|
|
|
15
12
|
Gem::Specification.new do |s|
|
|
16
13
|
s.name = %q{unicorn}
|
|
17
|
-
s.version = ENV[
|
|
18
|
-
s.authors = [
|
|
19
|
-
s.summary =
|
|
20
|
-
s.
|
|
21
|
-
s.
|
|
22
|
-
s.email = %q{mongrel-unicorn@rubyforge.org}
|
|
14
|
+
s.version = (ENV['VERSION'] || '6.1.0').dup
|
|
15
|
+
s.authors = ['unicorn hackers']
|
|
16
|
+
s.summary = 'Rack HTTP server for fast clients and Unix'
|
|
17
|
+
s.description = File.read('README').split("\n\n")[1]
|
|
18
|
+
s.email = %q{unicorn-public@yhbt.net}
|
|
23
19
|
s.executables = %w(unicorn unicorn_rails)
|
|
24
20
|
s.extensions = %w(ext/unicorn_http/extconf.rb)
|
|
25
|
-
s.extra_rdoc_files =
|
|
21
|
+
s.extra_rdoc_files = IO.readlines('.document').map!(&:chomp!).keep_if do |f|
|
|
22
|
+
File.exist?(f)
|
|
23
|
+
end
|
|
26
24
|
s.files = manifest
|
|
27
|
-
s.homepage =
|
|
28
|
-
s.rdoc_options = rdoc_options
|
|
29
|
-
s.rubyforge_project = %q{mongrel}
|
|
25
|
+
s.homepage = 'https://yhbt.net/unicorn/'
|
|
30
26
|
s.test_files = test_files
|
|
31
27
|
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
s.
|
|
28
|
+
# 2.0.0 is the minimum supported version. We don't specify
|
|
29
|
+
# a maximum version to make it easier to test pre-releases,
|
|
30
|
+
# but we do warn users if they install unicorn on an untested
|
|
31
|
+
# version in extconf.rb
|
|
32
|
+
s.required_ruby_version = ">= 2.0.0"
|
|
33
|
+
|
|
34
|
+
# We do not have a hard dependency on rack, it's possible to load
|
|
35
|
+
# things which respond to #call. HTTP status lines in responses
|
|
36
|
+
# won't have descriptive text, only the numeric status.
|
|
37
|
+
s.add_development_dependency(%q<rack>)
|
|
38
|
+
|
|
37
39
|
s.add_dependency(%q<kgio>, '~> 2.6')
|
|
38
40
|
s.add_dependency(%q<raindrops>, '~> 0.7')
|
|
39
41
|
|
|
40
|
-
s.add_development_dependency('
|
|
41
|
-
s.add_development_dependency('wrongdoc', '~> 1.6.1')
|
|
42
|
+
s.add_development_dependency('test-unit', '~> 3.0')
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
# Note: To avoid ambiguity, we intentionally avoid the SPDX-compatible
|
|
45
|
+
# 'Ruby' here since Ruby 1.9.3 switched to BSD-2-Clause, but we
|
|
46
|
+
# inherited our license from Mongrel when Ruby was at 1.8.
|
|
47
|
+
# We cannot automatically switch licenses when Ruby changes.
|
|
48
|
+
s.licenses = ['GPL-2.0+', 'Ruby-1.8']
|
|
44
49
|
end
|
data/unicorn_1
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
olddoc_placeholder
|
data/unicorn_rails_1
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
olddoc_placeholder
|