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
@@ -5,243 +5,243 @@ PhusionPassenger.require_passenger_lib 'message_channel'
5
5
  module PhusionPassenger
6
6
 
7
7
  class Loader
8
- attr_reader :pid, :input, :output, :sockets
9
-
10
- def initialize(command, app_root)
11
- @app_root = app_root
12
- a, input = UNIXSocket.pair
13
- c, output = UNIXSocket.pair
14
- @pid = pid = fork do
15
- STDIN.reopen(a)
16
- STDOUT.reopen(c)
17
- input.close
18
- output.close
19
- Dir.chdir(app_root)
20
- ENV['RAILS_ENV'] = ENV['RACK_ENV'] = ENV['PASSENGER_ENV'] = 'production'
21
- exec(*command)
22
- end
23
- a.close
24
- c.close
25
- @input = input
26
- @output = output
27
- @sockets = {}
28
- end
29
-
30
- def self.new_with_sockets(input, output, app_root)
31
- result = allocate
32
- result.instance_variable_set(:@input, input)
33
- result.instance_variable_set(:@output, output)
34
- result.instance_variable_set(:@app_root, app_root)
35
- result.instance_variable_set(:@sockets, {})
36
- return result
37
- end
38
-
39
- def close
40
- @input.close_write
41
- # Wait at most 100 msec for process to exit.
42
- select([@output], nil, nil, 0.1)
43
-
44
- @input.close if !@input.closed?
45
- @output.close if !@output.closed?
46
- if @pid
47
- begin
48
- Process.kill('TERM', @pid)
49
- rescue Errno::ESRCH
50
- end
51
- begin
52
- Process.waitpid(@pid)
53
- rescue Errno::ECHILD
54
- end
55
- end
56
- end
57
-
58
- def start(options = {})
59
- init_message = read_response_line
60
- if init_message != "I have control 1.0\n"
61
- raise "Unknown response initialization message: #{init_message.inspect}"
62
- end
63
- write_request_line "You have control 1.0"
64
- write_start_request(options)
65
- return process_response
66
- end
67
-
68
- def connect_and_send_request(headers)
69
- socket = Utils.connect_to_server(sockets["main"][:address])
70
- channel = MessageChannel.new(socket)
71
- data = ""
72
- headers["REQUEST_METHOD"] ||= "GET"
73
- headers["REQUEST_URI"] ||= headers["PATH_INFO"]
74
- headers["QUERY_STRING"] ||= ""
75
- headers["SCRIPT_NAME"] ||= ""
76
- headers.each_pair do |key, value|
77
- data << "#{key}\0#{value}\0"
78
- end
79
- channel.write_scalar(data)
80
- return socket
81
- end
8
+ attr_reader :pid, :input, :output, :sockets
9
+
10
+ def initialize(command, app_root)
11
+ @app_root = app_root
12
+ a, input = UNIXSocket.pair
13
+ c, output = UNIXSocket.pair
14
+ @pid = pid = fork do
15
+ STDIN.reopen(a)
16
+ STDOUT.reopen(c)
17
+ input.close
18
+ output.close
19
+ Dir.chdir(app_root)
20
+ ENV['RAILS_ENV'] = ENV['RACK_ENV'] = ENV['PASSENGER_ENV'] = 'production'
21
+ exec(*command)
22
+ end
23
+ a.close
24
+ c.close
25
+ @input = input
26
+ @output = output
27
+ @sockets = {}
28
+ end
29
+
30
+ def self.new_with_sockets(input, output, app_root)
31
+ result = allocate
32
+ result.instance_variable_set(:@input, input)
33
+ result.instance_variable_set(:@output, output)
34
+ result.instance_variable_set(:@app_root, app_root)
35
+ result.instance_variable_set(:@sockets, {})
36
+ return result
37
+ end
38
+
39
+ def close
40
+ @input.close_write
41
+ # Wait at most 100 msec for process to exit.
42
+ select([@output], nil, nil, 0.1)
43
+
44
+ @input.close if !@input.closed?
45
+ @output.close if !@output.closed?
46
+ if @pid
47
+ begin
48
+ Process.kill('TERM', @pid)
49
+ rescue Errno::ESRCH
50
+ end
51
+ begin
52
+ Process.waitpid(@pid)
53
+ rescue Errno::ECHILD
54
+ end
55
+ end
56
+ end
57
+
58
+ def start(options = {})
59
+ init_message = read_response_line
60
+ if init_message != "I have control 1.0\n"
61
+ raise "Unknown response initialization message: #{init_message.inspect}"
62
+ end
63
+ write_request_line "You have control 1.0"
64
+ write_start_request(options)
65
+ return process_response
66
+ end
67
+
68
+ def connect_and_send_request(headers)
69
+ socket = Utils.connect_to_server(sockets["main"][:address])
70
+ channel = MessageChannel.new(socket)
71
+ data = ""
72
+ headers["REQUEST_METHOD"] ||= "GET"
73
+ headers["REQUEST_URI"] ||= headers["PATH_INFO"]
74
+ headers["QUERY_STRING"] ||= ""
75
+ headers["SCRIPT_NAME"] ||= ""
76
+ headers.each_pair do |key, value|
77
+ data << "#{key}\0#{value}\0"
78
+ end
79
+ channel.write_scalar(data)
80
+ return socket
81
+ end
82
82
 
