passenger 6.0.22 → 6.0.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (334) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +59 -1
  3. data/Rakefile +13 -2
  4. data/bin/passenger-install-apache2-module +5 -0
  5. data/bin/passenger-install-nginx-module +18 -2
  6. data/build/apache2.rb +1 -1
  7. data/build/basics.rb +10 -4
  8. data/build/cxx_tests.rb +18 -7
  9. data/build/support/cxx_dependency_map.rb +40 -6
  10. data/build/test_basics.rb +24 -13
  11. data/package.json +1 -1
  12. data/passenger.gemspec +4 -2
  13. data/resources/templates/standalone/server.erb +1 -0
  14. data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +8 -0
  15. data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +10 -2
  16. data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +8 -0
  17. data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +9 -0
  18. data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +9 -0
  19. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +63 -50
  20. data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +19 -9
  21. data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +8 -0
  22. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +9 -1
  23. data/src/agent/Core/ApplicationPool/Group/Verification.cpp +8 -0
  24. data/src/agent/Core/ApplicationPool/Group.h +15 -5
  25. data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +5 -0
  26. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +5 -0
  27. data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +5 -0
  28. data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +5 -0
  29. data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +5 -0
  30. data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +5 -0
  31. data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +5 -0
  32. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +11 -4
  33. data/src/agent/Core/ApplicationPool/Pool.h +0 -2
  34. data/src/agent/Core/ApplicationPool/Process.h +22 -6
  35. data/src/agent/Core/ApplicationPool/Session.h +6 -1
  36. data/src/agent/Core/Config.h +8 -3
  37. data/src/agent/Core/Controller/CheckoutSession.cpp +24 -1
  38. data/src/agent/Core/Controller/Config.h +5 -1
  39. data/src/agent/Core/Controller.h +1 -0
  40. data/src/agent/Core/CoreMain.cpp +10 -17
  41. data/src/agent/Core/OptionParser.h +3 -0
  42. data/src/agent/Core/SpawningKit/ErrorRenderer.h +5 -0
  43. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -53
  44. data/src/agent/Core/SpawningKit/Handshake/Session.h +3 -0
  45. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
  46. data/src/agent/Core/SpawningKit/SmartSpawner.h +6 -2
  47. data/src/agent/Core/SpawningKit/Spawner.h +4 -0
  48. data/src/agent/Shared/Fundamentals/AbortHandler.cpp +88 -9
  49. data/src/agent/Shared/Fundamentals/AbortHandler.h +2 -0
  50. data/src/agent/Shared/Fundamentals/Initialization.cpp +9 -3
  51. data/src/agent/Shared/Fundamentals/Initialization.h +3 -3
  52. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +6 -7
  53. data/src/agent/Watchdog/Config.h +2 -1
  54. data/src/agent/Watchdog/WatchdogMain.cpp +4 -7
  55. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +5 -0
  56. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +15 -0
  57. data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +5 -3
  58. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +5 -0
  59. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +3 -0
  60. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +13 -0
  61. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +7 -0
  62. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +16 -0
  63. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +3 -0
  64. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +2 -1
  65. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +2 -1
  66. data/src/cxx_supportlib/Constants.h +1 -1
  67. data/src/cxx_supportlib/DataStructures/LString.h +4 -0
  68. data/src/cxx_supportlib/DataStructures/StringMap.h +0 -1
  69. data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
  70. data/src/cxx_supportlib/SafeLibev.h +1 -3
  71. data/src/cxx_supportlib/ServerKit/Hooks.h +2 -2
  72. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +0 -1
  73. data/src/cxx_supportlib/ServerKit/HttpServer.h +15 -10
  74. data/src/cxx_supportlib/ServerKit/Server.h +0 -6
  75. data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +2 -0
  76. data/src/cxx_supportlib/Utils/SpeedMeter.h +0 -3
  77. data/src/cxx_supportlib/oxt/implementation.cpp +11 -0
  78. data/src/cxx_supportlib/oxt/system_calls.cpp +10 -3
  79. data/src/cxx_supportlib/oxt/thread.hpp +1 -1
  80. data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +35 -9
  81. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +3 -2
  82. data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
  83. data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +74 -68
  84. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +11 -11
  85. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +2 -2
  86. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +2 -2
  87. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +10 -10
  88. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +1 -1
  89. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +3 -3
  90. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +2 -2
  91. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +1 -1
  92. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +2 -2
  93. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +9 -9
  94. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +2 -2
  95. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +6 -6
  96. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +2 -2
  97. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +1 -1
  98. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +88 -22
  99. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +91 -22
  100. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +105 -23
  101. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +90 -23
  102. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +2 -2
  103. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +1 -1
  104. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_after.hpp +303 -0
  105. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_at.hpp +296 -0
  106. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/impl/co_composed.hpp → co_composed.hpp} +208 -61
  107. data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +49 -0
  108. data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +10 -201
  109. data/src/cxx_supportlib/vendor-modified/boost/asio/composed.hpp +415 -0
  110. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +214 -48
  111. data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +3 -4
  112. data/src/cxx_supportlib/vendor-modified/boost/asio/default_completion_token.hpp +91 -0
  113. data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +9 -5
  114. data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +2 -2
  115. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
  116. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_message.hpp → detail/completion_message.hpp} +14 -16
  117. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_payload.hpp → detail/completion_payload.hpp} +30 -32
  118. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_handler.hpp → detail/completion_payload_handler.hpp} +15 -13
  119. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +26 -32
  120. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +5 -1
  121. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +14 -118
  122. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +36 -33
  123. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +1 -1
  124. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +7 -5
  125. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +6 -4
  126. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +44 -35
  127. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
  128. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiation_base.hpp +64 -0
  129. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +0 -11
  130. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +20 -16
  131. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +0 -1
  132. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +4 -4
  133. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +23 -18
  134. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +9 -0
  135. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +1 -1
  136. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +1 -1
  137. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +11 -1
  138. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timed_cancel_op.hpp +363 -0
  139. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +29 -51
  140. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +1 -1
  141. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +1 -1
  142. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +1 -1
  143. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +1 -1
  144. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +1 -1
  145. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +1 -1
  146. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +1 -1
  147. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +1 -1
  148. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +2 -1
  149. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +2 -1
  150. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +2 -114
  151. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +2 -3
  152. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +27 -19
  153. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +0 -1
  154. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +17 -15
  155. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +2 -3
  156. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +4 -2
  157. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +3 -5
  158. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +12 -7
  159. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +1 -1
  160. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +38 -40
  161. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +3 -3
  162. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +5 -5
  163. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +1 -1
  164. data/src/cxx_supportlib/vendor-modified/boost/asio/immediate.hpp +144 -0
  165. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +14 -7
  166. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +45 -14
  167. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +3 -3
  168. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_after.hpp +270 -0
  169. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_at.hpp +270 -0
  170. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +8 -0
  171. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +60 -166
  172. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +14 -7
  173. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +2 -2
  174. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +14 -7
  175. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +26 -177
  176. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +16 -82
  177. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +13 -286
  178. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +55 -18
  179. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +1 -1
  180. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +26 -185
  181. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +16 -87
  182. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +5 -5
  183. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -6
  184. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
  185. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +1 -1
  186. data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +12 -6
  187. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +1 -1
  188. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +2 -2
  189. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +127 -28
  190. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +70 -20
  191. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +114 -36
  192. data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +43 -3
  193. data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +2 -2
  194. data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +0 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +2 -2
  196. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +10 -7
  197. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +5 -5
  198. data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +2 -2
  199. data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +2 -2
  200. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +1 -1
  201. data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
  202. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +147 -35
  204. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +74 -22
  205. data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -0
  206. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +4 -1
  207. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +42 -11
  208. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +15 -37
  209. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +8 -8
  210. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +151 -10
  212. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +11 -9
  213. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +611 -102
  214. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +1 -1
  215. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +47 -47
  216. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +25 -24
  217. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocation_type.hpp +7 -7
  218. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_list.hpp +2 -2
  219. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_slist.hpp +2 -2
  220. data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +35 -1
  221. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +14 -14
  222. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +1 -1
  223. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +55 -23
  224. data/src/cxx_supportlib/vendor-modified/boost/container/detail/function_detector.hpp +1 -1
  225. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_container.hpp +2 -2
  226. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_contiguous_container.hpp +1 -1
  227. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_pair.hpp +4 -4
  228. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +8 -8
  229. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +9 -9
  230. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +4 -4
  231. data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +96 -10
  232. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +19 -4
  233. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +1 -1
  234. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +17 -17
  235. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common.hpp +1 -1
  236. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +2 -2
  237. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_resource.hpp +4 -4
  238. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +86 -52
  239. data/src/cxx_supportlib/vendor-modified/boost/container/detail/version_type.hpp +4 -4
  240. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +12 -0
  241. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +145 -65
  242. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +105 -22
  243. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +2 -2
  244. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +30 -22
  245. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +19 -2
  246. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +1 -1
  247. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +15 -8
  248. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +6 -5
  249. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +15 -15
  250. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
  251. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -1
  252. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +3 -3
  253. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +1 -1
  254. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +2 -2
  255. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +31 -24
  256. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +45 -43
  257. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +45 -33
  258. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +5 -7
  259. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +55 -47
  260. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +3 -3
  261. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +222 -73
  262. data/src/cxx_supportlib/vendor-modified/boost/core/detail/minstd_rand.hpp +58 -0
  263. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +13 -13
  264. data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +53 -5
  265. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +1 -0
  266. data/src/cxx_supportlib/vendor-modified/boost/core/pointer_in_range.hpp +49 -0
  267. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +2 -0
  268. data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +7 -2
  269. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +22 -34
  270. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +141 -38
  271. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/algorithm.hpp +8 -8
  272. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash.hpp +1 -1
  273. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +8 -6
  274. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +18 -18
  275. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +22 -17
  276. data/src/cxx_supportlib/vendor-modified/boost/libs/random/src/random_device.cpp +3 -1
  277. data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +0 -1
  278. data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +53 -0
  279. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +9 -1
  280. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +6 -1
  281. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  282. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/integral_wrapper.hpp +2 -1
  283. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  284. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +1 -1
  285. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +4 -1
  286. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +13 -1
  287. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +13 -1
  288. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +15 -0
  289. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +13 -1
  290. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set_fwd.hpp +15 -0
  291. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +22 -6
  292. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +38 -10
  293. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +111 -2
  294. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/cumulative_stats.hpp +177 -0
  295. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +11 -1
  296. data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +33 -7
  297. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +12 -0
  298. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +15 -0
  299. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +12 -0
  300. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +14 -0
  301. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +19 -0
  302. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +12 -0
  303. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +15 -0
  304. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +12 -0
  305. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +14 -0
  306. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +17 -0
  307. data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +1 -43
  308. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  309. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +8 -0
  310. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +12 -0
  311. data/src/nginx_module/Configuration.c +7 -2
  312. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +6 -0
  313. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +15 -0
  314. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +14 -0
  315. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +3 -0
  316. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +4 -0
  317. data/src/ruby_native_extension/passenger_native_support.c +1 -0
  318. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +5 -0
  319. data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +6 -2
  320. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +10 -0
  321. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +12 -4
  322. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +5 -0
  323. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +32 -5
  324. data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -0
  325. data/src/ruby_supportlib/phusion_passenger/rack/handler.rb +73 -0
  326. data/src/ruby_supportlib/phusion_passenger/rack_handler.rb +30 -56
  327. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +5 -0
  328. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -0
  329. data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +0 -4
  330. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +7 -198
  331. data/src/ruby_supportlib/phusion_passenger/utils/strscan.rb +67 -0
  332. data/src/ruby_supportlib/phusion_passenger/utils.rb +5 -15
  333. data/src/ruby_supportlib/phusion_passenger.rb +5 -5
  334. metadata +39 -10
