passenger 4.0.20 → 4.0.21

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 (496) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.gitignore +1 -0
  5. data/.travis.yml +1 -1
  6. data/NEWS +15 -0
  7. data/README.md +5 -3
  8. data/Rakefile +1 -0
  9. data/bin/passenger-config +1 -5
  10. data/bin/passenger-install-apache2-module +53 -5
  11. data/bin/passenger-install-nginx-module +19 -6
  12. data/bin/passenger-memory-stats +3 -3
  13. data/build/agents.rb +11 -8
  14. data/build/apache2.rb +9 -5
  15. data/build/basics.rb +15 -21
  16. data/build/common_library.rb +16 -6
  17. data/build/cplusplus_support.rb +5 -5
  18. data/build/cxx_tests.rb +3 -3
  19. data/build/documentation.rb +1 -1
  20. data/build/misc.rb +4 -37
  21. data/build/node_tests.rb +29 -0
  22. data/build/oxt_tests.rb +1 -1
  23. data/build/packaging.rb +29 -10
  24. data/build/preprocessor.rb +2 -1
  25. data/build/test_basics.rb +15 -6
  26. data/debian.template/locations.ini.template +1 -0
  27. data/debian.template/passenger.install.template +1 -0
  28. data/dev/copy_boost_headers.rb +7 -3
  29. data/dev/run_travis.sh +32 -16
  30. data/doc/Users guide Apache.idmap.txt +22 -34
  31. data/doc/Users guide Apache.txt +20 -234
  32. data/doc/Users guide Nginx.idmap.txt +84 -66
  33. data/doc/Users guide Nginx.txt +50 -1
  34. data/doc/Users guide Standalone.idmap.txt +74 -0
  35. data/doc/Users guide Standalone.txt +22 -9
  36. data/doc/Users guide.txt +51 -0
  37. data/doc/users_guide_snippets/environment_variables.txt +0 -3
  38. data/doc/users_guide_snippets/installation.txt +337 -380
  39. data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
  40. data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
  41. data/doc/users_guide_snippets/support_information.txt +2 -9
  42. data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
  43. data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
  44. data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
  45. data/ext/apache2/Bucket.h +1 -1
  46. data/ext/apache2/Configuration.hpp +0 -44
  47. data/ext/apache2/CreateDirConfig.cpp +1 -1
  48. data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
  49. data/ext/apache2/Hooks.cpp +28 -21
  50. data/ext/apache2/MergeDirConfig.cpp +1 -0
  51. data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
  52. data/ext/apache2/SetHeaders.cpp +73 -0
  53. data/ext/apache2/SetHeaders.cpp.erb +88 -0
  54. data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
  55. data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
  56. data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
  57. data/ext/boost/algorithm/string/formatter.hpp +2 -2
  58. data/ext/boost/assert.hpp +6 -1
  59. data/ext/boost/atomic.hpp +18 -0
  60. data/ext/boost/atomic/atomic.hpp +241 -0
  61. data/ext/boost/atomic/detail/base.hpp +585 -0
  62. data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
  63. data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
  64. data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
  65. data/ext/boost/atomic/detail/config.hpp +54 -0
  66. data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
  67. data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
  68. data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
  69. data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
  70. data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
  71. data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
  72. data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
  73. data/ext/boost/atomic/detail/interlocked.hpp +200 -0
  74. data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
  75. data/ext/boost/atomic/detail/lockpool.hpp +97 -0
  76. data/ext/boost/atomic/detail/platform.hpp +62 -0
  77. data/ext/boost/atomic/detail/type-classification.hpp +45 -0
  78. data/ext/boost/chrono/config.hpp +8 -3
  79. data/ext/boost/chrono/duration.hpp +9 -10
  80. data/ext/boost/chrono/system_clocks.hpp +1 -1
  81. data/ext/boost/chrono/time_point.hpp +4 -3
  82. data/ext/boost/config/auto_link.hpp +53 -52
  83. data/ext/boost/config/compiler/borland.hpp +1 -0
  84. data/ext/boost/config/compiler/clang.hpp +24 -1
  85. data/ext/boost/config/compiler/codegear.hpp +1 -0
  86. data/ext/boost/config/compiler/common_edg.hpp +1 -0
  87. data/ext/boost/config/compiler/cray.hpp +1 -0
  88. data/ext/boost/config/compiler/digitalmars.hpp +1 -0
  89. data/ext/boost/config/compiler/gcc.hpp +29 -3
  90. data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
  91. data/ext/boost/config/compiler/hp_acc.hpp +1 -0
  92. data/ext/boost/config/compiler/intel.hpp +1 -1
  93. data/ext/boost/config/compiler/metrowerks.hpp +1 -0
  94. data/ext/boost/config/compiler/mpw.hpp +1 -0
  95. data/ext/boost/config/compiler/pathscale.hpp +1 -0
  96. data/ext/boost/config/compiler/pgi.hpp +1 -0
  97. data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
  98. data/ext/boost/config/compiler/vacpp.hpp +3 -2
  99. data/ext/boost/config/compiler/visualc.hpp +25 -11
  100. data/ext/boost/config/platform/vxworks.hpp +353 -15
  101. data/ext/boost/config/select_compiler_config.hpp +4 -4
  102. data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
  103. data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
  104. data/ext/boost/config/suffix.hpp +45 -19
  105. data/ext/boost/date_time/format_date_parser.hpp +1 -11
  106. data/ext/boost/date_time/strings_from_facet.hpp +5 -3
  107. data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
  108. data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
  109. data/ext/boost/detail/endian.hpp +52 -4
  110. data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
  111. data/ext/boost/detail/select_type.hpp +36 -0
  112. data/ext/boost/exception/current_exception_cast.hpp +1 -1
  113. data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
  114. data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
  115. data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
  116. data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
  117. data/ext/boost/exception/detail/type_info.hpp +1 -1
  118. data/ext/boost/exception/diagnostic_information.hpp +15 -14
  119. data/ext/boost/exception/exception.hpp +1 -1
  120. data/ext/boost/exception/get_error_info.hpp +1 -1
  121. data/ext/boost/exception/info.hpp +12 -13
  122. data/ext/boost/exception/to_string.hpp +6 -1
  123. data/ext/boost/exception/to_string_stub.hpp +9 -1
  124. data/ext/boost/foreach.hpp +5 -5
  125. data/ext/boost/function/function_template.hpp +6 -6
  126. data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
  127. data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
  128. data/ext/boost/functional/hash/extensions.hpp +14 -2
  129. data/ext/boost/functional/hash/hash.hpp +26 -5
  130. data/ext/boost/get_pointer.hpp +17 -2
  131. data/ext/boost/integer_traits.hpp +1 -1
  132. data/ext/boost/lexical_cast.hpp +615 -395
  133. data/ext/boost/libs/atomic/lockpool.cpp +24 -0
  134. data/ext/boost/libs/system/src/error_code.cpp +25 -18
  135. data/ext/boost/libs/thread/src/future.cpp +7 -5
  136. data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
  137. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
  138. data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
  139. data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
  140. data/ext/boost/limits.hpp +1 -1
  141. data/ext/boost/math/policies/policy.hpp +10 -0
  142. data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
  143. data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
  144. data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
  145. data/ext/boost/math/special_functions/sign.hpp +13 -8
  146. data/ext/boost/math/tools/config.hpp +38 -16
  147. data/ext/boost/move/algorithm.hpp +275 -0
  148. data/ext/boost/move/core.hpp +332 -0
  149. data/ext/boost/move/detail/config_begin.hpp +23 -0
  150. data/ext/boost/move/detail/config_end.hpp +20 -0
  151. data/ext/boost/move/detail/meta_utils.hpp +158 -0
  152. data/ext/boost/move/iterator.hpp +298 -0
  153. data/ext/boost/move/move.hpp +10 -1256
  154. data/ext/boost/move/traits.hpp +142 -0
  155. data/ext/boost/move/utility.hpp +194 -0
  156. data/ext/boost/mpl/assert.hpp +72 -4
  157. data/ext/boost/noncopyable.hpp +15 -3
  158. data/ext/boost/pointer_to_other.hpp +55 -0
  159. data/ext/boost/range/concepts.hpp +4 -4
  160. data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
  161. data/ext/boost/range/empty.hpp +1 -1
  162. data/ext/boost/range/iterator_range_core.hpp +4 -1
  163. data/ext/boost/range/iterator_range_io.hpp +2 -2
  164. data/ext/boost/ratio/config.hpp +6 -0
  165. data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
  166. data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
  167. data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
  168. data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
  169. data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
  170. data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
  171. data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
  172. data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
  173. data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
  174. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
  175. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
  176. data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
  177. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
  178. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
  179. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
  180. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
  181. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
  182. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
  183. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
  184. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
  185. data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
  186. data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
  187. data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
  188. data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
  189. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
  190. data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
  191. data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
  192. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
  193. data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
  194. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
  195. data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
  196. data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
  197. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
  198. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
  199. data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
  200. data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
  201. data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
  202. data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
  203. data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
  204. data/ext/boost/smart_ptr/shared_array.hpp +135 -20
  205. data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
  206. data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
  207. data/ext/boost/static_assert.hpp +74 -17
  208. data/ext/boost/system/error_code.hpp +76 -68
  209. data/ext/boost/system/system_error.hpp +5 -1
  210. data/ext/boost/thread/barrier.hpp +6 -2
  211. data/ext/boost/thread/completion_latch.hpp +233 -0
  212. data/ext/boost/thread/condition.hpp +6 -1
  213. data/ext/boost/thread/detail/async_func.hpp +571 -0
  214. data/ext/boost/thread/detail/config.hpp +248 -40
  215. data/ext/boost/thread/detail/counter.hpp +93 -0
  216. data/ext/boost/thread/detail/delete.hpp +12 -0
  217. data/ext/boost/thread/detail/invoke.hpp +1351 -0
  218. data/ext/boost/thread/detail/is_convertible.hpp +48 -0
  219. data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
  220. data/ext/boost/thread/detail/log.hpp +83 -0
  221. data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
  222. data/ext/boost/thread/detail/move.hpp +32 -16
  223. data/ext/boost/thread/detail/thread.hpp +236 -41
  224. data/ext/boost/thread/detail/thread_group.hpp +55 -9
  225. data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
  226. data/ext/boost/thread/exceptions.hpp +2 -0
  227. data/ext/boost/thread/externally_locked.hpp +351 -0
  228. data/ext/boost/thread/externally_locked_stream.hpp +170 -0
  229. data/ext/boost/thread/future.hpp +2517 -455
  230. data/ext/boost/thread/future_error_code.hpp +61 -0
  231. data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
  232. data/ext/boost/thread/latch.hpp +142 -0
  233. data/ext/boost/thread/lock_algorithms.hpp +468 -0
  234. data/ext/boost/thread/lock_concepts.hpp +197 -0
  235. data/ext/boost/thread/lock_factories.hpp +78 -0
  236. data/ext/boost/thread/lock_guard.hpp +88 -0
  237. data/ext/boost/thread/lock_options.hpp +31 -0
  238. data/ext/boost/thread/lock_traits.hpp +45 -0
  239. data/ext/boost/thread/lock_types.hpp +1226 -0
  240. data/ext/boost/thread/lockable_adapter.hpp +226 -0
  241. data/ext/boost/thread/lockable_concepts.hpp +157 -0
  242. data/ext/boost/thread/lockable_traits.hpp +207 -0
  243. data/ext/boost/thread/locks.hpp +5 -1816
  244. data/ext/boost/thread/mutex.hpp +33 -1
  245. data/ext/boost/thread/null_mutex.hpp +243 -0
  246. data/ext/boost/thread/once.hpp +10 -1
  247. data/ext/boost/thread/poly_lockable.hpp +68 -0
  248. data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
  249. data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
  250. data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
  251. data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
  252. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
  253. data/ext/boost/thread/pthread/mutex.hpp +101 -38
  254. data/ext/boost/thread/pthread/once.hpp +459 -44
  255. data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
  256. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
  257. data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
  258. data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
  259. data/ext/boost/thread/pthread/thread_data.hpp +53 -50
  260. data/ext/boost/thread/pthread/timespec.hpp +96 -12
  261. data/ext/boost/thread/recursive_mutex.hpp +44 -1
  262. data/ext/boost/thread/reverse_lock.hpp +3 -2
  263. data/ext/boost/thread/scoped_thread.hpp +285 -0
  264. data/ext/boost/thread/shared_lock_guard.hpp +2 -1
  265. data/ext/boost/thread/shared_mutex.hpp +23 -0
  266. data/ext/boost/thread/strict_lock.hpp +235 -0
  267. data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
  268. data/ext/boost/thread/sync_queue.hpp +516 -0
  269. data/ext/boost/thread/synchronized_value.hpp +1001 -0
  270. data/ext/boost/thread/testable_mutex.hpp +148 -0
  271. data/ext/boost/thread/thread.hpp +1 -13
  272. data/ext/boost/thread/thread_functors.hpp +57 -0
  273. data/ext/boost/thread/thread_guard.hpp +46 -0
  274. data/ext/boost/thread/thread_only.hpp +29 -0
  275. data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
  276. data/ext/boost/thread/v2/thread.hpp +37 -10
  277. data/ext/boost/thread/xtime.hpp +2 -1
  278. data/ext/boost/token_functions.hpp +16 -16
  279. data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
  280. data/ext/boost/type_traits/add_reference.hpp +1 -1
  281. data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
  282. data/ext/boost/type_traits/aligned_storage.hpp +13 -0
  283. data/ext/boost/type_traits/common_type.hpp +11 -12
  284. data/ext/boost/type_traits/config.hpp +1 -1
  285. data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
  286. data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
  287. data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
  288. data/ext/boost/type_traits/has_left_shift.hpp +49 -0
  289. data/ext/boost/type_traits/has_right_shift.hpp +49 -0
  290. data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
  291. data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
  292. data/ext/boost/type_traits/intrinsics.hpp +18 -2
  293. data/ext/boost/type_traits/is_abstract.hpp +1 -1
  294. data/ext/boost/type_traits/is_array.hpp +1 -1
  295. data/ext/boost/type_traits/is_const.hpp +1 -1
  296. data/ext/boost/type_traits/is_convertible.hpp +78 -17
  297. data/ext/boost/type_traits/is_function.hpp +6 -1
  298. data/ext/boost/type_traits/is_integral.hpp +6 -1
  299. data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
  300. data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
  301. data/ext/boost/type_traits/is_pod.hpp +3 -1
  302. data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
  303. data/ext/boost/type_traits/is_volatile.hpp +1 -1
  304. data/ext/boost/type_traits/make_signed.hpp +153 -0
  305. data/ext/boost/type_traits/make_unsigned.hpp +16 -0
  306. data/ext/boost/type_traits/remove_const.hpp +1 -1
  307. data/ext/boost/type_traits/remove_cv.hpp +1 -1
  308. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  309. data/ext/boost/type_traits/remove_volatile.hpp +1 -1
  310. data/ext/boost/unordered/detail/allocate.hpp +1120 -0
  311. data/ext/boost/unordered/detail/buckets.hpp +876 -0
  312. data/ext/boost/unordered/detail/equivalent.hpp +680 -0
  313. data/ext/boost/unordered/detail/extract_key.hpp +183 -0
  314. data/ext/boost/unordered/detail/fwd.hpp +23 -0
  315. data/ext/boost/unordered/detail/table.hpp +861 -0
  316. data/ext/boost/unordered/detail/unique.hpp +622 -0
  317. data/ext/boost/unordered/detail/util.hpp +260 -0
  318. data/ext/boost/unordered/unordered_map.hpp +1652 -0
  319. data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
  320. data/ext/boost/unordered/unordered_set.hpp +1549 -0
  321. data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
  322. data/ext/boost/unordered_map.hpp +18 -0
  323. data/ext/boost/unordered_set.hpp +18 -0
  324. data/ext/boost/utility/addressof.hpp +2 -2
  325. data/ext/boost/utility/result_of.hpp +8 -1
  326. data/ext/boost/version.hpp +2 -2
  327. data/ext/common/Account.h +1 -1
  328. data/ext/common/AccountsDatabase.h +1 -1
  329. data/ext/common/AgentsStarter.cpp +3 -1
  330. data/ext/common/AgentsStarter.h +2 -2
  331. data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
  332. data/ext/common/ApplicationPool2/AppTypes.h +17 -8
  333. data/ext/common/ApplicationPool2/Common.h +12 -12
  334. data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
  335. data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
  336. data/ext/common/ApplicationPool2/Group.h +6 -6
  337. data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
  338. data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
  339. data/ext/common/ApplicationPool2/Pool.h +21 -21
  340. data/ext/common/ApplicationPool2/Process.h +6 -6
  341. data/ext/common/ApplicationPool2/Session.h +1 -1
  342. data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
  343. data/ext/common/ApplicationPool2/Socket.h +2 -2
  344. data/ext/common/ApplicationPool2/Spawner.h +64 -14
  345. data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
  346. data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
  347. data/ext/common/BackgroundEventLoop.cpp +4 -4
  348. data/ext/common/BackgroundEventLoop.h +1 -1
  349. data/ext/common/Constants.h +13 -1
  350. data/ext/common/EventedBufferedInput.h +8 -8
  351. data/ext/common/Exceptions.cpp +71 -0
  352. data/ext/common/Exceptions.h +60 -7
  353. data/ext/common/FileDescriptor.h +4 -4
  354. data/ext/common/MessageClient.h +1 -1
  355. data/ext/common/MessageServer.h +5 -5
  356. data/ext/common/MultiLibeio.cpp +3 -3
  357. data/ext/common/MultiLibeio.h +2 -2
  358. data/ext/common/RandomGenerator.h +11 -11
  359. data/ext/common/ResourceLocator.h +8 -1
  360. data/ext/common/SafeLibev.h +12 -12
  361. data/ext/common/ServerInstanceDir.h +11 -3
  362. data/ext/common/UnionStation.h +10 -10
  363. data/ext/common/Utils.cpp +11 -13
  364. data/ext/common/Utils.h +9 -9
  365. data/ext/common/Utils/BlockingQueue.h +10 -10
  366. data/ext/common/Utils/BufferedIO.h +1 -1
  367. data/ext/common/Utils/CachedFileStat.hpp +2 -2
  368. data/ext/common/Utils/FileChangeChecker.h +1 -1
  369. data/ext/common/Utils/HashMap.h +13 -4
  370. data/ext/common/Utils/IOUtils.cpp +33 -10
  371. data/ext/common/Utils/IniFile.h +3 -3
  372. data/ext/common/Utils/Lock.h +2 -2
  373. data/ext/common/Utils/MessagePassing.h +10 -10
  374. data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
  375. data/ext/common/Utils/ScopeGuard.h +5 -5
  376. data/ext/common/Utils/jsoncpp.cpp +2 -0
  377. data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
  378. data/ext/common/agents/HelperAgent/Main.cpp +18 -18
  379. data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
  380. data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
  381. data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
  382. data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
  383. data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
  384. data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
  385. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  386. data/ext/common/agents/SpawnPreparer.cpp +1 -0
  387. data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
  388. data/ext/common/agents/Watchdog/Main.cpp +81 -73
  389. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
  390. data/ext/libev/Changes +57 -0
  391. data/ext/libev/LICENSE +2 -1
  392. data/ext/libev/Makefile.in +110 -50
  393. data/ext/libev/README +8 -8
  394. data/ext/libev/aclocal.m4 +1503 -861
  395. data/ext/libev/config.guess +290 -304
  396. data/ext/libev/config.sub +77 -198
  397. data/ext/libev/configure +1735 -890
  398. data/ext/libev/configure.ac +3 -2
  399. data/ext/libev/ev++.h +6 -6
  400. data/ext/libev/ev.c +541 -214
  401. data/ext/libev/ev.h +106 -100
  402. data/ext/libev/ev_epoll.c +1 -1
  403. data/ext/libev/ev_kqueue.c +20 -4
  404. data/ext/libev/ev_vars.h +15 -16
  405. data/ext/libev/ev_win32.c +12 -2
  406. data/ext/libev/ev_wrap.h +162 -160
  407. data/ext/libev/event.c +29 -6
  408. data/ext/libev/event.h +9 -2
  409. data/ext/libev/ltmain.sh +2632 -1384
  410. data/ext/nginx/ConfigurationCommands.c +1 -1
  411. data/ext/nginx/ConfigurationCommands.c.erb +3 -1
  412. data/ext/nginx/ContentHandler.c +25 -2
  413. data/ext/nginx/CreateLocationConfig.c +1 -0
  414. data/ext/nginx/CreateLocationConfig.c.erb +1 -1
  415. data/ext/nginx/MergeLocationConfig.c +1 -0
  416. data/ext/nginx/MergeLocationConfig.c.erb +1 -1
  417. data/ext/nginx/config +12 -0
  418. data/ext/oxt/dynamic_thread_group.hpp +7 -4
  419. data/ext/oxt/system_calls.cpp +5 -1
  420. data/ext/oxt/system_calls.hpp +3 -0
  421. data/helper-scripts/node-loader.js +117 -249
  422. data/lib/phusion_passenger.rb +27 -5
  423. data/lib/phusion_passenger/abstract_installer.rb +104 -9
  424. data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
  425. data/lib/phusion_passenger/apache2/config_options.rb +6 -3
  426. data/lib/phusion_passenger/common_library.rb +7 -1
  427. data/lib/phusion_passenger/constants.rb +6 -0
  428. data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
  429. data/lib/phusion_passenger/nginx/config_options.rb +2 -1
  430. data/lib/phusion_passenger/packaging.rb +3 -0
  431. data/lib/phusion_passenger/platform_info/apache.rb +43 -6
  432. data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
  433. data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
  434. data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
  435. data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
  436. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
  437. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  438. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
  439. data/lib/phusion_passenger/platform_info/linux.rb +2 -1
  440. data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
  441. data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
  442. data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
  443. data/lib/phusion_passenger/standalone/start_command.rb +8 -2
  444. data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
  445. data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
  446. data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
  447. data/node_lib/phusion_passenger/line_reader.js +154 -0
  448. data/node_lib/phusion_passenger/request_handler.js +65 -0
  449. data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
  450. data/resources/templates/apache2/deployment_example.txt.erb +2 -1
  451. data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
  452. data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
  453. data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  454. data/resources/templates/general_error_with_html.html.template +1 -1
  455. data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
  456. data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
  457. data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
  458. data/resources/templates/nginx/deployment_example.txt.erb +2 -1
  459. data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  460. data/resources/templates/standalone/config.erb +1 -0
  461. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
  462. data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
  463. data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
  464. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
  465. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
  466. data/test/cxx/EventedBufferedInputTest.cpp +6 -6
  467. data/test/cxx/FileBackedPipeTest.cpp +1 -1
  468. data/test/cxx/MessagePassingTest.cpp +1 -1
  469. data/test/cxx/MessageServerTest.cpp +4 -4
  470. data/test/cxx/RequestHandlerTest.cpp +7 -7
  471. data/test/cxx/UnionStationTest.cpp +2 -2
  472. data/test/node/line_reader_spec.js +338 -0
  473. data/test/node/spec_helper.js +27 -0
  474. data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
  475. metadata +131 -22
  476. metadata.gz.asc +7 -7
  477. data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
  478. data/ext/boost/lambda/core.hpp +0 -79
  479. data/ext/boost/lambda/detail/actions.hpp +0 -174
  480. data/ext/boost/lambda/detail/arity_code.hpp +0 -110
  481. data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
  482. data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
  483. data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
  484. data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
  485. data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
  486. data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
  487. data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
  488. data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
  489. data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
  490. data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
  491. data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
  492. data/ext/boost/lambda/detail/operators.hpp +0 -370
  493. data/ext/boost/lambda/detail/ret.hpp +0 -325
  494. data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
  495. data/ext/boost/lambda/detail/select_functions.hpp +0 -74
  496. data/ext/boost/lambda/lambda.hpp +0 -34
