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.

Files changed (218) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +11 -5
  5. data/CHANGELOG +38 -0
  6. data/CONTRIBUTING.md +1 -4
  7. data/Gemfile +0 -1
  8. data/Gemfile.lock +0 -2
  9. data/Rakefile +33 -33
  10. data/bin/passenger +1 -1
  11. data/bin/passenger-config +1 -1
  12. data/bin/passenger-install-apache2-module +800 -800
  13. data/bin/passenger-install-nginx-module +592 -592
  14. data/bin/passenger-memory-stats +127 -127
  15. data/bin/passenger-status +216 -216
  16. data/build/agents.rb +127 -127
  17. data/build/apache2.rb +87 -87
  18. data/build/basics.rb +60 -60
  19. data/build/common_library.rb +165 -165
  20. data/build/cplusplus_support.rb +51 -51
  21. data/build/cxx_tests.rb +268 -268
  22. data/build/debian.rb +143 -143
  23. data/build/documentation.rb +58 -58
  24. data/build/integration_tests.rb +81 -81
  25. data/build/misc.rb +132 -132
  26. data/build/nginx.rb +20 -20
  27. data/build/node_tests.rb +7 -7
  28. data/build/oxt_tests.rb +14 -14
  29. data/build/packaging.rb +570 -570
  30. data/build/preprocessor.rb +260 -260
  31. data/build/rake_extensions.rb +71 -71
  32. data/build/ruby_extension.rb +29 -29
  33. data/build/ruby_tests.rb +6 -6
  34. data/build/test_basics.rb +37 -37
  35. data/debian.template/control.template +3 -5
  36. data/dev/copy_boost_headers +134 -134
  37. data/dev/install_scripts_bootstrap_code.rb +25 -25
  38. data/dev/list_tests +20 -20
  39. data/dev/ruby_server.rb +223 -223
  40. data/dev/runner +18 -18
  41. data/doc/ServerOptimizationGuide.txt.md +55 -2
  42. data/doc/Users guide Nginx.txt +0 -26
  43. data/doc/Users guide Standalone.txt +5 -1
  44. data/doc/users_guide_snippets/tips.txt +9 -0
  45. data/ext/common/ApplicationPool2/Group.h +23 -11
  46. data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
  47. data/ext/common/ApplicationPool2/Pool.h +22 -17
  48. data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
  49. data/ext/common/ApplicationPool2/Spawner.h +1 -1
  50. data/ext/common/Constants.h +1 -1
  51. data/ext/common/agents/Base.cpp +35 -20
  52. data/ext/common/agents/HelperAgent/Main.cpp +8 -1
  53. data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
  54. data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
  55. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
  56. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
  57. data/ext/common/agents/Main.cpp +1 -1
  58. data/ext/common/agents/Watchdog/Main.cpp +54 -19
  59. data/ext/nginx/Configuration.c +7 -0
  60. data/ext/nginx/ContentHandler.c +9 -1
  61. data/helper-scripts/backtrace-sanitizer.rb +106 -87
  62. data/helper-scripts/crash-watch.rb +32 -0
  63. data/helper-scripts/download_binaries/extconf.rb +38 -38
  64. data/helper-scripts/meteor-loader.rb +107 -107
  65. data/helper-scripts/prespawn +101 -101
  66. data/helper-scripts/rack-loader.rb +96 -96
  67. data/helper-scripts/rack-preloader.rb +137 -137
  68. data/lib/phusion_passenger.rb +292 -292
  69. data/lib/phusion_passenger/abstract_installer.rb +438 -438
  70. data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
  71. data/lib/phusion_passenger/admin_tools.rb +20 -20
  72. data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
  73. data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
  74. data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
  75. data/lib/phusion_passenger/apache2/config_options.rb +182 -182
  76. data/lib/phusion_passenger/common_library.rb +479 -485
  77. data/lib/phusion_passenger/config/about_command.rb +161 -161
  78. data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
  79. data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
  80. data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
  81. data/lib/phusion_passenger/config/command.rb +25 -25
  82. data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
  83. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
  84. data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
  85. data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
  86. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
  87. data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
  88. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
  89. data/lib/phusion_passenger/config/installation_utils.rb +204 -204
  90. data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
  91. data/lib/phusion_passenger/config/main.rb +152 -152
  92. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
  93. data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
  94. data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
  95. data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
  96. data/lib/phusion_passenger/config/utils.rb +95 -95
  97. data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
  98. data/lib/phusion_passenger/console_text_template.rb +25 -25
  99. data/lib/phusion_passenger/constants.rb +90 -90
  100. data/lib/phusion_passenger/debug_logging.rb +106 -106
  101. data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
  102. data/lib/phusion_passenger/message_channel.rb +312 -312
  103. data/lib/phusion_passenger/message_client.rb +176 -176
  104. data/lib/phusion_passenger/native_support.rb +369 -369
  105. data/lib/phusion_passenger/nginx/config_options.rb +297 -297
  106. data/lib/phusion_passenger/packaging.rb +131 -131
  107. data/lib/phusion_passenger/platform_info.rb +360 -360
  108. data/lib/phusion_passenger/platform_info/apache.rb +767 -767
  109. data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
  110. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
  111. data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
  112. data/lib/phusion_passenger/platform_info/curl.rb +32 -32
  113. data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
  114. data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
  115. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
  116. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  117. data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
  118. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
  119. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
  120. data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
  121. data/lib/phusion_passenger/platform_info/linux.rb +55 -55
  122. data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
  123. data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
  124. data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
  125. data/lib/phusion_passenger/plugin.rb +66 -66
  126. data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
  127. data/lib/phusion_passenger/public_api.rb +191 -191
  128. data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
  129. data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
  130. data/lib/phusion_passenger/request_handler.rb +567 -577
  131. data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
  132. data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
  133. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
  134. data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
  135. data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
  136. data/lib/phusion_passenger/standalone/command.rb +44 -40
  137. data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
  138. data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
  139. data/lib/phusion_passenger/standalone/main.rb +73 -73
  140. data/lib/phusion_passenger/standalone/start_command.rb +697 -685
  141. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
  142. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
  143. data/lib/phusion_passenger/standalone/status_command.rb +64 -64
  144. data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
  145. data/lib/phusion_passenger/standalone/version_command.rb +9 -9
  146. data/lib/phusion_passenger/union_station/connection.rb +32 -32
  147. data/lib/phusion_passenger/union_station/core.rb +251 -251
  148. data/lib/phusion_passenger/union_station/transaction.rb +126 -126
  149. data/lib/phusion_passenger/utils.rb +199 -167
  150. data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
  151. data/lib/phusion_passenger/utils/download.rb +196 -196
  152. data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
  153. data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
  154. data/lib/phusion_passenger/utils/lock.rb +31 -31
  155. data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
  156. data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
  157. data/lib/phusion_passenger/utils/shellwords.rb +20 -20
  158. data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
  159. data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
  160. data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
  161. data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
  162. data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
  163. data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
  164. data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
  165. data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
  166. data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
  167. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
  168. data/passenger.gemspec +0 -1
  169. data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
  170. data/resources/templates/standalone/config.erb +19 -15
  171. data/test/integration_tests/apache2_tests.rb +566 -566
  172. data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
  173. data/test/integration_tests/native_packaging_spec.rb +296 -296
  174. data/test/integration_tests/nginx_tests.rb +393 -393
  175. data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
  176. data/test/integration_tests/source_packaging_test.rb +138 -138
  177. data/test/integration_tests/spec_helper.rb +5 -5
  178. data/test/integration_tests/standalone_tests.rb +367 -367
  179. data/test/ruby/debug_logging_spec.rb +133 -133
  180. data/test/ruby/message_channel_spec.rb +186 -186
  181. data/test/ruby/rack/loader_spec.rb +28 -28
  182. data/test/ruby/rack/preloader_spec.rb +34 -34
  183. data/test/ruby/rails3.0/loader_spec.rb +12 -12
  184. data/test/ruby/rails3.0/preloader_spec.rb +18 -18
  185. data/test/ruby/rails3.1/loader_spec.rb +12 -12
  186. data/test/ruby/rails3.1/preloader_spec.rb +18 -18
  187. data/test/ruby/rails3.2/loader_spec.rb +12 -12
  188. data/test/ruby/rails3.2/preloader_spec.rb +18 -18
  189. data/test/ruby/rails4.0/loader_spec.rb +12 -12
  190. data/test/ruby/rails4.0/preloader_spec.rb +18 -18
  191. data/test/ruby/rails4.1/loader_spec.rb +12 -12
  192. data/test/ruby/rails4.1/preloader_spec.rb +18 -18
  193. data/test/ruby/request_handler_spec.rb +730 -730
  194. data/test/ruby/shared/loader_sharedspec.rb +224 -224
  195. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
  196. data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
  197. data/test/ruby/spec_helper.rb +65 -65
  198. data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
  199. data/test/ruby/union_station_spec.rb +276 -276
  200. data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
  201. data/test/ruby/utils/hosts_file_parser.rb +248 -248
  202. data/test/ruby/utils/tee_input_spec.rb +215 -215
  203. data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
  204. data/test/ruby/utils_spec.rb +21 -21
  205. data/test/stub/rack/config.ru +87 -87
  206. data/test/stub/rack/library.rb +8 -8
  207. data/test/stub/rack/start.rb +30 -30
  208. data/test/support/apache2_controller.rb +191 -191
  209. data/test/support/nginx_controller.rb +90 -99
  210. data/test/support/placebo-preloader.rb +57 -57
  211. data/test/support/test_helper.rb +435 -435
  212. metadata +11 -21
  213. metadata.gz.asc +7 -7
  214. data/lib/phusion_passenger/standalone/command2.rb +0 -292
  215. data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
  216. data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
  217. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
  218. 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
- 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
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
- 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
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
- 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
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
- 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
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
- 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
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