83
83
  private
84
- def write_request_line(line = "")
85
- STDERR.puts "---> #{line}" if DEBUG
86
- @input.puts line
87
- end
88
-
89
- def read_response_line
90
- while true
91
- line = @output.readline
92
- STDERR.puts "<--- #{line.strip}" if DEBUG
93
- if line.start_with?("!> ")
94
- line.sub!(/^\!> /, '')
95
- return line
96
- end
97
- end
98
- end
99
-
100
- def write_start_request(options)
101
- write_request_line "passenger_root: #{PhusionPassenger.install_spec}"
102
- write_request_line "ruby_libdir: #{PhusionPassenger.ruby_libdir}"
103
- write_request_line "keepalive: false"
104
- write_request_line "log_level: 6" if DEBUG
105
- options.each_pair do |key, value|
106
- write_request_line "#{key}: #{value}"
107
- end
108
- write_request_line
109
- end
110
-
111
- def process_response
112
- status = read_response_line
113
-
114
- headers = {}
115
- line = read_response_line
116
- while line != "\n"
117
- key, value = line.strip.split(/ *: */, 2)
118
- if key == "socket"
119
- process_socket(value)
120
- else
121
- headers[key] = value
122
- end
123
- line = read_response_line
124
- end
125
-
126
- if status == "Error\n"
127
- body = @output.read
128
- STDERR.puts "<--- #{body}" if DEBUG
129
- end
130
-
131
- return { :status => status.strip, :headers => headers, :body => body }
132
- end
133
-
134
- def process_socket(spec)
135
- name, address, protocol, concurrency = spec.split(';')
136
- @sockets[name] = { :address => address, :protocol => protocol, :concurrency => concurrency }
137
- end
84
+ def write_request_line(line = "")
85
+ STDERR.puts "---> #{line}" if DEBUG
86
+ @input.puts line
87
+ end
88
+
89
+ def read_response_line
90
+ while true
91
+ line = @output.readline
92
+ STDERR.puts "<--- #{line.strip}" if DEBUG
93
+ if line.start_with?("!> ")
94
+ line.sub!(/^\!> /, '')
95
+ return line
96
+ end
97
+ end
98
+ end
99
+
100
+ def write_start_request(options)
101
+ write_request_line "passenger_root: #{PhusionPassenger.install_spec}"
102
+ write_request_line "ruby_libdir: #{PhusionPassenger.ruby_libdir}"
103
+ write_request_line "keepalive: false"
104
+ write_request_line "log_level: 6" if DEBUG
105
+ options.each_pair do |key, value|
106
+ write_request_line "#{key}: #{value}"
107
+ end
108
+ write_request_line
109
+ end
110
+
111
+ def process_response
112
+ status = read_response_line
113
+
114
+ headers = {}
115
+ line = read_response_line
116
+ while line != "\n"
117
+ key, value = line.strip.split(/ *: */, 2)
118
+ if key == "socket"
119
+ process_socket(value)
120
+ else
121
+ headers[key] = value
122
+ end
123
+ line = read_response_line
124
+ end
125
+
126
+ if status == "Error\n"
127
+ body = @output.read
128
+ STDERR.puts "<--- #{body}" if DEBUG
129
+ end
130
+
131
+ return { :status => status.strip, :headers => headers, :body => body }
132
+ end
133
+
134
+ def process_socket(spec)
135
+ name, address, protocol, concurrency = spec.split(';')
136
+ @sockets[name] = { :address => address, :protocol => protocol, :concurrency => concurrency }
137
+ end
138
138
  end
139
139
 
140
140
  class Preloader < Loader
141
- def spawn(options = {})
142
- socket = Utils.connect_to_server(sockets["spawn"])
143
- loader = Loader.new_with_sockets(socket, socket.dup, @app_root)
144
- begin
145
- loader.send(:write_request_line, "spawn")
146
- loader.send(:write_start_request, options)
147
-
148
- line = loader.output.readline
149
- puts "<--- #{line.strip}" if DEBUG
150
- if line != "OK\n"
151
- raise "Unexpected spawn response status #{line.inspect}"
152
- end
153
-
154
- line = loader.output.readline
155
- puts "<--- #{line.strip}" if DEBUG
156
- loader.instance_variable_set(:@pid, line.to_i)
157
-
158
- return loader
159
- rescue
160
- loader.close
161
- raise
162
- end
163
- end
141
+ def spawn(options = {})
142
+ socket = Utils.connect_to_server(sockets["spawn"])
143
+ loader = Loader.new_with_sockets(socket, socket.dup, @app_root)
144
+ begin
145
+ loader.send(:write_request_line, "spawn")
146
+ loader.send(:write_start_request, options)
147
+
148
+ line = loader.output.readline
149
+ puts "<--- #{line.strip}" if DEBUG
150
+ if line != "OK\n"
151
+ raise "Unexpected spawn response status #{line.inspect}"
152
+ end
153
+
154
+ line = loader.output.readline
155
+ puts "<--- #{line.strip}" if DEBUG
156
+ loader.instance_variable_set(:@pid, line.to_i)
157
+
158
+ return loader
159
+ rescue
160
+ loader.close
161
+ raise
162
+ end
163
+ end
164
164
 