@@ -242,7 +242,7 @@
242
242
  {
243
243
 
244
244
  ngx_string("passenger_set_cgi_param"),
245
- NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF | NGX_CONF_TAKE2,
245
+ NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF | NGX_CONF_TAKE2,
246
246
  set_null_terminated_keyval_slot,
247
247
  NGX_HTTP_LOC_CONF_OFFSET,
248
248
  offsetof(passenger_loc_conf_t, vars_source),
@@ -57,7 +57,7 @@ end
57
57
 
58
58
  def context_for(option)
59
59
  context = option.fetch(:context, [:main, :srv, :loc, :lif])
60
- return context.map{ |c| "NGX_HTTP_#{c.upcase}_CONF" }.join(" | ")
60
+ return context.map{ |c| "NGX_HTTP_#{c.to_s.upcase}_CONF" }.join(" | ")
61
61
  end
62
62
 
63
63
  def take_type_for(option)
@@ -89,6 +89,8 @@ def setter_function_for(option)
89
89
  return "ngx_conf_set_str_array_slot"
90
90
  when :string_keyval
91
91
  return "set_null_terminated_keyval_slot"
92
+ when :path
93
+ return "ngx_conf_set_path_slot"
92
94
  else
93
95
  raise "Unknown type #{option[:type].inspect} for option #{option[:name]}"
94
96
  end
@@ -1225,6 +1225,7 @@ passenger_content_handler(ngx_http_request_t *r)
1225
1225
  u_char page_cache_file_str[NGX_MAX_PATH + 1];
1226
1226
  ngx_str_t page_cache_file;
1227
1227
  passenger_context_t *context;
1228
+ PP_Error error;
1228
1229
 
1229
1230
  if (passenger_main_conf.root_dir.len == 0) {
1230
1231
  return NGX_DECLINED;
@@ -1303,18 +1304,40 @@ passenger_content_handler(ngx_http_request_t *r)
1303
1304
  return passenger_static_content_handler(r, &page_cache_file);
1304
1305
  }
1305
1306
 
1307
+ pp_error_init(&error);
1306
1308
  if (slcf->app_root.data == NULL) {
1307
1309
  context->app_type = pp_app_type_detector_check_document_root(
1308
1310
  pp_app_type_detector,
1309
1311
  (const char *) context->public_dir.data, context->public_dir.len,
1310
- context->base_uri.len != 0);
1312
+ context->base_uri.len != 0,
1313
+ &error);
1311
1314
  } else {
1312
1315
  context->app_type = pp_app_type_detector_check_app_root(
1313
1316
  pp_app_type_detector,
1314
- (const char *) slcf->app_root.data, slcf->app_root.len);
1317
+ (const char *) slcf->app_root.data, slcf->app_root.len,
1318
+ &error);
1315
1319
  }
