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
@@ -30,124 +30,124 @@ require 'socket'
30
30
  require 'timeout'
31
31
 
32
32
  class PrespawnLocation
33
- class InvalidURLError < RuntimeError
34
- def initialize(url)
35
- @url = url
36
- end
37
-
38
- def to_s
39
- message
40
- end
41
-
42
- def message
43
- "'#{@url}' is not a valid URL."
44
- end
45
- end
46
-
47
- def self.parse(url)
48
- uri = uri_for(url)
49
-
50
- location = if uri.host == 'unix'
51
- UNIXPrespawnLocation.new(uri)
52
- else
53
- case uri.scheme
54
- when 'http'
55
- TCPPrespawnLocation.new(uri)
56
- when 'https'
57
- SSLPrespawnLocation.new(uri)
58
- end
59
- end
60
-
61
- unless location
62
- raise InvalidURLError, url
63
- end
64
-
65
- location
66
- end
67
-
68
- def self.uri_for(url)
69
- URI.parse(url)
70
- rescue URI::InvalidURIError
71
- raise InvalidURLError, url
72
- end
73
-
74
- def initialize(uri)
75
- @uri = uri
76
- end
77
-
78
- def request_path
79
- @uri.path.empty? ? '/' : @uri.path
80
- end
81
-
82
- def request_host
83
- @uri.host
84
- end
85
-
86
- def socket
87
- @socket ||= connect
88
- end
89
-
90
- def head_request
91
- socket.write("HEAD #{request_path} HTTP/1.1\r\n")
92
- socket.write("Host: #{request_host}\r\n")
93
- socket.write("Connection: close\r\n")
94
- socket.write("\r\n")
95
-
96
- begin
97
- Timeout.timeout(10) do
98
- socket.read
99
- end
100
- rescue Timeout::Error
101
- end
102
- end
33
+ class InvalidURLError < RuntimeError
34
+ def initialize(url)
35
+ @url = url
36
+ end
37
+
38
+ def to_s
39
+ message
40
+ end
41
+
42
+ def message
43
+ "'#{@url}' is not a valid URL."
44
+ end
45
+ end
46
+
47
+ def self.parse(url)
48
+ uri = uri_for(url)
49
+
50
+ location = if uri.host == 'unix'
51
+ UNIXPrespawnLocation.new(uri)
52
+ else
53
+ case uri.scheme
54
+ when 'http'
55
+ TCPPrespawnLocation.new(uri)
56
+ when 'https'
57
+ SSLPrespawnLocation.new(uri)
58
+ end
59
+ end
60
+
61
+ unless location
62
+ raise InvalidURLError, url
63
+ end
64
+
65
+ location
66
+ end
67
+
68
+ def self.uri_for(url)
69
+ URI.parse(url)
70
+ rescue URI::InvalidURIError
71
+ raise InvalidURLError, url
72
+ end
73
+
74
+ def initialize(uri)
75
+ @uri = uri
76
+ end
77
+
78
+ def request_path
79
+ @uri.path.empty? ? '/' : @uri.path
80
+ end
81
+
82
+ def request_host
83
+ @uri.host
84
+ end
85
+
86
+ def socket
87
+ @socket ||= connect
88
+ end
89
+
90
+ def head_request
91
+ socket.write("HEAD #{request_path} HTTP/1.1\r\n")
92
+ socket.write("Host: #{request_host}\r\n")
93
+ socket.write("Connection: close\r\n")
94
+ socket.write("\r\n")
95
+
96
+ begin
97
+ Timeout.timeout(10) do
98
+ socket.read
99
+ end
100
+ rescue Timeout::Error
101
+ end
102
+ end
103
103
  end
104
104
 
105
105
  class TCPPrespawnLocation < PrespawnLocation
106
- def request_port
107
- @uri.port
108
- end
109
-
110
- def connect
111
- TCPSocket.new('127.0.0.1', request_port)
112
- rescue Errno::ECONNREFUSED
113
- TCPSocket.new('::1', request_port)
114
- end
106
+ def request_port
107
+ @uri.port
108
+ end
109
+
110
+ def connect
111
+ TCPSocket.new('127.0.0.1', request_port)
112
+ rescue Errno::ECONNREFUSED
113
+ TCPSocket.new('::1', request_port)
114
+ end
115
115
  end
116
116
 
117
117
  class SSLPrespawnLocation < TCPPrespawnLocation
