passenger 5.0.0.beta3 → 5.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.editorconfig +11 -5
- data/CHANGELOG +38 -0
- data/CONTRIBUTING.md +1 -4
- data/Gemfile +0 -1
- data/Gemfile.lock +0 -2
- data/Rakefile +33 -33
- data/bin/passenger +1 -1
- data/bin/passenger-config +1 -1
- data/bin/passenger-install-apache2-module +800 -800
- data/bin/passenger-install-nginx-module +592 -592
- data/bin/passenger-memory-stats +127 -127
- data/bin/passenger-status +216 -216
- data/build/agents.rb +127 -127
- data/build/apache2.rb +87 -87
- data/build/basics.rb +60 -60
- data/build/common_library.rb +165 -165
- data/build/cplusplus_support.rb +51 -51
- data/build/cxx_tests.rb +268 -268
- data/build/debian.rb +143 -143
- data/build/documentation.rb +58 -58
- data/build/integration_tests.rb +81 -81
- data/build/misc.rb +132 -132
- data/build/nginx.rb +20 -20
- data/build/node_tests.rb +7 -7
- data/build/oxt_tests.rb +14 -14
- data/build/packaging.rb +570 -570
- data/build/preprocessor.rb +260 -260
- data/build/rake_extensions.rb +71 -71
- data/build/ruby_extension.rb +29 -29
- data/build/ruby_tests.rb +6 -6
- data/build/test_basics.rb +37 -37
- data/debian.template/control.template +3 -5
- data/dev/copy_boost_headers +134 -134
- data/dev/install_scripts_bootstrap_code.rb +25 -25
- data/dev/list_tests +20 -20
- data/dev/ruby_server.rb +223 -223
- data/dev/runner +18 -18
- data/doc/ServerOptimizationGuide.txt.md +55 -2
- data/doc/Users guide Nginx.txt +0 -26
- data/doc/Users guide Standalone.txt +5 -1
- data/doc/users_guide_snippets/tips.txt +9 -0
- data/ext/common/ApplicationPool2/Group.h +23 -11
- data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
- data/ext/common/ApplicationPool2/Pool.h +22 -17
- data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
- data/ext/common/ApplicationPool2/Spawner.h +1 -1
- data/ext/common/Constants.h +1 -1
- data/ext/common/agents/Base.cpp +35 -20
- data/ext/common/agents/HelperAgent/Main.cpp +8 -1
- data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
- data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
- data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
- data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
- data/ext/common/agents/Main.cpp +1 -1
- data/ext/common/agents/Watchdog/Main.cpp +54 -19
- data/ext/nginx/Configuration.c +7 -0
- data/ext/nginx/ContentHandler.c +9 -1
- data/helper-scripts/backtrace-sanitizer.rb +106 -87
- data/helper-scripts/crash-watch.rb +32 -0
- data/helper-scripts/download_binaries/extconf.rb +38 -38
- data/helper-scripts/meteor-loader.rb +107 -107
- data/helper-scripts/prespawn +101 -101
- data/helper-scripts/rack-loader.rb +96 -96
- data/helper-scripts/rack-preloader.rb +137 -137
- data/lib/phusion_passenger.rb +292 -292
- data/lib/phusion_passenger/abstract_installer.rb +438 -438
- data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
- data/lib/phusion_passenger/admin_tools.rb +20 -20
- data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
- data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
- data/lib/phusion_passenger/apache2/config_options.rb +182 -182
- data/lib/phusion_passenger/common_library.rb +479 -485
- data/lib/phusion_passenger/config/about_command.rb +161 -161
- data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
- data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
- data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
- data/lib/phusion_passenger/config/command.rb +25 -25
- data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
- data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
- data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
- data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
- data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
- data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
- data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
- data/lib/phusion_passenger/config/installation_utils.rb +204 -204
- data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
- data/lib/phusion_passenger/config/main.rb +152 -152
- data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
- data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
- data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
- data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
- data/lib/phusion_passenger/config/utils.rb +95 -95
- data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
- data/lib/phusion_passenger/console_text_template.rb +25 -25
- data/lib/phusion_passenger/constants.rb +90 -90
- data/lib/phusion_passenger/debug_logging.rb +106 -106
- data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
- data/lib/phusion_passenger/message_channel.rb +312 -312
- data/lib/phusion_passenger/message_client.rb +176 -176
- data/lib/phusion_passenger/native_support.rb +369 -369
- data/lib/phusion_passenger/nginx/config_options.rb +297 -297
- data/lib/phusion_passenger/packaging.rb +131 -131
- data/lib/phusion_passenger/platform_info.rb +360 -360
- data/lib/phusion_passenger/platform_info/apache.rb +767 -767
- data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
- data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
- data/lib/phusion_passenger/platform_info/curl.rb +32 -32
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
- data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
- data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
- data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
- data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
- data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
- data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
- data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
- data/lib/phusion_passenger/platform_info/linux.rb +55 -55
- data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
- data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
- data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
- data/lib/phusion_passenger/plugin.rb +66 -66
- data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
- data/lib/phusion_passenger/public_api.rb +191 -191
- data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
- data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
- data/lib/phusion_passenger/request_handler.rb +567 -577
- data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
- data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
- data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
- data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
- data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
- data/lib/phusion_passenger/standalone/command.rb +44 -40
- data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
- data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
- data/lib/phusion_passenger/standalone/main.rb +73 -73
- data/lib/phusion_passenger/standalone/start_command.rb +697 -685
- data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
- data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
- data/lib/phusion_passenger/standalone/status_command.rb +64 -64
- data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
- data/lib/phusion_passenger/standalone/version_command.rb +9 -9
- data/lib/phusion_passenger/union_station/connection.rb +32 -32
- data/lib/phusion_passenger/union_station/core.rb +251 -251
- data/lib/phusion_passenger/union_station/transaction.rb +126 -126
- data/lib/phusion_passenger/utils.rb +199 -167
- data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
- data/lib/phusion_passenger/utils/download.rb +196 -196
- data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
- data/lib/phusion_passenger/utils/lock.rb +31 -31
- data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
- data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
- data/lib/phusion_passenger/utils/shellwords.rb +20 -20
- data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
- data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
- data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
- data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
- data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
- data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
- data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
- data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
- data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
- data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
- data/passenger.gemspec +0 -1
- data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
- data/resources/templates/standalone/config.erb +19 -15
- data/test/integration_tests/apache2_tests.rb +566 -566
- data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
- data/test/integration_tests/native_packaging_spec.rb +296 -296
- data/test/integration_tests/nginx_tests.rb +393 -393
- data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
- data/test/integration_tests/source_packaging_test.rb +138 -138
- data/test/integration_tests/spec_helper.rb +5 -5
- data/test/integration_tests/standalone_tests.rb +367 -367
- data/test/ruby/debug_logging_spec.rb +133 -133
- data/test/ruby/message_channel_spec.rb +186 -186
- data/test/ruby/rack/loader_spec.rb +28 -28
- data/test/ruby/rack/preloader_spec.rb +34 -34
- data/test/ruby/rails3.0/loader_spec.rb +12 -12
- data/test/ruby/rails3.0/preloader_spec.rb +18 -18
- data/test/ruby/rails3.1/loader_spec.rb +12 -12
- data/test/ruby/rails3.1/preloader_spec.rb +18 -18
- data/test/ruby/rails3.2/loader_spec.rb +12 -12
- data/test/ruby/rails3.2/preloader_spec.rb +18 -18
- data/test/ruby/rails4.0/loader_spec.rb +12 -12
- data/test/ruby/rails4.0/preloader_spec.rb +18 -18
- data/test/ruby/rails4.1/loader_spec.rb +12 -12
- data/test/ruby/rails4.1/preloader_spec.rb +18 -18
- data/test/ruby/request_handler_spec.rb +730 -730
- data/test/ruby/shared/loader_sharedspec.rb +224 -224
- data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
- data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
- data/test/ruby/spec_helper.rb +65 -65
- data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
- data/test/ruby/union_station_spec.rb +276 -276
- data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
- data/test/ruby/utils/hosts_file_parser.rb +248 -248
- data/test/ruby/utils/tee_input_spec.rb +215 -215
- data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
- data/test/ruby/utils_spec.rb +21 -21
- data/test/stub/rack/config.ru +87 -87
- data/test/stub/rack/library.rb +8 -8
- data/test/stub/rack/start.rb +30 -30
- data/test/support/apache2_controller.rb +191 -191
- data/test/support/nginx_controller.rb +90 -99
- data/test/support/placebo-preloader.rb +57 -57
- data/test/support/test_helper.rb +435 -435
- metadata +11 -21
- metadata.gz.asc +7 -7
- data/lib/phusion_passenger/standalone/command2.rb +0 -292
- data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
- data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
- data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
- data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -6,230 +6,230 @@ require 'stringio'
|
|
6
6
|
module PhusionPassenger
|
7
7
|
|
8
8
|
shared_examples "TeeInput#gets" do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
9
|
+
context "if Content-Length is given" do
|
10
|
+
before :each do
|
11
|
+
init_input("hello\nworld\nlast line!", "CONTENT_LENGTH" => 21)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "reads a line, including newline character" do
|
15
|
+
@input.gets.should == "hello\n"
|
16
|
+
@input.gets.should == "world\n"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "reads until EOF if no newline is encountered before EOF" do
|
20
|
+
@input.gets
|
21
|
+
@input.gets
|
22
|
+
@input.gets.should == "last line"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns nil if EOF is reached" do
|
26
|
+
@input.gets
|
27
|
+
@input.gets
|
28
|
+
@input.gets
|
29
|
+
@input.gets.should be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "if Transfer-Encoding is chunked" do
|
34
|
+
before :each do
|
35
|
+
init_input("hello\nworld\nlast line", "TRANSFER_ENCODING" => "chunked")
|
36
|
+
end
|
37
|
+
|
38
|
+
it "reads a line, including newline character" do
|
39
|
+
@input.gets.should == "hello\n"
|
40
|
+
@input.gets.should == "world\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "reads until EOF if no newline is encountered before EOF" do
|
44
|
+
@input.gets
|
45
|
+
@input.gets
|
46
|
+
@input.gets.should == "last line"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "returns nil if EOF is reached" do
|
50
|
+
@input.gets
|
51
|
+
@input.gets
|
52
|
+
@input.gets
|
53
|
+
@input.gets.should be_nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "if neither Content-Length nor Transfer-Encoding chunked are given" do
|
58
|
+
before :each do
|
59
|
+
init_input("hello\nworld\nlast line")
|
60
|
+
end
|
61
|
+
|
62
|
+
it "returns nil" do
|
63
|
+
@input.gets.should be_nil
|
64
|
+
end
|
65
|
+
end
|
66
66
|
end
|
67
67
|
|
68
68
|
shared_examples "TeeInput#read" do
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
69
|
+
describe "with no arguments" do
|
70
|
+
context "if Content-Length is given" do
|
71
|
+
before :each do
|
72
|
+
init_input("hello!", "CONTENT_LENGTH" => 5)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "slurps up to Content-Length bytes from the socket" do
|
76
|
+
@input.read.should == "hello"
|
77
|
+
end
|
78
|
+
|
79
|
+
it "returns the empty string if EOF is reached" do
|
80
|
+
@input.read
|
81
|
+
@input.read.should == ""
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "if Transfer-Encoding is chunked" do
|
86
|
+
before :each do
|
87
|
+
init_input("hello!", "TRANSFER_ENCODING" => "chunked")
|
88
|
+
end
|
89
|
+
|
90
|
+
it "slurps the entire socket" do
|
91
|
+
@input.read.should == "hello!"
|
92
|
+
end
|
93
|
+
|
94
|
+
it "returns the empty string if EOF is reached" do
|
95
|
+
@input.read
|
96
|
+
@input.read.should == ""
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "if neither Content-Length nor Transfer-Encoding chunked are given" do
|
101
|
+
before :each do
|
102
|
+
init_input("hello!")
|
103
|
+
end
|
104
|
+
|
105
|
+
it "returns the empty string" do
|
106
|
+
@input.read.should == ""
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "with a length argument" do
|
112
|
+
it "raises ArgumentError if len < 0" do
|
113
|
+
init_input("")
|
114
|
+
lambda { @input.read(-1) }.should raise_error(ArgumentError)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "returns the empty string if len == 0" do
|
118
|
+
init_input("hello", "TRANSFER_ENCODING" => "chunked")
|
119
|
+
@input.read(0).should == ""
|
120
|
+
end
|
121
|
+
|
122
|
+
context "if Content-Length is given" do
|
123
|
+
before :each do
|
124
|
+
init_input("hello!", "CONTENT_LENGTH" => 5)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "reads exactly len bytes if available" do
|
128
|
+
@input.read(2).should == "he"
|
129
|
+
@input.read(2).should == "ll"
|
130
|
+
end
|
131
|
+
|
132
|
+
it "reads at most Content-Length bytes if Content-Length < len are available" do
|
133
|
+
@input.read(2).should == "he"
|
134
|
+
@input.read(4).should == "llo"
|
135
|
+
end
|
136
|
+
|
137
|
+
it "returns nil if Content-Length is reached" do
|
138
|
+
@input.read(5).should == "hello"
|
139
|
+
@input.read(1).should be_nil
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context "if Transfer-Encoding is chunked" do
|
144
|
+
before :each do
|
145
|
+
init_input("hello", "TRANSFER_ENCODING" => "chunked")
|
146
|
+
end
|
147
|
+
|
148
|
+
it "reads exactly len bytes if available" do
|
149
|
+
@input.read(2).should == "he"
|
150
|
+
@input.read(2).should == "ll"
|
151
|
+
end
|
152
|
+
|
153
|
+
it "reads until EOF if less than len bytes are available" do
|
154
|
+
@input.read(2).should == "he"
|
155
|
+
@input.read(4).should == "llo"
|
156
|
+
end
|
157
|
+
|
158
|
+
it "returns nil if EOF is reached" do
|
159
|
+
@input.read(5).should == "hello"
|
160
|
+
@input.read(1).should be_nil
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
context "if neither Content-Length nor Transfer-Encoding chunked are given" do
|
165
|
+
it "returns nil" do
|
166
|
+
init_input("hello")
|
167
|
+
@input.read(2).should be_nil
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
171
|
end
|
172
172
|
|
173
173
|
shared_examples "TeeInput#size" do
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
174
|
+
context "if Content-Length is given" do
|
175
|
+
it "returns the value in Content-Length" do
|
176
|
+
init_input("hello world", "CONTENT_LENGTH" => 10)
|
177
|
+
@input.size.should == 10
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context "if Transfer-Encoding is chunked" do
|
182
|
+
it "returns the number of bytes that can be read from the socket until EOF" do
|
183
|
+
init_input("hello world", "TRANSFER_ENCODING" => "chunked")
|
184
|
+
@input.size.should == 11
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
context "if neither Content-Length nor Transfer-Encoding chunked are given" do
|
189
|
+
it "returns 0" do
|
190
|
+
init_input("hello world")
|
191
|
+
@input.size.should == 0
|
192
|
+
end
|
193
|
+
end
|
194
194
|
end
|
195
195
|
|
196
196
|
describe Utils::TeeInput do
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
197
|
+
before :each do
|
198
|
+
@sock, @sock2 = UNIXSocket.pair
|
199
|
+
end
|
200
|
+
|
201
|
+
after :each do
|
202
|
+
[@sock, @sock2].each do |sock|
|
203
|
+
sock.close if sock && !sock.closed?
|
204
|
+
end
|
205
|
+
@input.close if @input
|
206
|
+
end
|
207
|
+
|
208
|
+
context "when unbuffered" do
|
209
|
+
def init_input(data, env = {})
|
210
|
+
@input = Utils::TeeInput.new(@sock2, env)
|
211
|
+
@sock.write(data)
|
212
|
+
@sock.close
|
213
|
+
end
|
214
|
+
|
215
|
+
describe("#gets") { include_examples "TeeInput#gets" }
|
216
|
+
describe("#read") { include_examples "TeeInput#read" }
|
217
|
+
describe("#size") { include_examples "TeeInput#size" }
|
218
|
+
end
|
219
|
+
|
220
|
+
context "when buffered" do
|
221
|
+
def init_input(data, env = {})
|
222
|
+
@input = Utils::TeeInput.new(@sock2, env)
|
223
|
+
@sock.write(data)
|
224
|
+
@sock.close
|
225
|
+
@input.read
|
226
|
+
@input.rewind
|
227
|
+
end
|
228
|
+
|
229
|
+
describe("#gets") { include_examples "TeeInput#gets" }
|
230
|
+
describe("#read") { include_examples "TeeInput#read" }
|
231
|
+
describe("#size") { include_examples "TeeInput#size" }
|
232
|
+
end
|
233
233
|
end
|
234
234
|
|
235
235
|
end # module PhusionPassenger
|
@@ -4,63 +4,63 @@ PhusionPassenger.require_passenger_lib 'utils/unseekable_socket'
|
|
4
4
|
module PhusionPassenger
|
5
5
|
|
6
6
|
describe Utils::UnseekableSocket do
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
7
|
+
class MyException < StandardError
|
8
|
+
end
|
9
|
+
|
10
|
+
class MySocket
|
11
|
+
def write(data)
|
12
|
+
end
|
13
|
+
|
14
|
+
def gets
|
15
|
+
end
|
16
|
+
|
17
|
+
def sync=(value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
before :each do
|
22
|
+
@socket = MySocket.new
|
23
|
+
@wrapper = Utils::UnseekableSocket.wrap(@socket)
|
24
|
+
end
|
25
|
+
|
26
|
+
def catch_exception
|
27
|
+
yield
|
28
|
+
return nil
|
29
|
+
rescue MyException => e
|
30
|
+
return e
|
31
|
+
end
|
32
|
+
|
33
|
+
it "delegates method calls to the wrapped socket" do
|
34
|
+
@socket.should_receive(:write).with("some data")
|
35
|
+
@socket.should_receive(:gets)
|
36
|
+
@wrapper.write("some data")
|
37
|
+
@wrapper.gets
|
38
|
+
end
|
39
|
+
|
40
|
+
it "annotates exceptions so that we can identify its source" do
|
41
|
+
@wrapper.source_of_exception?(MyException.new("foo")).should be_false
|
42
|
+
|
43
|
+
@socket.should_receive(:write).at_least(:once).and_raise(MyException.new("an error"))
|
44
|
+
@wrapper2 = Utils::UnseekableSocket.wrap(@socket)
|
45
|
+
e1 = catch_exception { @wrapper.write("hello") }
|
46
|
+
|
47
|
+
@wrapper.source_of_exception?(e1).should be_true
|
48
|
+
@wrapper2.source_of_exception?(e1).should be_true
|
49
|
+
|
50
|
+
@socket2 = MySocket.new
|
51
|
+
@socket2.should_receive(:write).at_least(:once).and_raise(MyException.new("an error"))
|
52
|
+
@wrapper.wrap(@socket2)
|
53
|
+
@wrapper2.wrap(@socket2)
|
54
|
+
e2 = catch_exception { @wrapper.write("hello") }
|
55
|
+
|
56
|
+
@wrapper.source_of_exception?(e1).should be_false
|
57
|
+
@wrapper2.source_of_exception?(e1).should be_false
|
58
|
+
@wrapper.source_of_exception?(e2).should be_true
|
59
|
+
@wrapper2.source_of_exception?(e2).should be_true
|
60
|
+
|
61
|
+
Utils::UnseekableSocket.new.source_of_exception?(e1).should be_false
|
62
|
+
Utils::UnseekableSocket.new.source_of_exception?(e2).should be_false
|
63
|
+
end
|
64
64
|
end
|
65
65
|
|
66
66
|
end # module PhusionPassenger
|