165
165
  private
166
- def process_socket(spec)
167
- sockets["spawn"] = spec
168
- end
166
+ def process_socket(spec)
167
+ sockets["spawn"] = spec
168
+ end
169
169
  end
170
170
 
171
171
  module LoaderSpecHelper
172
- def self.included(klass)
173
- klass.before(:each) do
174
- @stubs = []
175
- end
176
-
177
- klass.after(:each) do
178
- begin
179
- @loader.close if @loader
180
- @preloader.close if @preloader
181
- ensure
182
- @stubs.each do |stub|
183
- stub.destroy
184
- end
185
- end
186
- end
187
- end
188
-
189
- def before_start(code)
190
- @before_start = code
191
- end
192
-
193
- def after_start(code)
194
- @after_start = code
195
- end
196
-
197
- def register_stub(stub)
198
- @stubs << stub
199
- File.prepend(stub.startup_file, "#{@before_start}\n")
200
- File.append(stub.startup_file, "\n#{@after_start}")
201
- return stub
202
- end
203
-
204
- def register_app(app)
205
- @apps << app
206
- return app
207
- end
208
-
209
- def start!(options = {})
210
- result = start(options)
211
- if result[:status] != "Ready"
212
- raise "Loader failed to start; error page:\n#{result[:body]}"
213
- end
214
- end
215
-
216
- def perform_request(headers)
217
- socket = @loader.connect_and_send_request(headers)
218
- headers = {}
219
- line = socket.readline
220
- headers["Status"] = line.split(" ")[1]
221
- while line != "\r\n"
222
- key, value = line.strip.split(/ *: */, 2)
223
- headers[key] = value
224
- line = socket.readline
225
- end
226
- body = socket.read
227
- socket.close
228
- return [headers, body]
229
- end
172
+ def self.included(klass)
173
+ klass.before(:each) do
174
+ @stubs = []
175
+ end
176
+
177
+ klass.after(:each) do
178
+ begin
179
+ @loader.close if @loader
180
+ @preloader.close if @preloader
181
+ ensure
182
+ @stubs.each do |stub|
183
+ stub.destroy
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ def before_start(code)
190
+ @before_start = code
191
+ end
192
+
193
+ def after_start(code)
194
+ @after_start = code
195
+ end
196
+
197
+ def register_stub(stub)
198
+ @stubs << stub
199
+ File.prepend(stub.startup_file, "#{@before_start}\n")
200
+ File.append(stub.startup_file, "\n#{@after_start}")
201
+ return stub
202
+ end
203
+
204
+ def register_app(app)
205
+ @apps << app
206
+ return app
207
+ end
208
+
209
+ def start!(options = {})
210
+ result = start(options)
211
+ if result[:status] != "Ready"
212
+ raise "Loader failed to start; error page:\n#{result[:body]}"
213
+ end
214
+ end
215
+
216
+ def perform_request(headers)
217
+ socket = @loader.connect_and_send_request(headers)
218
+ headers = {}
219
+ line = socket.readline
220
+ headers["Status"] = line.split(" ")[1]
221
+ while line != "\r\n"
222
+ key, value = line.strip.split(/ *: */, 2)
223
+ headers[key] = value
224
+ line = socket.readline
225
+ end
226
+ body = socket.read
227
+ socket.close
228
+ return [headers, body]
229
+ end
230
230
  end
231
231
 
232
232
  shared_examples_for "a loader" do
233
- it "works" do
234
- result = start
235
- result[:status].should == "Ready"
236
- headers, body = perform_request(
237
- "REQUEST_METHOD" => "GET",
238
- "PATH_INFO" => "/",
239
- # For Rails 2
240
- "REQUEST_URI" => "/"
241
- )
242
- headers["Status"].should == "200"
243
- body.should == "front page"
244
- end
233
+ it "works" do
234
+ result = start
235
+ result[:status].should == "Ready"
236
+ headers, body = perform_request(
237
+ "REQUEST_METHOD" => "GET",
238
+ "PATH_INFO" => "/",
239
+ # For Rails 2
240
+ "REQUEST_URI" => "/"
241
+ )
242
+ headers["Status"].should == "200"
243
+ body.should == "front page"
244
+ end
245
245
  end
246
246
 
247
247
  end # module PhusionPassenger