118
- def connect
119
- require 'openssl'
120
- socket = OpenSSL::SSL::SSLSocket.new(super)
121
- socket.sync_close = true
122
- socket.connect
123
- socket
124
- end
118
+ def connect
119
+ require 'openssl'
120
+ socket = OpenSSL::SSL::SSLSocket.new(super)
121
+ socket.sync_close = true
122
+ socket.connect
123
+ socket
124
+ end
125
125
  end
126
126
 
127
127
  class UNIXPrespawnLocation < PrespawnLocation
128
- def request_path
129
- super.split(':', 2).last
130
- end
128
+ def request_path
129
+ super.split(':', 2).last
130
+ end
131
131
 
132
- def request_host
133
- '_'
134
- end
132
+ def request_host
133
+ '_'
134
+ end
135
135
 
136
- def socket_path
137
- @uri.path.split(':', 2).first
138
- end
136
+ def socket_path
137
+ @uri.path.split(':', 2).first
138
+ end
139
139
 
140
- def connect
141
- UNIXSocket.new(socket_path)
142
- end
140
+ def connect
141
+ UNIXSocket.new(socket_path)
142
+ end
143
143
  end
144
144
 
145
145
  url = ARGV[0]
146
146
  begin
147
- prespawn_location = PrespawnLocation.parse(url)
147
+ prespawn_location = PrespawnLocation.parse(url)
148
148
  rescue PrespawnLocation::InvalidURLError => e
149
- STDERR.puts "*** ERROR: #{e}"
150
- exit 1
149
+ STDERR.puts "*** ERROR: #{e}"
150
+ exit 1
151
151
  end
152
152
 
153
153
  prespawn_location.head_request
@@ -24,114 +24,114 @@
24
24
  # THE SOFTWARE.
25
25
 
26
26
  module PhusionPassenger
27
- module App
28
- def self.options
29
- return @@options
30
- end
27
+ module App
28
+ def self.options
29
+ return @@options
30
+ end
31
31
 
32
- def self.app
33
- return @@app
34
- end
32
+ def self.app
33
+ return @@app
34
+ end
35
35
 
36
- def self.format_exception(e)
37
- result = "#{e} (#{e.class})"
38
- if !e.backtrace.empty?
39
- if e.respond_to?(:html?) && e.html?
40
- require 'erb' if !defined?(ERB)
41
- result << "\n<pre> " << ERB::Util.h(e.backtrace.join("\n ")) << "</pre>"
42
- else
43
- result << "\n " << e.backtrace.join("\n ")
44
- end
45
- end
46
- return result
47
- end
36
+ def self.format_exception(e)
37
+ result = "#{e} (#{e.class})"
38
+ if !e.backtrace.empty?
39
+ if e.respond_to?(:html?) && e.html?
40
+ require 'erb' if !defined?(ERB)
41
+ result << "\n<pre> " << ERB::Util.h(e.backtrace.join("\n ")) << "</pre>"
42
+ else
43
+ result << "\n " << e.backtrace.join("\n ")
44
+ end
45
+ end
46
+ return result
47
+ end
48
48
 
49
- def self.exit_code_for_exception(e)
50
- if e.is_a?(SystemExit)
51
- return e.status
52
- else
53
- return 1
54
- end
55
- end
49
+ def self.exit_code_for_exception(e)
50
+ if e.is_a?(SystemExit)
51
+ return e.status
52
+ else
53
+ return 1
54
+ end
55
+ end
56
56
 
57
- def self.handshake_and_read_startup_request
58
- STDOUT.sync = true
59
- STDERR.sync = true
60
- puts "!> I have control 1.0"
61
- abort "Invalid initialization header" if STDIN.readline != "You have control 1.0\n"
57
+ def self.handshake_and_read_startup_request
58
+ STDOUT.sync = true
59
+ STDERR.sync = true
60
+ puts "!> I have control 1.0"
61
+ abort "Invalid initialization header" if STDIN.readline != "You have control 1.0\n"
62
62
 
63
- @@options = {}
64
- while (line = STDIN.readline) != "\n"
65
- name, value = line.strip.split(/: */, 2)
66
- @@options[name] = value
67
- end
68
- end
63
+ @@options = {}
64
+ while (line = STDIN.readline) != "\n"
65
+ name, value = line.strip.split(/: */, 2)
66
+ @@options[name] = value
67
+ end
68
+ end
69
69
 
