unicorn 5.4.0 → 5.5.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 +4 -4
- data/.manifest +2 -0
- data/.olddoc.yml +1 -1
- data/Application_Timeouts +4 -4
- data/Documentation/unicorn.1.txt +1 -1
- data/Documentation/unicorn_rails.1.txt +1 -1
- data/GIT-VERSION-FILE +1 -1
- data/GIT-VERSION-GEN +1 -1
- data/ISSUES +5 -2
- data/LATEST +25 -8
- data/LICENSE +2 -2
- data/Links +9 -7
- data/NEWS +71 -0
- data/README +13 -6
- data/Sandbox +2 -2
- data/bin/unicorn +3 -1
- data/examples/logrotate.conf +1 -1
- data/examples/nginx.conf +3 -2
- data/ext/unicorn_http/common_field_optimization.h +24 -6
- data/ext/unicorn_http/extconf.rb +30 -0
- data/ext/unicorn_http/global_variables.h +2 -2
- data/ext/unicorn_http/httpdate.c +2 -2
- data/ext/unicorn_http/unicorn_http.c +4 -9
- data/ext/unicorn_http/unicorn_http.rl +4 -9
- data/lib/unicorn.rb +19 -8
- data/lib/unicorn/configurator.rb +12 -1
- data/lib/unicorn/http_request.rb +1 -2
- data/lib/unicorn/http_server.rb +19 -20
- data/lib/unicorn/launcher.rb +1 -1
- data/lib/unicorn/socket_helper.rb +3 -2
- data/lib/unicorn/util.rb +3 -3
- data/lib/unicorn/version.rb +1 -1
- data/lib/unicorn/worker.rb +16 -2
- data/man/man1/unicorn.1 +7 -5
- data/man/man1/unicorn_rails.1 +6 -3
- data/t/README +4 -4
- data/t/t0301-no-default-middleware-ignored-in-config.sh +25 -0
- data/t/t0301.ru +13 -0
- data/test/exec/test_exec.rb +6 -7
- data/test/unit/test_ccc.rb +1 -1
- data/test/unit/test_http_parser.rb +16 -0
- data/test/unit/test_server.rb +5 -5
- data/test/unit/test_signals.rb +2 -2
- data/test/unit/test_socket_helper.rb +4 -4
- data/test/unit/test_util.rb +25 -0
- data/unicorn.gemspec +1 -1
- metadata +5 -4
data/man/man1/unicorn.1
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
.\" Automatically generated by Pandoc 1.17.2
|
2
|
+
.\"
|
1
3
|
.TH "UNICORN" "1" "September 15, 2009" "Unicorn User Manual" ""
|
4
|
+
.hy
|
2
5
|
.SH NAME
|
3
6
|
.PP
|
4
7
|
unicorn \- a rackup\-like command to launch the Unicorn HTTP server
|
@@ -61,10 +64,9 @@ socket.
|
|
61
64
|
Defaults to "0.0.0.0:8080" (all addresses on TCP port 8080) For
|
62
65
|
production deployments, specifying the "listen" directive in CONFIG_FILE
|
63
66
|
is recommended as it allows fine\-tuning of socket options.
|
67
|
+
\-N, \-\-no\-default\-middleware
|
64
68
|
.RS
|
65
69
|
.RE
|
66
|
-
.TP
|
67
|
-
.B \-N, \-\-no\-default\-middleware
|
68
70
|
Disables loading middleware implied by RACK_ENV.
|
69
71
|
This bypasses the configuration documented in the RACK ENVIRONMENT
|
70
72
|
section, but still allows RACK_ENV to be used for
|
@@ -116,8 +118,8 @@ Turn on verbose warnings, the $VERBOSE variable is set to true.
|
|
116
118
|
.RE
|
117
119
|
.TP
|
118
120
|
.B \-I, \-\-include PATH
|
119
|
-
specify
|
120
|
-
|
121
|
+
specify $LOAD_PATH.
|
122
|
+
PATH will be prepended to $LOAD_PATH.
|
121
123
|
The \[aq]:\[aq] character may be used to delimit multiple directories.
|
122
124
|
This directive may be used more than once.
|
123
125
|
Modifications to $LOAD_PATH take place immediately and in the order they
|
@@ -212,7 +214,7 @@ the unicorn config file.
|
|
212
214
|
.IP \[bu] 2
|
213
215
|
Unicorn RDoc (https://bogomips.org/unicorn/)
|
214
216
|
.IP \[bu] 2
|
215
|
-
Rack RDoc (
|
217
|
+
Rack RDoc (https://www.rubydoc.info/github/rack/rack/)
|
216
218
|
.IP \[bu] 2
|
217
219
|
Rackup HowTo (https://github.com/rack/rack/wiki/tutorial-rackup-howto)
|
218
220
|
.SH AUTHORS
|
data/man/man1/unicorn_rails.1
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
.\" Automatically generated by Pandoc 1.17.2
|
2
|
+
.\"
|
1
3
|
.TH "UNICORN_RAILS" "1" "September 17, 2009" "Unicorn User Manual" ""
|
4
|
+
.hy
|
2
5
|
.SH NAME
|
3
6
|
.PP
|
4
7
|
unicorn_rails \- unicorn launcher for Rails 1.x and 2.x users
|
@@ -125,8 +128,8 @@ Turn on verbose warnings, the $VERBOSE variable is set to true.
|
|
125
128
|
.RE
|
126
129
|
.TP
|
127
130
|
.B \-I, \-\-include PATH
|
128
|
-
specify
|
129
|
-
|
131
|
+
specify $LOAD_PATH.
|
132
|
+
PATH will be prepended to $LOAD_PATH.
|
130
133
|
The \[aq]:\[aq] character may be used to delimit multiple directories.
|
131
134
|
This directive may be used more than once.
|
132
135
|
Modifications to $LOAD_PATH take place immediately and in the order they
|
@@ -202,7 +205,7 @@ unicorn(1)
|
|
202
205
|
.IP \[bu] 2
|
203
206
|
Unicorn RDoc (https://bogomips.org/unicorn/)
|
204
207
|
.IP \[bu] 2
|
205
|
-
Rack RDoc (
|
208
|
+
Rack RDoc (https://www.rubydoc.info/github/rack/rack/)
|
206
209
|
.IP \[bu] 2
|
207
210
|
Rackup HowTo (https://github.com/rack/rack/wiki/tutorial-rackup-howto)
|
208
211
|
.SH AUTHORS
|
data/t/README
CHANGED
@@ -10,17 +10,17 @@ comfortable writing integration tests with.
|
|
10
10
|
|
11
11
|
== Requirements
|
12
12
|
|
13
|
-
* {Ruby 1.9.3+}[https://www.ruby-lang.org/] (duh!)
|
14
|
-
* {GNU make}[
|
13
|
+
* {Ruby 1.9.3+}[https://www.ruby-lang.org/en/] (duh!)
|
14
|
+
* {GNU make}[https://www.gnu.org/software/make/]
|
15
15
|
* {socat}[http://www.dest-unreach.org/socat/]
|
16
|
-
* {curl}[
|
16
|
+
* {curl}[https://curl.haxx.se/]
|
17
17
|
* standard UNIX shell utilities (Bourne sh, awk, sed, grep, ...)
|
18
18
|
|
19
19
|
We do not use bashisms or any non-portable, non-POSIX constructs
|
20
20
|
in our shell code. We use the "pipefail" option if available and
|
21
21
|
mainly test with {ksh}[http://kornshell.com/], but occasionally
|
22
22
|
with {dash}[http://gondor.apana.org.au/~herbert/dash/] and
|
23
|
-
{bash}[
|
23
|
+
{bash}[https://www.gnu.org/software/bash/], too.
|
24
24
|
|
25
25
|
== Running Tests
|
26
26
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
t_plan 3 "-N / --no-default-middleware option not supported in config.ru"
|
4
|
+
|
5
|
+
t_begin "setup and start" && {
|
6
|
+
unicorn_setup
|
7
|
+
RACK_ENV=development unicorn -D -c $unicorn_config t0301.ru
|
8
|
+
unicorn_wait_start
|
9
|
+
}
|
10
|
+
|
11
|
+
t_begin "check switches parsed as expected and -N ignored for Rack::Lint" && {
|
12
|
+
debug=false
|
13
|
+
lint=
|
14
|
+
eval "$(curl -sf http://$listen/vars)"
|
15
|
+
test x"$debug" = xtrue
|
16
|
+
test x"$lint" != x
|
17
|
+
test -f "$lint"
|
18
|
+
}
|
19
|
+
|
20
|
+
t_begin "killing succeeds" && {
|
21
|
+
kill $unicorn_pid
|
22
|
+
check_stderr
|
23
|
+
}
|
24
|
+
|
25
|
+
t_done
|
data/t/t0301.ru
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#\-N --debug
|
2
|
+
run(lambda do |env|
|
3
|
+
case env['PATH_INFO']
|
4
|
+
when '/vars'
|
5
|
+
b = "debug=#{$DEBUG.inspect}\n" \
|
6
|
+
"lint=#{caller.grep(%r{rack/lint\.rb})[0].split(':')[0]}\n"
|
7
|
+
end
|
8
|
+
h = {
|
9
|
+
'Content-Length' => b.size.to_s,
|
10
|
+
'Content-Type' => 'text/plain',
|
11
|
+
}
|
12
|
+
[ 200, h, [ b ] ]
|
13
|
+
end)
|
data/test/exec/test_exec.rb
CHANGED
@@ -193,8 +193,8 @@ def test_working_directory_rel_path_config_file
|
|
193
193
|
assert_equal other.path, results.first
|
194
194
|
|
195
195
|
Process.kill(:QUIT, pid)
|
196
|
-
|
197
|
-
|
196
|
+
ensure
|
197
|
+
FileUtils.rmtree(other.path)
|
198
198
|
end
|
199
199
|
|
200
200
|
def test_working_directory
|
@@ -229,8 +229,8 @@ def test_working_directory
|
|
229
229
|
assert_equal other.path, results.first
|
230
230
|
|
231
231
|
Process.kill(:QUIT, pid)
|
232
|
-
|
233
|
-
|
232
|
+
ensure
|
233
|
+
FileUtils.rmtree(other.path)
|
234
234
|
end
|
235
235
|
|
236
236
|
def test_working_directory_controls_relative_paths
|
@@ -271,11 +271,10 @@ def test_working_directory_controls_relative_paths
|
|
271
271
|
wait_master_ready("#{other.path}/stderr_log_here")
|
272
272
|
|
273
273
|
Process.kill(:QUIT, pid)
|
274
|
-
|
275
|
-
|
274
|
+
ensure
|
275
|
+
FileUtils.rmtree(other.path)
|
276
276
|
end
|
277
277
|
|
278
|
-
|
279
278
|
def test_exit_signals
|
280
279
|
%w(INT TERM QUIT).each do |sig|
|
281
280
|
File.open("config.ru", "wb") { |fp| fp.syswrite(HI) }
|
data/test/unit/test_ccc.rb
CHANGED
@@ -44,7 +44,7 @@ def test_ccc_tcpi
|
|
44
44
|
# make sure the server is running, at least
|
45
45
|
client = TCPSocket.new(host, port)
|
46
46
|
client.write("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
|
47
|
-
assert client.
|
47
|
+
assert client.wait(10), 'never got response from server'
|
48
48
|
res = client.read
|
49
49
|
assert_match %r{\AHTTP/1\.1 200}, res, 'got part of first response'
|
50
50
|
assert_match %r{\r\n\r\n\z}, res, 'got end of response, server is ready'
|
@@ -865,4 +865,20 @@ def test_memsize
|
|
865
865
|
rescue LoadError
|
866
866
|
# not all Ruby implementations have objspace
|
867
867
|
end
|
868
|
+
|
869
|
+
def test_dedupe
|
870
|
+
parser = HttpParser.new
|
871
|
+
# n.b. String#freeze optimization doesn't work under modern test-unit
|
872
|
+
exp = -'HTTP_HOST'
|
873
|
+
get = "GET / HTTP/1.1\r\nHost: example.com\r\nHavpbea-fhpxf: true\r\n\r\n"
|
874
|
+
assert parser.add_parse(get)
|
875
|
+
key = parser.env.keys.detect { |k| k == exp }
|
876
|
+
assert_same exp, key
|
877
|
+
|
878
|
+
if RUBY_VERSION.to_r >= 2.6 # 2.6.0-rc1+
|
879
|
+
exp = -'HTTP_HAVPBEA_FHPXF'
|
880
|
+
key = parser.env.keys.detect { |k| k == exp }
|
881
|
+
assert_same exp, key
|
882
|
+
end
|
883
|
+
end if RUBY_VERSION.to_r >= 2.5 && RUBY_ENGINE == 'ruby'
|
868
884
|
end
|
data/test/unit/test_server.rb
CHANGED
@@ -17,9 +17,9 @@ def call(env)
|
|
17
17
|
while env['rack.input'].read(4096)
|
18
18
|
end
|
19
19
|
[200, { 'Content-Type' => 'text/plain' }, ['hello!\n']]
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
rescue Unicorn::ClientShutdown, Unicorn::HttpParserError => e
|
21
|
+
$stderr.syswrite("#{e.class}: #{e.message} #{e.backtrace.empty?}\n")
|
22
|
+
raise e
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -80,8 +80,8 @@ def test_preload_app_config
|
|
80
80
|
loader_pid = tmp.sysread(4096).to_i
|
81
81
|
assert_equal $$, loader_pid
|
82
82
|
assert worker_pid != loader_pid
|
83
|
-
|
84
|
-
|
83
|
+
ensure
|
84
|
+
tmp.close!
|
85
85
|
end
|
86
86
|
|
87
87
|
def test_broken_app
|
data/test/unit/test_signals.rb
CHANGED
@@ -114,8 +114,8 @@ def test_timeout_slow_response
|
|
114
114
|
assert_nil buf
|
115
115
|
assert diff > 1.0, "diff was #{diff.inspect}"
|
116
116
|
assert diff < 60.0
|
117
|
-
|
118
|
-
|
117
|
+
ensure
|
118
|
+
Process.kill(:TERM, pid) rescue nil
|
119
119
|
end
|
120
120
|
|
121
121
|
def test_response_write
|
@@ -57,8 +57,8 @@ def test_bind_listen_unix
|
|
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 @@ def test_bind_listen_unix_umask
|
|
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
|
data/test/unit/test_util.rb
CHANGED
@@ -102,4 +102,29 @@ def test_reopen_logs_renamed_with_internal_encoding
|
|
102
102
|
}
|
103
103
|
tmp.close!
|
104
104
|
end
|
105
|
+
|
106
|
+
def test_pipe
|
107
|
+
r, w = Unicorn.pipe
|
108
|
+
assert r
|
109
|
+
assert w
|
110
|
+
|
111
|
+
return if RUBY_PLATFORM !~ /linux/
|
112
|
+
|
113
|
+
begin
|
114
|
+
f_getpipe_sz = 1032
|
115
|
+
IO.pipe do |a, b|
|
116
|
+
a_sz = a.fcntl(f_getpipe_sz)
|
117
|
+
b_sz = b.fcntl(f_getpipe_sz)
|
118
|
+
assert_kind_of Integer, a_sz
|
119
|
+
r_sz = r.fcntl(f_getpipe_sz)
|
120
|
+
assert_equal Raindrops::PAGE_SIZE, r_sz
|
121
|
+
assert_operator a_sz, :>=, r_sz
|
122
|
+
end
|
123
|
+
rescue Errno::EINVAL
|
124
|
+
# Linux <= 2.6.34
|
125
|
+
end
|
126
|
+
ensure
|
127
|
+
w.close
|
128
|
+
r.close
|
129
|
+
end
|
105
130
|
end
|
data/unicorn.gemspec
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
Gem::Specification.new do |s|
|
13
13
|
s.name = %q{unicorn}
|
14
|
-
s.version = (ENV['VERSION'] || '5.
|
14
|
+
s.version = (ENV['VERSION'] || '5.5.0').dup
|
15
15
|
s.authors = ['unicorn hackers']
|
16
16
|
s.summary = 'Rack HTTP server for fast clients and Unix'
|
17
17
|
s.description = File.read('README').split("\n\n")[1]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unicorn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- unicorn hackers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -238,6 +238,8 @@ files:
|
|
238
238
|
- t/t0116.ru
|
239
239
|
- t/t0200-rack-hijack.sh
|
240
240
|
- t/t0300-no-default-middleware.sh
|
241
|
+
- t/t0301-no-default-middleware-ignored-in-config.sh
|
242
|
+
- t/t0301.ru
|
241
243
|
- t/t9000-preread-input.sh
|
242
244
|
- t/t9001-oob_gc.sh
|
243
245
|
- t/t9002-oob_gc-path.sh
|
@@ -287,8 +289,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
287
289
|
- !ruby/object:Gem::Version
|
288
290
|
version: '0'
|
289
291
|
requirements: []
|
290
|
-
|
291
|
-
rubygems_version: 2.7.3
|
292
|
+
rubygems_version: 3.0.2
|
292
293
|
signing_key:
|
293
294
|
specification_version: 4
|
294
295
|
summary: Rack HTTP server for fast clients and Unix
|