passenger 3.0.21 → 3.9.1.beta

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 (835) hide show
  1. data/DEVELOPERS.TXT +4 -10
  2. data/NEWS +19 -27
  3. data/Rakefile +20 -19
  4. data/bin/passenger +3 -2
  5. data/bin/passenger-config +35 -5
  6. data/bin/passenger-install-apache2-module +12 -12
  7. data/bin/passenger-install-nginx-module +55 -38
  8. data/bin/passenger-memory-stats +3 -1
  9. data/bin/passenger-status +7 -35
  10. data/build/agents.rb +107 -21
  11. data/build/apache2.rb +11 -46
  12. data/build/basics.rb +61 -9
  13. data/build/common_library.rb +59 -142
  14. data/build/cxx_tests.rb +111 -110
  15. data/build/documentation.rb +33 -0
  16. data/build/misc.rb +30 -12
  17. data/build/nginx.rb +10 -39
  18. data/build/oxt_tests.rb +1 -0
  19. data/build/ruby_extension.rb +1 -5
  20. data/build/test_basics.rb +3 -2
  21. data/dev/copy_boost_headers.rb +2 -1
  22. data/doc/Architectural overview.html +49 -90
  23. data/doc/DebuggingAndStressTesting.txt.md +49 -0
  24. data/doc/Packaging.txt.md +254 -0
  25. data/doc/Security of user switching support.html +35 -66
  26. data/doc/Users guide Apache.html +588 -758
  27. data/doc/Users guide Apache.idmap.txt +253 -136
  28. data/doc/Users guide Apache.txt +154 -109
  29. data/doc/Users guide Nginx.html +544 -660
  30. data/doc/Users guide Nginx.idmap.txt +179 -91
  31. data/doc/Users guide Nginx.txt +192 -118
  32. data/doc/Users guide Standalone.html +65 -48
  33. data/doc/Users guide Standalone.idmap.txt +10 -2
  34. data/doc/Users guide Standalone.txt +4 -0
  35. data/doc/images/glyphicons-halflings-white.png +0 -0
  36. data/doc/images/glyphicons-halflings.png +0 -0
  37. data/doc/images/phusion_banner_small.png +0 -0
  38. data/doc/images/{smart-lv2.png → smart.png} +0 -0
  39. data/doc/images/{smart-lv2.svg → smart.svg} +0 -0
  40. data/doc/templates/bootstrap.min.css +397 -0
  41. data/doc/templates/markdown.html.erb +117 -0
  42. data/doc/users_guide_snippets/analysis_and_system_maintenance.txt +2 -1
  43. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +26 -48
  44. data/doc/users_guide_snippets/passenger_spawn_method.txt +18 -30
  45. data/doc/users_guide_snippets/support_information.txt +30 -0
  46. data/ext/apache2/Bucket.cpp +9 -26
  47. data/ext/apache2/Bucket.h +13 -10
  48. data/ext/apache2/Configuration.cpp +70 -58
  49. data/ext/apache2/Configuration.hpp +19 -47
  50. data/ext/apache2/DirectoryMapper.h +7 -7
  51. data/ext/apache2/Hooks.cpp +150 -313
  52. data/ext/boost/algorithm/string/detail/case_conv.hpp +4 -2
  53. data/ext/boost/algorithm/string/detail/find_format.hpp +20 -20
  54. data/ext/boost/algorithm/string/detail/find_format_all.hpp +23 -23
  55. data/ext/boost/algorithm/string/detail/find_format_store.hpp +2 -2
  56. data/ext/boost/algorithm/string/detail/formatter.hpp +25 -0
  57. data/ext/boost/algorithm/string/formatter.hpp +20 -3
  58. data/ext/boost/assert.hpp +85 -4
  59. data/ext/boost/bind/bind.hpp +1 -1
  60. data/ext/boost/concept/detail/backward_compatibility.hpp +1 -1
  61. data/ext/boost/concept_check.hpp +140 -64
  62. data/ext/boost/config.hpp +1 -1
  63. data/ext/boost/config/auto_link.hpp +8 -6
  64. data/ext/boost/config/compiler/borland.hpp +12 -2
  65. data/ext/boost/config/compiler/clang.hpp +89 -30
  66. data/ext/boost/config/compiler/codegear.hpp +3 -2
  67. data/ext/boost/config/compiler/common_edg.hpp +7 -5
  68. data/ext/boost/config/compiler/cray.hpp +61 -0
  69. data/ext/boost/config/compiler/digitalmars.hpp +9 -1
  70. data/ext/boost/config/compiler/gcc.hpp +33 -24
  71. data/ext/boost/config/compiler/gcc_xml.hpp +4 -0
  72. data/ext/boost/config/compiler/hp_acc.hpp +12 -1
  73. data/ext/boost/config/compiler/intel.hpp +78 -4
  74. data/ext/boost/config/compiler/metrowerks.hpp +4 -1
  75. data/ext/boost/config/compiler/mpw.hpp +4 -1
  76. data/ext/boost/config/compiler/nvcc.hpp +8 -66
  77. data/ext/boost/config/compiler/pathscale.hpp +80 -0
  78. data/ext/boost/config/compiler/pgi.hpp +5 -5
  79. data/ext/boost/config/compiler/sunpro_cc.hpp +4 -1
  80. data/ext/boost/config/compiler/vacpp.hpp +37 -13
  81. data/ext/boost/config/compiler/visualc.hpp +24 -11
  82. data/ext/boost/config/platform/bsd.hpp +1 -1
  83. data/ext/boost/config/platform/cray.hpp +18 -0
  84. data/ext/boost/config/platform/cygwin.hpp +10 -0
  85. data/ext/boost/config/platform/linux.hpp +5 -0
  86. data/ext/boost/config/platform/macos.hpp +5 -4
  87. data/ext/boost/config/platform/symbian.hpp +5 -2
  88. data/ext/boost/config/platform/vms.hpp +25 -0
  89. data/ext/boost/config/platform/win32.hpp +7 -1
  90. data/ext/boost/config/select_compiler_config.hpp +8 -25
  91. data/ext/boost/config/select_platform_config.hpp +8 -1
  92. data/ext/boost/config/select_stdlib_config.hpp +9 -1
  93. data/ext/boost/config/stdlib/dinkumware.hpp +6 -9
  94. data/ext/boost/config/stdlib/libcomo.hpp +1 -4
  95. data/ext/boost/config/stdlib/libcpp.hpp +36 -0
  96. data/ext/boost/config/stdlib/libstdcpp3.hpp +37 -11
  97. data/ext/boost/config/stdlib/modena.hpp +1 -4
  98. data/ext/boost/config/stdlib/msl.hpp +1 -4
  99. data/ext/boost/config/stdlib/roguewave.hpp +9 -6
  100. data/ext/boost/config/stdlib/sgi.hpp +12 -4
  101. data/ext/boost/config/stdlib/stlport.hpp +11 -4
  102. data/ext/boost/config/stdlib/vacpp.hpp +11 -4
  103. data/ext/boost/config/suffix.hpp +71 -6
  104. data/ext/boost/config/warning_disable.hpp +1 -1
  105. data/ext/boost/container/container_fwd.hpp +177 -0
  106. data/ext/boost/cstdint.hpp +17 -12
  107. data/ext/boost/current_function.hpp +2 -1
  108. data/ext/boost/date_time/c_time.hpp +17 -1
  109. data/ext/boost/date_time/compiler_config.hpp +13 -15
  110. data/ext/boost/date_time/date_formatting.hpp +7 -1
  111. data/ext/boost/date_time/filetime_functions.hpp +4 -4
  112. data/ext/boost/date_time/gregorian_calendar.ipp +2 -2
  113. data/ext/boost/date_time/strings_from_facet.hpp +3 -3
  114. data/ext/boost/date_time/time_facet.hpp +101 -101
  115. data/ext/boost/detail/endian.hpp +4 -2
  116. data/ext/boost/detail/fenv.hpp +74 -0
  117. data/ext/boost/detail/sp_typeinfo.hpp +6 -0
  118. data/ext/boost/exception/detail/clone_current_exception.hpp +47 -0
  119. data/ext/boost/exception/detail/exception_ptr.hpp +194 -122
  120. data/ext/boost/exception/detail/type_info.hpp +3 -3
  121. data/ext/boost/exception/diagnostic_information.hpp +37 -21
  122. data/ext/boost/exception/exception.hpp +21 -1
  123. data/ext/boost/exception/info.hpp +0 -1
  124. data/ext/boost/function.hpp +2 -2
  125. data/ext/boost/function/function_base.hpp +15 -9
  126. data/ext/boost/function/function_template.hpp +26 -48
  127. data/ext/boost/integer_fwd.hpp +0 -16
  128. data/ext/boost/integer_traits.hpp +2 -2
  129. data/ext/boost/iterator.hpp +1 -1
  130. data/ext/boost/iterator/iterator_adaptor.hpp +1 -7
  131. data/ext/boost/iterator/iterator_facade.hpp +13 -13
  132. data/ext/boost/iterator/transform_iterator.hpp +5 -20
  133. data/ext/boost/lexical_cast.hpp +1655 -673
  134. data/ext/boost/math/policies/policy.hpp +982 -0
  135. data/ext/boost/math/special_functions/detail/fp_traits.hpp +570 -0
  136. data/ext/boost/math/special_functions/detail/round_fwd.hpp +80 -0
  137. data/ext/boost/math/special_functions/fpclassify.hpp +533 -0
  138. data/ext/boost/math/special_functions/math_fwd.hpp +1070 -0
  139. data/ext/boost/math/special_functions/sign.hpp +145 -0
  140. data/ext/boost/math/tools/config.hpp +321 -0
  141. data/ext/boost/math/tools/promotion.hpp +150 -0
  142. data/ext/boost/math/tools/real_cast.hpp +29 -0
  143. data/ext/boost/math/tools/user.hpp +97 -0
  144. data/ext/boost/move/move.hpp +1222 -0
  145. data/ext/boost/mpl/O1_size.hpp +40 -0
  146. data/ext/boost/mpl/O1_size_fwd.hpp +24 -0
  147. data/ext/boost/mpl/advance.hpp +76 -0
  148. data/ext/boost/mpl/advance_fwd.hpp +28 -0
  149. data/ext/boost/mpl/at.hpp +52 -0
  150. data/ext/boost/mpl/at_fwd.hpp +24 -0
  151. data/ext/boost/mpl/aux_/O1_size_impl.hpp +87 -0
  152. data/ext/boost/mpl/aux_/advance_backward.hpp +128 -0
  153. data/ext/boost/mpl/aux_/advance_forward.hpp +127 -0
  154. data/ext/boost/mpl/aux_/arithmetic_op.hpp +92 -0
  155. data/ext/boost/mpl/aux_/at_impl.hpp +45 -0
  156. data/ext/boost/mpl/aux_/begin_end_impl.hpp +101 -0
  157. data/ext/boost/mpl/aux_/clear_impl.hpp +35 -0
  158. data/ext/boost/mpl/aux_/comparison_op.hpp +83 -0
  159. data/ext/boost/mpl/aux_/config/forwarding.hpp +27 -0
  160. data/ext/boost/mpl/aux_/config/typeof.hpp +38 -0
  161. data/ext/boost/mpl/aux_/contains_impl.hpp +61 -0
  162. data/ext/boost/mpl/aux_/find_if_pred.hpp +31 -0
  163. data/ext/boost/mpl/aux_/fold_impl.hpp +43 -0
  164. data/ext/boost/mpl/aux_/has_begin.hpp +23 -0
  165. data/ext/boost/mpl/aux_/has_size.hpp +23 -0
  166. data/ext/boost/mpl/aux_/has_tag.hpp +23 -0
  167. data/ext/boost/mpl/aux_/inserter_algorithm.hpp +159 -0
  168. data/ext/boost/mpl/aux_/is_msvc_eti_arg.hpp +64 -0
  169. data/ext/boost/mpl/aux_/iter_apply.hpp +47 -0
  170. data/ext/boost/mpl/aux_/iter_fold_if_impl.hpp +210 -0
  171. data/ext/boost/mpl/aux_/iter_fold_impl.hpp +42 -0
  172. data/ext/boost/mpl/aux_/lambda_spec.hpp +49 -0
  173. data/ext/boost/mpl/aux_/largest_int.hpp +63 -0
  174. data/ext/boost/mpl/aux_/msvc_eti_base.hpp +77 -0
  175. data/ext/boost/mpl/aux_/msvc_type.hpp +62 -0
  176. data/ext/boost/mpl/aux_/numeric_cast_utils.hpp +77 -0
  177. data/ext/boost/mpl/aux_/numeric_op.hpp +315 -0
  178. data/ext/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp +97 -0
  179. data/ext/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp +97 -0
  180. data/ext/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp +94 -0
  181. data/ext/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp +180 -0
  182. data/ext/boost/mpl/aux_/preprocessed/gcc/greater.hpp +94 -0
  183. data/ext/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp +94 -0
  184. data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp +133 -0
  185. data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp +180 -0
  186. data/ext/boost/mpl/aux_/preprocessed/gcc/less.hpp +94 -0
  187. data/ext/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp +94 -0
  188. data/ext/boost/mpl/aux_/preprocessed/gcc/list.hpp +323 -0
  189. data/ext/boost/mpl/aux_/preprocessed/gcc/minus.hpp +146 -0
  190. data/ext/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp +94 -0
  191. data/ext/boost/mpl/aux_/preprocessed/gcc/plus.hpp +146 -0
  192. data/ext/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp +231 -0
  193. data/ext/boost/mpl/aux_/preprocessed/gcc/times.hpp +146 -0
  194. data/ext/boost/mpl/aux_/preprocessed/gcc/vector.hpp +323 -0
  195. data/ext/boost/mpl/aux_/preprocessor/default_params.hpp +67 -0
  196. data/ext/boost/mpl/aux_/push_back_impl.hpp +70 -0
  197. data/ext/boost/mpl/aux_/push_front_impl.hpp +71 -0
  198. data/ext/boost/mpl/aux_/reverse_fold_impl.hpp +44 -0
  199. data/ext/boost/mpl/aux_/size_impl.hpp +52 -0
  200. data/ext/boost/mpl/aux_/traits_lambda_spec.hpp +63 -0
  201. data/ext/boost/mpl/back_fwd.hpp +24 -0
  202. data/ext/boost/mpl/back_inserter.hpp +34 -0
  203. data/ext/boost/mpl/begin_end.hpp +57 -0
  204. data/ext/boost/mpl/begin_end_fwd.hpp +27 -0
  205. data/ext/boost/mpl/clear.hpp +39 -0
  206. data/ext/boost/mpl/clear_fwd.hpp +24 -0
  207. data/ext/boost/mpl/comparison.hpp +24 -0
  208. data/ext/boost/mpl/contains.hpp +41 -0
  209. data/ext/boost/mpl/contains_fwd.hpp +25 -0
  210. data/ext/boost/mpl/deref.hpp +41 -0
  211. data/ext/boost/mpl/distance.hpp +78 -0
  212. data/ext/boost/mpl/distance_fwd.hpp +28 -0
  213. data/ext/boost/mpl/empty_fwd.hpp +24 -0
  214. data/ext/boost/mpl/equal_to.hpp +21 -0
  215. data/ext/boost/mpl/find.hpp +38 -0
  216. data/ext/boost/mpl/find_if.hpp +50 -0
  217. data/ext/boost/mpl/fold.hpp +48 -0
  218. data/ext/boost/mpl/front_fwd.hpp +24 -0
  219. data/ext/boost/mpl/front_inserter.hpp +33 -0
  220. data/ext/boost/mpl/greater.hpp +21 -0
  221. data/ext/boost/mpl/greater_equal.hpp +21 -0
  222. data/ext/boost/mpl/inserter.hpp +32 -0
  223. data/ext/boost/mpl/iter_fold.hpp +49 -0
  224. data/ext/boost/mpl/iter_fold_if.hpp +117 -0
  225. data/ext/boost/mpl/iterator_range.hpp +42 -0
  226. data/ext/boost/mpl/iterator_tags.hpp +27 -0
  227. data/ext/boost/mpl/less.hpp +21 -0
  228. data/ext/boost/mpl/less_equal.hpp +21 -0
  229. data/ext/boost/mpl/limits/list.hpp +21 -0
  230. data/ext/boost/mpl/limits/vector.hpp +21 -0
  231. data/ext/boost/mpl/list.hpp +57 -0
  232. data/ext/boost/mpl/list/aux_/O1_size.hpp +33 -0
  233. data/ext/boost/mpl/list/aux_/begin_end.hpp +44 -0
  234. data/ext/boost/mpl/list/aux_/clear.hpp +34 -0
  235. data/ext/boost/mpl/list/aux_/empty.hpp +34 -0
  236. data/ext/boost/mpl/list/aux_/front.hpp +33 -0
  237. data/ext/boost/mpl/list/aux_/include_preprocessed.hpp +35 -0
  238. data/ext/boost/mpl/list/aux_/item.hpp +55 -0
  239. data/ext/boost/mpl/list/aux_/iterator.hpp +76 -0
  240. data/ext/boost/mpl/list/aux_/pop_front.hpp +34 -0
  241. data/ext/boost/mpl/list/aux_/preprocessed/plain/list10.hpp +149 -0
  242. data/ext/boost/mpl/list/aux_/preprocessed/plain/list20.hpp +169 -0
  243. data/ext/boost/mpl/list/aux_/push_back.hpp +36 -0
  244. data/ext/boost/mpl/list/aux_/push_front.hpp +39 -0
  245. data/ext/boost/mpl/list/aux_/size.hpp +33 -0
  246. data/ext/boost/mpl/list/aux_/tag.hpp +24 -0
  247. data/ext/boost/mpl/list/list0.hpp +42 -0
  248. data/ext/boost/mpl/list/list10.hpp +43 -0
  249. data/ext/boost/mpl/list/list20.hpp +43 -0
  250. data/ext/boost/mpl/long.hpp +22 -0
  251. data/ext/boost/mpl/long_fwd.hpp +27 -0
  252. data/ext/boost/mpl/minus.hpp +21 -0
  253. data/ext/boost/mpl/multiplies.hpp +53 -0
  254. data/ext/boost/mpl/negate.hpp +81 -0
  255. data/ext/boost/mpl/not_equal_to.hpp +21 -0
  256. data/ext/boost/mpl/numeric_cast.hpp +41 -0
  257. data/ext/boost/mpl/pair.hpp +70 -0
  258. data/ext/boost/mpl/plus.hpp +21 -0
  259. data/ext/boost/mpl/pop_back_fwd.hpp +24 -0
  260. data/ext/boost/mpl/pop_front_fwd.hpp +24 -0
  261. data/ext/boost/mpl/prior.hpp +19 -0
  262. data/ext/boost/mpl/push_back.hpp +53 -0
  263. data/ext/boost/mpl/push_back_fwd.hpp +24 -0
  264. data/ext/boost/mpl/push_front.hpp +52 -0
  265. data/ext/boost/mpl/push_front_fwd.hpp +24 -0
  266. data/ext/boost/mpl/remove_if.hpp +83 -0
  267. data/ext/boost/mpl/reverse_fold.hpp +50 -0
  268. data/ext/boost/mpl/same_as.hpp +55 -0
  269. data/ext/boost/mpl/sequence_tag.hpp +124 -0
  270. data/ext/boost/mpl/sequence_tag_fwd.hpp +26 -0
  271. data/ext/boost/mpl/size.hpp +42 -0
  272. data/ext/boost/mpl/size_fwd.hpp +24 -0
  273. data/ext/boost/mpl/tag.hpp +52 -0
  274. data/ext/boost/mpl/times.hpp +21 -0
  275. data/ext/boost/mpl/vector.hpp +57 -0
  276. data/ext/boost/mpl/vector/aux_/O1_size.hpp +56 -0
  277. data/ext/boost/mpl/vector/aux_/at.hpp +116 -0
  278. data/ext/boost/mpl/vector/aux_/back.hpp +59 -0
  279. data/ext/boost/mpl/vector/aux_/begin_end.hpp +49 -0
  280. data/ext/boost/mpl/vector/aux_/clear.hpp +55 -0
  281. data/ext/boost/mpl/vector/aux_/empty.hpp +68 -0
  282. data/ext/boost/mpl/vector/aux_/front.hpp +56 -0
  283. data/ext/boost/mpl/vector/aux_/include_preprocessed.hpp +55 -0
  284. data/ext/boost/mpl/vector/aux_/item.hpp +103 -0
  285. data/ext/boost/mpl/vector/aux_/iterator.hpp +130 -0
  286. data/ext/boost/mpl/vector/aux_/pop_back.hpp +40 -0
  287. data/ext/boost/mpl/vector/aux_/pop_front.hpp +40 -0
  288. data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp +829 -0
  289. data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp +1144 -0
  290. data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp +139 -0
  291. data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp +159 -0
  292. data/ext/boost/mpl/vector/aux_/push_back.hpp +40 -0
  293. data/ext/boost/mpl/vector/aux_/push_front.hpp +40 -0
  294. data/ext/boost/mpl/vector/aux_/size.hpp +49 -0
  295. data/ext/boost/mpl/vector/aux_/tag.hpp +32 -0
  296. data/ext/boost/mpl/vector/aux_/vector0.hpp +52 -0
  297. data/ext/boost/mpl/vector/vector0.hpp +34 -0
  298. data/ext/boost/mpl/vector/vector10.hpp +45 -0
  299. data/ext/boost/mpl/vector/vector20.hpp +45 -0
  300. data/ext/boost/none.hpp +1 -1
  301. data/ext/boost/numeric/conversion/bounds.hpp +24 -0
  302. data/ext/boost/numeric/conversion/cast.hpp +61 -0
  303. data/ext/boost/numeric/conversion/conversion_traits.hpp +39 -0
  304. data/ext/boost/numeric/conversion/converter.hpp +68 -0
  305. data/ext/boost/numeric/conversion/converter_policies.hpp +186 -0
  306. data/ext/boost/numeric/conversion/detail/bounds.hpp +58 -0
  307. data/ext/boost/numeric/conversion/detail/conversion_traits.hpp +97 -0
  308. data/ext/boost/numeric/conversion/detail/converter.hpp +602 -0
  309. data/ext/boost/numeric/conversion/detail/int_float_mixture.hpp +72 -0
  310. data/ext/boost/numeric/conversion/detail/is_subranged.hpp +234 -0
  311. data/ext/boost/numeric/conversion/detail/meta.hpp +120 -0
  312. data/ext/boost/numeric/conversion/detail/numeric_cast_traits.hpp +138 -0
  313. data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp +1741 -0
  314. data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp +347 -0
  315. data/ext/boost/numeric/conversion/detail/sign_mixture.hpp +72 -0
  316. data/ext/boost/numeric/conversion/detail/udt_builtin_mixture.hpp +69 -0
  317. data/ext/boost/numeric/conversion/int_float_mixture_enum.hpp +29 -0
  318. data/ext/boost/numeric/conversion/numeric_cast_traits.hpp +31 -0
  319. data/ext/boost/numeric/conversion/sign_mixture_enum.hpp +29 -0
  320. data/ext/boost/numeric/conversion/udt_builtin_mixture_enum.hpp +26 -0
  321. data/ext/boost/operators.hpp +3 -1
  322. data/ext/boost/optional/optional.hpp +146 -79
  323. data/ext/boost/optional/optional_fwd.hpp +8 -1
  324. data/ext/boost/preprocessor/cat.hpp +2 -2
  325. data/ext/boost/preprocessor/config/config.hpp +39 -4
  326. data/ext/boost/preprocessor/facilities/intercept.hpp +277 -0
  327. data/ext/boost/preprocessor/facilities/overload.hpp +25 -0
  328. data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +3 -3
  329. data/ext/boost/preprocessor/iteration/iterate.hpp +3 -3
  330. data/ext/boost/preprocessor/punctuation/paren.hpp +23 -0
  331. data/ext/boost/preprocessor/repetition/enum_shifted_params.hpp +44 -0
  332. data/ext/boost/preprocessor/seq/cat.hpp +5 -4
  333. data/ext/boost/preprocessor/seq/size.hpp +0 -1
  334. data/ext/boost/preprocessor/tuple/eat.hpp +83 -34
  335. data/ext/boost/preprocessor/tuple/elem.hpp +161 -355
  336. data/ext/boost/preprocessor/tuple/rem.hpp +110 -48
  337. data/ext/boost/preprocessor/tuple/to_list.hpp +90 -36
  338. data/ext/boost/preprocessor/variadic/elem.hpp +94 -0
  339. data/ext/boost/preprocessor/variadic/size.hpp +30 -0
  340. data/ext/boost/range/begin.hpp +17 -6
  341. data/ext/boost/range/concepts.hpp +37 -2
  342. data/ext/boost/range/detail/safe_bool.hpp +72 -0
  343. data/ext/boost/range/end.hpp +14 -9
  344. data/ext/boost/range/iterator_range_core.hpp +120 -12
  345. data/ext/boost/range/size.hpp +21 -5
  346. data/ext/boost/smart_ptr/detail/shared_count.hpp +88 -0
  347. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +3 -0
  348. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +142 -0
  349. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +9 -0
  350. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +10 -2
  351. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +5 -1
  352. data/ext/boost/smart_ptr/detail/spinlock.hpp +4 -1
  353. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +20 -3
  354. data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +4 -0
  355. data/ext/boost/smart_ptr/make_shared.hpp +591 -22
  356. data/ext/boost/smart_ptr/shared_array.hpp +29 -1
  357. data/ext/boost/smart_ptr/shared_ptr.hpp +29 -13
  358. data/ext/boost/smart_ptr/weak_ptr.hpp +24 -12
  359. data/ext/boost/src/pthread/once.cpp +9 -7
  360. data/ext/boost/src/pthread/thread.cpp +32 -28
  361. data/ext/boost/src/pthread/timeconv.inl +4 -5
  362. data/ext/boost/src/tss_null.cpp +5 -1
  363. data/ext/boost/static_assert.hpp +8 -2
  364. data/ext/boost/thread/detail/config.hpp +19 -4
  365. data/ext/boost/thread/detail/move.hpp +11 -5
  366. data/ext/boost/thread/detail/thread.hpp +59 -43
  367. data/ext/boost/thread/exceptions.hpp +9 -9
  368. data/ext/boost/thread/future.hpp +150 -82
  369. data/ext/boost/thread/locks.hpp +101 -60
  370. data/ext/boost/thread/pthread/condition_variable.hpp +79 -32
  371. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +12 -3
  372. data/ext/boost/thread/pthread/mutex.hpp +17 -14
  373. data/ext/boost/thread/pthread/once.hpp +3 -4
  374. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +12 -2
  375. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -19
  376. data/ext/boost/thread/pthread/shared_mutex.hpp +13 -13
  377. data/ext/boost/thread/pthread/thread_data.hpp +40 -12
  378. data/ext/boost/thread/thread_time.hpp +5 -0
  379. data/ext/boost/throw_exception.hpp +1 -1
  380. data/ext/boost/token_functions.hpp +34 -10
  381. data/ext/boost/type_traits/add_rvalue_reference.hpp +66 -0
  382. data/ext/boost/type_traits/alignment_of.hpp +1 -1
  383. data/ext/boost/type_traits/detail/bool_trait_def.hpp +26 -3
  384. data/ext/boost/type_traits/detail/bool_trait_undef.hpp +3 -2
  385. data/ext/boost/type_traits/detail/cv_traits_impl.hpp +1 -1
  386. data/ext/boost/type_traits/detail/size_t_trait_def.hpp +6 -4
  387. data/ext/boost/type_traits/detail/type_trait_def.hpp +8 -2
  388. data/ext/boost/type_traits/function_traits.hpp +1 -1
  389. data/ext/boost/type_traits/has_nothrow_constructor.hpp +53 -0
  390. data/ext/boost/type_traits/has_nothrow_copy.hpp +19 -5
  391. data/ext/boost/type_traits/has_trivial_constructor.hpp +51 -0
  392. data/ext/boost/type_traits/has_trivial_copy.hpp +20 -5
  393. data/ext/boost/type_traits/has_trivial_destructor.hpp +12 -5
  394. data/ext/boost/type_traits/intrinsics.hpp +119 -71
  395. data/ext/boost/type_traits/is_const.hpp +5 -5
  396. data/ext/boost/type_traits/is_convertible.hpp +14 -13
  397. data/ext/boost/type_traits/is_enum.hpp +1 -1
  398. data/ext/boost/type_traits/is_floating_point.hpp +27 -0
  399. data/ext/boost/type_traits/is_function.hpp +3 -3
  400. data/ext/boost/type_traits/is_fundamental.hpp +1 -1
  401. data/ext/boost/type_traits/is_member_function_pointer.hpp +2 -2
  402. data/ext/boost/type_traits/is_member_pointer.hpp +2 -2
  403. data/ext/boost/type_traits/is_pod.hpp +11 -3
  404. data/ext/boost/type_traits/is_pointer.hpp +2 -2
  405. data/ext/boost/type_traits/is_signed.hpp +8 -3
  406. data/ext/boost/type_traits/is_union.hpp +8 -0
  407. data/ext/boost/type_traits/is_unsigned.hpp +9 -4
  408. data/ext/boost/type_traits/is_volatile.hpp +5 -5
  409. data/ext/boost/type_traits/remove_cv.hpp +4 -3
  410. data/ext/boost/type_traits/remove_pointer.hpp +51 -2
  411. data/ext/boost/type_traits/remove_reference.hpp +2 -2
  412. data/ext/boost/type_traits/type_with_alignment.hpp +8 -2
  413. data/ext/boost/utility/declval.hpp +44 -0
  414. data/ext/boost/utility/detail/in_place_factory_prefix.hpp +36 -0
  415. data/ext/boost/utility/detail/in_place_factory_suffix.hpp +23 -0
  416. data/ext/boost/utility/detail/result_of_iterate.hpp +142 -0
  417. data/ext/boost/utility/in_place_factory.hpp +88 -0
  418. data/ext/boost/utility/result_of.hpp +103 -0
  419. data/ext/boost/utility/swap.hpp +55 -0
  420. data/ext/common/AnsiColorConstants.h +36 -0
  421. data/ext/common/ApplicationPool2/Common.h +87 -0
  422. data/ext/common/ApplicationPool2/ComponentInfo.h +53 -0
  423. data/ext/common/ApplicationPool2/Group.h +648 -0
  424. data/ext/common/ApplicationPool2/Implementation.cpp +580 -0
  425. data/ext/common/ApplicationPool2/Options.h +576 -0
  426. data/ext/common/ApplicationPool2/PipeWatcher.h +61 -0
  427. data/ext/common/ApplicationPool2/Pool.h +1181 -0
  428. data/ext/common/ApplicationPool2/Process.h +425 -0
  429. data/ext/common/ApplicationPool2/README.md +96 -0
  430. data/ext/common/ApplicationPool2/Session.h +158 -0
  431. data/ext/common/ApplicationPool2/Socket.h +246 -0
  432. data/ext/common/ApplicationPool2/Spawner.h +2212 -0
  433. data/ext/common/ApplicationPool2/SuperGroup.h +749 -0
  434. data/ext/common/BackgroundEventLoop.cpp +129 -0
  435. data/ext/common/BackgroundEventLoop.h +61 -0
  436. data/ext/common/Constants.h +3 -1
  437. data/ext/common/EventedBufferedInput.h +331 -0
  438. data/ext/common/EventedMessageServer.h +17 -34
  439. data/ext/common/EventedServer.h +2 -2
  440. data/ext/common/Exceptions.h +71 -19
  441. data/ext/common/FileDescriptor.h +8 -6
  442. data/ext/common/HttpConstants.h +167 -0
  443. data/ext/common/IniFile.h +24 -0
  444. data/ext/common/Logging.h +62 -849
  445. data/ext/common/MessageReadersWriters.h +19 -0
  446. data/ext/common/MessageServer.h +11 -14
  447. data/ext/common/MultiLibeio.cpp +198 -0
  448. data/ext/common/MultiLibeio.h +67 -0
  449. data/ext/common/ResourceLocator.h +24 -41
  450. data/ext/common/SafeLibev.h +186 -14
  451. data/ext/common/StaticString.h +23 -3
  452. data/ext/common/UnionStation.h +972 -0
  453. data/ext/common/Utils.cpp +168 -24
  454. data/ext/common/Utils.h +25 -3
  455. data/ext/common/Utils/CachedFileStat.hpp +4 -3
  456. data/ext/common/Utils/FileChangeChecker.h +2 -2
  457. data/ext/common/Utils/HashMap.h +50 -0
  458. data/ext/common/Utils/IOUtils.cpp +229 -68
  459. data/ext/common/Utils/IOUtils.h +134 -3
  460. data/ext/common/Utils/Lock.h +28 -0
  461. data/ext/common/Utils/MemoryBarrier.h +52 -0
  462. data/ext/common/Utils/PriorityQueue.h +54 -0
  463. data/ext/common/Utils/ProcessMetricsCollector.h +9 -11
  464. data/ext/common/Utils/ScopeGuard.h +50 -1
  465. data/ext/common/Utils/SmallVector.h +653 -0
  466. data/ext/common/Utils/StrIntUtils.cpp +26 -2
  467. data/ext/common/Utils/StrIntUtils.h +18 -2
  468. data/ext/common/Utils/StringMap.h +125 -8
  469. data/ext/common/Utils/Template.h +212 -0
  470. data/ext/common/Utils/fib.c +699 -0
  471. data/ext/common/Utils/fib.h +101 -0
  472. data/ext/common/Utils/fibpriv.h +67 -0
  473. data/ext/common/Utils/json-forwards.h +249 -0
  474. data/ext/common/Utils/json.h +1855 -0
  475. data/ext/common/Utils/jsoncpp.cpp +4230 -0
  476. data/ext/common/agents/Base.cpp +1126 -0
  477. data/ext/common/{AgentBase.h → agents/Base.h} +5 -1
  478. data/ext/common/agents/EnvPrinter.c +16 -0
  479. data/ext/common/agents/HelperAgent/AgentOptions.h +81 -0
  480. data/ext/common/{HelperAgent → agents/HelperAgent}/BacktracesServer.h +3 -2
  481. data/ext/common/agents/HelperAgent/FileBackedPipe.h +732 -0
  482. data/ext/common/agents/HelperAgent/Main.cpp +497 -0
  483. data/ext/common/agents/HelperAgent/RequestHandler.cpp +283 -0
  484. data/ext/common/agents/HelperAgent/RequestHandler.h +2139 -0
  485. data/ext/common/agents/HelperAgent/ScgiRequestParser.h +451 -0
  486. data/ext/common/{LoggingAgent → agents/LoggingAgent}/DataStoreId.h +1 -1
  487. data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.cpp +1 -1
  488. data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.h +0 -0
  489. data/ext/common/{LoggingAgent → agents/LoggingAgent}/LoggingServer.h +18 -16
  490. data/ext/common/{LoggingAgent → agents/LoggingAgent}/Main.cpp +15 -13
  491. data/ext/common/{LoggingAgent → agents/LoggingAgent}/RemoteSender.h +6 -6
  492. data/ext/common/agents/SpawnPreparer.cpp +127 -0
  493. data/ext/common/{Watchdog.cpp → agents/Watchdog/Main.cpp} +63 -25
  494. data/ext/libeio/Changes +72 -0
  495. data/ext/{google/COPYING → libeio/LICENSE} +17 -9
  496. data/ext/libeio/Makefile.am +15 -0
  497. data/ext/libeio/Makefile.in +694 -0
  498. data/ext/libeio/aclocal.m4 +9418 -0
  499. data/ext/libeio/autogen.sh +3 -0
  500. data/ext/libeio/config.guess +1501 -0
  501. data/ext/libeio/config.h.in +136 -0
  502. data/ext/libeio/config.sub +1705 -0
  503. data/ext/libeio/configure +14822 -0
  504. data/ext/libeio/configure.ac +22 -0
  505. data/ext/libeio/demo.c +194 -0
  506. data/ext/libeio/ecb.h +457 -0
  507. data/ext/libeio/eio.c +2816 -0
  508. data/ext/libeio/eio.h +411 -0
  509. data/ext/libeio/install-sh +520 -0
  510. data/ext/libeio/libeio.m4 +211 -0
  511. data/ext/libeio/ltmain.sh +9636 -0
  512. data/ext/libeio/missing +376 -0
  513. data/ext/libeio/xthread.h +166 -0
  514. data/ext/libev/Changes +125 -7
  515. data/ext/libev/Makefile.am +5 -3
  516. data/ext/libev/Makefile.in +209 -120
  517. data/ext/libev/aclocal.m4 +6027 -4619
  518. data/ext/libev/autogen.sh +1 -4
  519. data/ext/libev/config.h.in +11 -7
  520. data/ext/libev/configure +7312 -14993
  521. data/ext/libev/configure.ac +12 -5
  522. data/ext/libev/depcomp +630 -0
  523. data/ext/libev/ev++.h +48 -32
  524. data/ext/libev/ev.c +1173 -391
  525. data/ext/libev/ev.h +315 -181
  526. data/ext/libev/ev_epoll.c +66 -15
  527. data/ext/libev/ev_kqueue.c +20 -18
  528. data/ext/libev/ev_poll.c +27 -23
  529. data/ext/libev/ev_port.c +39 -19
  530. data/ext/libev/ev_select.c +23 -17
  531. data/ext/libev/ev_vars.h +25 -8
  532. data/ext/libev/ev_win32.c +6 -6
  533. data/ext/libev/ev_wrap.h +22 -2
  534. data/ext/libev/event.c +18 -17
  535. data/ext/libev/event.h +16 -4
  536. data/ext/libev/libev.m4 +10 -6
  537. data/ext/libev/ltmain.sh +7353 -5811
  538. data/ext/nginx/Configuration.c +74 -42
  539. data/ext/nginx/Configuration.h +3 -5
  540. data/ext/nginx/ContentHandler.c +26 -83
  541. data/ext/nginx/ContentHandler.h +1 -1
  542. data/ext/nginx/config +13 -9
  543. data/ext/nginx/ngx_http_passenger_module.c +3 -7
  544. data/ext/oxt/detail/backtrace_enabled.hpp +5 -102
  545. data/ext/oxt/detail/context.hpp +90 -0
  546. data/ext/oxt/detail/spin_lock_darwin.hpp +4 -0
  547. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +4 -0
  548. data/ext/oxt/detail/spin_lock_pthreads.hpp +14 -0
  549. data/ext/oxt/detail/tracable_exception_enabled.hpp +2 -2
  550. data/ext/oxt/dynamic_thread_group.hpp +27 -1
  551. data/ext/oxt/implementation.cpp +415 -0
  552. data/ext/oxt/{thread.cpp → initialize.hpp} +13 -6
  553. data/ext/oxt/macros.hpp +32 -1
  554. data/ext/oxt/spin_lock.hpp +6 -11
  555. data/ext/oxt/system_calls.cpp +204 -16
  556. data/ext/oxt/system_calls.hpp +85 -45
  557. data/ext/oxt/thread.hpp +13 -117
  558. data/ext/ruby/passenger_native_support.c +82 -237
  559. data/helper-scripts/backtrace-sanitizer.rb +114 -0
  560. data/helper-scripts/classic-rails-loader.rb +135 -0
  561. data/helper-scripts/classic-rails-preloader.rb +161 -0
  562. data/helper-scripts/node-loader.js +314 -0
  563. data/helper-scripts/rack-loader.rb +104 -0
  564. data/helper-scripts/rack-preloader.rb +132 -0
  565. data/helper-scripts/wsgi-loader.py +231 -0
  566. data/helper-scripts/wsgi-preloader.py +1 -0
  567. data/lib/phusion_passenger.rb +159 -61
  568. data/lib/phusion_passenger/abstract_installer.rb +182 -87
  569. data/lib/phusion_passenger/admin_tools/server_instance.rb +25 -19
  570. data/lib/phusion_passenger/analytics_logger.rb +5 -4
  571. data/lib/phusion_passenger/classic_rails/{request_handler.rb → thread_handler_extension.rb} +4 -40
  572. data/lib/phusion_passenger/classic_rails_extensions/init.rb +5 -3
  573. data/lib/phusion_passenger/common_library.rb +441 -0
  574. data/lib/phusion_passenger/console_text_template.rb +4 -16
  575. data/lib/phusion_passenger/constants.rb +1 -8
  576. data/lib/phusion_passenger/debug_logging.rb +5 -2
  577. data/lib/phusion_passenger/dependencies.rb +51 -13
  578. data/lib/phusion_passenger/loader_shared_helpers.rb +318 -0
  579. data/lib/phusion_passenger/message_channel.rb +3 -47
  580. data/lib/phusion_passenger/message_client.rb +2 -2
  581. data/lib/phusion_passenger/native_support.rb +36 -15
  582. data/lib/phusion_passenger/packaging.rb +8 -11
  583. data/lib/phusion_passenger/platform_info.rb +25 -17
  584. data/lib/phusion_passenger/platform_info/apache.rb +10 -7
  585. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +10 -30
  586. data/lib/phusion_passenger/platform_info/compiler.rb +93 -34
  587. data/lib/phusion_passenger/platform_info/ruby.rb +37 -97
  588. data/lib/phusion_passenger/preloader_shared_helpers.rb +121 -0
  589. data/lib/phusion_passenger/public_api.rb +1 -4
  590. data/lib/phusion_passenger/rack/{request_handler.rb → thread_handler_extension.rb} +14 -63
  591. data/lib/phusion_passenger/rails3_extensions/init.rb +9 -8
  592. data/lib/phusion_passenger/request_handler.rb +500 -0
  593. data/lib/phusion_passenger/request_handler/thread_handler.rb +360 -0
  594. data/lib/phusion_passenger/ruby_core_enhancements.rb +142 -0
  595. data/lib/phusion_passenger/standalone/command.rb +36 -15
  596. data/lib/phusion_passenger/standalone/package_runtime_command.rb +16 -8
  597. data/lib/phusion_passenger/standalone/runtime_installer.rb +169 -72
  598. data/lib/phusion_passenger/standalone/start_command.rb +44 -39
  599. data/lib/phusion_passenger/standalone/utils.rb +5 -5
  600. data/lib/phusion_passenger/utils.rb +35 -914
  601. data/lib/phusion_passenger/utils/ansi_colors.rb +59 -0
  602. data/lib/phusion_passenger/utils/file_system_watcher.rb +1 -1
  603. data/lib/phusion_passenger/utils/robust_interruption.rb +134 -0
  604. data/lib/phusion_passenger/utils/tee_input.rb +174 -0
  605. data/lib/phusion_passenger/utils/tmpio.rb +33 -0
  606. data/lib/phusion_passenger/utils/unseekable_socket.rb +6 -0
  607. data/resources/mime.types +5 -1
  608. data/{lib/phusion_passenger/templates → resources}/standalone_default_root/index.html +0 -0
  609. data/{lib/phusion_passenger → resources}/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
  610. data/{lib/phusion_passenger → resources}/templates/apache2/config_snippets.txt.erb +0 -0
  611. data/{lib/phusion_passenger → resources}/templates/apache2/deployment_example.txt.erb +0 -0
  612. data/{lib/phusion_passenger → resources}/templates/apache2/no_write_permission_to_passenger_root.txt.erb +0 -0
  613. data/{lib/phusion_passenger → resources}/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  614. data/{lib/phusion_passenger → resources}/templates/apache2/run_installer_as_root.txt.erb +0 -0
  615. data/{lib/phusion_passenger → resources}/templates/apache2/welcome.txt.erb +0 -0
  616. data/{lib/phusion_passenger → resources}/templates/error_layout.css +6 -0
  617. data/resources/templates/error_layout.html.template +89 -0
  618. data/resources/templates/general_error.html.template +1 -0
  619. data/resources/templates/general_error_with_html.html.template +1 -0
  620. data/{lib/phusion_passenger → resources}/templates/nginx/ask_for_extra_configure_flags.txt.erb +0 -0
  621. data/{lib/phusion_passenger → resources}/templates/nginx/cannot_write_to_dir.txt.erb +0 -0
  622. data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets.txt.erb +0 -0
  623. data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets_inserted.txt.erb +0 -0
  624. data/{lib/phusion_passenger → resources}/templates/nginx/confirm_extra_configure_flags.txt.erb +0 -0
  625. data/{lib/phusion_passenger → resources}/templates/nginx/deployment_example.txt.erb +0 -0
  626. data/resources/templates/nginx/not_available_when_natively_packaged.txt.erb +8 -0
  627. data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_downloaded.txt.erb +0 -0
  628. data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_extracted.txt.erb +0 -0
  629. data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  630. data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
  631. data/{lib/phusion_passenger → resources}/templates/nginx/query_download_and_install.txt.erb +0 -0
  632. data/{lib/phusion_passenger → resources}/templates/nginx/run_installer_as_root.txt.erb +0 -0
  633. data/{lib/phusion_passenger → resources}/templates/nginx/welcome.txt.erb +0 -0
  634. data/{lib/phusion_passenger → resources}/templates/standalone/cannot_write_to_dir.txt.erb +0 -0
  635. data/{lib/phusion_passenger → resources}/templates/standalone/config.erb +26 -5
  636. data/{lib/phusion_passenger → resources}/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
  637. data/{lib/phusion_passenger → resources}/templates/standalone/run_installer_as_root.txt.erb +0 -0
  638. data/{lib/phusion_passenger → resources}/templates/standalone/welcome.txt.erb +0 -0
  639. data/resources/templates/undisclosed_error.html.template +25 -0
  640. data/test/config.json.example +42 -0
  641. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +86 -0
  642. data/test/cxx/ApplicationPool2/OptionsTest.cpp +44 -0
  643. data/test/cxx/ApplicationPool2/PoolTest.cpp +1234 -0
  644. data/test/cxx/ApplicationPool2/ProcessTest.cpp +131 -0
  645. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +229 -0
  646. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +744 -0
  647. data/test/cxx/BufferedIOTest.cpp +7 -7
  648. data/test/cxx/CxxTestMain.cpp +65 -2
  649. data/test/cxx/FileBackedPipeTest.cpp +626 -0
  650. data/test/cxx/FileChangeCheckerTest.cpp +20 -18
  651. data/test/cxx/FilterSupportTest.cpp +5 -5
  652. data/test/cxx/IOUtilsTest.cpp +11 -4
  653. data/test/cxx/MessageReadersWritersTest.cpp +1 -1
  654. data/test/cxx/MessageServerTest.cpp +31 -30
  655. data/test/cxx/RequestHandlerTest.cpp +777 -0
  656. data/test/cxx/ScgiRequestParserTest.cpp +36 -16
  657. data/test/cxx/ServerInstanceDirTest.cpp +1 -1
  658. data/test/cxx/StringMapTest.cpp +61 -0
  659. data/test/cxx/TemplateTest.cpp +118 -0
  660. data/test/cxx/TestSupport.cpp +25 -68
  661. data/test/cxx/TestSupport.h +81 -41
  662. data/test/cxx/{LoggingTest.cpp → UnionStationTest.cpp} +79 -74
  663. data/test/cxx/UtilsTest.cpp +59 -5
  664. data/test/integration_tests/apache2_tests.rb +2 -2
  665. data/test/integration_tests/nginx_tests.rb +1 -1
  666. data/test/integration_tests/spec_helper.rb +7 -5
  667. data/test/oxt/oxt_test_main.cpp +2 -0
  668. data/test/oxt/syscall_interruption_test.cpp +1 -0
  669. data/test/ruby/classic_rails/loader_spec.rb +48 -0
  670. data/test/ruby/classic_rails/preloader_spec.rb +54 -0
  671. data/test/ruby/rack/loader_spec.rb +62 -0
  672. data/test/ruby/rack/preloader_spec.rb +74 -0
  673. data/test/ruby/{abstract_request_handler_spec.rb → request_handler_spec.rb} +31 -68
  674. data/test/ruby/shared/loader_spec.rb +241 -0
  675. data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +141 -182
  676. data/test/ruby/shared/ruby_loader_spec.rb +55 -0
  677. data/test/ruby/spec_helper.rb +8 -53
  678. data/test/ruby/utils/file_system_watcher_spec.rb +9 -1
  679. data/test/ruby/utils_spec.rb +10 -683
  680. data/test/stub/rack/config.ru +28 -3
  681. data/test/stub/rack/start.rb +47 -0
  682. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/Rakefile +0 -0
  683. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/application_controller.rb +0 -2
  684. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_1.rb +0 -0
  685. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_2.rb +0 -0
  686. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/foo_controller.rb +0 -0
  687. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/helpers/application_helper.rb +0 -0
  688. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/boot.rb +0 -0
  689. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/database.yml +3 -3
  690. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environment.rb +5 -2
  691. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/development.rb +0 -0
  692. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/production.rb +0 -0
  693. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/staging.rb +0 -0
  694. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/inflections.rb +0 -0
  695. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/mime_types.rb +0 -0
  696. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/routes.rb +1 -0
  697. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/about +0 -0
  698. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/console +0 -0
  699. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/dbconsole +0 -0
  700. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/destroy +0 -0
  701. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/generate +0 -0
  702. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/benchmarker +0 -0
  703. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/profiler +0 -0
  704. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/request +0 -0
  705. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/plugin +0 -0
  706. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/inspector +0 -0
  707. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/reaper +0 -0
  708. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/spawner +0 -0
  709. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/runner +0 -0
  710. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/server +0 -0
  711. data/test/stub/{rails_apps/3.0/empty → rails3.0}/Gemfile +0 -0
  712. data/test/stub/rails3.0/Gemfile.lock +80 -0
  713. data/test/stub/{rails_apps/3.0/empty → rails3.0}/Rakefile +0 -0
  714. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/controllers/application_controller.rb +0 -0
  715. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/helpers/application_helper.rb +0 -0
  716. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/views/layouts/application.html.erb +0 -0
  717. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config.ru +0 -0
  718. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/application.rb +0 -0
  719. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/boot.rb +0 -0
  720. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/database.yml +0 -0
  721. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environment.rb +0 -0
  722. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/development.rb +0 -0
  723. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/production.rb +0 -0
  724. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/test.rb +0 -0
  725. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/backtrace_silencers.rb +0 -0
  726. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/inflections.rb +0 -0
  727. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/mime_types.rb +0 -0
  728. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/passenger.rb +0 -0
  729. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/secret_token.rb +0 -0
  730. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/session_store.rb +0 -0
  731. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/locales/en.yml +0 -0
  732. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/routes.rb +0 -0
  733. data/test/stub/{rails_apps/3.0/empty → rails3.0}/db/seeds.rb +0 -0
  734. data/test/stub/{rails_apps/3.0/empty → rails3.0}/doc/README_FOR_APP +0 -0
  735. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/404.html +0 -0
  736. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/422.html +0 -0
  737. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/500.html +0 -0
  738. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/favicon.ico +0 -0
  739. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/index.html +0 -0
  740. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/robots.txt +0 -0
  741. data/test/stub/{rails_apps/3.0/empty → rails3.0}/script/rails +0 -0
  742. data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/performance/browsing_test.rb +0 -0
  743. data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/test_helper.rb +0 -0
  744. data/test/stub/start_error.pl +24 -0
  745. data/test/stub/wsgi/passenger_wsgi.py +71 -3
  746. data/test/support/apache2_controller.rb +2 -2
  747. data/test/support/placebo-preloader.rb +88 -0
  748. data/test/support/test_helper.rb +1 -14
  749. data/test/tut/tut.h +11 -4
  750. metadata +590 -326
  751. data.tar.gz.asc +0 -12
  752. data/PACKAGING.TXT +0 -25
  753. data/build/config.rb +0 -46
  754. data/ext/apache2/HelperAgent.cpp +0 -364
  755. data/ext/boost/call_traits.hpp +0 -24
  756. data/ext/boost/detail/call_traits.hpp +0 -164
  757. data/ext/common/AbstractSpawnManager.h +0 -110
  758. data/ext/common/AgentBase.cpp +0 -432
  759. data/ext/common/ApplicationPool/Client.h +0 -788
  760. data/ext/common/ApplicationPool/Interface.h +0 -295
  761. data/ext/common/ApplicationPool/Pool.h +0 -1327
  762. data/ext/common/ApplicationPool/Server.h +0 -479
  763. data/ext/common/MessageChannel.h +0 -494
  764. data/ext/common/PoolOptions.h +0 -518
  765. data/ext/common/Process.h +0 -253
  766. data/ext/common/Session.h +0 -436
  767. data/ext/common/SpawnManager.h +0 -611
  768. data/ext/google/ChangeLog +0 -167
  769. data/ext/google/dense_hash_map +0 -310
  770. data/ext/google/dense_hash_set +0 -287
  771. data/ext/google/sparse_hash_map +0 -294
  772. data/ext/google/sparse_hash_set +0 -275
  773. data/ext/google/sparsehash/densehashtable.h +0 -1062
  774. data/ext/google/sparsehash/sparseconfig.h +0 -55
  775. data/ext/google/sparsehash/sparsehashtable.h +0 -1015
  776. data/ext/google/sparsetable +0 -1468
  777. data/ext/google/type_traits.h +0 -250
  778. data/ext/nginx/HelperAgent.cpp +0 -1355
  779. data/ext/nginx/ScgiRequestParser.h +0 -375
  780. data/ext/oxt/backtrace.cpp +0 -185
  781. data/ext/oxt/tracable_exception.cpp +0 -89
  782. data/helper-scripts/passenger-spawn-server +0 -106
  783. data/lib/phusion_passenger/abstract_request_handler.rb +0 -766
  784. data/lib/phusion_passenger/abstract_server.rb +0 -372
  785. data/lib/phusion_passenger/abstract_server_collection.rb +0 -335
  786. data/lib/phusion_passenger/app_process.rb +0 -174
  787. data/lib/phusion_passenger/classic_rails/application_spawner.rb +0 -344
  788. data/lib/phusion_passenger/classic_rails/framework_spawner.rb +0 -311
  789. data/lib/phusion_passenger/exceptions.rb +0 -103
  790. data/lib/phusion_passenger/html_template.rb +0 -107
  791. data/lib/phusion_passenger/rack/application_spawner.rb +0 -231
  792. data/lib/phusion_passenger/spawn_manager.rb +0 -359
  793. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +0 -38
  794. data/lib/phusion_passenger/templates/app_init_error.html.erb +0 -64
  795. data/lib/phusion_passenger/templates/database_error.html.erb +0 -66
  796. data/lib/phusion_passenger/templates/error_layout.html.erb +0 -39
  797. data/lib/phusion_passenger/templates/framework_init_error.html.erb +0 -39
  798. data/lib/phusion_passenger/templates/general_error.html.erb +0 -22
  799. data/lib/phusion_passenger/templates/load_error.html.erb +0 -46
  800. data/lib/phusion_passenger/templates/version_not_found.html.erb +0 -34
  801. data/lib/phusion_passenger/utils/rewindable_input.rb +0 -125
  802. data/lib/phusion_passenger/wsgi/application_spawner.rb +0 -108
  803. data/test/config.yml.example +0 -41
  804. data/test/cxx/ApplicationPool_PoolTest.cpp +0 -33
  805. data/test/cxx/ApplicationPool_PoolTestCases.cpp +0 -1029
  806. data/test/cxx/ApplicationPool_ServerTest.cpp +0 -308
  807. data/test/cxx/ApplicationPool_Server_PoolTest.cpp +0 -80
  808. data/test/cxx/MessageChannelTest.cpp +0 -557
  809. data/test/cxx/PoolOptionsTest.cpp +0 -116
  810. data/test/cxx/SpawnManagerTest.cpp +0 -161
  811. data/test/ruby/abstract_server_collection_spec.rb +0 -247
  812. data/test/ruby/abstract_server_spec.rb +0 -61
  813. data/test/ruby/app_process_spec.rb +0 -43
  814. data/test/ruby/classic_rails/application_spawner_spec.rb +0 -89
  815. data/test/ruby/classic_rails/framework_spawner_spec.rb +0 -92
  816. data/test/ruby/rack/application_spawner_spec.rb +0 -116
  817. data/test/ruby/shared/abstract_server_spec.rb +0 -23
  818. data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +0 -38
  819. data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +0 -19
  820. data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +0 -15
  821. data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +0 -27
  822. data/test/ruby/shared/spawners/preloading_spawner_spec.rb +0 -29
  823. data/test/ruby/shared/spawners/reload_all_spec.rb +0 -36
  824. data/test/ruby/shared/spawners/reload_single_spec.rb +0 -52
  825. data/test/ruby/shared/spawners/spawn_server_spec.rb +0 -28
  826. data/test/ruby/shared/spawners/spawner_spec.rb +0 -273
  827. data/test/ruby/shared/utils/pseudo_io_spec.rb +0 -60
  828. data/test/ruby/spawn_manager_spec.rb +0 -134
  829. data/test/ruby/wsgi/application_spawner_spec.rb +0 -50
  830. data/test/stub/message_channel.rb +0 -11
  831. data/test/stub/message_channel_2.rb +0 -12
  832. data/test/stub/message_channel_3.rb +0 -19
  833. data/test/stub/rails_apps/3.0/empty/Gemfile.lock +0 -73
  834. data/test/stub/spawn_server.rb +0 -22
  835. metadata.gz.asc +0 -12