70
- def self.init_passenger
71
- require "#{options["ruby_libdir"]}/phusion_passenger"
72
- PhusionPassenger.locate_directories(options["passenger_root"])
73
- PhusionPassenger.require_passenger_lib 'native_support'
74
- PhusionPassenger.require_passenger_lib 'ruby_core_enhancements'
75
- PhusionPassenger.require_passenger_lib 'ruby_core_io_enhancements'
76
- PhusionPassenger.require_passenger_lib 'loader_shared_helpers'
77
- PhusionPassenger.require_passenger_lib 'request_handler'
78
- PhusionPassenger.require_passenger_lib 'rack/thread_handler_extension'
79
- @@options = LoaderSharedHelpers.init(@@options)
80
- if defined?(NativeSupport)
81
- NativeSupport.disable_stdio_buffering
82
- end
83
- RequestHandler::ThreadHandler.send(:include, Rack::ThreadHandlerExtension)
84
- rescue Exception => e
85
- LoaderSharedHelpers.about_to_abort(e) if defined?(LoaderSharedHelpers)
86
- puts "!> Error"
87
- puts "!> html: true" if e.respond_to?(:html?) && e.html?
88
- puts "!> "
89
- puts format_exception(e)
90
- exit exit_code_for_exception(e)
91
- end
70
+ def self.init_passenger
71
+ require "#{options["ruby_libdir"]}/phusion_passenger"
72
+ PhusionPassenger.locate_directories(options["passenger_root"])
73
+ PhusionPassenger.require_passenger_lib 'native_support'
74
+ PhusionPassenger.require_passenger_lib 'ruby_core_enhancements'
75
+ PhusionPassenger.require_passenger_lib 'ruby_core_io_enhancements'
76
+ PhusionPassenger.require_passenger_lib 'loader_shared_helpers'
77
+ PhusionPassenger.require_passenger_lib 'request_handler'
78
+ PhusionPassenger.require_passenger_lib 'rack/thread_handler_extension'
79
+ @@options = LoaderSharedHelpers.init(@@options)
80
+ if defined?(NativeSupport)
81
+ NativeSupport.disable_stdio_buffering
82
+ end
83
+ RequestHandler::ThreadHandler.send(:include, Rack::ThreadHandlerExtension)
84
+ rescue Exception => e
85
+ LoaderSharedHelpers.about_to_abort(options, e) if defined?(LoaderSharedHelpers)
86
+ puts "!> Error"
87
+ puts "!> html: true" if e.respond_to?(:html?) && e.html?
88
+ puts "!> "
89
+ puts format_exception(e)
90
+ exit exit_code_for_exception(e)
91
+ end
92
92
 
93
- def self.load_app
94
- LoaderSharedHelpers.before_loading_app_code_step1('config.ru', options)
95
- LoaderSharedHelpers.run_load_path_setup_code(options)
96
- LoaderSharedHelpers.before_loading_app_code_step2(options)
93
+ def self.load_app
94
+ LoaderSharedHelpers.before_loading_app_code_step1('config.ru', options)
95
+ LoaderSharedHelpers.run_load_path_setup_code(options)
96
+ LoaderSharedHelpers.before_loading_app_code_step2(options)
97
97
 
98
- begin
99
- require 'rubygems'
100
- rescue LoadError
101
- end
102
- require 'rack'
103
- rackup_file = options["startup_file"] || "config.ru"
104
- rackup_code = ::File.open(rackup_file, 'rb') do |f|
105
- f.read
106
- end
107
- @@app = eval("Rack::Builder.new {( #{rackup_code}\n )}.to_app",
108
- TOPLEVEL_BINDING, rackup_file)
98
+ begin
99
+ require 'rubygems'
100
+ rescue LoadError
101
+ end
102
+ require 'rack'
103
+ rackup_file = options["startup_file"] || "config.ru"
104
+ rackup_code = ::File.open(rackup_file, 'rb') do |f|
105
+ f.read
106
+ end
107
+ @@app = eval("Rack::Builder.new {( #{rackup_code}\n )}.to_app",
108
+ TOPLEVEL_BINDING, rackup_file)
109
109
 
