passenger 6.1.4 → 6.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +12 -1
- data/Rakefile +1 -1
- data/build/agent.rb +15 -15
- data/build/apache2.rb +18 -18
- data/build/basics.rb +1 -1
- data/build/common_library.rb +21 -20
- data/build/cxx_tests.rb +19 -19
- data/build/integration_tests.rb +3 -3
- data/build/misc.rb +10 -9
- data/build/nginx.rb +12 -12
- data/build/oxt_tests.rb +7 -7
- data/build/packaging.rb +11 -11
- data/build/ruby_extension.rb +3 -3
- data/build/ruby_tests.rb +1 -1
- data/build/schema_printer.rb +13 -13
- data/build/support/cplusplus.rb +8 -8
- data/build/support/cxx_dependency_map.rb +622 -622
- data/build/support/general.rb +0 -1
- data/build/support/vendor/cxx_hinted_parser/lib/cxx_hinted_parser/parser.rb +4 -4
- data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/builder.rb +1 -1
- data/build/test_basics.rb +4 -4
- data/dev/colorize-logs +6 -6
- data/dev/copy_boost_headers +8 -8
- data/dev/index_cxx_dependencies.rb +6 -6
- data/dev/install_scripts_bootstrap_code.rb +4 -4
- data/dev/list_tests +2 -2
- data/dev/nginx_version_sha256 +2 -2
- data/dev/parse_file_descriptor_log +1 -1
- data/passenger.gemspec +4 -4
- data/src/agent/Core/Config.h +1 -1
- data/src/agent/Core/Controller/Config.h +1 -1
- data/src/agent/Watchdog/Config.h +1 -1
- data/src/cxx_supportlib/Constants.h +1 -1
- data/src/helper-scripts/backtrace-sanitizer.rb +2 -2
- data/src/helper-scripts/download_binaries/extconf.rb +8 -8
- data/src/helper-scripts/meteor-loader.rb +39 -39
- data/src/helper-scripts/rack-loader.rb +1 -0
- data/src/helper-scripts/rack-preloader.rb +2 -1
- data/src/ruby_native_extension/extconf.rb +27 -28
- data/src/ruby_supportlib/phusion_passenger/abstract_installer.rb +27 -27
- data/src/ruby_supportlib/phusion_passenger/admin_tools/instance.rb +5 -4
- data/src/ruby_supportlib/phusion_passenger/admin_tools/instance_registry.rb +9 -8
- data/src/ruby_supportlib/phusion_passenger/admin_tools/memory_stats.rb +24 -24
- data/src/ruby_supportlib/phusion_passenger/admin_tools.rb +5 -5
- data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +526 -526
- data/src/ruby_supportlib/phusion_passenger/apache2/config_utils.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/common_library.rb +105 -105
- data/src/ruby_supportlib/phusion_passenger/config/about_command.rb +5 -5
- data/src/ruby_supportlib/phusion_passenger/config/agent_compiler.rb +7 -6
- data/src/ruby_supportlib/phusion_passenger/config/api_call_command.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/config/command.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/config/compile_agent_command.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +5 -5
- data/src/ruby_supportlib/phusion_passenger/config/detach_process_command.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/config/download_agent_command.rb +17 -17
- data/src/ruby_supportlib/phusion_passenger/config/download_nginx_engine_command.rb +18 -18
- data/src/ruby_supportlib/phusion_passenger/config/install_agent_command.rb +10 -10
- data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +12 -12
- data/src/ruby_supportlib/phusion_passenger/config/installation_utils.rb +24 -23
- data/src/ruby_supportlib/phusion_passenger/config/main.rb +26 -26
- data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +5 -4
- data/src/ruby_supportlib/phusion_passenger/config/reopen_logs_command.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/config/restart_app_command.rb +4 -4
- data/src/ruby_supportlib/phusion_passenger/config/system_properties_command.rb +14 -13
- data/src/ruby_supportlib/phusion_passenger/config/utils.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/config/validate_install_command.rb +34 -33
- data/src/ruby_supportlib/phusion_passenger/console_text_template.rb +3 -2
- data/src/ruby_supportlib/phusion_passenger/debug_logging.rb +2 -2
- data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +35 -36
- data/src/ruby_supportlib/phusion_passenger/message_channel.rb +17 -16
- data/src/ruby_supportlib/phusion_passenger/message_client.rb +5 -4
- data/src/ruby_supportlib/phusion_passenger/native_support.rb +42 -42
- data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +548 -548
- data/src/ruby_supportlib/phusion_passenger/packaging.rb +6 -6
- data/src/ruby_supportlib/phusion_passenger/platform_info/apache.rb +85 -84
- data/src/ruby_supportlib/phusion_passenger/platform_info/apache_detector.rb +13 -13
- data/src/ruby_supportlib/phusion_passenger/platform_info/binary_compatibility.rb +5 -5
- data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +65 -65
- data/src/ruby_supportlib/phusion_passenger/platform_info/crypto.rb +6 -6
- data/src/ruby_supportlib/phusion_passenger/platform_info/curl.rb +5 -5
- data/src/ruby_supportlib/phusion_passenger/platform_info/cxx_portability.rb +10 -10
- data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck.rb +6 -5
- data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +7 -7
- data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/libs.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +7 -7
- data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/platform_info/linux.rb +14 -13
- data/src/ruby_supportlib/phusion_passenger/platform_info/networking.rb +27 -26
- data/src/ruby_supportlib/phusion_passenger/platform_info/operating_system.rb +16 -16
- data/src/ruby_supportlib/phusion_passenger/platform_info/pcre.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/platform_info/ruby.rb +29 -28
- data/src/ruby_supportlib/phusion_passenger/platform_info/zlib.rb +2 -2
- data/src/ruby_supportlib/phusion_passenger/platform_info.rb +37 -36
- data/src/ruby_supportlib/phusion_passenger/plugin.rb +3 -3
- data/src/ruby_supportlib/phusion_passenger/preloader_shared_helpers.rb +16 -15
- data/src/ruby_supportlib/phusion_passenger/public_api.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/rack/handler.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/rack/out_of_band_gc.rb +5 -4
- data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +8 -7
- data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +9 -11
- data/src/ruby_supportlib/phusion_passenger/request_handler.rb +27 -26
- data/src/ruby_supportlib/phusion_passenger/ruby_core_enhancements.rb +6 -5
- data/src/ruby_supportlib/phusion_passenger/ruby_core_io_enhancements.rb +7 -6
- data/src/ruby_supportlib/phusion_passenger/standalone/app_finder.rb +13 -13
- data/src/ruby_supportlib/phusion_passenger/standalone/command.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +351 -351
- data/src/ruby_supportlib/phusion_passenger/standalone/main.rb +11 -11
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +13 -14
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command/nginx_engine.rb +21 -23
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +4 -4
- data/src/ruby_supportlib/phusion_passenger/standalone/status_command.rb +5 -5
- data/src/ruby_supportlib/phusion_passenger/standalone/stop_command.rb +6 -6
- data/src/ruby_supportlib/phusion_passenger/standalone/version_command.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/utils/download.rb +12 -11
- data/src/ruby_supportlib/phusion_passenger/utils/file_system_watcher.rb +9 -9
- data/src/ruby_supportlib/phusion_passenger/utils/hosts_file_parser.rb +8 -7
- data/src/ruby_supportlib/phusion_passenger/utils/json.rb +7 -6
- data/src/ruby_supportlib/phusion_passenger/utils/native_support_utils.rb +4 -4
- data/src/ruby_supportlib/phusion_passenger/utils/progress_bar.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/utils/shellwords.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/utils/strscan.rb +1 -0
- data/src/ruby_supportlib/phusion_passenger/utils/tee_input.rb +1 -0
- data/src/ruby_supportlib/phusion_passenger/utils/terminal_choice_menu.rb +13 -12
- data/src/ruby_supportlib/phusion_passenger/utils/tmpio.rb +2 -3
- data/src/ruby_supportlib/phusion_passenger/utils/unseekable_socket.rb +7 -7
- data/src/ruby_supportlib/phusion_passenger/utils.rb +17 -16
- data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/app.rb +1 -0
- data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +3 -2
- data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/lldb_controller.rb +2 -1
- data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/utils.rb +3 -2
- data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller.rb +13 -13
- data/src/ruby_supportlib/phusion_passenger.rb +27 -26
- metadata +2 -2
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# encoding: binary
|
|
2
|
+
|
|
2
3
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
|
3
4
|
# Copyright (c) 2010-2025 Asynchronous B.V.
|
|
4
5
|
#
|
|
@@ -32,7 +33,7 @@ module PhusionPassenger
|
|
|
32
33
|
module PlatformInfo
|
|
33
34
|
private
|
|
34
35
|
@@cache_dir = nil
|
|
35
|
-
@@verbose = ['1', 'true', 'on', 'yes'].include?(ENV['VERBOSE'])
|
|
36
|
+
@@verbose = [ '1', 'true', 'on', 'yes' ].include?(ENV['VERBOSE'])
|
|
36
37
|
@@log_implementation = lambda do |message|
|
|
37
38
|
message = reindent(message, 3)
|
|
38
39
|
message.sub!(/^ /, '')
|
|
@@ -72,10 +73,10 @@ module PhusionPassenger
|
|
|
72
73
|
metaclass.send(:alias_method, "_unmemoized_#{method}", method)
|
|
73
74
|
variable_name = "@@memoized_#{method}".sub(/\?/, '')
|
|
74
75
|
check_variable_name = "@@has_memoized_#{method}".sub(/\?/, '')
|
|
75
|
-
eval(%Q
|
|
76
|
+
eval(%Q(
|
|
76
77
|
#{variable_name} = nil
|
|
77
78
|
#{check_variable_name} = false
|
|
78
|
-
|
|
79
|
+
))
|
|
79
80
|
line = __LINE__ + 1
|
|
80
81
|
source = %Q{
|
|
81
82
|
def self.#{method}(*args) # def self.httpd(*args)
|
|
@@ -131,7 +132,7 @@ module PhusionPassenger
|
|
|
131
132
|
return filename
|
|
132
133
|
end
|
|
133
134
|
end
|
|
134
|
-
|
|
135
|
+
nil
|
|
135
136
|
end
|
|
136
137
|
private_class_method :select_executable
|
|
137
138
|
|
|
@@ -139,16 +140,16 @@ module PhusionPassenger
|
|
|
139
140
|
str = str.dup
|
|
140
141
|
str.gsub!(/\A([\s\t]*\n)+/, '')
|
|
141
142
|
str.gsub!(/[\s\t\n]+\Z/, '')
|
|
142
|
-
indent = str.split("\n").select{ |line| !line.strip.empty? }.map{ |line| line.index(/[^\s]/) }.compact.min || 0
|
|
143
|
+
indent = str.split("\n").select { |line| !line.strip.empty? }.map { |line| line.index(/[^\s]/) }.compact.min || 0
|
|
143
144
|
str.gsub!(/^[[:blank:]]{#{indent}}/, '')
|
|
144
|
-
|
|
145
|
+
str
|
|
145
146
|
end
|
|
146
147
|
private_class_method :unindent
|
|
147
148
|
|
|
148
149
|
def self.reindent(str, level)
|
|
149
150
|
str = unindent(str)
|
|
150
151
|
str.gsub!(/^/, ' ' * level)
|
|
151
|
-
|
|
152
|
+
str
|
|
152
153
|
end
|
|
153
154
|
private_class_method :reindent
|
|
154
155
|
|
|
@@ -186,7 +187,7 @@ module PhusionPassenger
|
|
|
186
187
|
end
|
|
187
188
|
|
|
188
189
|
def self.cache_dir
|
|
189
|
-
|
|
190
|
+
@@cache_dir
|
|
190
191
|
end
|
|
191
192
|
|
|
192
193
|
def self.verbose=(val)
|
|
@@ -194,7 +195,7 @@ module PhusionPassenger
|
|
|
194
195
|
end
|
|
195
196
|
|
|
196
197
|
def self.verbose?
|
|
197
|
-
|
|
198
|
+
@@verbose
|
|
198
199
|
end
|
|
199
200
|
|
|
200
201
|
def self.log_implementation=(impl)
|
|
@@ -202,29 +203,29 @@ module PhusionPassenger
|
|
|
202
203
|
end
|
|
203
204
|
|
|
204
205
|
def self.log_implementation
|
|
205
|
-
|
|
206
|
+
@@log_implementation
|
|
206
207
|
end
|
|
207
208
|
|
|
208
209
|
|
|
209
210
|
def self.env_defined?(name)
|
|
210
|
-
|
|
211
|
+
!ENV[name].nil? && !ENV[name].empty?
|
|
211
212
|
end
|
|
212
213
|
|
|
213
214
|
def self.string_env(name, default_value = nil)
|
|
214
215
|
value = ENV[name]
|
|
215
216
|
if value.nil? || value.empty?
|
|
216
|
-
|
|
217
|
+
default_value
|
|
217
218
|
else
|
|
218
|
-
|
|
219
|
+
value
|
|
219
220
|
end
|
|
220
221
|
end
|
|
221
222
|
|
|
222
223
|
def self.read_file(filename)
|
|
223
|
-
|
|
224
|
+
File.open(filename, "rb") do |f|
|
|
224
225
|
f.read
|
|
225
226
|
end
|
|
226
227
|
rescue
|
|
227
|
-
|
|
228
|
+
""
|
|
228
229
|
end
|
|
229
230
|
|
|
230
231
|
# Clears all memoized values. However, the disk cache (if any is configured)
|
|
@@ -240,9 +241,9 @@ module PhusionPassenger
|
|
|
240
241
|
def self.tmpdir
|
|
241
242
|
result = ENV['TMPDIR']
|
|
242
243
|
if result && !result.empty?
|
|
243
|
-
|
|
244
|
+
result.sub(/\/+\Z/, '')
|
|
244
245
|
else
|
|
245
|
-
|
|
246
|
+
'/tmp'
|
|
246
247
|
end
|
|
247
248
|
end
|
|
248
249
|
memoize :tmpdir
|
|
@@ -266,15 +267,15 @@ module PhusionPassenger
|
|
|
266
267
|
if system(filename)
|
|
267
268
|
return dir
|
|
268
269
|
else
|
|
269
|
-
attempts << { :
|
|
270
|
-
:
|
|
270
|
+
attempts << { dir: dir,
|
|
271
|
+
error: "This directory's filesystem is mounted with the 'noexec' option." }
|
|
271
272
|
end
|
|
272
273
|
rescue Errno::ENOENT
|
|
273
|
-
attempts << { :
|
|
274
|
+
attempts << { dir: dir, error: "This directory doesn't exist." }
|
|
274
275
|
rescue Errno::EACCES
|
|
275
|
-
attempts << { :
|
|
276
|
+
attempts << { dir: dir, error: "This program doesn't have permission to write to this directory." }
|
|
276
277
|
rescue SystemCallError => e
|
|
277
|
-
attempts << { :
|
|
278
|
+
attempts << { dir: dir, error: e.message }
|
|
278
279
|
ensure
|
|
279
280
|
File.unlink(filename) rescue nil
|
|
280
281
|
end
|
|
@@ -289,15 +290,15 @@ module PhusionPassenger
|
|
|
289
290
|
if system(filename)
|
|
290
291
|
return dir
|
|
291
292
|
else
|
|
292
|
-
attempts << { :
|
|
293
|
-
:
|
|
293
|
+
attempts << { dir: dir,
|
|
294
|
+
error: "This directory's filesystem is mounted with the 'noexec' option." }
|
|
294
295
|
end
|
|
295
296
|
rescue Errno::ENOENT
|
|
296
|
-
attempts << { :
|
|
297
|
+
attempts << { dir: dir, error: "This directory doesn't exist." }
|
|
297
298
|
rescue Errno::EACCES
|
|
298
|
-
attempts << { :
|
|
299
|
+
attempts << { dir: dir, error: "This program doesn't have permission to write to this directory." }
|
|
299
300
|
rescue SystemCallError => e
|
|
300
|
-
attempts << { :
|
|
301
|
+
attempts << { dir: dir, error: e.message }
|
|
301
302
|
ensure
|
|
302
303
|
File.unlink(filename) rescue nil
|
|
303
304
|
end
|
|
@@ -331,9 +332,9 @@ module PhusionPassenger
|
|
|
331
332
|
|
|
332
333
|
def self.rb_config
|
|
333
334
|
if defined?(::RbConfig)
|
|
334
|
-
|
|
335
|
+
::RbConfig::CONFIG
|
|
335
336
|
else
|
|
336
|
-
|
|
337
|
+
::Config::CONFIG
|
|
337
338
|
end
|
|
338
339
|
end
|
|
339
340
|
|
|
@@ -355,9 +356,9 @@ module PhusionPassenger
|
|
|
355
356
|
end
|
|
356
357
|
if name =~ /^\//
|
|
357
358
|
if File.executable?(name)
|
|
358
|
-
|
|
359
|
+
name
|
|
359
360
|
else
|
|
360
|
-
|
|
361
|
+
nil
|
|
361
362
|
end
|
|
362
363
|
else
|
|
363
364
|
ENV['PATH'].to_s.split(File::PATH_SEPARATOR).each do |directory|
|
|
@@ -367,14 +368,14 @@ module PhusionPassenger
|
|
|
367
368
|
return path
|
|
368
369
|
end
|
|
369
370
|
end
|
|
370
|
-
|
|
371
|
+
nil
|
|
371
372
|
end
|
|
372
373
|
end
|
|
373
374
|
|
|
374
375
|
def self.find_all_commands(name)
|
|
375
376
|
search_dirs = ENV['PATH'].to_s.split(File::PATH_SEPARATOR)
|
|
376
|
-
search_dirs.concat(%w
|
|
377
|
-
["/opt/*/bin", "/opt/*/sbin", "/usr/local/*/bin", "/usr/local/*/sbin"].each do |glob|
|
|
377
|
+
search_dirs.concat(%w[/bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin])
|
|
378
|
+
[ "/opt/*/bin", "/opt/*/sbin", "/usr/local/*/bin", "/usr/local/*/sbin" ].each do |glob|
|
|
378
379
|
search_dirs.concat(Dir[glob])
|
|
379
380
|
end
|
|
380
381
|
|
|
@@ -406,7 +407,7 @@ module PhusionPassenger
|
|
|
406
407
|
result << path
|
|
407
408
|
end
|
|
408
409
|
end
|
|
409
|
-
|
|
410
|
+
result
|
|
410
411
|
end
|
|
411
412
|
|
|
412
413
|
# Check whether the specified command is in $PATH or in
|
|
@@ -416,7 +417,7 @@ module PhusionPassenger
|
|
|
416
417
|
def self.find_system_command(name)
|
|
417
418
|
result = find_command(name)
|
|
418
419
|
if result.nil?
|
|
419
|
-
['/sbin', '/usr/sbin', '/usr/local/sbin'].each do |dir|
|
|
420
|
+
[ '/sbin', '/usr/sbin', '/usr/local/sbin' ].each do |dir|
|
|
420
421
|
path = File.join(dir, name)
|
|
421
422
|
if File.file?(path) && File.executable?(path)
|
|
422
423
|
return path
|
|
@@ -60,7 +60,7 @@ module PhusionPassenger
|
|
|
60
60
|
last_result = callback.call(*args, &block)
|
|
61
61
|
end
|
|
62
62
|
end
|
|
63
|
-
|
|
63
|
+
last_result
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
def self.register(name, klass)
|
|
@@ -76,7 +76,7 @@ module PhusionPassenger
|
|
|
76
76
|
klass.new(*args, &block)
|
|
77
77
|
end
|
|
78
78
|
else
|
|
79
|
-
|
|
79
|
+
nil
|
|
80
80
|
end
|
|
81
81
|
end
|
|
82
82
|
|
|
@@ -89,7 +89,7 @@ module PhusionPassenger
|
|
|
89
89
|
end
|
|
90
90
|
end
|
|
91
91
|
end
|
|
92
|
-
|
|
92
|
+
last_result
|
|
93
93
|
end
|
|
94
94
|
end
|
|
95
95
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# encoding: binary
|
|
2
|
+
|
|
2
3
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
|
3
4
|
# Copyright (c) 2011-2025 Asynchronous B.V.
|
|
4
5
|
#
|
|
@@ -69,8 +70,8 @@ module PhusionPassenger
|
|
|
69
70
|
doc = Utils::JSON.parse(line)
|
|
70
71
|
rescue RuntimeError => e
|
|
71
72
|
client.write(Utils::JSON.generate(
|
|
72
|
-
:
|
|
73
|
-
:
|
|
73
|
+
result: 'error',
|
|
74
|
+
message: "JSON parse error: #{e}"
|
|
74
75
|
))
|
|
75
76
|
end
|
|
76
77
|
|
|
@@ -78,8 +79,8 @@ module PhusionPassenger
|
|
|
78
79
|
handle_spawn_command(client, doc, options)
|
|
79
80
|
else
|
|
80
81
|
client.write(Utils::JSON.generate(
|
|
81
|
-
:
|
|
82
|
-
:
|
|
82
|
+
result: 'error',
|
|
83
|
+
message: "Unknown command #{doc['command'].inspect}"
|
|
83
84
|
))
|
|
84
85
|
nil
|
|
85
86
|
end
|
|
@@ -119,13 +120,13 @@ module PhusionPassenger
|
|
|
119
120
|
'STEP_PERFORMED', work_dir)
|
|
120
121
|
LoaderSharedHelpers.run_block_and_record_step_progress('PRELOADER_SEND_RESPONSE', work_dir) do
|
|
121
122
|
client.write(Utils::JSON.generate(
|
|
122
|
-
:
|
|
123
|
-
:
|
|
123
|
+
result: 'ok',
|
|
124
|
+
pid: Process.pid
|
|
124
125
|
))
|
|
125
126
|
end
|
|
126
127
|
LoaderSharedHelpers.record_journey_step_end('PRELOADER_FINISH',
|
|
127
128
|
'STEP_PERFORMED', work_dir)
|
|
128
|
-
[:forked, work_dir]
|
|
129
|
+
[ :forked, work_dir ]
|
|
129
130
|
rescue Exception => e
|
|
130
131
|
STDERR.puts("Error: #{e}\n#{e.backtrace.join("\n")}")
|
|
131
132
|
exit!(1)
|
|
@@ -139,14 +140,14 @@ module PhusionPassenger
|
|
|
139
140
|
|
|
140
141
|
def advertise_sockets(_options, server)
|
|
141
142
|
json = {
|
|
142
|
-
:
|
|
143
|
+
sockets: [
|
|
143
144
|
{
|
|
144
|
-
:
|
|
145
|
-
:
|
|
146
|
-
:
|
|
147
|
-
:
|
|
148
|
-
}
|
|
149
|
-
]
|
|
145
|
+
name: 'main',
|
|
146
|
+
address: "unix:#{server[1]}",
|
|
147
|
+
protocol: 'preloader',
|
|
148
|
+
concurrency: 1,
|
|
149
|
+
},
|
|
150
|
+
],
|
|
150
151
|
}
|
|
151
152
|
|
|
152
153
|
File.open(ENV['PASSENGER_SPAWN_WORK_DIR'] + '/response/properties.json', 'w') do |f|
|
|
@@ -162,7 +163,7 @@ module PhusionPassenger
|
|
|
162
163
|
# We call ::select just in case someone overwrites the global select()
|
|
163
164
|
# function by including ActionView::Helpers in the wrong place.
|
|
164
165
|
# https://code.google.com/p/phusion-passenger/issues/detail?id=915
|
|
165
|
-
ios = Kernel.select([server_socket, STDIN])[0]
|
|
166
|
+
ios = Kernel.select([ server_socket, STDIN ])[0]
|
|
166
167
|
if ios.include?(server_socket)
|
|
167
168
|
result, subprocess_work_dir = accept_and_process_next_client(server_socket, options)
|
|
168
169
|
if result == :forked
|
|
@@ -45,7 +45,7 @@ module PhusionPassenger
|
|
|
45
45
|
|
|
46
46
|
private
|
|
47
47
|
def build_args(options)
|
|
48
|
-
args = ['-e', environment]
|
|
48
|
+
args = [ '-e', environment ]
|
|
49
49
|
args << '-p' << options[:Port].to_s if options[:Port]
|
|
50
50
|
args << '-a' << options[:Host].to_s if options[:Host]
|
|
51
51
|
args << '-R' << options[:config].to_s if options[:config]
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# encoding: binary
|
|
2
|
+
|
|
2
3
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
|
3
4
|
# Copyright (c) 2012-2025 Asynchronous B.V.
|
|
4
5
|
#
|
|
@@ -66,7 +67,7 @@ module PhusionPassenger
|
|
|
66
67
|
raise "Unrecognized Out-Of-Band GC strategy #{@strategy.inspect}"
|
|
67
68
|
end
|
|
68
69
|
|
|
69
|
-
[status, headers, body]
|
|
70
|
+
[ status, headers, body ]
|
|
70
71
|
end
|
|
71
72
|
|
|
72
73
|
private
|
|
@@ -123,9 +124,9 @@ module PhusionPassenger
|
|
|
123
124
|
|
|
124
125
|
def initialize_legacy(frequency, logger = nil)
|
|
125
126
|
initialize_with_options(
|
|
126
|
-
:
|
|
127
|
-
:
|
|
128
|
-
:
|
|
127
|
+
strategy: :counting,
|
|
128
|
+
frequency: frequency,
|
|
129
|
+
logger: logger)
|
|
129
130
|
end
|
|
130
131
|
end
|
|
131
132
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# encoding: binary
|
|
2
|
+
|
|
2
3
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
|
3
4
|
# Copyright (c) 2010-2025 Asynchronous B.V.
|
|
4
5
|
#
|
|
@@ -41,7 +42,7 @@ module PhusionPassenger
|
|
|
41
42
|
module ThreadHandlerExtension
|
|
42
43
|
# Constants which exist to relieve Ruby's garbage collector.
|
|
43
44
|
RACK_VERSION = "rack.version" # :nodoc:
|
|
44
|
-
RACK_VERSION_VALUE = [1, 3] # :nodoc:
|
|
45
|
+
RACK_VERSION_VALUE = [ 1, 3 ] # :nodoc:
|
|
45
46
|
RACK_INPUT = "rack.input" # :nodoc:
|
|
46
47
|
RACK_ERRORS = "rack.errors" # :nodoc:
|
|
47
48
|
RACK_MULTITHREAD = "rack.multithread" # :nodoc:
|
|
@@ -56,9 +57,9 @@ module PhusionPassenger
|
|
|
56
57
|
SCRIPT_NAME = "SCRIPT_NAME" # :nodoc:
|
|
57
58
|
REQUEST_METHOD = "REQUEST_METHOD" # :nodoc:
|
|
58
59
|
TRANSFER_ENCODING_HEADER = "Transfer-Encoding" # :nodoc:
|
|
59
|
-
TRANSFER_ENCODING_HEADERS = ["Transfer-Encoding", "Transfer-encoding", "transfer-encoding"] # :nodoc:
|
|
60
|
+
TRANSFER_ENCODING_HEADERS = [ "Transfer-Encoding", "Transfer-encoding", "transfer-encoding" ] # :nodoc:
|
|
60
61
|
CONTENT_LENGTH_HEADER = "Content-Length" # :nodoc:
|
|
61
|
-
CONTENT_LENGTH_HEADERS = ["Content-Length", "Content-length", "content-length"] # :nodoc:
|
|
62
|
+
CONTENT_LENGTH_HEADERS = [ "Content-Length", "Content-length", "content-length" ] # :nodoc:
|
|
62
63
|
X_SENDFILE_HEADER = "X-Sendfile" # :nodoc:
|
|
63
64
|
X_ACCEL_REDIRECT_HEADER = "X-Accel-Redirect" # :nodoc:
|
|
64
65
|
CONTENT_LENGTH_HEADER_AND_SEPARATOR = "Content-Length: " # :nodoc
|
|
@@ -191,7 +192,7 @@ module PhusionPassenger
|
|
|
191
192
|
# can respond to #each.
|
|
192
193
|
output_body = should_output_body?(status, is_head_request)
|
|
193
194
|
if body.is_a?(String)
|
|
194
|
-
body = [body]
|
|
195
|
+
body = [ body ]
|
|
195
196
|
elsif body.nil?
|
|
196
197
|
body = []
|
|
197
198
|
elsif output_body && body.is_a?(Array)
|
|
@@ -342,7 +343,7 @@ module PhusionPassenger
|
|
|
342
343
|
|
|
343
344
|
def generate_headers_array(status, headers)
|
|
344
345
|
status_str = status.to_s
|
|
345
|
-
result = ["HTTP/1.1 #{status_str} Whatever\r\n"]
|
|
346
|
+
result = [ "HTTP/1.1 #{status_str} Whatever\r\n" ]
|
|
346
347
|
headers.each do |key, values|
|
|
347
348
|
if values.is_a?(String)
|
|
348
349
|
values = values.split(NEWLINE)
|
|
@@ -362,7 +363,7 @@ module PhusionPassenger
|
|
|
362
363
|
result << CRLF
|
|
363
364
|
end
|
|
364
365
|
end
|
|
365
|
-
|
|
366
|
+
result
|
|
366
367
|
end
|
|
367
368
|
|
|
368
369
|
def lookup_header(haystack, needles)
|
|
@@ -383,7 +384,7 @@ module PhusionPassenger
|
|
|
383
384
|
end
|
|
384
385
|
|
|
385
386
|
def chunk_data(data, size)
|
|
386
|
-
[size.to_s(16), CRLF, data, CRLF]
|
|
387
|
+
[ size.to_s(16), CRLF, data, CRLF ]
|
|
387
388
|
end
|
|
388
389
|
|
|
389
390
|
# Called when body is written out successfully. Indicates that we should
|
|
@@ -31,7 +31,6 @@ PhusionPassenger.require_passenger_lib 'utils/unseekable_socket'
|
|
|
31
31
|
|
|
32
32
|
module PhusionPassenger
|
|
33
33
|
class RequestHandler
|
|
34
|
-
|
|
35
34
|
# This class encapsulates the logic of a single RequestHandler thread.
|
|
36
35
|
class ThreadHandler
|
|
37
36
|
include DebugLogging
|
|
@@ -223,14 +222,14 @@ module PhusionPassenger
|
|
|
223
222
|
if @connect_password && headers[PASSENGER_CONNECT_PASSWORD] != @connect_password
|
|
224
223
|
warn "*** Passenger RequestHandler warning: " <<
|
|
225
224
|
"someone tried to connect with an invalid connect password."
|
|
226
|
-
|
|
225
|
+
nil
|
|
227
226
|
else
|
|
228
|
-
|
|
227
|
+
headers
|
|
229
228
|
end
|
|
230
229
|
rescue SecurityError => e
|
|
231
230
|
warn("*** Passenger RequestHandler warning: " <<
|
|
232
231
|
"HTTP header size exceeded maximum.")
|
|
233
|
-
|
|
232
|
+
nil
|
|
234
233
|
end
|
|
235
234
|
|
|
236
235
|
# Like parse_session_request, but parses an HTTP request. This is a very minimalistic
|
|
@@ -274,7 +273,7 @@ module PhusionPassenger
|
|
|
274
273
|
headers["REMOTE_PORT"],
|
|
275
274
|
headers["REMOTE_ADDR"] = connection.to_io.is_a?(TCPSocket) ?
|
|
276
275
|
connection.to_io.peeraddr(:numeric)[1..2] :
|
|
277
|
-
[nil, '127.0.0.1']
|
|
276
|
+
[ nil, '127.0.0.1' ]
|
|
278
277
|
|
|
279
278
|
else
|
|
280
279
|
header, value = line.split(/\s*:\s*/, 2)
|
|
@@ -291,12 +290,12 @@ module PhusionPassenger
|
|
|
291
290
|
if @connect_password && headers["HTTP_X_PASSENGER_CONNECT_PASSWORD"] != @connect_password
|
|
292
291
|
warn "*** Passenger RequestHandler warning: " <<
|
|
293
292
|
"someone tried to connect with an invalid connect password."
|
|
294
|
-
|
|
293
|
+
nil
|
|
295
294
|
else
|
|
296
|
-
|
|
295
|
+
headers
|
|
297
296
|
end
|
|
298
297
|
rescue EOFError
|
|
299
|
-
|
|
298
|
+
nil
|
|
300
299
|
end
|
|
301
300
|
|
|
302
301
|
def process_ping(env, connection)
|
|
@@ -342,13 +341,12 @@ module PhusionPassenger
|
|
|
342
341
|
|
|
343
342
|
def should_reraise_error?(e)
|
|
344
343
|
# Stubable by unit tests.
|
|
345
|
-
|
|
344
|
+
true
|
|
346
345
|
end
|
|
347
346
|
|
|
348
347
|
def should_swallow_app_error?(e, socket_wrapper)
|
|
349
|
-
|
|
348
|
+
socket_wrapper && socket_wrapper.source_of_exception?(e) && [ Errno::EPIPE, Errno::ECONNRESET ].any? { |er| e.is_a?(er) }
|
|
350
349
|
end
|
|
351
350
|
end
|
|
352
|
-
|
|
353
351
|
end # class RequestHandler
|
|
354
352
|
end # module PhusionPassenger
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# encoding: binary
|
|
2
|
+
|
|
2
3
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
|
3
4
|
# Copyright (c) 2010-2025 Asynchronous B.V.
|
|
4
5
|
#
|
|
@@ -102,19 +103,19 @@ module PhusionPassenger
|
|
|
102
103
|
@main_socket_address, @main_socket = create_tcp_socket(options)
|
|
103
104
|
end
|
|
104
105
|
@server_sockets[:main] = {
|
|
105
|
-
:
|
|
106
|
-
:
|
|
107
|
-
:
|
|
108
|
-
:
|
|
109
|
-
:
|
|
106
|
+
address: @main_socket_address,
|
|
107
|
+
socket: @main_socket,
|
|
108
|
+
protocol: @force_http_session ? :http : :session,
|
|
109
|
+
concurrency: @concurrency,
|
|
110
|
+
accept_http_requests: true,
|
|
110
111
|
}
|
|
111
112
|
|
|
112
113
|
@http_socket_address, @http_socket = create_tcp_socket(options)
|
|
113
114
|
@server_sockets[:http] = {
|
|
114
|
-
:
|
|
115
|
-
:
|
|
116
|
-
:
|
|
117
|
-
:
|
|
115
|
+
address: @http_socket_address,
|
|
116
|
+
socket: @http_socket,
|
|
117
|
+
protocol: :http,
|
|
118
|
+
concurrency: 1,
|
|
118
119
|
}
|
|
119
120
|
|
|
120
121
|
@owner_pipe = owner_pipe
|
|
@@ -272,7 +273,7 @@ module PhusionPassenger
|
|
|
272
273
|
# can easily reactivate the workaround. Or maybe if we just need
|
|
273
274
|
# TCP sockets for some other reason.
|
|
274
275
|
|
|
275
|
-
#return RUBY_PLATFORM !~ /darwin/
|
|
276
|
+
# return RUBY_PLATFORM !~ /darwin/
|
|
276
277
|
|
|
277
278
|
ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
|
|
278
279
|
# Unix domain socket implementation on JRuby
|
|
@@ -282,7 +283,7 @@ module PhusionPassenger
|
|
|
282
283
|
# It's also bugged in Windows Subsystem for Linux
|
|
283
284
|
# as of Windows 10, version 1803 (Fall Creators Update)
|
|
284
285
|
# You will get "Address In Use" errors even if the port is unused.
|
|
285
|
-
|
|
286
|
+
!@force_http_session && ruby_engine != "jruby" && !PlatformInfo.windows_subsystem?
|
|
286
287
|
end
|
|
287
288
|
|
|
288
289
|
def create_unix_socket_on_filesystem(options)
|
|
@@ -308,7 +309,7 @@ module PhusionPassenger
|
|
|
308
309
|
socket.sync = true
|
|
309
310
|
socket.close_on_exec!
|
|
310
311
|
File.chmod(0600, socket_address)
|
|
311
|
-
["unix:#{socket_address}", socket]
|
|
312
|
+
[ "unix:#{socket_address}", socket ]
|
|
312
313
|
end
|
|
313
314
|
end
|
|
314
315
|
|
|
@@ -323,7 +324,7 @@ module PhusionPassenger
|
|
|
323
324
|
socket.sync = true
|
|
324
325
|
socket.close_on_exec!
|
|
325
326
|
socket_address = "tcp://#{bind_address}:#{socket.addr[1]}"
|
|
326
|
-
|
|
327
|
+
[ socket_address, socket ]
|
|
327
328
|
end
|
|
328
329
|
|
|
329
330
|
# Reset signal handlers to their default handler, and install some
|
|
@@ -369,22 +370,22 @@ module PhusionPassenger
|
|
|
369
370
|
|
|
370
371
|
def start_threads
|
|
371
372
|
common_options = {
|
|
372
|
-
:
|
|
373
|
-
:
|
|
374
|
-
:
|
|
375
|
-
:
|
|
373
|
+
app: @app,
|
|
374
|
+
app_group_name: @app_group_name,
|
|
375
|
+
connect_password: @connect_password,
|
|
376
|
+
keepalive_enabled: @keepalive,
|
|
376
377
|
}
|
|
377
378
|
main_socket_options = common_options.merge(
|
|
378
|
-
:
|
|
379
|
-
:
|
|
380
|
-
:
|
|
379
|
+
server_socket: @main_socket,
|
|
380
|
+
socket_name: "main socket",
|
|
381
|
+
protocol: @server_sockets[:main][:protocol] == :session ?
|
|
381
382
|
:session :
|
|
382
383
|
:http
|
|
383
384
|
)
|
|
384
385
|
http_socket_options = common_options.merge(
|
|
385
|
-
:
|
|
386
|
-
:
|
|
387
|
-
:
|
|
386
|
+
server_socket: @http_socket,
|
|
387
|
+
socket_name: "HTTP socket",
|
|
388
|
+
protocol: :http
|
|
388
389
|
)
|
|
389
390
|
|
|
390
391
|
# Used for marking threads that have finished initializing,
|
|
@@ -470,7 +471,7 @@ module PhusionPassenger
|
|
|
470
471
|
end
|
|
471
472
|
end
|
|
472
473
|
begin
|
|
473
|
-
ios = select([owner_pipe_watcher[0], @graceful_termination_pipe[0]])[0]
|
|
474
|
+
ios = select([ owner_pipe_watcher[0], @graceful_termination_pipe[0] ])[0]
|
|
474
475
|
if ios.include?(owner_pipe_watcher[0])
|
|
475
476
|
trace(2, "Owner pipe closed")
|
|
476
477
|
else
|
|
@@ -483,7 +484,7 @@ module PhusionPassenger
|
|
|
483
484
|
owner_pipe_watcher[1].close if !owner_pipe_watcher[1].closed?
|
|
484
485
|
end
|
|
485
486
|
else
|
|
486
|
-
ios = select([@owner_pipe, @graceful_termination_pipe[0]])[0]
|
|
487
|
+
ios = select([ @owner_pipe, @graceful_termination_pipe[0] ])[0]
|
|
487
488
|
if ios.include?(@owner_pipe)
|
|
488
489
|
trace(2, "Owner pipe closed")
|
|
489
490
|
else
|
|
@@ -529,7 +530,7 @@ module PhusionPassenger
|
|
|
529
530
|
debug("Error shutting down HTTP thread (#{address}): #{e} (#{e.class})")
|
|
530
531
|
end
|
|
531
532
|
end
|
|
532
|
-
|
|
533
|
+
threads
|
|
533
534
|
end
|
|
534
535
|
|
|
535
536
|
def terminate_threads
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# encoding: binary
|
|
2
|
+
|
|
2
3
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
|
3
4
|
# Copyright (c) 2010-2025 Asynchronous B.V.
|
|
4
5
|
#
|
|
@@ -55,7 +56,7 @@ class Exception
|
|
|
55
56
|
if thread_name = current_thread[:name]
|
|
56
57
|
thread_name = "(#{thread_name})"
|
|
57
58
|
end
|
|
58
|
-
|
|
59
|
+
"*** Exception #{self.class} #{location}" <<
|
|
59
60
|
"(#{self}) (process #{$$}, thread #{thread_id}#{thread_name}):\n" <<
|
|
60
61
|
"\tfrom " << backtrace.join("\n\tfrom ")
|
|
61
62
|
end
|
|
@@ -108,11 +109,11 @@ class File
|
|
|
108
109
|
# do that too. This method fixes that by using Dir.logical_pwd.
|
|
109
110
|
if File.respond_to?(:absolute_path)
|
|
110
111
|
def self.absolute_logical_path(path, base = Dir.logical_pwd)
|
|
111
|
-
|
|
112
|
+
File.absolute_path(path, base)
|
|
112
113
|
end
|
|
113
114
|
else
|
|
114
115
|
def self.absolute_logical_path(path, base = Dir.logical_pwd)
|
|
115
|
-
|
|
116
|
+
File.expand_path(path, base)
|
|
116
117
|
end
|
|
117
118
|
end
|
|
118
119
|
end
|
|
@@ -152,7 +153,7 @@ module Signal
|
|
|
152
153
|
# See https://github.com/phusion/passenger/issues/2489 for details.
|
|
153
154
|
result.delete("PROF")
|
|
154
155
|
|
|
155
|
-
|
|
156
|
+
result
|
|
156
157
|
end
|
|
157
158
|
end
|
|
158
159
|
|
|
@@ -161,7 +162,7 @@ module GC
|
|
|
161
162
|
# Checks whether the current Ruby interpreter's garbage
|
|
162
163
|
# collector is copy-on-write friendly.
|
|
163
164
|
def self.copy_on_write_friendly?
|
|
164
|
-
|
|
165
|
+
false
|
|
165
166
|
end
|
|
166
167
|
end
|
|
167
168
|
end
|