@@ -0,0 +1,55 @@
1
+ module PhusionPassenger
2
+
3
+ shared_examples_for "a Ruby loader" do
4
+ it "prints an error page if the startup file fails to load" do
5
+ File.write(@stub.startup_file, %q{
6
+ raise "oh no!"
7
+ })
8
+ result = start
9
+ result[:status].should == "Error"
10
+ result[:body].should include("oh no!")
11
+ end
12
+
13
+ it "calls the starting_worker_process event after the startup file has been loaded" do
14
+ File.prepend(@stub.startup_file, %q{
15
+ history_file = "history.txt"
16
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
17
+ ::File.open(history_file, 'a') do |f|
18
+ f.puts "worker_process_started\n"
19
+ end
20
+ end
21
+ ::File.open(history_file, 'a') do |f|
22
+ f.puts "end of startup file\n"
23
+ end
24
+ })
25
+ result = start
26
+ result[:status].should == "Ready"
27
+ File.read("#{@stub.app_root}/history.txt").should ==
28
+ "end of startup file\n" +
29
+ "worker_process_started\n"
30
+ end
31
+
32
+ it "calls the stopping_worker_process event on exit" do
33
+ File.prepend(@stub.startup_file, %q{
34
+ history_file = "history.txt"
35
+ PhusionPassenger.on_event(:stopping_worker_process) do
36
+ ::File.open(history_file, 'a') do |f|
37
+ f.puts "worker_process_stopped\n"
38
+ end
39
+ end
40
+ ::File.open(history_file, 'a') do |f|
41
+ f.puts "end of startup file\n"
42
+ end
43
+ })
44
+ result = start
45
+ result[:status].should == "Ready"
46
+ @loader.input.close_write
47
+ eventually do
48
+ File.read("#{@stub.app_root}/history.txt") ==
49
+ "end of startup file\n" +
50
+ "worker_process_stopped\n"
51
+ end
52
+ end
53
+ end
54
+
55
+ end # module PhusionPassenger
@@ -5,16 +5,18 @@ end
5
5
  source_root = File.expand_path(File.dirname(__FILE__) + "/../..")