110
- LoaderSharedHelpers.after_loading_app_code(options)
111
- rescue Exception => e
112
- LoaderSharedHelpers.about_to_abort(e)
113
- puts "!> Error"
114
- puts "!> html: true" if e.respond_to?(:html?) && e.html?
115
- puts "!> "
116
- puts format_exception(e)
117
- exit exit_code_for_exception(e)
118
- end
110
+ LoaderSharedHelpers.after_loading_app_code(options)
111
+ rescue Exception => e
112
+ LoaderSharedHelpers.about_to_abort(options, e)
113
+ puts "!> Error"
114
+ puts "!> html: true" if e.respond_to?(:html?) && e.html?
115
+ puts "!> "
116
+ puts format_exception(e)
117
+ exit exit_code_for_exception(e)
118
+ end
119
119
 
120
120
 
121
- ################## Main code ##################
121
+ ################## Main code ##################
122
122
 
123
123
 
124
- handshake_and_read_startup_request
125
- init_passenger
126
- load_app
127
- LoaderSharedHelpers.before_handling_requests(false, options)
128
- handler = RequestHandler.new(STDIN, options.merge("app" => app))
129
- LoaderSharedHelpers.advertise_readiness
130
- LoaderSharedHelpers.advertise_sockets(STDOUT, handler)
131
- puts "!> "
132
- handler.main_loop
133
- handler.cleanup
134
- LoaderSharedHelpers.after_handling_requests
124
+ handshake_and_read_startup_request
125
+ init_passenger
126
+ load_app
127
+ LoaderSharedHelpers.before_handling_requests(false, options)
128
+ handler = RequestHandler.new(STDIN, options.merge("app" => app))
129
+ LoaderSharedHelpers.advertise_readiness
130
+ LoaderSharedHelpers.advertise_sockets(STDOUT, handler)
131
+ puts "!> "
132
+ handler.main_loop
133
+ handler.cleanup
134
+ LoaderSharedHelpers.after_handling_requests
135
135
 
136
- end # module App
136
+ end # module App
137
137
  end # module PhusionPassenger
@@ -26,141 +26,141 @@
26
26
  GC.copy_on_write_friendly = true if GC.respond_to?(:copy_on_write_friendly=)
27
27
 
28
28
  module PhusionPassenger