1316
1320
  if (context->app_type == PAT_NONE) {
1317
1321
  return NGX_DECLINED;
1322
+ } else if (context->app_type == PAT_ERROR) {
1323
+ if (error.errnoCode == EACCES) {
1324
+ ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
1325
+ "%s; This error means that the Nginx worker process (PID %d, "
1326
+ "running as UID %d) does not have permission to access this file. "
1327
+ "Please read the manual to learn how to fix this problem: "
1328
+ "section 'Troubleshooting' -> 'Upon accessing the web app, Nginx "
1329
+ "reports a \"Permission denied\" error'; Extra info",
1330
+ error.message,
1331
+ (int) getpid(),
1332
+ (int) getuid());
1333
+ } else {
1334
+ ngx_log_error(NGX_LOG_ALERT, r->connection->log,
1335
+ (error.errnoCode == PP_NO_ERRNO) ? 0 : error.errnoCode,
1336
+ "%s",
1337
+ error.message);
1338
+ }
1339
+ pp_error_destroy(&error);
1340
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
1318
1341
  }
1319
1342
 
1320
1343
 
@@ -148,3 +148,4 @@
148
148
 
149
149
  conf->request_queue_overflow_status_code = NGX_CONF_UNSET;
150
150
 
151
+
@@ -67,4 +67,4 @@ end
67
67
  <% else %>