6
6
  Dir.chdir("#{source_root}/test")
7
7
 
8
- require 'yaml'
8
+ require 'rubygems'
9
+ require 'json'
9
10
  begin
10
- CONFIG = YAML::load_file('config.yml')
11
+ CONFIG = JSON.load(File.read('config.json'))
11
12
  rescue Errno::ENOENT
12
- STDERR.puts "*** You do not have the file test/config.yml. " <<
13
- "Please copy test/config.yml.example to " <<
14
- "test/config.yml, and edit it."
13
+ STDERR.puts "*** You do not have the file test/config.json. " <<
14
+ "Please copy test/config.json.example to " <<
15
+ "test/config.json, and edit it."
15
16
  exit 1
16
17
  end
17
18
 
19
+ DEBUG = ['1', 'y', 'yes'].include?(ENV['DEBUG'].to_s.downcase)
18
20
  AGENTS_DIR = "#{source_root}/agents"
19
21
 
20
22
  $LOAD_PATH.unshift("#{source_root}/lib")
@@ -23,6 +25,7 @@ $LOAD_PATH.unshift("#{source_root}/test")
23
25
  require 'fileutils'
24
26
  require 'support/test_helper'
25
27
  require 'phusion_passenger'
28
+ PhusionPassenger.locate_directories
26
29
  require 'phusion_passenger/debug_logging'