@@ -28,7 +28,6 @@
28
28
 
29
29
  #include <string>
30
30
  #include <vector>
31
- #include <algorithm>
32
31
  #include <boost/intrusive_ptr.hpp>
33
32
  #include <boost/move/core.hpp>
34
33
  #include <boost/container/vector.hpp>
@@ -54,6 +53,10 @@
54
53
  #include <Core/SpawningKit/Result.h>
55
54
  #include <Shared/ApplicationPoolApiKey.h>
56
55
 
56
+ namespace tut {
57
+ template<class Data> class test_object;
58
+ }
59
+
57
60
  namespace Passenger {
58
61
  namespace ApplicationPool2 {
59
62
 
@@ -100,6 +103,9 @@ typedef boost::container::vector<ProcessPtr> ProcessList;
100
103
  */
101
104
  class Process {
102
105
  public:
106
+ friend class Group;
107
+ template<class Data> friend class tut::test_object;
108
+
103
109
  static const unsigned int MAX_SOCKETS_ACCEPTING_HTTP_REQUESTS = 3;
104
110
 
105
111
  private:
@@ -337,9 +343,14 @@ private:
337
343
  }
338
344
 
339
345
  void destroySelf() const {
346
+ Context *context = getContext();
347
+ Process *storagePointer = const_cast<Process *>(this);
340
348
  this->~Process();
341
- LockGuard l(getContext()->memoryManagementSyncher);
342
- getContext()->processObjectPool.free(const_cast<Process *>(this));
349
+
350
+ LockGuard l(context->memoryManagementSyncher);
351
+ // Use `storagePointer` because using `this` after calling the destructor
352
+ // is undefined behavior.
353
+ context->processObjectPool.free(storagePointer);
343
354
  }
344
355
 
345
356
 
@@ -384,6 +395,10 @@ public:
384
395
 
385
396
  /** Last time when a session was opened for this Process. */
386
397
  unsigned long long lastUsed;
398
+ /** Which generation of app processes this one belongs to,
399
+ inherited from the app group, incremented when a restart
400
+ is initiated*/
401
+ const unsigned int generation;
387
402
  /** Number of sessions currently open.
388
403
  * @invariant session >= 0
389
404
  */
@@ -446,8 +461,7 @@ public:
446
461
  /** Collected by Pool::collectAnalytics(). */
447
462
  ProcessMetrics metrics;
448
463
 
449
-
450
- Process(const BasicGroupInfo *groupInfo, const Json::Value &args)
464
+ Process(const BasicGroupInfo *groupInfo, const unsigned int gen, const Json::Value &args)
451
465
  : info(this, groupInfo, args),
452
466
  socketsAcceptingHttpRequestsCount(0),
453
467
  spawnerCreationTime(getJsonUint64Field(args, "spawner_creation_time")),
@@ -458,6 +472,7 @@ public:
458
472
  refcount(1),
459
473
  index(-1),
460
474
  lastUsed(spawnEndTime),
475
+ generation(gen),
461
476
  sessions(0),
462
477
  processed(0),
463
478
  lifeStatus(ALIVE),
@@ -471,7 +486,7 @@ public:
471
486
  indexSocketsAcceptingHttpRequests();
472
487
  }
473
488
 
474
- Process(const BasicGroupInfo *groupInfo, const SpawningKit::Result &skResult,
489
+ Process(const BasicGroupInfo *groupInfo, const unsigned int gen, const SpawningKit::Result &skResult,
475
490
  const Json::Value &args)
476
491
  : info(this, groupInfo, skResult),
477
492
  socketsAcceptingHttpRequestsCount(0),
@@ -483,6 +498,7 @@ public:
483
498
  refcount(1),
484
499
  index(-1),
485
500
  lastUsed(spawnEndTime),
501
+ generation(gen),
486
502
  sessions(0),
487
503
  processed(0),
488
504
  lifeStatus(ALIVE),
@@ -109,9 +109,14 @@ private:
109
109
  }
110
110
 
111
111
  void destroySelf() const {
112
+ Context *context = this->context;
113
+ Session *storagePointer = const_cast<Session *>(this);
112
114
  this->~Session();
115
+
113
116
  LockGuard l(context->memoryManagementSyncher);
114
- context->sessionObjectPool.free(const_cast<Session *>(this));
117
+ // Use `storagePointer` because using `this` after calling the destructor
118
+ // is undefined behavior.
119
+ context->sessionObjectPool.free(storagePointer);
115
120
  }
116
121
 
117
122
  public:
@@ -118,6 +118,7 @@ using namespace std;
118
118
  * default_abort_websockets_on_process_shutdown boolean - default(true)
119
119
  * default_app_file_descriptor_ulimit unsigned integer - -
120
120
  * default_bind_address string - default("127.0.0.1")
121
+ * default_custom_error_page string - default("")
121
122
  * default_environment string - default("production")
122
123
  * default_force_max_concurrent_requests_per_process integer - default(-1)
123
124
  * default_friendly_error_pages string - default("auto")
@@ -166,13 +167,13 @@ using namespace std;
166
167
  * security_update_checker_interval unsigned integer - default(86400)
167
168
  * security_update_checker_proxy_url string - -
168
169
  * security_update_checker_url string - default("https://securitycheck.phusionpassenger.com/v1/check.json")
169
- * server_software string - default("Phusion_Passenger/6.0.22")
170
+ * server_software string - default("Phusion_Passenger/6.0.24")
170
171
  * show_version_in_header boolean - default(true)
171
172
  * single_app_mode_app_root string - default,read_only
172
173
  * single_app_mode_app_start_command string - read_only
173
174
  * single_app_mode_app_type string - read_only
174
175
  * single_app_mode_startup_file string - read_only
175
- * spawn_dir string required read_only
176
+ * spawn_dir string - default,read_only
176
177
  * standalone_engine string - default
177
178
  * stat_throttle_rate unsigned integer - default(10)
178
179
  * telemetry_collector_ca_certificate_path string - -
@@ -239,6 +240,10 @@ private:
239
240
  return 80;
240
241
  }
