boourns-unicorn 4.4.1
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.
- data/.CHANGELOG.old +25 -0
- data/.document +29 -0
- data/.gitignore +24 -0
- data/.mailmap +26 -0
- data/.wrongdoc.yml +10 -0
- data/Application_Timeouts +77 -0
- data/CONTRIBUTORS +35 -0
- data/COPYING +674 -0
- data/DESIGN +97 -0
- data/Documentation/.gitignore +5 -0
- data/Documentation/GNUmakefile +30 -0
- data/Documentation/unicorn.1.txt +174 -0
- data/Documentation/unicorn_rails.1.txt +175 -0
- data/FAQ +53 -0
- data/GIT-VERSION-GEN +40 -0
- data/GNUmakefile +267 -0
- data/HACKING +134 -0
- data/ISSUES +36 -0
- data/KNOWN_ISSUES +79 -0
- data/LICENSE +64 -0
- data/Links +56 -0
- data/PHILOSOPHY +145 -0
- data/README +149 -0
- data/Rakefile +97 -0
- data/SIGNALS +114 -0
- data/Sandbox +96 -0
- data/TODO +5 -0
- data/TUNING +98 -0
- data/bin/unicorn +121 -0
- data/bin/unicorn_rails +209 -0
- data/examples/big_app_gc.rb +2 -0
- data/examples/echo.ru +27 -0
- data/examples/git.ru +13 -0
- data/examples/init.sh +74 -0
- data/examples/logger_mp_safe.rb +25 -0
- data/examples/logrotate.conf +29 -0
- data/examples/nginx.conf +156 -0
- data/examples/unicorn.conf.minimal.rb +13 -0
- data/examples/unicorn.conf.rb +94 -0
- data/ext/unicorn_http/CFLAGS +13 -0
- data/ext/unicorn_http/c_util.h +124 -0
- data/ext/unicorn_http/common_field_optimization.h +111 -0
- data/ext/unicorn_http/ext_help.h +86 -0
- data/ext/unicorn_http/extconf.rb +10 -0
- data/ext/unicorn_http/global_variables.h +97 -0
- data/ext/unicorn_http/httpdate.c +82 -0
- data/ext/unicorn_http/unicorn_http.rl +1036 -0
- data/ext/unicorn_http/unicorn_http_common.rl +76 -0
- data/lib/unicorn.rb +107 -0
- data/lib/unicorn/app/exec_cgi.rb +154 -0
- data/lib/unicorn/app/inetd.rb +109 -0
- data/lib/unicorn/app/old_rails.rb +35 -0
- data/lib/unicorn/app/old_rails/static.rb +59 -0
- data/lib/unicorn/cgi_wrapper.rb +147 -0
- data/lib/unicorn/configurator.rb +630 -0
- data/lib/unicorn/const.rb +40 -0
- data/lib/unicorn/http_request.rb +83 -0
- data/lib/unicorn/http_response.rb +45 -0
- data/lib/unicorn/http_server.rb +755 -0
- data/lib/unicorn/launcher.rb +62 -0
- data/lib/unicorn/oob_gc.rb +71 -0
- data/lib/unicorn/preread_input.rb +33 -0
- data/lib/unicorn/socket_helper.rb +208 -0
- data/lib/unicorn/ssl_client.rb +11 -0
- data/lib/unicorn/ssl_configurator.rb +104 -0
- data/lib/unicorn/ssl_server.rb +42 -0
- data/lib/unicorn/stream_input.rb +149 -0
- data/lib/unicorn/tee_input.rb +126 -0
- data/lib/unicorn/tmpio.rb +29 -0
- data/lib/unicorn/util.rb +69 -0
- data/lib/unicorn/worker.rb +88 -0
- data/local.mk.sample +59 -0
- data/script/isolate_for_tests +32 -0
- data/setup.rb +1586 -0
- data/t/.gitignore +5 -0
- data/t/GNUmakefile +82 -0
- data/t/README +42 -0
- data/t/bin/content-md5-put +36 -0
- data/t/bin/sha1sum.rb +17 -0
- data/t/bin/unused_listen +40 -0
- data/t/bin/utee +12 -0
- data/t/broken-app.ru +12 -0
- data/t/detach.ru +11 -0
- data/t/env.ru +3 -0
- data/t/heartbeat-timeout.ru +12 -0
- data/t/listener_names.ru +4 -0
- data/t/my-tap-lib.sh +201 -0
- data/t/oob_gc.ru +21 -0
- data/t/oob_gc_path.ru +21 -0
- data/t/pid.ru +3 -0
- data/t/preread_input.ru +17 -0
- data/t/rack-input-tests.ru +21 -0
- data/t/sslgen.sh +71 -0
- data/t/t0000-http-basic.sh +50 -0
- data/t/t0001-reload-bad-config.sh +53 -0
- data/t/t0002-config-conflict.sh +49 -0
- data/t/t0002-parser-error.sh +94 -0
- data/t/t0003-working_directory.sh +51 -0
- data/t/t0004-heartbeat-timeout.sh +69 -0
- data/t/t0004-working_directory_broken.sh +24 -0
- data/t/t0005-working_directory_app.rb.sh +37 -0
- data/t/t0006-reopen-logs.sh +83 -0
- data/t/t0006.ru +13 -0
- data/t/t0007-working_directory_no_embed_cli.sh +44 -0
- data/t/t0008-back_out_of_upgrade.sh +110 -0
- data/t/t0009-broken-app.sh +56 -0
- data/t/t0009-winch_ttin.sh +59 -0
- data/t/t0010-reap-logging.sh +55 -0
- data/t/t0011-active-unix-socket.sh +79 -0
- data/t/t0012-reload-empty-config.sh +85 -0
- data/t/t0013-rewindable-input-false.sh +24 -0
- data/t/t0013.ru +12 -0
- data/t/t0014-rewindable-input-true.sh +24 -0
- data/t/t0014.ru +12 -0
- data/t/t0015-configurator-internals.sh +25 -0
- data/t/t0016-trust-x-forwarded-false.sh +30 -0
- data/t/t0017-trust-x-forwarded-true.sh +30 -0
- data/t/t0018-write-on-close.sh +23 -0
- data/t/t0019-max_header_len.sh +49 -0
- data/t/t0020-at_exit-handler.sh +49 -0
- data/t/t0021-process_detach.sh +29 -0
- data/t/t0022-listener_names-preload_app.sh +32 -0
- data/t/t0100-rack-input-tests.sh +124 -0
- data/t/t0116-client_body_buffer_size.sh +80 -0
- data/t/t0116.ru +16 -0
- data/t/t0600-https-server-basic.sh +48 -0
- data/t/t9000-preread-input.sh +48 -0
- data/t/t9001-oob_gc.sh +47 -0
- data/t/t9002-oob_gc-path.sh +75 -0
- data/t/test-lib.sh +113 -0
- data/t/write-on-close.ru +11 -0
- data/test/aggregate.rb +15 -0
- data/test/benchmark/README +50 -0
- data/test/benchmark/dd.ru +18 -0
- data/test/benchmark/stack.ru +8 -0
- data/test/exec/README +5 -0
- data/test/exec/test_exec.rb +1041 -0
- data/test/test_helper.rb +300 -0
- data/test/unit/test_configurator.rb +158 -0
- data/test/unit/test_droplet.rb +28 -0
- data/test/unit/test_http_parser.rb +860 -0
- data/test/unit/test_http_parser_ng.rb +716 -0
- data/test/unit/test_http_parser_xftrust.rb +38 -0
- data/test/unit/test_request.rb +197 -0
- data/test/unit/test_response.rb +99 -0
- data/test/unit/test_server.rb +289 -0
- data/test/unit/test_signals.rb +207 -0
- data/test/unit/test_sni_hostnames.rb +47 -0
- data/test/unit/test_socket_helper.rb +192 -0
- data/test/unit/test_stream_input.rb +204 -0
- data/test/unit/test_tee_input.rb +296 -0
- data/test/unit/test_upload.rb +306 -0
- data/test/unit/test_util.rb +99 -0
- data/unicorn.gemspec +44 -0
- metadata +333 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 4 "write-on-close tests for funky response-bodies"
|
|
4
|
+
|
|
5
|
+
t_begin "setup and start" && {
|
|
6
|
+
unicorn_setup
|
|
7
|
+
unicorn -D -c $unicorn_config write-on-close.ru
|
|
8
|
+
unicorn_wait_start
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
t_begin "write-on-close response body succeeds" && {
|
|
12
|
+
test xGoodbye = x"$(curl -sSf http://$listen/)"
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
t_begin "killing succeeds" && {
|
|
16
|
+
kill $unicorn_pid
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
t_begin "check stderr" && {
|
|
20
|
+
check_stderr
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
t_done
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 5 "max_header_len setting (only intended for Rainbows!)"
|
|
4
|
+
|
|
5
|
+
t_begin "setup and start" && {
|
|
6
|
+
unicorn_setup
|
|
7
|
+
req='GET / HTTP/1.0\r\n\r\n'
|
|
8
|
+
len=$(printf "$req" | wc -c)
|
|
9
|
+
echo Unicorn::HttpParser.max_header_len = $len >> $unicorn_config
|
|
10
|
+
unicorn -D -c $unicorn_config env.ru
|
|
11
|
+
unicorn_wait_start
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
t_begin "minimal request succeeds" && {
|
|
15
|
+
rm -f $tmp
|
|
16
|
+
(
|
|
17
|
+
cat $fifo > $tmp &
|
|
18
|
+
printf "$req"
|
|
19
|
+
wait
|
|
20
|
+
echo ok > $ok
|
|
21
|
+
) | socat - TCP:$listen > $fifo
|
|
22
|
+
test xok = x$(cat $ok)
|
|
23
|
+
|
|
24
|
+
fgrep "HTTP/1.1 200 OK" $tmp
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
t_begin "big request fails" && {
|
|
28
|
+
rm -f $tmp
|
|
29
|
+
(
|
|
30
|
+
cat $fifo > $tmp &
|
|
31
|
+
printf 'GET /xxxxxx HTTP/1.0\r\n\r\n'
|
|
32
|
+
wait
|
|
33
|
+
echo ok > $ok
|
|
34
|
+
) | socat - TCP:$listen > $fifo
|
|
35
|
+
test xok = x$(cat $ok)
|
|
36
|
+
fgrep "HTTP/1.1 413" $tmp
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
dbgcat tmp
|
|
40
|
+
|
|
41
|
+
t_begin "killing succeeds" && {
|
|
42
|
+
kill $unicorn_pid
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
t_begin "check stderr" && {
|
|
46
|
+
check_stderr
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
t_done
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
|
|
4
|
+
t_plan 5 "at_exit/END handlers work as expected"
|
|
5
|
+
|
|
6
|
+
t_begin "setup and startup" && {
|
|
7
|
+
unicorn_setup
|
|
8
|
+
cat >> $unicorn_config <<EOF
|
|
9
|
+
at_exit { \$stdout.syswrite("#{Process.pid} BOTH\\n") }
|
|
10
|
+
END { \$stdout.syswrite("#{Process.pid} END BOTH\\n") }
|
|
11
|
+
after_fork do |_,_|
|
|
12
|
+
at_exit { \$stdout.syswrite("#{Process.pid} WORKER ONLY\\n") }
|
|
13
|
+
END { \$stdout.syswrite("#{Process.pid} END WORKER ONLY\\n") }
|
|
14
|
+
end
|
|
15
|
+
EOF
|
|
16
|
+
|
|
17
|
+
unicorn -D pid.ru -c $unicorn_config
|
|
18
|
+
unicorn_wait_start
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
t_begin "read worker PID" && {
|
|
22
|
+
worker_pid=$(curl -sSf http://$listen/)
|
|
23
|
+
t_info "worker_pid=$worker_pid"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
t_begin "issue graceful shutdown (SIGQUIT) and wait for termination" && {
|
|
27
|
+
kill -QUIT $unicorn_pid
|
|
28
|
+
|
|
29
|
+
while kill -0 $unicorn_pid >/dev/null 2>&1
|
|
30
|
+
do
|
|
31
|
+
sleep 1
|
|
32
|
+
done
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
t_begin "check stderr" && check_stderr
|
|
36
|
+
|
|
37
|
+
dbgcat r_err
|
|
38
|
+
dbgcat r_out
|
|
39
|
+
|
|
40
|
+
t_begin "all at_exit handlers ran" && {
|
|
41
|
+
grep "$worker_pid BOTH" $r_out
|
|
42
|
+
grep "$unicorn_pid BOTH" $r_out
|
|
43
|
+
grep "$worker_pid END BOTH" $r_out
|
|
44
|
+
grep "$unicorn_pid END BOTH" $r_out
|
|
45
|
+
grep "$worker_pid WORKER ONLY" $r_out
|
|
46
|
+
grep "$worker_pid END WORKER ONLY" $r_out
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
t_done
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
|
|
4
|
+
t_plan 5 "Process.detach on forked background process works"
|
|
5
|
+
|
|
6
|
+
t_begin "setup and startup" && {
|
|
7
|
+
t_fifos process_detach
|
|
8
|
+
unicorn_setup
|
|
9
|
+
TEST_FIFO=$process_detach \
|
|
10
|
+
unicorn -E none -D detach.ru -c $unicorn_config
|
|
11
|
+
unicorn_wait_start
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
t_begin "read detached PID with HTTP/1.0" && {
|
|
15
|
+
detached_pid=$(curl -0 -sSf http://$listen/)
|
|
16
|
+
t_info "detached_pid=$detached_pid"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
t_begin "read background FIFO" && {
|
|
20
|
+
test xHIHI = x"$(cat $process_detach)"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
t_begin "killing succeeds" && {
|
|
24
|
+
kill $unicorn_pid
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
t_begin "check stderr" && check_stderr
|
|
28
|
+
|
|
29
|
+
t_done
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
|
|
4
|
+
# Raindrops::Middleware depends on Unicorn.listener_names,
|
|
5
|
+
# ensure we don't break Raindrops::Middleware when preload_app is true
|
|
6
|
+
|
|
7
|
+
t_plan 4 "Unicorn.listener_names available with preload_app=true"
|
|
8
|
+
|
|
9
|
+
t_begin "setup and startup" && {
|
|
10
|
+
unicorn_setup
|
|
11
|
+
echo preload_app true >> $unicorn_config
|
|
12
|
+
unicorn -E none -D listener_names.ru -c $unicorn_config
|
|
13
|
+
unicorn_wait_start
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
t_begin "read listener names includes listener" && {
|
|
17
|
+
resp=$(curl -sSf http://$listen/)
|
|
18
|
+
ok=false
|
|
19
|
+
t_info "resp=$resp"
|
|
20
|
+
case $resp in
|
|
21
|
+
*\"$listen\"*) ok=true ;;
|
|
22
|
+
esac
|
|
23
|
+
$ok
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
t_begin "killing succeeds" && {
|
|
27
|
+
kill $unicorn_pid
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
t_begin "check stderr" && check_stderr
|
|
31
|
+
|
|
32
|
+
t_done
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
test -r random_blob || die "random_blob required, run with 'make $0'"
|
|
4
|
+
|
|
5
|
+
t_plan 10 "rack.input read tests"
|
|
6
|
+
|
|
7
|
+
t_begin "setup and startup" && {
|
|
8
|
+
rtmpfiles curl_out curl_err
|
|
9
|
+
unicorn_setup
|
|
10
|
+
unicorn -E none -D rack-input-tests.ru -c $unicorn_config
|
|
11
|
+
blob_sha1=$(rsha1 < random_blob)
|
|
12
|
+
blob_size=$(wc -c < random_blob)
|
|
13
|
+
t_info "blob_sha1=$blob_sha1"
|
|
14
|
+
unicorn_wait_start
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
t_begin "corked identity request" && {
|
|
18
|
+
rm -f $tmp
|
|
19
|
+
(
|
|
20
|
+
cat $fifo > $tmp &
|
|
21
|
+
printf 'PUT / HTTP/1.0\r\n'
|
|
22
|
+
printf 'Content-Length: %d\r\n\r\n' $blob_size
|
|
23
|
+
cat random_blob
|
|
24
|
+
wait
|
|
25
|
+
echo ok > $ok
|
|
26
|
+
) | ( sleep 1 && socat - TCP4:$listen > $fifo )
|
|
27
|
+
test 1 -eq $(grep $blob_sha1 $tmp |wc -l)
|
|
28
|
+
test x"$(cat $ok)" = xok
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
t_begin "corked chunked request" && {
|
|
32
|
+
rm -f $tmp
|
|
33
|
+
(
|
|
34
|
+
cat $fifo > $tmp &
|
|
35
|
+
content-md5-put < random_blob
|
|
36
|
+
wait
|
|
37
|
+
echo ok > $ok
|
|
38
|
+
) | ( sleep 1 && socat - TCP4:$listen > $fifo )
|
|
39
|
+
test 1 -eq $(grep $blob_sha1 $tmp |wc -l)
|
|
40
|
+
test x"$(cat $ok)" = xok
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
t_begin "corked identity request (input#size first)" && {
|
|
44
|
+
rm -f $tmp
|
|
45
|
+
(
|
|
46
|
+
cat $fifo > $tmp &
|
|
47
|
+
printf 'PUT /size_first HTTP/1.0\r\n'
|
|
48
|
+
printf 'Content-Length: %d\r\n\r\n' $blob_size
|
|
49
|
+
cat random_blob
|
|
50
|
+
wait
|
|
51
|
+
echo ok > $ok
|
|
52
|
+
) | ( sleep 1 && socat - TCP4:$listen > $fifo )
|
|
53
|
+
test 1 -eq $(grep $blob_sha1 $tmp |wc -l)
|
|
54
|
+
test x"$(cat $ok)" = xok
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
t_begin "corked identity request (input#rewind first)" && {
|
|
58
|
+
rm -f $tmp
|
|
59
|
+
(
|
|
60
|
+
cat $fifo > $tmp &
|
|
61
|
+
printf 'PUT /rewind_first HTTP/1.0\r\n'
|
|
62
|
+
printf 'Content-Length: %d\r\n\r\n' $blob_size
|
|
63
|
+
cat random_blob
|
|
64
|
+
wait
|
|
65
|
+
echo ok > $ok
|
|
66
|
+
) | ( sleep 1 && socat - TCP4:$listen > $fifo )
|
|
67
|
+
test 1 -eq $(grep $blob_sha1 $tmp |wc -l)
|
|
68
|
+
test x"$(cat $ok)" = xok
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
t_begin "corked chunked request (input#size first)" && {
|
|
72
|
+
rm -f $tmp
|
|
73
|
+
(
|
|
74
|
+
cat $fifo > $tmp &
|
|
75
|
+
printf 'PUT /size_first HTTP/1.1\r\n'
|
|
76
|
+
printf 'Host: example.com\r\n'
|
|
77
|
+
printf 'Transfer-Encoding: chunked\r\n'
|
|
78
|
+
printf 'Trailer: Content-MD5\r\n'
|
|
79
|
+
printf '\r\n'
|
|
80
|
+
content-md5-put --no-headers < random_blob
|
|
81
|
+
wait
|
|
82
|
+
echo ok > $ok
|
|
83
|
+
) | ( sleep 1 && socat - TCP4:$listen > $fifo )
|
|
84
|
+
test 1 -eq $(grep $blob_sha1 $tmp |wc -l)
|
|
85
|
+
test 1 -eq $(grep $blob_sha1 $tmp |wc -l)
|
|
86
|
+
test x"$(cat $ok)" = xok
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
t_begin "corked chunked request (input#rewind first)" && {
|
|
90
|
+
rm -f $tmp
|
|
91
|
+
(
|
|
92
|
+
cat $fifo > $tmp &
|
|
93
|
+
printf 'PUT /rewind_first HTTP/1.1\r\n'
|
|
94
|
+
printf 'Host: example.com\r\n'
|
|
95
|
+
printf 'Transfer-Encoding: chunked\r\n'
|
|
96
|
+
printf 'Trailer: Content-MD5\r\n'
|
|
97
|
+
printf '\r\n'
|
|
98
|
+
content-md5-put --no-headers < random_blob
|
|
99
|
+
wait
|
|
100
|
+
echo ok > $ok
|
|
101
|
+
) | ( sleep 1 && socat - TCP4:$listen > $fifo )
|
|
102
|
+
test 1 -eq $(grep $blob_sha1 $tmp |wc -l)
|
|
103
|
+
test x"$(cat $ok)" = xok
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
t_begin "regular request" && {
|
|
107
|
+
curl -sSf -T random_blob http://$listen/ > $curl_out 2> $curl_err
|
|
108
|
+
test x$blob_sha1 = x$(cat $curl_out)
|
|
109
|
+
test ! -s $curl_err
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
t_begin "chunked request" && {
|
|
113
|
+
curl -sSf -T- < random_blob http://$listen/ > $curl_out 2> $curl_err
|
|
114
|
+
test x$blob_sha1 = x$(cat $curl_out)
|
|
115
|
+
test ! -s $curl_err
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
dbgcat r_err
|
|
119
|
+
|
|
120
|
+
t_begin "shutdown" && {
|
|
121
|
+
kill $unicorn_pid
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
t_done
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 12 "client_body_buffer_size settings"
|
|
4
|
+
|
|
5
|
+
t_begin "setup and start" && {
|
|
6
|
+
unicorn_setup
|
|
7
|
+
rtmpfiles unicorn_config_tmp one_meg
|
|
8
|
+
dd if=/dev/zero bs=1M count=1 of=$one_meg
|
|
9
|
+
cat >> $unicorn_config <<EOF
|
|
10
|
+
after_fork do |server, worker|
|
|
11
|
+
File.open("$fifo", "wb") { |fp| fp.syswrite "START" }
|
|
12
|
+
end
|
|
13
|
+
EOF
|
|
14
|
+
cat $unicorn_config > $unicorn_config_tmp
|
|
15
|
+
echo client_body_buffer_size 0 >> $unicorn_config
|
|
16
|
+
unicorn -D -c $unicorn_config t0116.ru
|
|
17
|
+
unicorn_wait_start
|
|
18
|
+
fs_class=Unicorn::TmpIO
|
|
19
|
+
mem_class=StringIO
|
|
20
|
+
|
|
21
|
+
test x"$(cat $fifo)" = xSTART
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
t_begin "class for a zero-byte file should be StringIO" && {
|
|
25
|
+
> $tmp
|
|
26
|
+
test xStringIO = x"$(curl -T $tmp -sSf http://$listen/input_class)"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
t_begin "class for a 1 byte file should be filesystem-backed" && {
|
|
30
|
+
echo > $tmp
|
|
31
|
+
test x$fs_class = x"$(curl -T $tmp -sSf http://$listen/tmp_class)"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
t_begin "reload with default client_body_buffer_size" && {
|
|
35
|
+
mv $unicorn_config_tmp $unicorn_config
|
|
36
|
+
kill -HUP $unicorn_pid
|
|
37
|
+
test x"$(cat $fifo)" = xSTART
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
t_begin "class for a 1 byte file should be memory-backed" && {
|
|
41
|
+
echo > $tmp
|
|
42
|
+
test x$mem_class = x"$(curl -T $tmp -sSf http://$listen/tmp_class)"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
t_begin "class for a random blob file should be filesystem-backed" && {
|
|
46
|
+
resp="$(curl -T random_blob -sSf http://$listen/tmp_class)"
|
|
47
|
+
test x$fs_class = x"$resp"
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
t_begin "one megabyte file should be filesystem-backed" && {
|
|
51
|
+
resp="$(curl -T $one_meg -sSf http://$listen/tmp_class)"
|
|
52
|
+
test x$fs_class = x"$resp"
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
t_begin "reload with a big client_body_buffer_size" && {
|
|
56
|
+
echo "client_body_buffer_size(1024 * 1024)" >> $unicorn_config
|
|
57
|
+
kill -HUP $unicorn_pid
|
|
58
|
+
test x"$(cat $fifo)" = xSTART
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
t_begin "one megabyte file should be memory-backed" && {
|
|
62
|
+
resp="$(curl -T $one_meg -sSf http://$listen/tmp_class)"
|
|
63
|
+
test x$mem_class = x"$resp"
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
t_begin "one megabyte + 1 byte file should be filesystem-backed" && {
|
|
67
|
+
echo >> $one_meg
|
|
68
|
+
resp="$(curl -T $one_meg -sSf http://$listen/tmp_class)"
|
|
69
|
+
test x$fs_class = x"$resp"
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
t_begin "killing succeeds" && {
|
|
73
|
+
kill $unicorn_pid
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
t_begin "check stderr" && {
|
|
77
|
+
check_stderr
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
t_done
|
data/t/t0116.ru
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#\ -E none
|
|
2
|
+
use Rack::ContentLength
|
|
3
|
+
use Rack::ContentType, 'text/plain'
|
|
4
|
+
app = lambda do |env|
|
|
5
|
+
input = env['rack.input']
|
|
6
|
+
case env["PATH_INFO"]
|
|
7
|
+
when "/tmp_class"
|
|
8
|
+
body = input.instance_variable_get(:@tmp).class.name
|
|
9
|
+
when "/input_class"
|
|
10
|
+
body = input.class.name
|
|
11
|
+
else
|
|
12
|
+
return [ 500, {}, [] ]
|
|
13
|
+
end
|
|
14
|
+
[ 200, {}, [ body ] ]
|
|
15
|
+
end
|
|
16
|
+
run app
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 7 "simple HTTPS connection tests"
|
|
4
|
+
|
|
5
|
+
t_begin "setup and start" && {
|
|
6
|
+
rtmpfiles curl_err
|
|
7
|
+
unicorn_setup
|
|
8
|
+
cat > $unicorn_config <<EOF
|
|
9
|
+
ssl do
|
|
10
|
+
listen "$listen"
|
|
11
|
+
ssl_certificate "server.crt"
|
|
12
|
+
ssl_certificate_key "server.key"
|
|
13
|
+
end
|
|
14
|
+
pid "$pid"
|
|
15
|
+
stderr_path "$r_err"
|
|
16
|
+
stdout_path "$r_out"
|
|
17
|
+
EOF
|
|
18
|
+
unicorn -D -c $unicorn_config env.ru
|
|
19
|
+
unicorn_wait_start
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
t_begin "single request" && {
|
|
23
|
+
curl -sSfv --cacert ca.crt https://$listen/
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
t_begin "check stderr has no errors" && {
|
|
27
|
+
check_stderr
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
t_begin "multiple requests" && {
|
|
31
|
+
curl -sSfv --no-keepalive --cacert ca.crt \
|
|
32
|
+
https://$listen/ https://$listen/ 2>> $curl_err >> $tmp
|
|
33
|
+
dbgcat curl_err
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
t_begin "check stderr has no errors" && {
|
|
37
|
+
check_stderr
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
t_begin "killing succeeds" && {
|
|
41
|
+
kill $unicorn_pid
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
t_begin "check stderr has no errors" && {
|
|
45
|
+
check_stderr
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
t_done
|