27
30
  require 'phusion_passenger/utils/tmpdir'
28
31
 
@@ -54,51 +57,3 @@ Spec::Runner.configure do |config|
54
57
  end
55
58
  end
56
59
  end
57
-
58
- module SpawnerSpecHelper
59
- def self.included(klass)
60
- klass.before(:each) do
61
- @stubs = []
62
- @apps = []
63
- end
64
-
65
- klass.after(:each) do
66
- begin
67
- @apps.each do |app|
68
- app.close
69
- end
70
- # Wait until all apps have exited, so that they don't
71
- # hog memory for the next test case.
72
- eventually(5) do
73
- @apps.all? do |app|
74
- !PhusionPassenger::Utils.process_is_alive?(app.pid)
75
- end
76
- end
77
- ensure
78
- @stubs.each do |stub|
79
- stub.destroy
80
- end
81
- end
82
- end
83
- end
84
-
85
- def before_start(code)
86
- @before_start = code
87
- end
88
-
89
- def after_start(code)
90
- @after_start = code
91
- end
92
-
93
- def register_stub(stub)
94
- @stubs << stub
95
- File.prepend(stub.startup_file, "#{@before_start}\n")
96
- File.append(stub.startup_file, "\n#{@after_start}")
97
- return stub
98
- end
99
-
100
- def register_app(app)
101
- @apps << app
102
- return app
103
- end
104
- end
@@ -110,7 +110,15 @@ describe Utils::FileSystemWatcher do
110
110
  specify "a watched file has been truncated" do