241
242
 
243
+ static Json::Value getDefaultSpawnDir(const ConfigKit::Store &store) {
244
+ return getSystemTempDir();
245
+ }
246
+
242
247
  static Json::Value getDefaultThreads(const ConfigKit::Store &store) {
243
248
  return Json::UInt(boost::thread::hardware_concurrency());
244
249
  }
@@ -487,7 +492,7 @@ public:
487
492
  overrideWithDynamicDefault("default_server_port", UINT_TYPE, OPTIONAL, getDefaultServerPort);
488
493
 
489
494
  add("passenger_root", STRING_TYPE, REQUIRED | READ_ONLY);
490
- add("spawn_dir", STRING_TYPE, REQUIRED | READ_ONLY);
495
+ addWithDynamicDefault("spawn_dir", STRING_TYPE, OPTIONAL | READ_ONLY | CACHE_DEFAULT_VALUE, getDefaultSpawnDir);
491
496
  add("config_manifest", OBJECT_TYPE, OPTIONAL | READ_ONLY);
492
497
  add("pid_file", STRING_TYPE, OPTIONAL | READ_ONLY);
493
498
  add("web_server_version", STRING_TYPE, OPTIONAL | READ_ONLY);
@@ -23,6 +23,7 @@
23
23
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
24
  * THE SOFTWARE.