68
68
  <% raise "Unknown option type #{option[:type].inspect} for option #{option[:name]}" %>
69
69
  <% end %>
70
- <% end %>
70
+ <% end %>
@@ -170,3 +170,4 @@
170
170
  prev->request_queue_overflow_status_code,
171
171
  NGX_CONF_UNSET);
172
172
 
173
+
@@ -69,4 +69,4 @@ end
69
69
  <% else %>
70
70
  <% raise "Unknown option type #{option[:type].inspect} for option #{option[:name]}" %>
71
71
  <% end %>
72
- <% end %>
72
+ <% end %>
@@ -68,6 +68,18 @@ if [ $ngx_found = yes ]; then
68
68
  CORE_LIBS="$CORE_LIBS -lm"
69
69
  fi
70
70
 
71
+ ngx_feature="POSIX realtime library"
72
+ ngx_feature_name=
73
+ ngx_feature_run=no
74
+ ngx_feature_incs=
75
+ ngx_feature_path=
76
+ ngx_feature_libs="-lrt"
77
+ ngx_feature_test=
78
+ . auto/feature
79
+ if [ $ngx_found = yes ]; then
80
+ CORE_LIBS="$CORE_LIBS -lrt"
81
+ fi
82
+
71
83
  nginx_version=`grep 'NGINX_VERSION ' src/core/nginx.h | awk '{ print $3 }' | sed 's/"//g'`