111
111
  File.write("#{@tmpdir}/foo", "contents")
112
112
  result = test_block(["#{@tmpdir}/foo"]) do
113
- File.open("#{@tmpdir}/foo", "w").close
113
+ if RUBY_PLATFORM =~ /darwin/
114
+ # OS X kernel bug in kqueue... sigh...
115
+ File.open("#{@tmpdir}/foo", "w") do |f|
116
+ f.write("a")
117
+ f.truncate(0)
118
+ end
119
+ else
120
+ File.open("#{@tmpdir}/foo", "w").close
121
+ end
114
122
  end
115
123
  end
116
124
 
@@ -5,244 +5,24 @@ require 'stringio'
5
5
  require 'etc'
6
6
  require 'phusion_passenger/message_channel'
7
7
  require 'phusion_passenger/platform_info/ruby'
8
+ require 'phusion_passenger/loader_shared_helpers'
8
9
  require 'phusion_passenger/utils'
9
10
 
10
- require 'ruby/shared/utils/pseudo_io_spec'
11
-
12
11
  module PhusionPassenger
13
12
 
14
13
  describe Utils do
15
14
  include Utils
16
15
 
17
- specify "#close_all_io_objects_for_fds closes all IO objects that are associated with the given file descriptors" do
18
- filename = "#{Dir.tmpdir}/passenger_test.#{Process.pid}.txt"
19
- begin
20
- pid = safe_fork('utils_spec') do
21
- a, b = IO.pipe
22
- close_all_io_objects_for_fds([0, 1, 2])
23
- File.open(filename, "w") do |f|
24
- f.write("#{a.closed?}, #{b.closed?}")
25
- end
26
- end
27
- Process.waitpid(pid) rescue nil
28
- File.read(filename).should == "true, true"
29
- ensure
30
- File.unlink(filename) rescue nil
31
- end
32
- end
33
-
34
- describe "#report_app_init_status" do
35
- it "reports normal errors, which #unmarshal_and_raise_errors raises" do
36
- a, b = IO.pipe
37
- begin
38
- pid = safe_fork('utils_spec') do
39
- a.close
40
- report_app_init_status(MessageChannel.new(b)) do
41
- raise RuntimeError, "hello world"
42
- end
43
- end
44
- b.close
45
- lambda { unmarshal_and_raise_errors(MessageChannel.new(a)) }.should raise_error(/hello world/)
46
- ensure
47
- a.close rescue nil
48
- b.close rescue nil
49
- end
50
- end
51
-
52
- it "reports SystemExit errors, which #unmarshal_and_raise_errors raises" do
53
- a, b = IO.pipe
54
- begin
55
- pid = safe_fork('utils_spec') do
56
- a.close
57
- report_app_init_status(MessageChannel.new(b)) do
58
- exit
59
- end
60
- end
61
- b.close
62
- lambda { unmarshal_and_raise_errors(MessageChannel.new(a)) }.should raise_error(/exited during startup/)
63
- ensure
64
- a.close rescue nil
65
- b.close rescue nil
66
- end
67
- end
68
-
69
- it "returns whether the block succeeded" do
70
- channel = MessageChannel.new(StringIO.new)
71
- success = report_app_init_status(channel) do
72
- false
73
- end
74
- success.should be_true
75
-
76
- success = report_app_init_status(channel) do
77
- raise StandardError, "hi"
78
- end
79
- success.should be_false
80
- end
81
-
82
- it "reports all data written to STDERR and $stderr" do
83
- a, b = IO.pipe
84
- begin
85
- pid = safe_fork('utils_spec') do
86
- a.close
87
- report_app_init_status(MessageChannel.new(b), nil) do
88
- STDERR.puts "Something went wrong!"
89
- $stderr.puts "Something went wrong again!"
90
- exit
91
- end
92
- end
93
- b.close
94
-
95
- begin
96
- unmarshal_and_raise_errors(MessageChannel.new(a))
97
- violated "No exception raised"
98
- rescue AppInitError => e
99
- e.stderr.should =~ /Something went wrong!/
100
- e.stderr.should =~ /Something went wrong again!/
101
- end
102
- ensure
103
- a.close rescue nil
104
- b.close rescue nil
105
- end
106
- end
107
-
108
- it "reports all data written to STDERR and $stderr even if it was reopened" do
109
- a, b = IO.pipe
110
- begin
111
- pid = safe_fork('utils_spec') do
112
- a.close
113
- report_app_init_status(MessageChannel.new(b), nil) do
114
- STDERR.puts "Something went wrong!"
115
- STDERR.reopen("output.tmp", "w")
116
- STDERR.puts "Something went wrong again!"
117
- STDERR.flush
118
- $stderr.puts "Something went wrong yet again!"
119
- $stderr.flush
120
- exit
121
- end
122
- end
123
- b.close
124
-
125
- begin
126
- unmarshal_and_raise_errors(MessageChannel.new(a))
127
- violated "No exception raised"
128
- rescue AppInitError => e
129
- e.stderr.should =~ /Something went wrong!/
130
- e.stderr.should =~ /Something went wrong again!/
131
- e.stderr.should =~ /Something went wrong yet again!/
132
- end
133
-
134
- file_contents = File.read("output.tmp")
135
- file_contents.should =~ /Something went wrong again!/
136
- file_contents.should =~ /Something went wrong yet again!/
137
- ensure
138
- a.close rescue nil
139
- b.close rescue nil
140
- File.unlink("output.tmp") rescue nil
141
- end
142
- end
143
-
144
- describe "if the block failed" do
145
- before :each do
146
- @raise_error = true
147
- end
148
-
149
- it_should_behave_like "a pseudo stderr created by #report_app_init_status"
150
- end
151
-
152
- describe "if the block succeeded" do
153
- it_should_behave_like "a pseudo stderr created by #report_app_init_status"
154
- end
155
- end
156
-
157
- specify "#safe_fork with double_fork == false reseeds the pseudo-random number generator" do
158
- a, b = IO.pipe
159
- begin
160
- pid = safe_fork do
161
- b.puts(rand)
162
- end
163
- Process.waitpid(pid) rescue nil
164
- pid = safe_fork do
165
- b.puts(rand)
166
- end
167
- Process.waitpid(pid) rescue nil
168
-
169
- first_num = a.readline
170
- second_num = a.readline
171
- first_num.should_not == second_num
172
- ensure
173
- a.close rescue nil
174
- b.close rescue nil
175
- end
176
- end
177
-
178
- specify "#safe_fork with double_fork == true reseeds the pseudo-random number generator" do
179
- a, b = IO.pipe
180
- begin
181
- # Seed the pseudo-random number generator here
182
- # so that it doesn't happen in the child processes.
183
- srand
184
-
185
- safe_fork(self.class, true) do
186
- b.puts(rand)
187
- end
188
- safe_fork(self.class, true) do
189
- b.puts(rand)
190
- end
191
-
192
- first_num = a.readline
193
- second_num = a.readline
194
- first_num.should_not == second_num
195
- ensure
196
- a.close rescue nil
197
- b.close rescue nil
198
- end
199
- end
200
-
201
- describe "#unmarshal_and_raise_errors" do
202
- before :each do
203
- @a, @b = IO.pipe
204
- @report_channel = MessageChannel.new(@a)
205
- report_app_init_status(MessageChannel.new(@b)) do
206
- raise StandardError, "Something went wrong!"
207
- end
208
- end
209
-
210
- after :each do
211
- @a.close rescue nil
212
- @b.close rescue nil
213
- end
214
-
215
- it "prints the exception information to the 'print_exception' argument using #puts, if 'print_exception' responds to that" do
216
- buffer = StringIO.new
217
- lambda { unmarshal_and_raise_errors(@report_channel, buffer) }.should raise_error(AppInitError)
218
- buffer.string.should =~ /Something went wrong!/
219
- buffer.string.should =~ /utils\.rb/
220
- buffer.string.should =~ /utils_spec\.rb/
221
- end
222
-
223
- it "appends the exception information to the file pointed to by 'print_exception', if 'print_exception' responds to #to_str" do
224
- begin
225
- lambda { unmarshal_and_raise_errors(@report_channel, "exception.txt") }.should raise_error(AppInitError)
226
- data = File.read('exception.txt')
227
- data.should =~ /Something went wrong!/
228
- data.should =~ /utils\.rb/
229
- data.should =~ /utils_spec\.rb/
230
- ensure
231
- File.unlink('exception.txt') rescue nil
232
- end
233
- end
234
- end
235
-
236
16
  specify "#to_boolean works" do