29
- module App
30
- def self.options
31
- return @@options
32
- end
33
-
34
- def self.app
35
- return @@app
36
- end
37
-
38
- def self.format_exception(e)
39
- result = "#{e} (#{e.class})"
40
- if !e.backtrace.empty?
41
- if e.respond_to?(:html?) && e.html?
42
- require 'erb' if !defined?(ERB)
43
- result << "\n<pre> " << ERB::Util.h(e.backtrace.join("\n ")) << "</pre>"
44
- else
45
- result << "\n " << e.backtrace.join("\n ")
46
- end
47
- end
48
- return result
49
- end
50
-
51
- def self.exit_code_for_exception(e)
52
- if e.is_a?(SystemExit)
53
- return e.status
54
- else
55
- return 1
56
- end
57
- end
58
-
59
- def self.handshake_and_read_startup_request
60
- STDOUT.sync = true
61
- STDERR.sync = true
62
- puts "!> I have control 1.0"
63
- abort "Invalid initialization header" if STDIN.readline != "You have control 1.0\n"
64
-
65
- @@options = {}
66
- while (line = STDIN.readline) != "\n"
67
- name, value = line.strip.split(/: */, 2)
68
- @@options[name] = value
69
- end
70
- end
71
-
72
- def self.init_passenger
73
- require "#{options["ruby_libdir"]}/phusion_passenger"
74
- PhusionPassenger.locate_directories(options["passenger_root"])
75
- PhusionPassenger.require_passenger_lib 'native_support'
76
- PhusionPassenger.require_passenger_lib 'ruby_core_enhancements'
77
- PhusionPassenger.require_passenger_lib 'ruby_core_io_enhancements'
78
- PhusionPassenger.require_passenger_lib 'preloader_shared_helpers'
79
- PhusionPassenger.require_passenger_lib 'loader_shared_helpers'
80
- PhusionPassenger.require_passenger_lib 'request_handler'
81
- PhusionPassenger.require_passenger_lib 'rack/thread_handler_extension'
82
- @@options = LoaderSharedHelpers.init(@@options)
83
- @@options = PreloaderSharedHelpers.init(@@options)
84
- if defined?(NativeSupport)
85
- NativeSupport.disable_stdio_buffering
86
- end
87
- RequestHandler::ThreadHandler.send(:include, Rack::ThreadHandlerExtension)
88
- rescue Exception => e
89
- LoaderSharedHelpers.about_to_abort(e) if defined?(LoaderSharedHelpers)
90
- puts "!> Error"
91
- puts "!> html: true" if e.respond_to?(:html?) && e.html?
92
- puts "!> "
93
- puts format_exception(e)
94
- exit exit_code_for_exception(e)
95
- end
96
-
97
- def self.preload_app
98
- LoaderSharedHelpers.before_loading_app_code_step1('config.ru', options)
99
- LoaderSharedHelpers.run_load_path_setup_code(options)
100
- LoaderSharedHelpers.before_loading_app_code_step2(options)
101
-
102
- begin
103
- require 'rubygems'
104
- rescue LoadError
105
- end
106
- require 'rack'
107
- rackup_file = options["startup_file"] || "config.ru"
108
- rackup_code = ::File.open(rackup_file, 'rb') do |f|
109
- f.read
110
- end
111
- @@app = eval("Rack::Builder.new {( #{rackup_code}\n )}.to_app",
112
- TOPLEVEL_BINDING, rackup_file)
113
-
114
- LoaderSharedHelpers.after_loading_app_code(options)
115
- rescue Exception => e
116
- LoaderSharedHelpers.about_to_abort(e)
117
- puts "!> Error"
118
- puts "!> html: true" if e.respond_to?(:html?) && e.html?
119
- puts "!> "
120
- puts format_exception(e)
121
- exit exit_code_for_exception(e)
122
- end
123
-
124
- def self.negotiate_spawn_command
125
- puts "!> I have control 1.0"
126
- abort "Invalid initialization header" if STDIN.readline != "You have control 1.0\n"
127
-
128
- begin
129
- while (line = STDIN.readline) != "\n"
130
- name, value = line.strip.split(/: */, 2)
131
- options[name] = value
132
- end
133
- @@options = LoaderSharedHelpers.sanitize_spawn_options(@@options)
134
-
135
- LoaderSharedHelpers.before_handling_requests(true, options)
136
- handler = RequestHandler.new(STDIN, options.merge("app" => app))
137
- rescue Exception => e
138
- LoaderSharedHelpers.about_to_abort(e)
139
- puts "!> Error"
140
- puts "!> "
141
- puts format_exception(e)
142
- exit exit_code_for_exception(e)
143
- end
144
-
145
- LoaderSharedHelpers.advertise_readiness
146
- LoaderSharedHelpers.advertise_sockets(STDOUT, handler)
147
- puts "!> "
148
- return handler
149
- end
150
-
151
-
152
- ################## Main code ##################
153
-
154
-
155
- handshake_and_read_startup_request
156
- init_passenger
157
- preload_app
158
- if PreloaderSharedHelpers.run_main_loop(options) == :forked
159
- handler = negotiate_spawn_command
160
- handler.main_loop
161
- handler.cleanup
162
- LoaderSharedHelpers.after_handling_requests
163
- end
164
-
165
- end # module App
29
+ module App
30
+ def self.options
31
+ return @@options
32
+ end
33
+
34
+ def self.app
35
+ return @@app
36
+ end
37
+
38
+ def self.format_exception(e)
39
+ result = "#{e} (#{e.class})"
40
+ if !e.backtrace.empty?
41
+ if e.respond_to?(:html?) && e.html?
42
+ require 'erb' if !defined?(ERB)
43
+ result << "\n<pre> " << ERB::Util.h(e.backtrace.join("\n ")) << "</pre>"
44
+ else
45
+ result << "\n " << e.backtrace.join("\n ")
46
+ end
47
+ end
48
+ return result
49
+ end
50
+
51
+ def self.exit_code_for_exception(e)
52
+ if e.is_a?(SystemExit)
53
+ return e.status
54
+ else
55
+ return 1
56
+ end
57
+ end
58
+
59
+ def self.handshake_and_read_startup_request
60
+ STDOUT.sync = true
61
+ STDERR.sync = true
62
+ puts "!> I have control 1.0"
63
+ abort "Invalid initialization header" if STDIN.readline != "You have control 1.0\n"
64
+
65
+ @@options = {}
66
+ while (line = STDIN.readline) != "\n"
67
+ name, value = line.strip.split(/: */, 2)
68
+ @@options[name] = value
69
+ end
70
+ end
71
+
72
+ def self.init_passenger
73
+ require "#{options["ruby_libdir"]}/phusion_passenger"
74
+ PhusionPassenger.locate_directories(options["passenger_root"])
75
+ PhusionPassenger.require_passenger_lib 'native_support'
76
+ PhusionPassenger.require_passenger_lib 'ruby_core_enhancements'
77
+ PhusionPassenger.require_passenger_lib 'ruby_core_io_enhancements'
78
+ PhusionPassenger.require_passenger_lib 'preloader_shared_helpers'
79
+ PhusionPassenger.require_passenger_lib 'loader_shared_helpers'
80
+ PhusionPassenger.require_passenger_lib 'request_handler'
81
+ PhusionPassenger.require_passenger_lib 'rack/thread_handler_extension'
82
+ @@options = LoaderSharedHelpers.init(@@options)
83
+ @@options = PreloaderSharedHelpers.init(@@options)
84
+ if defined?(NativeSupport)
85
+ NativeSupport.disable_stdio_buffering
86
+ end
87
+ RequestHandler::ThreadHandler.send(:include, Rack::ThreadHandlerExtension)
88
+ rescue Exception => e
89
+ LoaderSharedHelpers.about_to_abort(options, e) if defined?(LoaderSharedHelpers)
90
+ puts "!> Error"
91
+ puts "!> html: true" if e.respond_to?(:html?) && e.html?
92
+ puts "!> "
93
+ puts format_exception(e)
94
+ exit exit_code_for_exception(e)
95
+ end
96
+
97
+ def self.preload_app
98
+ LoaderSharedHelpers.before_loading_app_code_step1('config.ru', options)
99
+ LoaderSharedHelpers.run_load_path_setup_code(options)
100
+ LoaderSharedHelpers.before_loading_app_code_step2(options)
101
+
102
+ begin
103
+ require 'rubygems'
104
+ rescue LoadError
105
+ end
106
+ require 'rack'
107
+ rackup_file = options["startup_file"] || "config.ru"
108
+ rackup_code = ::File.open(rackup_file, 'rb') do |f|
109
+ f.read
110
+ end
111
+ @@app = eval("Rack::Builder.new {( #{rackup_code}\n )}.to_app",
112
+ TOPLEVEL_BINDING, rackup_file)
113
+
114
+ LoaderSharedHelpers.after_loading_app_code(options)
115
+ rescue Exception => e
116
+ LoaderSharedHelpers.about_to_abort(options, e)
117
+ puts "!> Error"
118
+ puts "!> html: true" if e.respond_to?(:html?) && e.html?
119
+ puts "!> "
120
+ puts format_exception(e)
121
+ exit exit_code_for_exception(e)
122
+ end
123
+
124
+ def self.negotiate_spawn_command
125
+ puts "!> I have control 1.0"
126
+ abort "Invalid initialization header" if STDIN.readline != "You have control 1.0\n"
127
+
128
+ begin
129
+ while (line = STDIN.readline) != "\n"
130
+ name, value = line.strip.split(/: */, 2)
131
+ options[name] = value
132
+ end
133
+ @@options = LoaderSharedHelpers.sanitize_spawn_options(@@options)
134
+
135
+ LoaderSharedHelpers.before_handling_requests(true, options)
136
+ handler = RequestHandler.new(STDIN, options.merge("app" => app))
137
+ rescue Exception => e
138
+ LoaderSharedHelpers.about_to_abort(options, e)
139
+ puts "!> Error"
140
+ puts "!> "
141
+ puts format_exception(e)
142
+ exit exit_code_for_exception(e)
143
+ end
144
+
145
+ LoaderSharedHelpers.advertise_readiness
146
+ LoaderSharedHelpers.advertise_sockets(STDOUT, handler)
147
+ puts "!> "
148
+ return handler
149
+ end
150
+
151
+
152
+ ################## Main code ##################
153
+
154
+
155
+ handshake_and_read_startup_request
156
+ init_passenger
157
+ preload_app
158
+ if PreloaderSharedHelpers.run_main_loop(options) == :forked
159
+ handler = negotiate_spawn_command
160
+ handler.main_loop
161
+ handler.cleanup
162
+ LoaderSharedHelpers.after_handling_requests
163
+ end
164
+
165
+ end # module App
166
166
  end # module PhusionPassenger