72
84
 
73
85
  nginx_major_version=`echo "$nginx_version" | cut -d . -f 1`
@@ -25,6 +25,7 @@
25
25
  #ifndef _OXT_DYNAMIC_THREAD_GROUP_HPP_
26
26
  #define _OXT_DYNAMIC_THREAD_GROUP_HPP_
27
27
 
28
+ #include <vector>
28
29
  #include <list>
29
30
  #include <memory>
30
31
 
@@ -54,7 +55,7 @@ using namespace boost;
54
55
  class dynamic_thread_group {
55
56
  private:
56
57
  struct thread_handle;
57
- typedef shared_ptr<thread_handle> thread_handle_ptr;
58
+ typedef boost::shared_ptr<thread_handle> thread_handle_ptr;
58
59
 
59
60
  /** A container which aggregates a thread object
60
61
  * as well as the its own iterator in the 'thread_handles'
@@ -172,10 +173,11 @@ public:
172
173
  list<thread_handle_ptr>::iterator it;
173
174
  thread_handle_ptr handle;
174
175
  unsigned int nthreads_copy = nthreads;
175
- thread *threads[nthreads];
176
+ vector<thread *> threads;
176
177
  unsigned int i = 0;
177
178
 
178
179
  // We make a copy so that the handles aren't destroyed prematurely.
180
+ threads.reserve(nthreads);
179
181
  thread_handles_copy = thread_handles;
180
182
  for (it = thread_handles.begin(); it != thread_handles.end(); it++, i++) {
181
183
  handle = *it;
@@ -186,7 +188,7 @@ public:
186
188
  nthreads = 0;
187
189
 
188
190
  l.unlock();
189
- thread::interrupt_and_join_multiple(threads, nthreads_copy, interruptSyscalls);
191
+ thread::interrupt_and_join_multiple(&threads[0], nthreads_copy, interruptSyscalls);
190
192
  }
191
193
 
192
194
  void join_all() {
@@ -196,10 +198,11 @@ public:
196
198
  list<thread_handle_ptr>::iterator it;
197
199
  thread_handle_ptr handle;
198
200
  unsigned int nthreads_copy = nthreads;
199
- thread *threads[nthreads];
201
+ vector<thread *> threads;
200
202
  unsigned int i = 0;
201
203
 
202
204
  // We make a copy so that the handles aren't destroyed prematurely.
205
+ threads.reserve(nthreads);
203
206
  thread_handles_copy = thread_handles;
204
207
  for (it = thread_handles.begin(); it != thread_handles.end(); it++, i++) {
205
208
  handle = *it;
@@ -72,6 +72,10 @@ oxt::setup_syscall_interruption_support() {
72
72
 
73
73
  void
74
74
  oxt::setup_random_failure_simulation(const ErrorChance *_errorChances, unsigned int n) {
75
+ if (n > OXT_MAX_ERROR_CHANCES) {
76
+ throw std::runtime_error("Number of error chances may not exceed OXT_MAX_ERROR_CHANCES");
77
+ }
78
+
75
79
  ErrorChance *storage = new ErrorChance[n];
76
80
  for (unsigned int i = 0; i < n; i++) {
77
81
  storage[i] = _errorChances[i];
@@ -84,7 +88,7 @@ static bool
84
88
  shouldSimulateFailure() {
85
89
  if (nErrorChances > 0) {
86
90
  double number = random() / (double) RAND_MAX;
87
- const ErrorChance *candidates[nErrorChances];
91
+ const ErrorChance *candidates[OXT_MAX_ERROR_CHANCES];
88
92
  unsigned int i, n = 0;
89
93
 
90
94
  for (i = 0; i < nErrorChances; i++) {
@@ -114,6 +114,7 @@
114
114
 
115
115
  namespace oxt {
116
116
  static const int INTERRUPTION_SIGNAL = SIGUSR1; // SIGUSR2 is reserved by Valgrind...
117
+ #define OXT_MAX_ERROR_CHANCES 16
117
118
 
118
119
  struct ErrorChance {
119
120
  double chance;
@@ -131,6 +132,8 @@ namespace oxt {
131
132
  * by oxt::thread::interrupt() or oxt::thread::interrupt_and_join().
132
133
  */
133
134
  namespace syscalls {
135
+ using namespace std;
136
+
134
137
  int open(const char *path, int oflag);
135
138
  int open(const char *path, int oflag, mode_t mode);
136
139
  ssize_t read(int fd, void *buf, size_t count);
@@ -23,243 +23,27 @@
23
23
  * THE SOFTWARE.
24
24
  */
25
25
 
26
+ module.paths.unshift(__dirname + "/../node_lib");
26
27
  var EventEmitter = require('events').EventEmitter;
27
28
  var net = require('net');
28
- GLOBAL.PhusionPassenger = new EventEmitter();
29
-
30
- /**
31
- * Class for reading a stream line-by-line.
32
- * Usage:
33
- *
34
- * reader = new LineReader(stream);
35
- * reader.readLine(function(line) {
36
- * ...
37
- * // When done:
38
- * reader.close();
39
- * });
40
- */
41
- function LineReader(stream) {
42
- var self = this;
43
- this.stream = stream;
44
-
45
- this.buffer = '';
46
- this.lines = [];
47
- this.callbacks = [];
48
-
49
- function handleLineBuffer() {
50
- if (self.lineBufferIsFull()) {
51
- stream.pause();
52
- self.paused = true;
53
- }
54
-
55
- while (self.buffer != undefined && self.lines.length > 0 && self.callbacks.length > 0) {
56
- line = self.lines.shift();
57
- callback = self.callbacks.shift();
58
- callback(line);
59
- }
60
-
61
- if (self.buffer != undefined && !self.lineBufferIsFull() && self.paused) {
62
- self.paused = false;
63
- self.stream.resume();
64
- }
65
- }
66
-
67
- function onData(data) {
68
- var index, line, callback;
69
-
70
- if (self.buffer == undefined) {
71
- // Already closed.
72
- return;
73
- }
74
-
75
- self.buffer += data;
76
- while ((index = self.buffer.indexOf("\n")) != -1) {
77
- line = self.buffer.substr(0, index + 1);
78
- self.buffer = self.buffer.substr(index + 1);
79
- self.lines.push(line);
80
- }
81
- handleLineBuffer();
82
- }
83
-
84
- function onEnd() {
85
- if (self.buffer != undefined) {
86
- self.lines.push(self.buffer);
87
- self.buffer = '';
88
- handleLineBuffer();
89
- if (self.onEof) {
90
- self.onEof();
91
- }
92
- }
93
- }
94
-
95
- this.onData = onData;
96
- this.onEnd = onEnd;
97
- stream.on('data', onData);
98
- stream.on('end', onEnd);
99
- stream.resume();
100
- }
101
-
102
- LineReader.prototype.close = function() {
103
- this.stream.pause();
104
- this.stream.removeListener('data', this.onData);
105
- this.stream.removeListener('end', this.onEnd);
106
- this.buffer = undefined;
107
- this.lines = undefined;
108
- }
109
-
110
- LineReader.prototype.lineBufferIsFull = function() {
111
- return this.lines.length > 0;
112
- }
113
-
114
- LineReader.prototype.readLine = function(callback) {
115
- if (this.lines.length > 0) {
116
- var line = this.lines.shift();
117
- if (!this.lineBufferIsFull() && this.paused) {
118
- this.paused = false;
119
- this.stream.resume();
120
- }
121
- callback(line);
122
- } else {
123
- this.callbacks.push(callback);
124
- }
125
- }
126
-
127
-
128
- const
129
- SPP_PARSING_SIZE = 0,
130
- SPP_PARSING_HEADERS = 1,
131
- SPP_DONE = 10,
132
- SPP_ERROR = 11,
133
- SPP_ENCODING = 'binary';
134
-
135
- function SessionProtocolParser() {
136
- this.state = SPP_PARSING_SIZE;
137
- this.processed = 0;
138
- this.size = 0;
139
- this.keys = [];
140
- }
141
-
142
- SessionProtocolParser.prototype.feed = function(buffer) {
143
- var consumed = 0;
144
- var locallyConsumed;
145
-
146
- while (consumed < buffer.length && this.state != SPP_ERROR && this.state != SPP_DONE) {
147
- switch (this.state) {
148
- case SPP_PARSING_SIZE:
149
- this.size += buffer[consumed] * Math.pow(256, 3 - this.processed);
150
- locallyConsumed = 1;
151
- this.processed++;
152
- if (this.processed == 4) {
153
- this.state = SPP_PARSING_HEADERS;
154
- this.buffer = new Buffer(this.size);
155
- this.processed = 0;
156
- }
157
- break;
158
-
159
- case SPP_PARSING_HEADERS:
160
- locallyConsumed = Math.min(buffer.length - consumed, this.buffer.length - this.processed);
161
- buffer.copy(this.buffer, this.processed, consumed, consumed + locallyConsumed);
162
- this.processed += locallyConsumed;
163
- if (this.processed == this.buffer.length) {
164
- this.state = SPP_DONE;
165
- this.parse();
166
- }
167
- break;
168
-
169
- default:
170
- console.assert(false);
171
- break;
172
- }
173
-
174
- consumed += locallyConsumed;
175
- }
176
-
177
- return consumed;
178
- }
179
-
180
- SessionProtocolParser.prototype.parse = function() {
181
- function findZero(buffer, start) {
182
- while (start < buffer.length) {
183
- if (buffer[start] == 0) {
184
- return start;
185
- } else {
186
- start++;
187
- }
188
- }
189
- return -1;
190
- }
191
-
192
- var start = 0;
193
- var key, value;
194
-
195
- while (start < this.buffer.length) {
196
- var keyEnd = findZero(this.buffer, start);
197
- if (keyEnd != -1 && keyEnd + 1 < this.buffer.length) {
198
- var valueStart = keyEnd + 1;
199
- var valueEnd = findZero(this.buffer, valueStart);
200
- if (valueEnd != -1) {
201
- key = this.buffer.toString(SPP_ENCODING, start, keyEnd);
202
- value = this.buffer.toString(SPP_ENCODING, valueStart, valueEnd);
203
- start = valueEnd + 1;
204
- this.keys.push(key);
205
- this[key] = value;
206
- } else {
207
- start = this.buffer.length;
208
- }
209
- } else {
210
- start = this.buffer.length;
211
- }
212
- }
213
- }
214
-
215
- //var p = new SessionProtocolParser();
216
- //p.feed(new Buffer("\x00\x00\x00\x06hi\0ho\0"));
217
- //process.exit();
29
+ var http = require('http');
218
30
 
31
+ var LineReader = require('phusion_passenger/line_reader').LineReader;
32
+ var RequestHandler = require('phusion_passenger/request_handler').RequestHandler;
33
+ var HttplibEmulation = require('phusion_passenger/httplib_emulation');
219
34
 
220
- function RequestHandler(readyCallback, clientCallback) {
221
- var self = this;
222
-
223
- function handleNewClient(socket) {
224
- var state = 'PARSING_HEADER';
225
- var parser = new SessionProtocolParser();
226
-
227
- function handleData(data) {
228
- if (state == 'PARSING_HEADER') {
229
- var consumed = parser.feed(data);
230
- if (parser.state == SPP_DONE) {
231
- state = 'HEADER_SEEN';
232
- socket.removeListener('data', handleData);
233
- PhusionPassenger.emit('request', parser, socket);
234
- if (consumed != data.length) {
235
- socket.emit('data', data.slice(consumed));
236
- }
237
- } else if (parser.state == SPP_ERROR) {
238
- console.error('Header parse error');
239
- socket.destroySoon();
240
- }
241
- } else {
242
- // Do nothing.
243
- }
244
- }
35
+ GLOBAL.PhusionPassenger = new EventEmitter();
36
+ var stdinReader = new LineReader(process.stdin);
37
+ beginHandshake();
38
+ readInitializationHeader();
245
39
 
246
- socket.on('data', handleData);
247
- }
248
40
 
249
- var server = net.createServer({ allowHalfOpen: true }, handleNewClient);
250
- this.server = server;
251
- server.listen(0, function() {
252
- readyCallback(self);
253
- });
41
+ function beginHandshake() {
42
+ process.stdout.write("!> I have control 1.0\n");
254
43
  }
255
44
 
256
-
257
- /**************************/
258
-
259
- var reader = new LineReader(process.stdin);
260
-
261
45
  function readInitializationHeader() {
262
- reader.readLine(function(line) {
46
+ stdinReader.readLine(function(line) {
263
47
  if (line != "You have control 1.0\n") {
264
48
  console.error('Invalid initialization header');
265
49
  process.exit(1);
@@ -273,9 +57,9 @@ function readOptions() {
273
57
  var options = {};
274
58
 
275
59
  function readNextOption() {
276
- reader.readLine(function(line) {
60
+ stdinReader.readLine(function(line) {
277
61
  if (line == "\n") {
278
- initialize(options);
62
+ setupEnvironment(options);
279
63
  } else if (line == "") {
280
64
  console.error("End of stream encountered while reading initialization options");
281
65
  process.exit(1);
@@ -290,29 +74,113 @@ function readOptions() {
290
74
  readNextOption();
291
75
  }
292
76
 
293
- function initialize(options) {
77
+ function setupEnvironment(options) {
294
78
  PhusionPassenger.options = options;
79
+ PhusionPassenger.configure = configure;
80
+ PhusionPassenger._requestHandler = new RequestHandler(loadApplication);
81
+ PhusionPassenger._appInstalled = false;
82
+ http.Server.prototype.originalListen = http.Server.prototype.listen;
83
+ http.Server.prototype.listen = installServer;
84
+
85
+ stdinReader.close();
86
+ stdinReader = undefined;
87
+ process.stdin.on('end', shutdown);
88
+ process.stdin.resume();
89
+ }
295
90
 
296
- PhusionPassenger.requestHandler = new RequestHandler(function() {
297
- require(options.app_root + '/passenger_node.js');
298
- process.stdout.write("!> Ready\n");
299
- process.stdout.write("!> socket: main;tcp://127.0.0.1:" +
300
- PhusionPassenger.requestHandler.server.address().port +
301
- ";session;0\n");
302
- process.stdout.write("!> \n");
303
- });
91
+ /**
92
+ * PhusionPassenger.configure(options)
93
+ *
94
+ * Configures Phusion Passenger's behavior inside this Node application.
95
+ *
96
+ * Options:
97
+ * autoInstall (boolean, default true)
98
+ * Whether to install the first HttpServer object for which listen() is called,
99
+ * as the Phusion Passenger request handler.
100
+ */
101
+ function configure(_options) {
102
+ var options = {
103
+ autoInstall: true
104
+ };
105
+ for (var key in _options) {
106
+ options[key] = _options[key];
107
+ }
304
108
 
305
- reader.close();
306
- reader = undefined;
307
- process.stdin.on('end', function() {
308
- if (PhusionPassenger.listeners('exit').length == 0) {
309
- process.exit(0);
109
+ if (!options.autoInstall) {
110
+ http.Server.prototype.listen = listenAndMaybeInstall;
111
+ }
112
+ }
113
+
114
+ function loadApplication() {
115
+ require(PhusionPassenger.options.app_root + '/app.js');
116
+ }
117
+
118
+ function extractCallback(args) {
119
+ if (args.length > 1 && typeof(args[args.length - 1]) == 'function') {
120
+ return args[args.length - 1];
121
+ }
122
+ }
123
+
124
+ function installServer() {
125
+ var server = this;
126
+ if (!PhusionPassenger._appInstalled) {
127
+ PhusionPassenger._appInstalled = true;
128
+ PhusionPassenger._server = server;
129
+ finalizeStartup();
130
+
131
+ PhusionPassenger.on('request', function(headers, socket, bodyBegin) {
132
+ var req = HttplibEmulation.createIncomingMessage(headers, socket, bodyBegin);
133
+ if (req.headers['upgrade']) {
134
+ if (EventEmitter.listenerCount(server, 'upgrade') > 0) {
135
+ server.emit('upgrade', req, socket, bodyBegin);
136
+ } else {
137
+ socket.destroy();
138
+ }
139
+ } else {
140
+ var res = HttplibEmulation.createServerResponse(req);
141
+ server.emit('request', req, res);
142
+ }
143
+ });
144
+
145
+ var callback = extractCallback(arguments);
146
+ if (callback) {
147
+ server.once('listening', callback);
148
+ }
149
+ server.emit('listening');
150
+ } else {
151
+ throw new Error("http.Server.listen() was called more than once, which " +
152
+ "is not allowed because Phusion Passenger is in auto-install mode. " +
153
+ "This means that the first http.Server object for which listen() is called, " +
154
+ "is automatically installed as the Phusion Passenger request handler. " +
155
+ "If you want to create and listen on multiple http.Server object then " +
156
+ "you should disable auto-install mode.");
157
+ }
158
+ }
159
+
160
+ function listenAndMaybeInstall(port) {
161
+ if (port === 'passenger') {
162
+ if (!PhusionPassenger._appInstalled) {
163
+ installServer.apply(this, arguments);
310
164
  } else {
311
- PhusionPassenger.emit('exit');
165
+ throw new Error("You may only call listen('passenger') once");
312
166
  }
313
- });
314
- process.stdin.resume();
167
+ } else {
168
+ this.originalListen.apply(this, arguments);
169
+ }
315
170
  }
316
171
 
317
- process.stdout.write("!> I have control 1.0\n");
318
- readInitializationHeader();
172
+ function finalizeStartup() {
173
+ process.stdout.write("!> Ready\n");
174
+ process.stdout.write("!> socket: main;tcp://127.0.0.1:" +
175
+ PhusionPassenger._requestHandler.server.address().port +
176
+ ";session;0\n");
177
+ process.stdout.write("!> \n");
178
+ }
179
+
180
+ function shutdown() {
181
+ if (PhusionPassenger.listeners('exit').length == 0) {
182
+ process.exit(0);
183
+ } else {
184
+ PhusionPassenger.emit('exit');
185
+ }
186
+ }