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
@@ -1,308 +0,0 @@
1
- #include "TestSupport.h"
2
-
3
- #include <boost/bind.hpp>
4
-
5
- #include "ApplicationPool/Pool.h"
6
- #include "ApplicationPool/Server.h"
7
- #include "ApplicationPool/Client.h"
8
- #include "Utils.h"
9
- #include <string>
10
- #include <cstring>
11
- #include <unistd.h>
12
- #include <errno.h>
13
-
14
- using namespace Passenger;
15
- using namespace Passenger::ApplicationPool;
16
- using namespace boost;
17
- using namespace std;
18
-
19
- namespace tut {
20
- struct ApplicationPool_ServerTest {
21
- ServerInstanceDirPtr serverInstanceDir;
22
- ServerInstanceDir::GenerationPtr generation;
23
- string socketFilename;
24
- AccountsDatabasePtr accountsDatabase;
25
- AccountPtr clientAccount;
26
- shared_ptr<MessageServer> messageServer;
27
- shared_ptr<Pool> realPool;
28
- shared_ptr<Server> poolServer;
29
- shared_ptr<Client> pool, pool2;
30
- shared_ptr<oxt::thread> serverThread;
31
-
32
- ~ApplicationPool_ServerTest() {
33
- if (serverThread != NULL) {
34
- serverThread->interrupt_and_join();
35
- }
36
- }
37
-
38
- void initializePool() {
39
- createServerInstanceDirAndGeneration(serverInstanceDir, generation);
40
- socketFilename = generation->getPath() + "/socket";
41
- accountsDatabase = ptr(new AccountsDatabase());
42
- clientAccount = accountsDatabase->add("test", "12345", false);
43
-
44
- messageServer = ptr(new MessageServer(socketFilename, accountsDatabase));
45
- realPool = ptr(new Pool("../helper-scripts/passenger-spawn-server", generation));
46
- poolServer = ptr(new Server(realPool));
47
- messageServer->addHandler(poolServer);
48
- serverThread = ptr(new oxt::thread(
49
- boost::bind(&MessageServer::mainLoop, messageServer.get())
50
- ));
51
- pool = ptr(new Client());
52
- pool2 = ptr(new Client());
53
- pool->connect(socketFilename, "test", "12345");
54
- pool2->connect(socketFilename, "test", "12345");
55
- }
56
-
57
- SessionPtr spawnRackApp() {
58
- PoolOptions options("stub/rack");
59
- options.appType = "rack";
60
- return pool->get(options);
61
- }
62
-
63
-
64
- /* A StringListCreator which not only returns a dummy value, but also
65
- * increments a counter each time getItems() is called. */
66
- class DummyStringListCreator: public StringListCreator {
67
- public:
68
- mutable int counter;
69
-
70
- DummyStringListCreator() {
71
- counter = 0;
72
- }
73
-
74
- virtual const StringListPtr getItems() const {
75
- StringListPtr result = ptr(new StringList());
76
- counter++;
77
- result->push_back("hello");
78
- result->push_back("world");
79
- return result;
80
- }
81
- };
82
-
83
- class SlowClient: public Client {
84
- private:
85
- unsigned int timeToSendUsername;
86
- unsigned int timeToSendPassword;
87
-
88
- protected:
89
- virtual void sendUsername(MessageChannel &channel, const string &username) {
90
- if (timeToSendUsername > 0) {
91
- usleep(timeToSendUsername * 1000);
92
- }
93
- channel.writeScalar(username);
94
- }
95
-
96
- virtual void sendPassword(MessageChannel &channel, const StaticString &userSuppliedPassword) {
97
- if (timeToSendPassword > 0) {
98
- usleep(timeToSendPassword * 1000);
99
- }
100
- channel.writeScalar(userSuppliedPassword.c_str(), userSuppliedPassword.size());
101
- }
102
-
103
- public:
104
- SlowClient(unsigned int timeToSendUsername,
105
- unsigned int timeToSendPassword)
106
- : Client()
107
- {
108
- this->timeToSendUsername = timeToSendUsername;
109
- this->timeToSendPassword = timeToSendPassword;
110
- }
111
- };
112
- };
113
-
114
- DEFINE_TEST_GROUP(ApplicationPool_ServerTest);
115
-
116
- TEST_METHOD(1) {
117
- // When calling get() with a PoolOptions object,
118
- // options.environmentVariables->getItems() isn't called unless
119
- // the pool had to spawn something.
120
- initializePool();
121
-
122
- shared_ptr<DummyStringListCreator> strList = ptr(new DummyStringListCreator());
123
- PoolOptions options("stub/rack");
124
- options.appType = "rack";
125
- options.environmentVariables = strList;
126
-
127
- SessionPtr session1 = pool->get(options);
128
- session1.reset();
129
- ensure_equals("(1)", strList->counter, 1);
130
-
131
- session1 = pool->get(options);
132
- session1.reset();
133
- ensure_equals("(2)", strList->counter, 1);
134
- }
135
-
136
- TEST_METHOD(5) {
137
- // get() requires GET rights.
138
- initializePool();
139
-
140
- try {
141
- clientAccount->setRights(Account::SET_PARAMETERS);
142
- spawnRackApp();
143
- fail("SecurityException expected");
144
- } catch (const SecurityException &e) {
145
- // Pass.
146
- }
147
-
148
- clientAccount->setRights(Account::GET);
149
- spawnRackApp(); // Should not throw SecurityException now.
150
- }
151
-
152
- TEST_METHOD(6) {
153
- // clear() requires CLEAR rights.
154
- initializePool();
155
-
156
- try {
157
- clientAccount->setRights(Account::SET_PARAMETERS);
158
- pool->clear();
159
- fail("SecurityException expected");
160
- } catch (const SecurityException &e) {
161
- // Pass.
162
- }
163
-
164
- clientAccount->setRights(Account::CLEAR);
165
- pool->clear(); // Should not throw SecurityException now.
166
- }
167
-
168
- TEST_METHOD(7) {
169
- // setMaxIdleTime() requires SET_PARAMETERS rights.
170
- initializePool();
171
-
172
- try {
173
- clientAccount->setRights(Account::GET_PARAMETERS);
174
- pool->setMaxIdleTime(60);
175
- fail("SecurityException expected");
176
- } catch (const SecurityException &e) {
177
- // Pass.
178
- }
179
-
180
- clientAccount->setRights(Account::SET_PARAMETERS);
181
- pool->setMaxIdleTime(60); // Should not throw SecurityException now.
182
- }
183
-
184
- TEST_METHOD(8) {
185
- // setMax() requires SET_PARAMETERS rights.
186
- initializePool();
187
-
188
- try {
189
- clientAccount->setRights(Account::GET_PARAMETERS);
190
- pool->setMax(60);
191
- fail("SecurityException expected");
192
- } catch (const SecurityException &e) {
193
- // Pass.
194
- }
195
-
196
- clientAccount->setRights(Account::SET_PARAMETERS);
197
- pool->setMax(60); // Should not throw SecurityException now.
198
- }
199
-
200
- TEST_METHOD(9) {
201
- // getActive() requires GET_PARAMETERS rights.
202
- initializePool();
203
-
204
- try {
205
- clientAccount->setRights(Account::SET_PARAMETERS);
206
- pool->getActive();
207
- fail("SecurityException expected");
208
- } catch (const SecurityException &e) {
209
- // Pass.
210
- }
211
-
212
- clientAccount->setRights(Account::GET_PARAMETERS);
213
- pool->getActive(); // Should not throw SecurityException now.
214
- }
215
-
216
- TEST_METHOD(10) {
217
- // getCount() requires GET_PARAMETERS rights.
218
- initializePool();
219
-
220
- try {
221
- clientAccount->setRights(Account::SET_PARAMETERS);
222
- pool->getCount();
223
- fail("SecurityException expected");
224
- } catch (const SecurityException &e) {
225
- // Pass.
226
- }
227
-
228
- clientAccount->setRights(Account::GET_PARAMETERS);
229
- pool->getCount(); // Should not throw SecurityException now.
230
- }
231
-
232
- TEST_METHOD(11) {
233
- // setMaxPerApp() requires SET_PARAMETERS rights.
234
- initializePool();
235
-
236
- try {
237
- clientAccount->setRights(Account::GET_PARAMETERS);
238
- pool->setMaxPerApp(2);
239
- fail("SecurityException expected");
240
- } catch (const SecurityException &e) {
241
- // Pass.
242
- }
243
-
244
- clientAccount->setRights(Account::SET_PARAMETERS);
245
- pool->setMaxPerApp(2); // Should not throw SecurityException now.
246
- }
247
-
248
- TEST_METHOD(12) {
249
- // getSpawnServerPid() requires GET_PARAMETERS rights.
250
- initializePool();
251
-
252
- try {
253
- clientAccount->setRights(Account::SET_PARAMETERS);
254
- pool->getSpawnServerPid();
255
- fail("SecurityException expected");
256
- } catch (const SecurityException &e) {
257
- // Pass.
258
- }
259
-
260
- clientAccount->setRights(Account::GET_PARAMETERS);
261
- pool->getSpawnServerPid(); // Should not throw SecurityException now.
262
- }
263
-
264
- TEST_METHOD(13) {
265
- // inspect() requires INSPECT_BASIC_INFO rights.
266
- initializePool();
267
-
268
- try {
269
- clientAccount->setRights(Account::SET_PARAMETERS);
270
- pool->inspect();
271
- fail("SecurityException expected");
272
- } catch (const SecurityException &e) {
273
- // Pass.
274
- }
275
-
276
- clientAccount->setRights(Account::INSPECT_BASIC_INFO);
277
- pool->inspect(); // Should not throw SecurityException now.
278
- }
279
-
280
- TEST_METHOD(14) {
281
- // toXml() requires INSPECT_BASIC_INFO rights.
282
- initializePool();
283
-
284
- try {
285
- clientAccount->setRights(Account::SET_PARAMETERS);
286
- pool->toXml();
287
- fail("SecurityException expected");
288
- } catch (const SecurityException &e) {
289
- // Pass.
290
- }
291
-
292
- clientAccount->setRights(Account::INSPECT_BASIC_INFO);
293
- pool->toXml(); // Should not throw SecurityException now.
294
- }
295
-
296
- TEST_METHOD(15) {
297
- // toXml() only prints private information if the client has the INSPECT_SENSITIVE_INFO right.
298
- initializePool();
299
- PoolOptions options("stub/rack");
300
- options.appType = "rack";
301
- pool->get(options);
302
-
303
- clientAccount->setRights(Account::INSPECT_BASIC_INFO);
304
- ensure("Does not contain private information", pool->toXml().find("<server_sockets>") == string::npos);
305
- clientAccount->setRights(Account::INSPECT_BASIC_INFO | Account::INSPECT_SENSITIVE_INFO);
306
- ensure("Contains private information", pool->toXml().find("<server_sockets>") != string::npos);
307
- }
308
- }
@@ -1,80 +0,0 @@
1
- #include "TestSupport.h"
2
-
3
- #include <string>
4
- #include <boost/thread.hpp>
5
- #include <boost/shared_ptr.hpp>
6
-
7
- #include "ApplicationPool/Pool.h"
8
- #include "ApplicationPool/Server.h"
9
- #include "ApplicationPool/Client.h"
10
- #include "Utils.h"
11
-
12
- using namespace Passenger;
13
- using namespace std;
14
- using namespace boost;
15
-
16
- namespace tut {
17
- struct ApplicationPool_Server_PoolTest {
18
- ServerInstanceDirPtr serverInstanceDir;
19
- ServerInstanceDir::GenerationPtr generation;
20
- AccountsDatabasePtr accountsDatabase;
21
- shared_ptr<MessageServer> messageServer;
22
- shared_ptr<ApplicationPool::Pool> realPool;
23
- shared_ptr<ApplicationPool::Server> poolServer;
24
- shared_ptr<ApplicationPool::Client> pool, pool2;
25
- shared_ptr<oxt::thread> serverThread;
26
- string socketFilename;
27
-
28
- ApplicationPool_Server_PoolTest() {
29
- createServerInstanceDirAndGeneration(serverInstanceDir, generation);
30
- socketFilename = generation->getPath() + "/socket";
31
- accountsDatabase = ptr(new AccountsDatabase());
32
- accountsDatabase->add("test", "12345", false);
33
-
34
- messageServer = ptr(new MessageServer(socketFilename, accountsDatabase));
35
- realPool = ptr(new ApplicationPool::Pool("../helper-scripts/passenger-spawn-server", generation));
36
- poolServer = ptr(new ApplicationPool::Server(realPool));
37
- messageServer->addHandler(poolServer);
38
- serverThread = ptr(new oxt::thread(
39
- boost::bind(&MessageServer::mainLoop, messageServer.get())
40
- ));
41
- pool = newPoolConnection();
42
- pool2 = newPoolConnection();
43
- }
44
-
45
- ~ApplicationPool_Server_PoolTest() {
46
- if (serverThread != NULL) {
47
- serverThread->interrupt_and_join();
48
- }
49
- }
50
-
51
- void reinitializeWithSpawnManager(AbstractSpawnManagerPtr spawnManager) {
52
- if (serverThread != NULL) {
53
- serverThread->interrupt_and_join();
54
- }
55
-
56
- messageServer.reset(); // Wait until the previous instance has removed the socket.
57
- messageServer = ptr(new MessageServer(socketFilename, accountsDatabase));
58
- realPool = ptr(new ApplicationPool::Pool(spawnManager));
59
- poolServer = ptr(new ApplicationPool::Server(realPool));
60
- messageServer->addHandler(poolServer);
61
- serverThread = ptr(new oxt::thread(
62
- boost::bind(&MessageServer::mainLoop, messageServer.get())
63
- ));
64
- pool = newPoolConnection();
65
- pool2 = newPoolConnection();
66
- }
67
-
68
- shared_ptr<ApplicationPool::Client> newPoolConnection() {
69
- shared_ptr<ApplicationPool::Client> p(new ApplicationPool::Client());
70
- p->connect(socketFilename, "test", "12345");
71
- return p;
72
- }
73
- };
74
-
75
- DEFINE_TEST_GROUP(ApplicationPool_Server_PoolTest);
76
-
77
- #define USE_TEMPLATE
78
- #include "ApplicationPool_PoolTestCases.cpp"
79
- }
80
-
@@ -1,557 +0,0 @@
1
- #include "TestSupport.h"
2
- #include "MessageChannel.h"
3
-
4
- #include <boost/thread.hpp>
5
- #include <boost/bind.hpp>
6
- #include <oxt/thread.hpp>
7
- #include <utility>
8
-
9
- #include <cstring>
10
- #include <cstdio>
11
-
12
- #include <sys/types.h>
13
- #include <sys/wait.h>
14
- #include <unistd.h>
15
-
16
- using namespace Passenger;
17
- using namespace std;
18
- using namespace boost;
19
- using namespace oxt;
20
-
21
- namespace tut {
22
- struct MessageChannelTest {
23
- MessageChannel reader, writer;
24
- int p[2];
25
-
26
- MessageChannelTest() {
27
- if (pipe(p) != 0) {
28
- throw SystemException("Cannot create a pipe", errno);
29
- }
30
- reader = MessageChannel(p[0]);
31
- writer = MessageChannel(p[1]);
32
- }
33
-
34
- ~MessageChannelTest() {
35
- reader.close();
36
- writer.close();
37
- }
38
-
39
- static void writeDataAfterSomeTime(int fd, unsigned int sleepTimeInMsec) {
40
- try {
41
- syscalls::usleep(sleepTimeInMsec * 1000);
42
- syscalls::write(fd, "hi", 2);
43
- } catch (const boost::thread_interrupted &) {
44
- // Do nothing.
45
- }
46
- }
47
-
48
- static void writeDataSlowly(int fd, unsigned int bytesToWrite, unsigned int bytesPerSec) {
49
- try {
50
- for (unsigned i = 0; i < bytesToWrite && !boost::this_thread::interruption_requested(); i++) {
51
- syscalls::write(fd, "x", 1);
52
- syscalls::usleep(1000000 / bytesPerSec);
53
- }
54
- } catch (const boost::thread_interrupted &) {
55
- // Do nothing.
56
- }
57
- }
58
- };
59
-
60
- DEFINE_TEST_GROUP(MessageChannelTest);
61
-
62
- TEST_METHOD(1) {
63
- // read() should be able to parse a message constructed by write(name, ...).
64
- vector<string> args;
65
-
66
- writer.write("hello", "world", "!", NULL);
67
- ensure("End of file has not been reached", reader.read(args));
68
- ensure_equals("read() returns the same number of arguments as passed to write()", args.size(), 3u);
69
- ensure_equals(args[0], "hello");
70
- ensure_equals(args[1], "world");
71
- ensure_equals(args[2], "!");
72
- }
73
-
74
- TEST_METHOD(2) {
75
- // read() should be able to parse a message constructed by write(list).
76
- list<string> input;
77
- vector<string> output;
78
-
79
- input.push_back("hello");
80
- input.push_back("world");
81
- input.push_back("!");
82
- writer.write(input);
83
- ensure("End of file has not been reached", reader.read(output));
84
- ensure_equals("read() returns the same number of arguments as passed to write()", input.size(), output.size());
85
-
86
- list<string>::const_iterator it;
87
- vector<string>::const_iterator it2;
88
- for (it = input.begin(), it2 = output.begin(); it != input.end(); it++, it2++) {
89
- ensure_equals(*it, *it2);
90
- }
91
- }
92
-
93
- TEST_METHOD(3) {
94
- // write() should be able to properly serialize arguments that contain whitespace.
95
- vector<string> args;
96
- writer.write("hello", "world with whitespaces", "!!!", NULL);
97
- ensure("End of file has not been reached", reader.read(args));
98
- ensure_equals(args[1], "world with whitespaces");
99
- }
100
-
101
- TEST_METHOD(4) {
102
- // read() should be able to read messages constructed by the Ruby implementation.
103
- // write() should be able to construct messages that can be read by the Ruby implementation.
104
- // Multiple read() and write() calls should work (i.e. the MessageChannel should have stream properties).
105
- // End of file should be properly detected.
106
- int p1[2], p2[2];
107
- pid_t pid;
108
-
109
- pipe(p1);
110
- pipe(p2);
111
- pid = fork();
112
- if (pid == 0) {
113
- close(p[0]);
114
- close(p[1]);
115
- dup2(p1[0], 0);
116
- dup2(p2[1], 1);
117
- close(p1[0]);
118
- close(p1[1]);
119
- close(p2[0]);
120
- close(p2[1]);
121
- execlp("ruby", "ruby", "./stub/message_channel.rb", (char *) 0);
122
- perror("Cannot execute ruby");
123
- _exit(1);
124
- } else {
125
- MessageChannel input(p1[1]);
126
- MessageChannel output(p2[0]);
127
- close(p1[0]);
128
- close(p2[1]);
129
-
130
- input.write("hello", "my beautiful", "world", NULL);
131
- input.write("you have", "not enough", "minerals", NULL);
132
- input.close();
133
-
134
- vector<string> message1, message2, message3;
135
- ensure("End of stream has not been reached (1)", output.read(message1));
136
- ensure("End of stream has not been reached (2)", output.read(message2));
137
- ensure("End of file has been reached", !output.read(message3));
138
- output.close();
139
- waitpid(pid, NULL, 0);
140
-
141
- ensure_equals("First message is correctly transformed by the mock object",
142
- message1.size(), 4u);
143
- ensure_equals(message1[0], "hello");
144
- ensure_equals(message1[1], "my beautiful");
145
- ensure_equals(message1[2], "world");
146
- ensure_equals(message1[3], "!!");
147
-
148
- ensure_equals("Second message is correctly transformed by the mock object",
149
- message2.size(), 4u);
150
- ensure_equals(message2[0], "you have");
151
- ensure_equals(message2[1], "not enough");
152
- ensure_equals(message2[2], "minerals");
153
- ensure_equals(message2[3], "??");
154
- }
155
- }
156
-
157
- TEST_METHOD(6) {
158
- // write(name) should generate a correct message even if there are no additional arguments.
159
- writer.write("hello", NULL);
160
- vector<string> args;
161
- reader.read(args);
162
- ensure_equals(args.size(), 1u);
163
- ensure_equals(args[0], "hello");
164
- }
165
-
166
- TEST_METHOD(7) {
167
- // writeFileDescriptor() and receiveFileDescriptor() should work.
168
- int s[2], my_pipe[2], fd;
169
- socketpair(AF_UNIX, SOCK_STREAM, 0, s);
170
- MessageChannel channel1(s[0]);
171
- MessageChannel channel2(s[1]);
172
-
173
- pipe(my_pipe);
174
- boost::thread thr(bind(
175
- &MessageChannel::writeFileDescriptor,
176
- &channel1,
177
- my_pipe[1],
178
- true
179
- ));
180
- fd = channel2.readFileDescriptor();
181
- thr.join();
182
-
183
- char buf[5];
184
- write(fd, "hello", 5);
185
- close(fd);
186
- read(my_pipe[0], buf, 5);
187
- ensure(memcmp(buf, "hello", 5) == 0);
188
-
189
- close(s[0]);
190
- close(s[1]);
191
- close(my_pipe[0]);
192
- close(my_pipe[1]);
193
- }
194
-
195
- TEST_METHOD(8) {
196
- // write() should be able to construct a message that consists of only an empty string.
197
- // read() should be able to read a message that consists of only an empty string.
198
- vector<string> args;
199
-
200
- writer.write("", NULL);
201
- reader.read(args);
202
- ensure_equals(args.size(), 1u);
203
- ensure_equals(args[0], "");
204
- }
205
-
206
- TEST_METHOD(9) {
207
- // readScalar() should be able to read messages constructed by writeScalar().
208
- // This also tests readExact()/writeExact() because readScalar()/writeScalar() uses
209
- // them internally.
210
- writer.writeScalar("hello\n\r world!!!");
211
- writer.writeScalar(" and this is a second message");
212
-
213
- string output;
214
- ensure("End of stream has not been reached (1)", reader.readScalar(output));
215
- ensure_equals(output, "hello\n\r world!!!");
216
-
217
- ensure("End of stream has not been reached (2)", reader.readScalar(output));
218
- ensure_equals(output, " and this is a second message");
219
- }
220
-
221
- TEST_METHOD(10) {
222
- // writeScalar() should be able to produce messages that are compatible with the Ruby implementation.
223
- // readScalar() should be able to read messages produced by the Ruby implementation.
224
- int p1[2], p2[2];
225
- pid_t pid;
226
-
227
- pipe(p1);
228
- pipe(p2);
229
- pid = fork();
230
- if (pid == 0) {
231
- close(p[0]);
232
- close(p[1]);
233
- dup2(p1[0], 0);
234
- dup2(p2[1], 1);
235
- close(p1[0]);
236
- close(p1[1]);
237
- close(p2[0]);
238
- close(p2[1]);
239
- execlp("ruby", "ruby", "./stub/message_channel_2.rb", (void *) 0);
240
- perror("Cannot execute ruby");
241
- _exit(1);
242
- } else {
243
- MessageChannel reader(p2[0]);
244
- MessageChannel writer(p1[1]);
245
- string output;
246
- close(p1[0]);
247
- close(p2[1]);
248
-
249
- writer.writeScalar("hello world\n!\r!");
250
- ensure("End of file has not yet been reached (1)", reader.readScalar(output));
251
- ensure_equals(output, "hello world\n!\r!!!");
252
-
253
- writer.writeScalar("");
254
- ensure("End of file has not yet been reached (2)", reader.readScalar(output));
255
- ensure_equals(output, "??");
256
- writer.close();
257
-
258
- ensure("End of file has been reached", !reader.readScalar(output));
259
- reader.close();
260
- waitpid(pid, NULL, 0);
261
- }
262
- }
263
-
264
- TEST_METHOD(11) {
265
- // If we send a lot of different messages (including file descriptor passing),
266
- // and the other side sends the same stuff back to us, then MessageChannel
267
- // should be able to read them all, if done in the correct order.
268
- // writeScalar() should be able to produce messages that are compatible with the Ruby implementation.
269
- // readScalar() should be able to read messages produced by the Ruby implementation.
270
- int fd[2];
271
- pid_t pid;
272
-
273
- socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
274
- pid = fork();
275
- if (pid == 0) {
276
- close(p[0]);
277
- close(p[1]);
278
- dup2(fd[0], 3);
279
- close(fd[0]);
280
- close(fd[1]);
281
- execlp("ruby", "ruby", "./stub/message_channel_3.rb", (void *) 0);
282
- perror("Cannot execute ruby");
283
- _exit(1);
284
- } else {
285
- MessageChannel channel(fd[1]);
286
- close(fd[0]);
287
-
288
- vector<string> args;
289
- string output;
290
- int tmp[2];
291
-
292
- channel.write("hello ", "my!", "world", NULL);
293
- ensure("End of file has not yet been reached", channel.read(args));
294
- ensure_equals(args.size(), 3u);
295
- ensure_equals(args[0], "hello ");
296
- ensure_equals(args[1], "my!");
297
- ensure_equals(args[2], "world");
298
-
299
- channel.writeScalar("testing 123");
300
- ensure("End of file has not yet been reached", channel.readScalar(output));
301
- ensure_equals(output, "testing 123");
302
-
303
- pipe(tmp);
304
- close(tmp[0]);
305
- channel.writeFileDescriptor(tmp[1]);
306
- close(tmp[1]);
307
- int x = channel.readFileDescriptor();
308
- close(x);
309
-
310
- channel.write("the end", NULL);
311
- ensure("End of file has not yet been reached", channel.read(args));
312
- ensure_equals(args.size(), 1u);
313
- ensure_equals(args[0], "the end");
314
-
315
- ensure("End of file has been reached", !channel.read(args));
316
- channel.close();
317
- waitpid(pid, NULL, 0);
318
- }
319
- }
320
-
321
- TEST_METHOD(12) {
322
- // readScalar()/writeScalar() should be able to handle arbitrary binary data.
323
- string data;
324
- FILE *f = fopen("stub/garbage3.dat", "r");
325
- while (!feof(f)) {
326
- char buf[1024 * 32];
327
- size_t ret = fread(buf, 1, sizeof(buf), f);
328
- data.append(buf, ret);
329
- }
330
- fclose(f);
331
-
332
- pid_t pid = fork();
333
- if (pid == 0) {
334
- reader.close();
335
- writer.writeScalar(data);
336
- _exit(0);
337
- } else {
338
- writer.close();
339
- string result;
340
- reader.readScalar(result);
341
- ensure_equals(result, data);
342
- waitpid(pid, NULL, 0);
343
- }
344
- }
345
-
346
- TEST_METHOD(13) {
347
- // Test connected(), fileno() and close().
348
- int fd[2];
349
- pipe(fd);
350
- close(fd[1]);
351
-
352
- MessageChannel channel(fd[0]);
353
- ensure(channel.connected());
354
- ensure_equals(channel.filenum(), fd[0]);
355
-
356
- channel.close();
357
- ensure_equals(channel.filenum(), -1);
358
- ensure(!channel.connected());
359
- }
360
-
361
- TEST_METHOD(14) {
362
- // close() sets the file descriptor to -1 even if closing failed.
363
- int fd[2];
364
- pipe(fd);
365
- close(fd[0]);
366
- close(fd[1]);
367
-
368
- MessageChannel channel(fd[0]);
369
- bool gotException;
370
- try {
371
- channel.close();
372
- gotException = false;
373
- } catch (...) {
374
- gotException = true;
375
- }
376
- if (!gotException) {
377
- fail("close() should have failed");
378
- }
379
- ensure_equals(channel.filenum(), -1);
380
- ensure(!channel.connected());
381
- }
382
-
383
- TEST_METHOD(25) {
384
- // readScalar() doesn't throw SecurityException if maxSize is
385
- // given but the available amount of data equals maxSize.
386
- string str;
387
- writer.writeScalar("hello");
388
- reader.readScalar(str, 5);
389
- }
390
-
391
- TEST_METHOD(26) {
392
- // readScalar() throws SecurityException if there's too much data to read.
393
- string str;
394
-
395
- writer.writeScalar("hello");
396
- try {
397
- reader.readScalar(str, 4);
398
- fail("SecurityException expected");
399
- } catch (const SecurityException &) {
400
- // Pass.
401
- }
402
- }
403
-
404
- TEST_METHOD(27) {
405
- // readScalar() throws TimeoutException if no data was received within the timeout.
406
- unsigned long long timeout = 30;
407
- string str;
408
- try {
409
- reader.readScalar(str, 0, &timeout);
410
- fail("TimeoutException expected");
411
- } catch (const TimeoutException &) {
412
- ensure("The passed time is deducted from timeout", timeout < 5);
413
- }
414
- }
415
-
416
- TEST_METHOD(28) {
417
- // readScalar() throws TimeoutException if not enough header data was received
418
- // within the timeout.
419
- unsigned long long timeout = 30;
420
- string str;
421
- writeExact(writer.filenum(), "xxx", 3); // A part of a random 32-bit integer header.
422
- try {
423
- reader.readScalar(str, 0, &timeout);
424
- fail("TimeoutException expected");
425
- } catch (const TimeoutException &) {
426
- ensure("The passed time is deducted from timeout", timeout < 5);
427
- }
428
- }
429
-
430
- TEST_METHOD(29) {
431
- // readScalar() throws TimeoutException if the header data was received but no
432
- // body data was received within the timeout.
433
- unsigned long long timeout = 30;
434
- string str;
435
- writer.writeUint32(1024); // Dummy header.
436
- try {
437
- reader.readScalar(str, 0, &timeout);
438
- fail("TimeoutException expected");
439
- } catch (const TimeoutException &) {
440
- ensure("The passed time is deducted from timeout", timeout < 5);
441
- }
442
- }
443
-
444
- TEST_METHOD(30) {
445
- // readScalar() throws TimeoutException if the header data was received but not
446
- // enough body data was received within the timeout.
447
- string str;
448
- writer.writeUint32(1024); // Dummy header.
449
-
450
- // Write a dummy body at 100 bytes per sec, or 1 byte every 10 msec.
451
- // Takes 10 seconds.
452
- TempThread thr(boost::bind(&writeDataSlowly, writer.filenum(), 1000, 100));
453
-
454
- unsigned long long timeout = 35;
455
- Timer timer;
456
- try {
457
- reader.readScalar(str, 0, &timeout);
458
- fail("TimeoutException expected");
459
- } catch (const TimeoutException &) {
460
- unsigned long long elapsed = timer.elapsed();
461
- ensure("Spent at least 35 msec waiting", elapsed >= 34);
462
- ensure("Spent at most 60 msec waiting", elapsed <= 60);
463
- ensure("The passed time is deducted from timeout", timeout < 5);
464
- }
465
- }
466
-
467
- TEST_METHOD(31) {
468
- // readScalar() returns if enough data was received within the specified timeout.
469
- string str;
470
- unsigned long long timeout = 1000;
471
-
472
- writer.writeUint32(250);
473
- TempThread thr(boost::bind(&writeDataSlowly, writer.filenum(), 250, 1000));
474
-
475
- reader.readScalar(str, 0, &timeout);
476
- ensure("Spent at least 250 msec waiting", timeout <= 1000 - 250);
477
- ensure("Spent at most 500 msec waiting", timeout >= 1000 - 500);
478
- }
479
-
480
- TEST_METHOD(32) {
481
- // Test readUint32() and writeUint32().
482
- writer.writeUint32(0);
483
- writer.writeUint32(1);
484
- writer.writeUint32(1024);
485
- writer.writeUint32(3000000000u);
486
-
487
- unsigned int i;
488
- ensure(reader.readUint32(i));
489
- ensure_equals(i, 0u);
490
- ensure(reader.readUint32(i));
491
- ensure_equals(i, 1u);
492
- ensure(reader.readUint32(i));
493
- ensure_equals(i, 1024u);
494
- ensure(reader.readUint32(i));
495
- ensure_equals(i, 3000000000u);
496
- }
497
-
498
- TEST_METHOD(33) {
499
- // readUint32() returns false if EOF was reached prematurely.
500
- writeExact(writer.filenum(), "x", 1);
501
- writer.close();
502
- unsigned int i;
503
- ensure(!reader.readUint32(i));
504
- }
505
-
506
- TEST_METHOD(34) {
507
- // readUint32() throws TimeoutException if no data was available within the timeout.
508
- unsigned long long timeout = 30;
509
- unsigned int i;
510
- try {
511
- reader.readUint32(i, &timeout);
512
- fail("TimeoutException expected");
513
- } catch (const TimeoutException &) {
514
- ensure("The spent time is deducted from timeout", timeout < 5);
515
- }
516
- }
517
-
518
- TEST_METHOD(35) {
519
- // readUint32() throws TimeoutException if not enough data was available within the timeout.
520
- unsigned long long timeout = 30;
521
- unsigned int i;
522
- writeExact(writer.filenum(), "xx", 2);
523
- try {
524
- reader.readUint32(i, &timeout);
525
- fail("TimeoutException expected");
526
- } catch (const TimeoutException &e) {
527
- ensure("The spent time is deducted from timeout", timeout < 5);
528
- }
529
- }
530
-
531
- TEST_METHOD(36) {
532
- // readUint32() throws TimeoutException if timeout is 0 and no data
533
- // is immediately available.
534
- unsigned long long timeout = 0;
535
- unsigned int i;
536
- try {
537
- reader.readUint32(i, &timeout);
538
- fail("TimeoutException expected");
539
- } catch (const TimeoutException &) {
540
- ensure_equals("Timeout is unchanged", timeout, 0u);
541
- }
542
- }
543
-
544
- TEST_METHOD(37) {
545
- // readUint32() throws TimeoutException if timeout is 0 and not enough
546
- // data is immediately available.
547
- unsigned long long timeout = 0;
548
- unsigned int i;
549
- writeExact(writer.filenum(), "xx", 2);
550
- try {
551
- reader.readUint32(i, &timeout);
552
- fail("TimeoutException expected");
553
- } catch (const TimeoutException &e) {
554
- ensure_equals("Timeout unchanged", timeout, 0u);
555
- }
556
- }
557
- }