237
- to_boolean(nil).should be_false
238
- to_boolean(false).should be_false
239
- to_boolean(true).should be_true
240
- to_boolean(1).should be_true
241
- to_boolean(0).should be_true
242
- to_boolean("").should be_true
243
- to_boolean("true").should be_true
244
- to_boolean("false").should be_false
245
- to_boolean("bla bla").should be_true
17
+ LoaderSharedHelpers.to_boolean(nil).should be_false
18
+ LoaderSharedHelpers.to_boolean(false).should be_false
19
+ LoaderSharedHelpers.to_boolean(true).should be_true
20
+ LoaderSharedHelpers.to_boolean(1).should be_true
21
+ LoaderSharedHelpers.to_boolean(0).should be_true
22
+ LoaderSharedHelpers.to_boolean("").should be_true
23
+ LoaderSharedHelpers.to_boolean("true").should be_true
24
+ LoaderSharedHelpers.to_boolean("false").should be_false
25
+ LoaderSharedHelpers.to_boolean("bla bla").should be_true
246
26
  end
247
27
 
248
28
  specify "#split_by_null_into_hash works" do
@@ -289,459 +69,6 @@ describe Utils do
289
69
  end
290
70
  end
291
71
 
292
- when_user_switching_possible do
293
- describe "#lower_privilege" do
294
- before :each do
295
- @options = {
296
- "default_user" => CONFIG["default_user"],
297
- "default_group" => CONFIG["default_group"]
298
- }
299
- @startup_file = "tmp.startup_file"
300
- @startup_file_target = "tmp.startup_file_target"
301
- File.symlink(@startup_file_target, @startup_file)
302
- File.touch(@startup_file_target)
303
- end
304
-
305
- after :each do
306
- File.unlink(@startup_file) rescue nil
307
- File.unlink(@startup_file_target) rescue nil
308
- end
309
-
310
- def run(options = {})
311
- script = %q{
312
- require 'phusion_passenger/utils'
313
- include PhusionPassenger::Utils
314
- options = Marshal.load(ARGV[0].unpack('m').first)
315
- startup_file = ARGV[1]
316
- begin
317
- lower_privilege(startup_file, options)
318
- puts "success"
319
- puts Process.uid
320
- puts Process.gid
321
- puts `groups`
322
- puts ENV["HOME"]
323
- puts ENV["USER"]
324
- rescue => e
325
- puts "error"
326
- puts e
327
- end
328
- }.strip
329
- data = Marshal.dump(@options.merge(options))
330
- output = run_script(script, [data].pack('m'), @startup_file)
331
- lines = output.split("\n")
332
- status = lines.shift
333
- if status == "success"
334
- @uid, @gid, @groups, @env_home, @env_user = lines
335
- @uid = @uid.to_i
336
- @gid = @gid.to_i
337
- @username = Etc.getpwuid(@uid).name
338
- @groupname = Etc.getgrgid(@gid).name
339
- else
340
- @error = lines[0]
341
- end
342
- end
343
-
344
- def primary_group_for(username)
345
- gid = Etc.getpwnam(username).gid
346
- return Etc.getgrgid(gid).name
347
- end
348
-
349
- def uid_for(username)
350
- return Etc.getpwnam(username).uid
351
- end
352
-
353
- def gid_for(group_name)
354
- return Etc.getgrnam(group_name).gid
355
- end
356
-
357
- def group_name_for_gid(gid)
358
- return Etc.getgrgid(gid).name
359
- end
360
-
361
- describe "if 'user' is given" do
362
- describe "and 'user' is 'root'" do
363
- before :each do
364
- @options["user"] = "root"
365
- end
366
-
367
- it "changes the user to the value of 'default_user'" do
368
- run
369
- @username.should == CONFIG["default_user"]
370
- end
371
-
372
- specify "if 'group' is given, it changes group to the given group name" do
373
- run("group" => CONFIG["normal_group_1"])
374
- @groupname.should == CONFIG["normal_group_1"]
375
- end
376
-
377
- specify "if 'group' is set to the root group, it changes group to default_group" do
378
- run("group" => group_name_for_gid(0))
379
- @groupname.should == CONFIG["default_group"]
380
- end
381
-
382
- describe "and 'group' is set to '!STARTUP_FILE!'" do
383
- before :each do
384
- @options["group"] = "!STARTUP_FILE!"
385
- end
386
-
387
- it "changes the group to the startup file's group" do
388
- File.lchown(-1,
389
- gid_for(CONFIG["normal_group_1"]),
390
- @startup_file)
391
- run
392
- @groupname.should == CONFIG["normal_group_1"]
393
- end
394
-
395
- specify "if the startup file is a symlink, then it uses the symlink's group, not the target's group" do
396
- File.lchown(-1,
397
- gid_for(CONFIG["normal_group_2"]),
398
- @startup_file)
399
- File.chown(-1,
400
- gid_for(CONFIG["normal_group_1"]),
401
- @startup_file_target)
402
- run
403
- @groupname.should == CONFIG["normal_group_2"]
404
- end
405
- end
406
-
407
- specify "if 'group' is not given, it changes the group to default_user's primary group" do
408
- run
409
- @groupname.should == primary_group_for(CONFIG["default_user"])
410
- end
411
- end
412
-
413
- describe "and 'user' is not 'root'" do
414
- before :each do
415
- @options["user"] = CONFIG["normal_user_1"]
416
- end
417
-
418
- it "changes the user to the given username" do
419
- run
420
- @username.should == CONFIG["normal_user_1"]
421
- end
422
-
423
- specify "if 'group' is given, it changes group to the given group name" do
424
- run("group" => CONFIG["normal_group_1"])
425
- @groupname.should == CONFIG["normal_group_1"]
426
- end
427
-
428
- specify "if 'group' is set to the root group, it changes group to default_group" do
429
- run("group" => group_name_for_gid(0))
430
- @groupname.should == CONFIG["default_group"]
431
- end
432
-
433
- describe "and 'group' is set to '!STARTUP_FILE!'" do
434
- before :each do
435
- @options["group"] = "!STARTUP_FILE!"
436
- end
437
-
438
- it "changes the group to the startup file's group" do
439
- File.lchown(-1,
440
- gid_for(CONFIG["normal_group_1"]),
441
- @startup_file)
442
- run
443
- @groupname.should == CONFIG["normal_group_1"]
444
- end
445
-
446
- specify "if the startup file is a symlink, then it uses the symlink's group, not the target's group" do
447
- File.lchown(-1,
448
- gid_for(CONFIG["normal_group_2"]),
449
- @startup_file)
450
- File.chown(-1,
451
- gid_for(CONFIG["normal_group_1"]),
452
- @startup_file_target)
453
- run
454
- @groupname.should == CONFIG["normal_group_2"]
455
- end
456
- end
457
-
458
- specify "if 'group' is not given, it changes the group to the user's primary group" do
459
- run
460
- @groupname.should == primary_group_for(CONFIG["normal_user_1"])
461
- end
462
- end
463
-
464
- describe "and the given username does not exist" do
465
- before :each do
466
- @options["user"] = CONFIG["nonexistant_user"]
467
- end
468
-
469
- it "changes the user to the value of 'default_user'" do
470
- run
471
- @username.should == CONFIG["default_user"]
472
- end
473
-
474
- specify "if 'group' is given, it changes group to the given group name" do
475
- run("group" => CONFIG["normal_group_1"])
476
- @groupname.should == CONFIG["normal_group_1"]
477
- end
478
-
479
- specify "if 'group' is set to the root group, it changes group to default_group" do
480
- run("group" => group_name_for_gid(0))
481
- @groupname.should == CONFIG["default_group"]
482
- end
483
-
484
- describe "and 'group' is set to '!STARTUP_FILE!'" do
485
- before :each do
486
- @options["group"] = "!STARTUP_FILE!"
487
- end
488
-
489
- it "changes the group to the startup file's group" do
490
- File.lchown(-1,
491
- gid_for(CONFIG["normal_group_1"]),
492
- @startup_file)
493
- run
494
- @groupname.should == CONFIG["normal_group_1"]
495
- end
496
-
497
- specify "if the startup file is a symlink, then it uses the symlink's group, not the target's group" do
498
- File.lchown(-1,
499
- gid_for(CONFIG["normal_group_2"]),
500
- @startup_file)
501
- File.chown(-1,
502
- gid_for(CONFIG["normal_group_1"]),
503
- @startup_file_target)
504
- run
505
- @groupname.should == CONFIG["normal_group_2"]
506
- end
507
- end
508
-
509
- specify "if 'group' is not given, it changes the group to default_user's primary group" do
510
- run
511
- @groupname.should == primary_group_for(CONFIG["default_user"])
512
- end
513
- end
514
- end
515
- describe "if 'user' is not given" do
516
- describe "and the startup file's owner exists" do
517
- before :each do
518
- File.lchown(uid_for(CONFIG["normal_user_1"]),
519
- -1,
520
- @startup_file)
521
- end
522
-
523
- it "changes the user to the owner of the startup file" do
524
- run
525
- @username.should == CONFIG["normal_user_1"]
526
- end
527
-
528
- specify "if the startup file is a symlink, then it uses the symlink's owner, not the target's owner" do
529
- File.lchown(uid_for(CONFIG["normal_user_2"]),
530
- -1,
531
- @startup_file)
532
- File.chown(uid_for(CONFIG["normal_user_1"]),
533
- -1,
534
- @startup_file_target)
535
- run
536
- @username.should == CONFIG["normal_user_2"]
537
- end
538
-
539
- specify "if 'group' is given, it changes group to the given group name" do
540
- run("group" => CONFIG["normal_group_1"])
541
- @groupname.should == CONFIG["normal_group_1"]
542
- end
543
-
544
- specify "if 'group' is set to the root group, it changes group to default_group" do
545
- run("group" => group_name_for_gid(0))
546
- @groupname.should == CONFIG["default_group"]
547
- end
548
-
549
- describe "and 'group' is set to '!STARTUP_FILE!'" do
550
- before :each do
551
- @options["group"] = "!STARTUP_FILE!"
552
- end
553
-
554
- it "changes the group to the startup file's group" do
555
- File.lchown(-1,
556
- gid_for(CONFIG["normal_group_1"]),
557
- @startup_file)
558
- run
559
- @groupname.should == CONFIG["normal_group_1"]
560
- end
561
-
562
- specify "if the startup file is a symlink, then it uses the symlink's group, not the target's group" do
563
- File.lchown(-1,
564
- gid_for(CONFIG["normal_group_2"]),
565
- @startup_file)
566
- File.chown(-1,
567
- gid_for(CONFIG["normal_group_1"]),
568
- @startup_file_target)
569
- run
570
- @groupname.should == CONFIG["normal_group_2"]
571
- end
572
- end
573
-
574
- specify "if 'group' is not given, it changes the group to the startup file's owner's primary group" do
575
- run
576
- @groupname.should == primary_group_for(CONFIG["normal_user_1"])
577
- end
578
- end
579
-
580
- describe "and the startup file's owner doesn't exist" do
581
- before :each do
582
- File.lchown(CONFIG["nonexistant_uid"],
583
- -1,
584
- @startup_file)
585
- end
586
-
587
- it "changes the user to the value of 'default_user'" do
588
- run
589
- @username.should == CONFIG["default_user"]
590
- end
591
-
592
- specify "if 'group' is given, it changes group to the given group name" do
593
- run("group" => CONFIG["normal_group_1"])
594
- @groupname.should == CONFIG["normal_group_1"]
595
- end
596
-
597
- specify "if 'group' is set to the root group, it changes group to default_group" do
598
- run("group" => group_name_for_gid(0))
599
- @groupname.should == CONFIG["default_group"]
600
- end
601
-
602
- describe "and 'group' is set to '!STARTUP_FILE!'" do
603
- before :each do
604
- @options["group"] = "!STARTUP_FILE!"
605
- end
606
-
607
- describe "and the startup file's group doesn't exist" do
608
- before :each do
609
- File.lchown(-1,
610
- CONFIG["nonexistant_gid"],
611
- @startup_file)
612
- end
613
-
614
- it "changes the group to the value given by 'default_group'" do
615
- run
616
- @groupname.should == CONFIG["default_group"]
617
- end
618
- end
619
-
620
- describe "and the startup file's group exists" do
621
- before :each do
622
- File.lchown(-1,
623
- gid_for(CONFIG["normal_group_1"]),
624
- @startup_file)
625
- end
626
-
627
- it "changes the group to the startup file's group" do
628
- run
629
- @groupname.should == CONFIG["normal_group_1"]
630
- end
631
-
632
- specify "if the startup file is a symlink, then it uses the symlink's group, not the target's group" do
633
- File.lchown(-1,
634
- gid_for(CONFIG["normal_group_2"]),
635
- @startup_file)
636
- File.chown(-1,
637
- gid_for(CONFIG["normal_group_1"]),
638
- @startup_file_target)
639
- run
640
- @groupname.should == CONFIG["normal_group_2"]
641
- end
642
- end
643
- end
644
-
645
- specify "if 'group' is not given, it changes the group to default_user's primary group" do
646
- run
647
- @groupname.should == primary_group_for(CONFIG["default_user"])
648
- end
649
- end
650
- end
651
-
652
- it "raises an error if it tries to lower to 'default_user', but that user doesn't exist" do
653
- run("user" => "root", "default_user" => CONFIG["nonexistant_user"])
654
- @error.should =~ /Cannot determine a user to lower privilege to/
655
- end
656
-
657
- it "raises an error if it tries to lower to 'default_group', but that group doesn't exist" do
658
- run("user" => CONFIG["normal_user_1"],
659
- "group" => group_name_for_gid(0),
660
- "default_group" => CONFIG["nonexistant_group"])
661
- @error.should =~ /Cannot determine a group to lower privilege to/
662
- end
663
-
664
- it "changes supplementary groups to the owner's default supplementary groups" do
665
- run("user" => CONFIG["normal_user_1"])
666
- default_groups = `groups "#{CONFIG['normal_user_1']}"`.strip
667
- default_groups.gsub!(/.*: */, '')
668
- @groups.should == default_groups
669
- end
670
-
671
- it "sets $HOME to the user's home directory" do
672
- run("user" => CONFIG["normal_user_1"])
673
- @env_home.should == Etc.getpwnam(CONFIG["normal_user_1"]).dir
674
- end
675
-
676
- it "sets $USER to the user's name" do
677
- run("user" => CONFIG["normal_user_1"])
678
- @env_user.should == CONFIG["normal_user_1"]
679
- end
680
- end
681
- end
682
-
683
- describe "#check_directory_tree_permissions" do
684
- before :each do
685
- @root = PhusionPassenger::Utils.passenger_tmpdir
686
- end
687
-
688
- def primary_group_for(username)
689
- gid = Etc.getpwnam(username).gid
690
- return Etc.getgrgid(gid).name
691
- end
692
-
693
- it "raises an error for the top-most parent directory that has wrong permissions" do
694
- FileUtils.mkdir_p("#{@root}/a/b/c/d")
695
-
696
- when_running_as_root do
697
- user = CONFIG['normal_user_1']
698
- group = primary_group_for(user)
699
- system("chown -R #{user} #{@root}/a")
700
- system("chgrp -R #{group} #{@root}/a")
701
-
702
- output = run_script(%q{
703
- require 'phusion_passenger/utils'
704
- include PhusionPassenger::Utils
705
- @root = ARGV[0]
706
- lower_privilege(nil,
707
- "user" => ARGV[1],
708
- "group" => ARGV[2])
709
-
710
- File.chmod(0600, "#{@root}/a/b/c/d")
711
- File.chmod(0600, "#{@root}/a/b/c")
712
- File.chmod(0600, "#{@root}/a")
713
- p check_directory_tree_permissions("#{@root}/a/b/c/d")
714
- File.chmod(0700, "#{@root}/a")
715
- p check_directory_tree_permissions("#{@root}/a/b/c/d")
716
- File.chmod(0700, "#{@root}/a/b/c")
717
- p check_directory_tree_permissions("#{@root}/a/b/c/d")
718
- File.chmod(0700, "#{@root}/a/b/c/d")
719
- p check_directory_tree_permissions("#{@root}/a/b/c/d")
720
- }, @root, user, group)
721
- lines = output.split("\n")
722
- lines[0].should == ["#{@root}/a", true].inspect
723
- lines[1].should == ["#{@root}/a/b/c", true].inspect
724
- lines[2].should == ["#{@root}/a/b/c/d", false].inspect
725
- lines[3].should == "nil"
726
- end
727
- when_not_running_as_root do
728
- File.chmod(0000, "#{@root}/a/b/c/d")
729
- File.chmod(0600, "#{@root}/a/b/c")
730
- File.chmod(0600, "#{@root}/a")
731
- check_directory_tree_permissions("#{@root}/a/b/c/d").should ==
732
- ["#{@root}/a", true]
733
- File.chmod(0700, "#{@root}/a")
734
- check_directory_tree_permissions("#{@root}/a/b/c/d").should ==
735
- ["#{@root}/a/b/c", true]
736
- File.chmod(0700, "#{@root}/a/b/c")
737
- check_directory_tree_permissions("#{@root}/a/b/c/d").should ==
738
- ["#{@root}/a/b/c/d", false]
739
- File.chmod(0700, "#{@root}/a/b/c/d")
740
- check_directory_tree_permissions("#{@root}/a/b/c/d").should be_nil
741
- end
742
- end
743
- end
744
-
745
72
  ######################
746
73
  end
747
74