25
25
  */
26
+ #include "DataStructures/LString.h"
26
27
  #include <Core/Controller.h>
27
28
  #include <Core/SpawningKit/ErrorRenderer.h>
28
29
 
@@ -351,8 +352,17 @@ Controller::endRequestWithErrorResponse(Client **c, Request **r,
351
352
  Request *req = *r;
352
353
  SpawningKit::ErrorRenderer renderer(*appPool->getSpawningKitContext());
353
354
  string data;
355
+ const LString *path = customErrorPageEnabled(req);
354
356
 
355
- if (friendlyErrorPagesEnabled(req)) {
357
+ if (!psg_lstr_cmp(path, StaticString(""))) {
358
+ try {
359
+ data = renderer.renderCustom(StaticString(path->start->data, path->size));
360
+ } catch (const SystemException &e2) {
361
+ SKC_ERROR(client, "Cannot render an error page: " << e2.what() <<
362
+ "\n" << e2.backtrace());
363
+ data = "<h2>Internal server error</h2>";
364
+ }
365
+ } else if (friendlyErrorPagesEnabled(req)) {
356
366
  try {
357
367
  data = renderer.renderWithDetails(e);
358
368
  } catch (const SystemException &e2) {
@@ -373,6 +383,19 @@ Controller::endRequestWithErrorResponse(Client **c, Request **r,
373
383
  endRequestWithSimpleResponse(c, r, psg_pstrdup(req->pool, data), statusCode);
374
384
  }
375
385
 
386
+ const LString*
387
+ Controller::customErrorPageEnabled(Request *req) {
388
+ const StaticString name = "!~PASSENGER_CUSTOM_ERROR_PAGE";
389
+ LString* customErrorPagePath = req->secureHeaders.lookup(name);
390
+ if (customErrorPagePath != NULL && customErrorPagePath->size > 0) {
391
+ return psg_lstr_make_contiguous(customErrorPagePath, req->pool);
392
+ } else {
393
+ customErrorPagePath = (LString *) psg_palloc(req->pool, sizeof(LString));
394
+ psg_lstr_init(customErrorPagePath);
395
+ return customErrorPagePath;
396
+ }
397
+ }
398
+
376
399
  bool
377
400
  Controller::friendlyErrorPagesEnabled(Request *req) {
378
401
  bool defaultValue;
@@ -88,6 +88,7 @@ parseControllerBenchmarkMode(const StaticString &mode) {
88
88
  * default_abort_websockets_on_process_shutdown boolean - default(true)
89
89
  * default_app_file_descriptor_ulimit unsigned integer - -
90
90
  * default_bind_address string - default("127.0.0.1")
91
+ * default_custom_error_page string - default("")
91
92
  * default_environment string - default("production")
92
93
  * default_force_max_concurrent_requests_per_process integer - default(-1)
93
94
  * default_friendly_error_pages string - default("auto")
@@ -116,7 +117,7 @@ parseControllerBenchmarkMode(const StaticString &mode) {
116
117
  * multi_app boolean - default(true),read_only
117
118
  * request_freelist_limit unsigned integer - default(1024)
118
119
  * response_buffer_high_watermark unsigned integer - default(134217728)
119
- * server_software string - default("Phusion_Passenger/6.0.22")
120
+ * server_software string - default("Phusion_Passenger/6.0.24")
120
121
  * show_version_in_header boolean - default(true)
121
122
  * start_reading_after_accept boolean - default(true)
122
123
  * stat_throttle_rate unsigned integer - default(10)
@@ -161,6 +162,7 @@ private:
161
162
  add("server_software", STRING_TYPE, OPTIONAL, SERVER_TOKEN_NAME "/" PASSENGER_VERSION);
162
163
  add("vary_turbocache_by_cookie", STRING_TYPE, OPTIONAL);
163
164
 
165
+ add("default_custom_error_page", STRING_TYPE, OPTIONAL, "");
164
166
  add("default_friendly_error_pages", STRING_TYPE, OPTIONAL, "auto");
165
167
  add("default_environment", STRING_TYPE, OPTIONAL, DEFAULT_APP_ENV);
166
168
  add("default_spawn_method", STRING_TYPE, OPTIONAL, DEFAULT_SPAWN_METHOD);
@@ -428,6 +430,7 @@ public:
428
430
  StaticString defaultStickySessionsCookieAttributes;
429
431
  StaticString defaultVaryTurbocacheByCookie;
430
432
 
433
+ StaticString defaultCustomErrorPage;
431
434
  StaticString defaultFriendlyErrorPages;
432
435
  StaticString defaultEnvironment;
433
436
  StaticString defaultSpawnMethod;
@@ -463,6 +466,7 @@ public:
463
466
  defaultStickySessionsCookieAttributes(psg_pstrdup(pool, config["default_sticky_sessions_cookie_attributes"].asString())),
464
467
  defaultVaryTurbocacheByCookie(psg_pstrdup(pool, config["vary_turbocache_by_cookie"].asString())),
465
468
 
469
+ defaultCustomErrorPage(psg_pstrdup(pool, config["default_custom_error_page"].asString())),
466
470
  defaultFriendlyErrorPages(psg_pstrdup(pool, config["default_friendly_error_pages"].asString())),
467
471
  defaultEnvironment(psg_pstrdup(pool, config["default_environment"].asString())),
468
472
  defaultSpawnMethod(psg_pstrdup(pool, config["default_spawn_method"].asString())),
@@ -216,6 +216,7 @@ private:
216
216
  const ExceptionPtr &e);
217
217
  void endRequestWithErrorResponse(Client **c, Request **r,
218
218
  const SpawningKit::SpawnException &e, int statusCode);
219
+ const LString* customErrorPageEnabled(Request *req);
219
220
  bool friendlyErrorPagesEnabled(Request *req);
220
221
 
221
222
 
@@ -85,7 +85,6 @@
85
85
  #include <AppTypeDetector/Detector.h>
86
86
  #include <IOTools/MessageSerialization.h>
87
87
  #include <FileDescriptor.h>
88
- #include <ResourceLocator.h>
89
88
  #include <BackgroundEventLoop.cpp>
90
89
  #include <FileTools/FileManip.h>
91
90
  #include <FileTools/PathSecurityCheck.h>
@@ -145,7 +144,6 @@ namespace Core {
145
144
 
146
145
  boost::mutex configSyncher;
147
146
 
148
- ResourceLocator resourceLocator;
149
147
  RandomGeneratorPtr randomGenerator;
150
148
  SpawningKit::Context::Schema spawningKitContextSchema;
151
149
  SpawningKit::ContextPtr spawningKitContext;
@@ -697,8 +695,6 @@ initializeNonPrivilegedWorkingObjects() {
697
695
 
698
696
  setenv("SERVER_SOFTWARE", coreConfig->get("server_software").asCString(), 1);
699
697
 
700
- wo->resourceLocator = ResourceLocator(coreConfig->get("passenger_root").asString());
701
-
702
698
  wo->randomGenerator = boost::make_shared<RandomGenerator>();
703
699
  // Check whether /dev/urandom is actually random.
704
700
  // https://code.google.com/p/phusion-passenger/issues/detail?id=516
@@ -710,7 +706,7 @@ initializeNonPrivilegedWorkingObjects() {
710
706
  UPDATE_TRACE_POINT();
711
707
  wo->spawningKitContext = boost::make_shared<SpawningKit::Context>(
712
708
  wo->spawningKitContextSchema);
713
- wo->spawningKitContext->resourceLocator = &wo->resourceLocator;
709
+ wo->spawningKitContext->resourceLocator = Agent::Fundamentals::context->resourceLocator;
714
710
  wo->spawningKitContext->wrapperRegistry = coreWrapperRegistry;
715
711
  wo->spawningKitContext->randomGenerator = wo->randomGenerator;
716
712
  wo->spawningKitContext->integrationMode = coreConfig->get("integration_mode").asString();
@@ -772,7 +768,7 @@ initializeNonPrivilegedWorkingObjects() {
772
768
  &coreSchema->controllerSingleAppMode.schema,
773
769
  &wo->singleAppModeConfig,
774
770
  coreSchema->controllerSingleAppMode.translator);
775
- two.controller->resourceLocator = &wo->resourceLocator;
771
+ two.controller->resourceLocator = Agent::Fundamentals::context->resourceLocator;
776
772
  two.controller->wrapperRegistry = coreWrapperRegistry;
777
773
  two.controller->appPool = wo->appPool;
778
774
  two.controller->shutdownFinishCallback = controllerShutdownFinished;
@@ -877,7 +873,7 @@ initializeSecurityUpdateChecker() {
877
873
  config,
878
874
  coreSchema->securityUpdateChecker.translator);
879
875
  workingObjects->securityUpdateChecker = checker;
880
- checker->resourceLocator = &workingObjects->resourceLocator;
876
+ checker->resourceLocator = Agent::Fundamentals::context->resourceLocator;
881
877
  checker->initialize();
882
878
  checker->start();
883
879
  }
@@ -927,7 +923,7 @@ initializeAdminPanelConnector() {
927
923
  AdminPanelConnector *connector = new Core::AdminPanelConnector(
928
924
  coreSchema->adminPanelConnector.schema, config,
929
925
  coreSchema->adminPanelConnector.translator);
930
- connector->resourceLocator = &wo.resourceLocator;
926
+ connector->resourceLocator = Agent::Fundamentals::context->resourceLocator;
931
927
  connector->appPool = wo.appPool;
932
928
  connector->configGetter = inspectConfig;
933
929
  for (unsigned int i = 0; i < wo.threadWorkingObjects.size(); i++) {
@@ -956,7 +952,7 @@ prestartWebApps() {
956
952
  }
957
953
 
958
954
  boost::function<void ()> func = boost::bind(prestartWebApps,
959
- wo->resourceLocator,
955
+ *Agent::Fundamentals::context->resourceLocator,
960
956
  coreConfig->get("default_ruby").asString(),
961
957
  prestartURLs
962
958
  );
@@ -983,7 +979,7 @@ warnIfPassengerRootVulnerable() {
983
979
  return; // Passenger is not root, so no escalation.
984
980
  }
985
981
 
986
- string root = workingObjects->resourceLocator.getInstallSpec();
982
+ string root = Agent::Fundamentals::context->resourceLocator->getInstallSpec();
987
983
  vector<string> errors, checkErrors;
988
984
  if (isPathProbablySecureForRootUse(root, errors, checkErrors)) {
989
985
  if (!checkErrors.empty()) {
@@ -1400,13 +1396,10 @@ parseOptions(int argc, const char *argv[], ConfigKit::Store &config) {
1400
1396
  }
1401
1397
  }
1402
1398
 
1403
- if (!updates.empty()) {
1404
- vector<ConfigKit::Error> errors;
1405
- if (!config.update(updates, errors)) {
1406
- P_BUG("Unable to set initial configuration: " <<
1407
- ConfigKit::toString(errors) << "\n"
1408
- "Raw initial configuration: " << updates.toStyledString());
1409
- }
1399
+ vector<ConfigKit::Error> errors;
1400
+ if (!config.update(updates, errors)) {
1401
+ P_ERROR("*** Error in options: " << ConfigKit::toString(errors));
1402
+ std::exit(1);
1410
1403
  }
1411
1404
  }
1412
1405
 
@@ -339,6 +339,9 @@ parseCoreOption(int argc, const char *argv[], int &i, Json::Value &updates) {
339
339
  } else if (p.isFlag(argv[i], '\0', "--multi-app")) {
340
340
  updates["multi_app"] = true;
341
341
  i++;
342
+ } else if (p.isFlag(argv[i], '\0', "--custom-error-page")) {
343
+ updates["custom_error_page"] = argv[i + 1];
344
+ i+=2;
342
345
  } else if (p.isFlag(argv[i], '\0', "--force-friendly-error-pages")) {
343
346
  updates["default_friendly_error_pages"] = true;
344
347
  i++;
@@ -33,6 +33,7 @@
33
33
  #include <jsoncpp/json.h>
34
34
 
35
35
  #include <Constants.h>
36
+ #include <DataStructures/LString.h>
36
37
  #include <StaticString.h>
37
38
  #include <FileTools/FileManip.h>
38
39
  #include <StrIntTools/Template.h>
@@ -108,6 +109,10 @@ public:
108
109
 
109
110
  return Template::apply(unsafeReadFile(htmlFile), params);
110
111
  }
112
+
113
+ string renderCustom(const StaticString &htmlFile) const {
114
+ return unsafeReadFile(htmlFile);
115
+ }
111
116
  };
112
117
 
113
118
 
@@ -30,9 +30,7 @@
30
30
  #include <boost/thread.hpp>
31
31
  #include <boost/scoped_array.hpp>
32
32
  #include <string>
33
- #include <vector>
34
- #include <stdexcept>
35
- #include <algorithm>
33
+ #include <exception>
36
34
  #include <utility>
37
35
  #include <cerrno>
38
36
  #include <cstddef>
@@ -45,7 +43,6 @@
45
43
  #include <pwd.h>
46
44
  #include <grp.h>
47
45
  #include <unistd.h>
48
- #include <limits.h>
49
46
 
50
47
  #include <jsoncpp/json.h>
51
48
 
@@ -350,55 +347,6 @@ private:
350
347
  }
351
348
  }
352
349
 
353
- #if 0
354
- void inferApplicationInfo() const {
355
- TRACE_POINT();
356
- session.result.codeRevision = readFromRevisionFile();
357
- if (session.result.codeRevision.empty()) {
358
- session.result.codeRevision = inferCodeRevisionFromCapistranoSymlink();
359
- }
360
- }
361
-
362
- string readFromRevisionFile() const {
363
- TRACE_POINT();
364
- string filename = config->appRoot + "/REVISION";
365
- try {
366
- if (fileExists(filename)) {
367
- return strip(readAll(filename));
368
- }
369
- } catch (const SystemException &e) {
370
- P_WARN("Cannot access " << filename << ": " << e.what());
371
- }
372
- return string();
373
- }
374
-
375
- string inferCodeRevisionFromCapistranoSymlink() const {
376
- TRACE_POINT();
377
- if (extractBaseName(config->appRoot) == "current") {
378
- string appRoot = config->appRoot.toString(); // null terminate string
379
- char buf[PATH_MAX + 1];
380
- ssize_t ret;
381
-
382
- do {
383
- ret = readlink(appRoot.c_str(), buf, PATH_MAX);
384
- } while (ret == -1 && errno == EINTR);
385
- if (ret == -1) {
386
- if (errno == EINVAL) {
387
- return string();
388
- } else {
389
- int e = errno;
390
- P_WARN("Cannot read symlink " << appRoot << ": " << strerror(e));
391
- }
392
- }
393
-
394
- buf[ret] = '\0';
395
- return extractBaseName(buf);
396
- } else {
397
- return string();
398
- }
399
- }
400
- #endif
401
-
402
350
  void findFreePortOrSocketFile() {
403
351
  TRACE_POINT();
404
352
  session.expectedStartPort = findFreePort();
@@ -89,6 +89,9 @@ struct HandshakeSession {
89
89
  { }
90
90
 
91
91
  ~HandshakeSession() {
92
+ boost::this_thread::disable_interruption di;
93
+ boost::this_thread::disable_syscall_interruption dsi;
94
+
92
95
  if (workDirFd != -1) {
93
96
  safelyClose(workDirFd, true);
94
97
  }
@@ -31,11 +31,12 @@
31
31
  #include <cerrno>
32
32
 
33
33
  #include <sys/types.h>
34
- #include <limits.h>
34
+ #include <limits.h> // IWYU pragma: keep; for PATH_MAX
35
35
  #include <unistd.h>
36
36
 
37
37
  #include <Exceptions.h>
38
38
  #include <Utils.h>
39
+ #include <FileTools/FileManip.h>
39
40
  #include <StrIntTools/StrIntUtils.h>
40
41
 
41
42
  namespace Passenger {
@@ -78,6 +79,8 @@ public:
78
79
 
79
80
  ~HandshakeWorkDir() {
80
81
  if (!path.empty()) {
82
+ boost::this_thread::disable_interruption di;
83
+ boost::this_thread::disable_syscall_interruption dsi;
81
84
  removeDirTree(path);
82
85
  }
83
86
  }
@@ -108,7 +111,7 @@ public:
108
111
  // dropping root privileges).
109
112
  boost::this_thread::disable_interruption di;
110
113
  boost::this_thread::disable_syscall_interruption dsi;
111
- syscalls::chown(path.c_str(), uid, gid);
114
+ oxt::syscalls::chown(path.c_str(), uid, gid);
112
115
  }
113
116
  };
114
117
 
@@ -33,12 +33,12 @@
33
33
  #include <string>
34
34
  #include <vector>
35
35
  #include <map>
36
- #include <stdexcept>
36
+ #include <exception>
37
37
  #include <dirent.h>
38
38
  #include <sys/types.h>
39
39
  #include <sys/wait.h>
40
40
  #include <sys/stat.h>
41
- #include <signal.h>
41
+ #include <signal.h> // IWYU pragma: keep; for signal constants
42
42
  #include <unistd.h>
43
43
  #include <cstring>
44
44
  #include <cassert>
@@ -66,6 +66,10 @@
66
66
  #include <Core/SpawningKit/Handshake/Perform.h>
67
67
  #include <Core/SpawningKit/Handshake/BackgroundIOCapturer.h>
68
68
 
69
+ #ifdef INTELLISENSE
70
+ #include <Core/ApplicationPool/Options.h>
71
+ #endif
72
+
69
73
  namespace Passenger {
70
74
  namespace SpawningKit {
71
75
 
@@ -38,6 +38,10 @@
38
38
  #include <Core/SpawningKit/Result.h>
39
39
  #include <Core/SpawningKit/UserSwitchingRules.h>
40
40
 
41
+ #ifdef INTELLISENSE
42
+ #include <Core/ApplicationPool/Options.h>
43
+ #endif
44
+
41
45
  namespace Passenger {
42
46
  namespace SpawningKit {
43
47