passenger 4.0.60 → 5.0.0.beta1

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 (1301) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +5 -0
  5. data/.travis.yml +3 -2
  6. data/CHANGELOG +31 -53
  7. data/CONTRIBUTING.md +4 -4
  8. data/CONTRIBUTORS +0 -1
  9. data/Gemfile +18 -0
  10. data/Gemfile.lock +41 -0
  11. data/Rakefile +16 -0
  12. data/bin/passenger +2 -2
  13. data/bin/passenger-install-apache2-module +12 -12
  14. data/bin/passenger-install-nginx-module +9 -14
  15. data/bin/passenger-status +125 -87
  16. data/build/agents.rb +112 -140
  17. data/build/apache2.rb +4 -9
  18. data/build/basics.rb +5 -3
  19. data/build/common_library.rb +1 -0
  20. data/build/cxx_tests.rb +69 -47
  21. data/build/debian.rb +4 -2
  22. data/build/documentation.rb +1 -0
  23. data/build/integration_tests.rb +28 -43
  24. data/build/misc.rb +0 -18
  25. data/build/nginx.rb +2 -6
  26. data/build/packaging.rb +33 -22
  27. data/build/preprocessor.rb +2 -4
  28. data/build/ruby_tests.rb +7 -26
  29. data/build/test_basics.rb +24 -25
  30. data/debian.template/control.template +2 -2
  31. data/debian.template/locations.ini.template +2 -3
  32. data/debian.template/passenger.install.template +2 -2
  33. data/debian.template/rules.template +1 -1
  34. data/dev/ci/run_jenkins.sh +0 -1
  35. data/dev/ci/run_rpm_tests.sh +3 -0
  36. data/dev/ci/run_travis.sh +63 -17
  37. data/dev/copy_boost_headers +22 -6
  38. data/dev/ruby_server.rb +244 -0
  39. data/dev/vagrant/provision.sh +3 -1
  40. data/doc/DebuggingAndStressTesting.md +3 -3
  41. data/doc/Design and Architecture.txt +5 -6
  42. data/doc/Packaging.txt.md +35 -6
  43. data/doc/ServerOptimizationGuide.txt.md +339 -0
  44. data/doc/Users guide Apache.idmap.txt +177 -187
  45. data/doc/Users guide Apache.txt +143 -219
  46. data/doc/Users guide Nginx.idmap.txt +166 -166
  47. data/doc/Users guide Nginx.txt +265 -223
  48. data/doc/Users guide Standalone.txt +3 -3
  49. data/doc/templates/markdown.html.erb +37 -6
  50. data/doc/users_guide_snippets/environment_variables.txt +1 -1
  51. data/doc/users_guide_snippets/support_information.txt +1 -1
  52. data/doc/users_guide_snippets/tips.txt +2 -2
  53. data/ext/apache2/Configuration.cpp +23 -81
  54. data/ext/apache2/Configuration.hpp +18 -92
  55. data/ext/apache2/ConfigurationCommands.cpp +64 -15
  56. data/ext/apache2/ConfigurationCommands.cpp.erb +8 -4
  57. data/ext/apache2/ConfigurationFields.hpp +12 -0
  58. data/ext/apache2/ConfigurationSetters.cpp +73 -1
  59. data/ext/apache2/ConfigurationSetters.cpp.erb +3 -2
  60. data/ext/apache2/CreateDirConfig.cpp +6 -0
  61. data/ext/apache2/DirectoryMapper.h +11 -6
  62. data/ext/apache2/Hooks.cpp +291 -408
  63. data/ext/apache2/MergeDirConfig.cpp +42 -0
  64. data/ext/apache2/SetHeaders.cpp +61 -16
  65. data/ext/apache2/SetHeaders.cpp.erb +9 -7
  66. data/ext/boost/container/allocator_traits.hpp +400 -0
  67. data/ext/boost/container/deque.hpp +2012 -0
  68. data/ext/boost/container/detail/adaptive_node_pool_impl.hpp +874 -0
  69. data/ext/boost/container/detail/advanced_insert_int.hpp +369 -0
  70. data/ext/boost/container/detail/algorithms.hpp +84 -0
  71. data/ext/boost/container/detail/allocation_type.hpp +54 -0
  72. data/ext/boost/container/detail/allocator_version_traits.hpp +163 -0
  73. data/ext/boost/container/detail/config_begin.hpp +49 -0
  74. data/ext/boost/container/detail/config_end.hpp +17 -0
  75. data/ext/boost/container/detail/destroyers.hpp +365 -0
  76. data/ext/boost/container/detail/flat_tree.hpp +1055 -0
  77. data/ext/boost/container/detail/function_detector.hpp +88 -0
  78. data/ext/boost/container/detail/iterators.hpp +611 -0
  79. data/ext/boost/container/detail/math_functions.hpp +113 -0
  80. data/ext/boost/container/detail/memory_util.hpp +83 -0
  81. data/ext/boost/container/detail/mpl.hpp +160 -0
  82. data/ext/boost/container/detail/multiallocation_chain.hpp +286 -0
  83. data/ext/boost/container/detail/node_alloc_holder.hpp +386 -0
  84. data/ext/boost/container/detail/node_pool_impl.hpp +365 -0
  85. data/ext/boost/container/detail/pair.hpp +354 -0
  86. data/ext/boost/container/detail/pool_common.hpp +52 -0
  87. data/ext/boost/container/detail/preprocessor.hpp +232 -0
  88. data/ext/boost/container/detail/transform_iterator.hpp +176 -0
  89. data/ext/boost/container/detail/tree.hpp +1134 -0
  90. data/ext/boost/container/detail/type_traits.hpp +210 -0
  91. data/ext/boost/container/detail/utilities.hpp +1141 -0
  92. data/ext/boost/container/detail/value_init.hpp +45 -0
  93. data/ext/boost/container/detail/variadic_templates_tools.hpp +153 -0
  94. data/ext/boost/container/detail/version_type.hpp +92 -0
  95. data/ext/boost/container/detail/workaround.hpp +44 -0
  96. data/ext/boost/container/flat_map.hpp +1674 -0
  97. data/ext/boost/container/flat_set.hpp +1408 -0
  98. data/ext/boost/container/list.hpp +1475 -0
  99. data/ext/boost/container/map.hpp +1508 -0
  100. data/ext/boost/container/scoped_allocator.hpp +1503 -0
  101. data/ext/boost/container/scoped_allocator_fwd.hpp +83 -0
  102. data/ext/boost/container/set.hpp +1280 -0
  103. data/ext/boost/container/slist.hpp +1706 -0
  104. data/ext/boost/container/stable_vector.hpp +1869 -0
  105. data/ext/boost/container/static_vector.hpp +1053 -0
  106. data/ext/boost/container/string.hpp +2856 -0
  107. data/ext/boost/container/throw_exception.hpp +110 -0
  108. data/ext/boost/container/vector.hpp +2671 -0
  109. data/ext/boost/detail/is_xxx.hpp +61 -0
  110. data/ext/boost/intrusive/any_hook.hpp +344 -0
  111. data/ext/boost/intrusive/avl_set.hpp +2528 -0
  112. data/ext/boost/intrusive/avl_set_hook.hpp +297 -0
  113. data/ext/boost/intrusive/avltree.hpp +1786 -0
  114. data/ext/boost/intrusive/avltree_algorithms.hpp +968 -0
  115. data/ext/boost/intrusive/bs_set_hook.hpp +296 -0
  116. data/ext/boost/intrusive/circular_list_algorithms.hpp +413 -0
  117. data/ext/boost/intrusive/circular_slist_algorithms.hpp +404 -0
  118. data/ext/boost/intrusive/derivation_value_traits.hpp +70 -0
  119. data/ext/boost/intrusive/detail/any_node_and_algorithms.hpp +297 -0
  120. data/ext/boost/intrusive/detail/assert.hpp +41 -0
  121. data/ext/boost/intrusive/detail/avltree_node.hpp +197 -0
  122. data/ext/boost/intrusive/detail/clear_on_destructor_base.hpp +36 -0
  123. data/ext/boost/intrusive/detail/common_slist_algorithms.hpp +102 -0
  124. data/ext/boost/intrusive/detail/config_begin.hpp +52 -0
  125. data/ext/boost/intrusive/detail/config_end.hpp +15 -0
  126. data/ext/boost/intrusive/detail/ebo_functor_holder.hpp +95 -0
  127. data/ext/boost/intrusive/detail/function_detector.hpp +88 -0
  128. data/ext/boost/intrusive/detail/generic_hook.hpp +209 -0
  129. data/ext/boost/intrusive/detail/has_member_function_callable_with.hpp +357 -0
  130. data/ext/boost/intrusive/detail/hashtable_node.hpp +249 -0
  131. data/ext/boost/intrusive/detail/is_stateful_value_traits.hpp +77 -0
  132. data/ext/boost/intrusive/detail/list_node.hpp +196 -0
  133. data/ext/boost/intrusive/detail/memory_util.hpp +288 -0
  134. data/ext/boost/intrusive/detail/mpl.hpp +383 -0
  135. data/ext/boost/intrusive/detail/parent_from_member.hpp +97 -0
  136. data/ext/boost/intrusive/detail/preprocessor.hpp +52 -0
  137. data/ext/boost/intrusive/detail/rbtree_node.hpp +201 -0
  138. data/ext/boost/intrusive/detail/slist_node.hpp +166 -0
  139. data/ext/boost/intrusive/detail/transform_iterator.hpp +173 -0
  140. data/ext/boost/intrusive/detail/tree_algorithms.hpp +1742 -0
  141. data/ext/boost/intrusive/detail/tree_node.hpp +199 -0
  142. data/ext/boost/intrusive/detail/utilities.hpp +858 -0
  143. data/ext/boost/intrusive/detail/workaround.hpp +22 -0
  144. data/ext/boost/intrusive/hashtable.hpp +3110 -0
  145. data/ext/boost/intrusive/intrusive_fwd.hpp +542 -0
  146. data/ext/boost/intrusive/linear_slist_algorithms.hpp +327 -0
  147. data/ext/boost/intrusive/link_mode.hpp +46 -0
  148. data/ext/boost/intrusive/list.hpp +1525 -0
  149. data/ext/boost/intrusive/list_hook.hpp +290 -0
  150. data/ext/boost/intrusive/member_value_traits.hpp +70 -0
  151. data/ext/boost/intrusive/options.hpp +810 -0
  152. data/ext/boost/intrusive/parent_from_member.hpp +42 -0
  153. data/ext/boost/intrusive/pointer_plus_bits.hpp +86 -0
  154. data/ext/boost/intrusive/pointer_traits.hpp +265 -0
  155. data/ext/boost/intrusive/priority_compare.hpp +39 -0
  156. data/ext/boost/intrusive/rbtree.hpp +1785 -0
  157. data/ext/boost/intrusive/rbtree_algorithms.hpp +934 -0
  158. data/ext/boost/intrusive/set.hpp +2554 -0
  159. data/ext/boost/intrusive/set_hook.hpp +300 -0
  160. data/ext/boost/intrusive/sg_set.hpp +2601 -0
  161. data/ext/boost/intrusive/sgtree.hpp +2009 -0
  162. data/ext/boost/intrusive/sgtree_algorithms.hpp +807 -0
  163. data/ext/boost/intrusive/slist.hpp +2219 -0
  164. data/ext/boost/intrusive/slist_hook.hpp +294 -0
  165. data/ext/boost/intrusive/splay_set.hpp +2575 -0
  166. data/ext/boost/intrusive/splay_set_hook.hpp +292 -0
  167. data/ext/boost/intrusive/splaytree.hpp +1784 -0
  168. data/ext/boost/intrusive/splaytree_algorithms.hpp +1008 -0
  169. data/ext/boost/intrusive/treap.hpp +1882 -0
  170. data/ext/boost/intrusive/treap_algorithms.hpp +919 -0
  171. data/ext/boost/intrusive/treap_set.hpp +2751 -0
  172. data/ext/boost/intrusive/trivial_value_traits.hpp +46 -0
  173. data/ext/boost/intrusive/unordered_set.hpp +2115 -0
  174. data/ext/boost/intrusive/unordered_set_hook.hpp +434 -0
  175. data/ext/boost/intrusive_ptr.hpp +18 -0
  176. data/ext/boost/math/common_factor_ct.hpp +180 -0
  177. data/ext/boost/math_fwd.hpp +108 -0
  178. data/ext/boost/move/detail/move_helpers.hpp +175 -0
  179. data/ext/boost/parameter.hpp +21 -0
  180. data/ext/boost/parameter/aux_/arg_list.hpp +459 -0
  181. data/ext/boost/parameter/aux_/cast.hpp +143 -0
  182. data/ext/boost/parameter/aux_/default.hpp +69 -0
  183. data/ext/boost/parameter/aux_/is_maybe.hpp +26 -0
  184. data/ext/boost/parameter/aux_/maybe.hpp +120 -0
  185. data/ext/boost/parameter/aux_/overloads.hpp +88 -0
  186. data/ext/boost/parameter/aux_/parameter_requirements.hpp +25 -0
  187. data/ext/boost/parameter/aux_/parenthesized_type.hpp +119 -0
  188. data/ext/boost/parameter/aux_/preprocessor/flatten.hpp +115 -0
  189. data/ext/boost/parameter/aux_/preprocessor/for_each.hpp +103 -0
  190. data/ext/boost/parameter/aux_/python/invoker.hpp +132 -0
  191. data/ext/boost/parameter/aux_/python/invoker_iterate.hpp +93 -0
  192. data/ext/boost/parameter/aux_/result_of0.hpp +36 -0
  193. data/ext/boost/parameter/aux_/set.hpp +67 -0
  194. data/ext/boost/parameter/aux_/tag.hpp +38 -0
  195. data/ext/boost/parameter/aux_/tagged_argument.hpp +188 -0
  196. data/ext/boost/parameter/aux_/template_keyword.hpp +47 -0
  197. data/ext/boost/parameter/aux_/unwrap_cv_reference.hpp +97 -0
  198. data/ext/boost/parameter/aux_/void.hpp +29 -0
  199. data/ext/boost/parameter/aux_/yesno.hpp +26 -0
  200. data/ext/boost/parameter/binding.hpp +106 -0
  201. data/ext/boost/parameter/config.hpp +14 -0
  202. data/ext/boost/parameter/keyword.hpp +152 -0
  203. data/ext/boost/parameter/macros.hpp +99 -0
  204. data/ext/boost/parameter/match.hpp +55 -0
  205. data/ext/boost/parameter/name.hpp +156 -0
  206. data/ext/boost/parameter/parameters.hpp +931 -0
  207. data/ext/boost/parameter/preprocessor.hpp +1178 -0
  208. data/ext/boost/parameter/python.hpp +735 -0
  209. data/ext/boost/parameter/value_type.hpp +108 -0
  210. data/ext/boost/pool/detail/for.m4 +107 -0
  211. data/ext/boost/pool/detail/guard.hpp +69 -0
  212. data/ext/boost/pool/detail/mutex.hpp +42 -0
  213. data/ext/boost/pool/detail/pool_construct.bat +24 -0
  214. data/ext/boost/pool/detail/pool_construct.ipp +852 -0
  215. data/ext/boost/pool/detail/pool_construct.m4 +84 -0
  216. data/ext/boost/pool/detail/pool_construct.sh +12 -0
  217. data/ext/boost/pool/detail/pool_construct_simple.bat +25 -0
  218. data/ext/boost/pool/detail/pool_construct_simple.ipp +43 -0
  219. data/ext/boost/pool/detail/pool_construct_simple.m4 +72 -0
  220. data/ext/boost/pool/detail/pool_construct_simple.sh +12 -0
  221. data/ext/boost/pool/object_pool.hpp +287 -0
  222. data/ext/boost/pool/pool.hpp +1024 -0
  223. data/ext/boost/pool/pool_alloc.hpp +488 -0
  224. data/ext/boost/pool/poolfwd.hpp +82 -0
  225. data/ext/boost/pool/simple_segregated_storage.hpp +377 -0
  226. data/ext/boost/pool/singleton_pool.hpp +251 -0
  227. data/ext/boost/preprocessor/arithmetic.hpp +25 -0
  228. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  229. data/ext/boost/preprocessor/arithmetic/div.hpp +39 -0
  230. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  231. data/ext/boost/preprocessor/arithmetic/mul.hpp +53 -0
  232. data/ext/boost/preprocessor/array.hpp +32 -0
  233. data/ext/boost/preprocessor/array/enum.hpp +33 -0
  234. data/ext/boost/preprocessor/array/insert.hpp +55 -0
  235. data/ext/boost/preprocessor/array/pop_back.hpp +37 -0
  236. data/ext/boost/preprocessor/array/pop_front.hpp +38 -0
  237. data/ext/boost/preprocessor/array/push_back.hpp +33 -0
  238. data/ext/boost/preprocessor/array/push_front.hpp +33 -0
  239. data/ext/boost/preprocessor/array/remove.hpp +54 -0
  240. data/ext/boost/preprocessor/array/replace.hpp +49 -0
  241. data/ext/boost/preprocessor/array/reverse.hpp +29 -0
  242. data/ext/boost/preprocessor/array/to_list.hpp +33 -0
  243. data/ext/boost/preprocessor/array/to_seq.hpp +33 -0
  244. data/ext/boost/preprocessor/array/to_tuple.hpp +22 -0
  245. data/ext/boost/preprocessor/assert_msg.hpp +17 -0
  246. data/ext/boost/preprocessor/comma.hpp +17 -0
  247. data/ext/boost/preprocessor/comparison.hpp +24 -0
  248. data/ext/boost/preprocessor/comparison/equal.hpp +34 -0
  249. data/ext/boost/preprocessor/comparison/greater.hpp +38 -0
  250. data/ext/boost/preprocessor/comparison/greater_equal.hpp +38 -0
  251. data/ext/boost/preprocessor/comparison/less.hpp +46 -0
  252. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  253. data/ext/boost/preprocessor/comparison/not_equal.hpp +814 -0
  254. data/ext/boost/preprocessor/config/limits.hpp +30 -0
  255. data/ext/boost/preprocessor/control.hpp +22 -0
  256. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  257. data/ext/boost/preprocessor/control/detail/dmc/while.hpp +536 -0
  258. data/ext/boost/preprocessor/control/detail/edg/while.hpp +534 -0
  259. data/ext/boost/preprocessor/control/detail/msvc/while.hpp +277 -0
  260. data/ext/boost/preprocessor/control/expr_if.hpp +30 -0
  261. data/ext/boost/preprocessor/debug.hpp +18 -0
  262. data/ext/boost/preprocessor/debug/assert.hpp +44 -0
  263. data/ext/boost/preprocessor/debug/line.hpp +35 -0
  264. data/ext/boost/preprocessor/detail/dmc/auto_rec.hpp +286 -0
  265. data/ext/boost/preprocessor/detail/is_nullary.hpp +30 -0
  266. data/ext/boost/preprocessor/detail/is_unary.hpp +30 -0
  267. data/ext/boost/preprocessor/detail/null.hpp +17 -0
  268. data/ext/boost/preprocessor/detail/split.hpp +35 -0
  269. data/ext/boost/preprocessor/enum_params_with_defaults.hpp +17 -0
  270. data/ext/boost/preprocessor/enum_shifted.hpp +17 -0
  271. data/ext/boost/preprocessor/expand.hpp +17 -0
  272. data/ext/boost/preprocessor/expr_if.hpp +17 -0
  273. data/ext/boost/preprocessor/facilities.hpp +23 -0
  274. data/ext/boost/preprocessor/facilities/apply.hpp +34 -0
  275. data/ext/boost/preprocessor/facilities/expand.hpp +28 -0
  276. data/ext/boost/preprocessor/facilities/is_1.hpp +23 -0
  277. data/ext/boost/preprocessor/facilities/is_empty.hpp +43 -0
  278. data/ext/boost/preprocessor/facilities/is_empty_or_1.hpp +30 -0
  279. data/ext/boost/preprocessor/for.hpp +17 -0
  280. data/ext/boost/preprocessor/if.hpp +17 -0
  281. data/ext/boost/preprocessor/iteration.hpp +19 -0
  282. data/ext/boost/preprocessor/iteration/detail/bounds/lower3.hpp +99 -0
  283. data/ext/boost/preprocessor/iteration/detail/bounds/lower4.hpp +99 -0
  284. data/ext/boost/preprocessor/iteration/detail/bounds/lower5.hpp +99 -0
  285. data/ext/boost/preprocessor/iteration/detail/bounds/upper3.hpp +99 -0
  286. data/ext/boost/preprocessor/iteration/detail/bounds/upper4.hpp +99 -0
  287. data/ext/boost/preprocessor/iteration/detail/bounds/upper5.hpp +99 -0
  288. data/ext/boost/preprocessor/iteration/detail/finish.hpp +99 -0
  289. data/ext/boost/preprocessor/iteration/detail/iter/forward3.hpp +1338 -0
  290. data/ext/boost/preprocessor/iteration/detail/iter/forward4.hpp +1338 -0
  291. data/ext/boost/preprocessor/iteration/detail/iter/forward5.hpp +1338 -0
  292. data/ext/boost/preprocessor/iteration/detail/iter/reverse2.hpp +1296 -0
  293. data/ext/boost/preprocessor/iteration/detail/iter/reverse3.hpp +1296 -0
  294. data/ext/boost/preprocessor/iteration/detail/iter/reverse4.hpp +1296 -0
  295. data/ext/boost/preprocessor/iteration/detail/iter/reverse5.hpp +1296 -0
  296. data/ext/boost/preprocessor/iteration/detail/local.hpp +812 -0
  297. data/ext/boost/preprocessor/iteration/detail/rlocal.hpp +782 -0
  298. data/ext/boost/preprocessor/iteration/detail/self.hpp +21 -0
  299. data/ext/boost/preprocessor/iteration/detail/start.hpp +99 -0
  300. data/ext/boost/preprocessor/iteration/local.hpp +26 -0
  301. data/ext/boost/preprocessor/iteration/self.hpp +19 -0
  302. data/ext/boost/preprocessor/library.hpp +36 -0
  303. data/ext/boost/preprocessor/limits.hpp +17 -0
  304. data/ext/boost/preprocessor/list.hpp +37 -0
  305. data/ext/boost/preprocessor/list/at.hpp +39 -0
  306. data/ext/boost/preprocessor/list/cat.hpp +42 -0
  307. data/ext/boost/preprocessor/list/detail/dmc/fold_left.hpp +279 -0
  308. data/ext/boost/preprocessor/list/detail/edg/fold_left.hpp +536 -0
  309. data/ext/boost/preprocessor/list/detail/edg/fold_right.hpp +794 -0
  310. data/ext/boost/preprocessor/list/enum.hpp +41 -0
  311. data/ext/boost/preprocessor/list/filter.hpp +54 -0
  312. data/ext/boost/preprocessor/list/first_n.hpp +58 -0
  313. data/ext/boost/preprocessor/list/for_each.hpp +49 -0
  314. data/ext/boost/preprocessor/list/for_each_product.hpp +141 -0
  315. data/ext/boost/preprocessor/list/rest_n.hpp +55 -0
  316. data/ext/boost/preprocessor/list/size.hpp +58 -0
  317. data/ext/boost/preprocessor/list/to_array.hpp +123 -0
  318. data/ext/boost/preprocessor/list/to_seq.hpp +32 -0
  319. data/ext/boost/preprocessor/list/to_tuple.hpp +38 -0
  320. data/ext/boost/preprocessor/logical.hpp +29 -0
  321. data/ext/boost/preprocessor/logical/bitnor.hpp +38 -0
  322. data/ext/boost/preprocessor/logical/bitor.hpp +38 -0
  323. data/ext/boost/preprocessor/logical/bitxor.hpp +38 -0
  324. data/ext/boost/preprocessor/logical/nor.hpp +30 -0
  325. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  326. data/ext/boost/preprocessor/logical/or.hpp +30 -0
  327. data/ext/boost/preprocessor/logical/xor.hpp +30 -0
  328. data/ext/boost/preprocessor/max.hpp +17 -0
  329. data/ext/boost/preprocessor/min.hpp +17 -0
  330. data/ext/boost/preprocessor/punctuation.hpp +20 -0
  331. data/ext/boost/preprocessor/punctuation/paren_if.hpp +38 -0
  332. data/ext/boost/preprocessor/repeat_3rd.hpp +17 -0
  333. data/ext/boost/preprocessor/repeat_from_to.hpp +17 -0
  334. data/ext/boost/preprocessor/repeat_from_to_2nd.hpp +17 -0
  335. data/ext/boost/preprocessor/repeat_from_to_3rd.hpp +17 -0
  336. data/ext/boost/preprocessor/repetition.hpp +32 -0
  337. data/ext/boost/preprocessor/repetition/deduce_r.hpp +22 -0
  338. data/ext/boost/preprocessor/repetition/deduce_z.hpp +22 -0
  339. data/ext/boost/preprocessor/repetition/detail/dmc/for.hpp +536 -0
  340. data/ext/boost/preprocessor/repetition/detail/edg/for.hpp +534 -0
  341. data/ext/boost/preprocessor/repetition/detail/msvc/for.hpp +277 -0
  342. data/ext/boost/preprocessor/repetition/enum_params_with_defaults.hpp +24 -0
  343. data/ext/boost/preprocessor/repetition/enum_shifted.hpp +68 -0
  344. data/ext/boost/preprocessor/repetition/enum_shifted_binary_params.hpp +51 -0
  345. data/ext/boost/preprocessor/repetition/enum_trailing.hpp +63 -0
  346. data/ext/boost/preprocessor/repetition/enum_trailing_binary_params.hpp +53 -0
  347. data/ext/boost/preprocessor/selection.hpp +18 -0
  348. data/ext/boost/preprocessor/selection/max.hpp +39 -0
  349. data/ext/boost/preprocessor/selection/min.hpp +39 -0
  350. data/ext/boost/preprocessor/seq.hpp +43 -0
  351. data/ext/boost/preprocessor/seq/cat.hpp +49 -0
  352. data/ext/boost/preprocessor/seq/detail/binary_transform.hpp +40 -0
  353. data/ext/boost/preprocessor/seq/detail/split.hpp +284 -0
  354. data/ext/boost/preprocessor/seq/filter.hpp +54 -0
  355. data/ext/boost/preprocessor/seq/first_n.hpp +30 -0
  356. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  357. data/ext/boost/preprocessor/seq/fold_right.hpp +288 -0
  358. data/ext/boost/preprocessor/seq/for_each.hpp +60 -0
  359. data/ext/boost/preprocessor/seq/for_each_product.hpp +126 -0
  360. data/ext/boost/preprocessor/seq/insert.hpp +28 -0
  361. data/ext/boost/preprocessor/seq/pop_back.hpp +29 -0
  362. data/ext/boost/preprocessor/seq/pop_front.hpp +27 -0
  363. data/ext/boost/preprocessor/seq/push_back.hpp +19 -0
  364. data/ext/boost/preprocessor/seq/push_front.hpp +19 -0
  365. data/ext/boost/preprocessor/seq/remove.hpp +29 -0
  366. data/ext/boost/preprocessor/seq/replace.hpp +29 -0
  367. data/ext/boost/preprocessor/seq/rest_n.hpp +30 -0
  368. data/ext/boost/preprocessor/seq/reverse.hpp +39 -0
  369. data/ext/boost/preprocessor/seq/subseq.hpp +28 -0
  370. data/ext/boost/preprocessor/seq/to_array.hpp +28 -0
  371. data/ext/boost/preprocessor/seq/to_list.hpp +29 -0
  372. data/ext/boost/preprocessor/seq/to_tuple.hpp +27 -0
  373. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  374. data/ext/boost/preprocessor/slot.hpp +17 -0
  375. data/ext/boost/preprocessor/slot/counter.hpp +25 -0
  376. data/ext/boost/preprocessor/slot/detail/counter.hpp +269 -0
  377. data/ext/boost/preprocessor/slot/detail/slot1.hpp +267 -0
  378. data/ext/boost/preprocessor/slot/detail/slot2.hpp +267 -0
  379. data/ext/boost/preprocessor/slot/detail/slot3.hpp +267 -0
  380. data/ext/boost/preprocessor/slot/detail/slot4.hpp +267 -0
  381. data/ext/boost/preprocessor/slot/detail/slot5.hpp +267 -0
  382. data/ext/boost/preprocessor/tuple.hpp +28 -0
  383. data/ext/boost/preprocessor/tuple/enum.hpp +22 -0
  384. data/ext/boost/preprocessor/tuple/reverse.hpp +114 -0
  385. data/ext/boost/preprocessor/tuple/size.hpp +28 -0
  386. data/ext/boost/preprocessor/tuple/to_array.hpp +37 -0
  387. data/ext/boost/preprocessor/tuple/to_seq.hpp +114 -0
  388. data/ext/boost/preprocessor/variadic.hpp +23 -0
  389. data/ext/boost/preprocessor/variadic/to_array.hpp +32 -0
  390. data/ext/boost/preprocessor/variadic/to_list.hpp +25 -0
  391. data/ext/boost/preprocessor/variadic/to_seq.hpp +25 -0
  392. data/ext/boost/preprocessor/variadic/to_tuple.hpp +24 -0
  393. data/ext/boost/preprocessor/while.hpp +17 -0
  394. data/ext/boost/preprocessor/wstringize.hpp +29 -0
  395. data/ext/boost/smart_ptr/intrusive_ptr.hpp +324 -0
  396. data/ext/common/AccountsDatabase.h +3 -4
  397. data/ext/common/AgentsStarter.cpp +12 -15
  398. data/ext/common/AgentsStarter.h +54 -120
  399. data/ext/common/ApplicationPool2/AppTypes.cpp +12 -5
  400. data/ext/common/ApplicationPool2/AppTypes.h +21 -14
  401. data/ext/common/ApplicationPool2/Common.h +36 -19
  402. data/ext/common/ApplicationPool2/DirectSpawner.h +15 -16
  403. data/ext/common/ApplicationPool2/DummySpawner.h +9 -8
  404. data/ext/common/ApplicationPool2/ErrorRenderer.h +1 -1
  405. data/ext/common/ApplicationPool2/Group.h +304 -171
  406. data/ext/common/ApplicationPool2/Implementation.cpp +234 -125
  407. data/ext/common/ApplicationPool2/Options.h +50 -62
  408. data/ext/common/ApplicationPool2/Pool.h +285 -189
  409. data/ext/common/ApplicationPool2/Process.h +126 -115
  410. data/ext/common/ApplicationPool2/Session.h +70 -30
  411. data/ext/common/ApplicationPool2/SmartSpawner.h +19 -18
  412. data/ext/common/ApplicationPool2/Socket.h +57 -43
  413. data/ext/common/ApplicationPool2/SpawnObject.h +83 -0
  414. data/ext/common/ApplicationPool2/Spawner.h +59 -38
  415. data/ext/common/ApplicationPool2/SpawnerFactory.h +8 -14
  416. data/ext/common/ApplicationPool2/SuperGroup.h +69 -40
  417. data/ext/common/BackgroundEventLoop.cpp +48 -1
  418. data/ext/common/BackgroundEventLoop.h +3 -1
  419. data/ext/common/Constants.h +30 -8
  420. data/ext/common/DataStructures/HashedStaticString.h +103 -0
  421. data/ext/common/DataStructures/LString.h +396 -0
  422. data/ext/common/DataStructures/StringKeyTable.h +588 -0
  423. data/ext/common/EventedMessageServer.h +1 -0
  424. data/ext/common/FileDescriptor.h +5 -0
  425. data/ext/common/InstanceDirectory.h +240 -0
  426. data/ext/common/Logging.cpp +38 -13
  427. data/ext/common/Logging.h +53 -22
  428. data/ext/common/MemoryKit/mbuf.cpp +413 -0
  429. data/ext/common/MemoryKit/mbuf.h +266 -0
  430. data/ext/common/MemoryKit/palloc.cpp +337 -0
  431. data/ext/common/MemoryKit/palloc.h +121 -0
  432. data/ext/common/ResourceLocator.h +62 -6
  433. data/ext/common/SafeLibev.h +4 -4
  434. data/ext/common/ServerKit/AcceptLoadBalancer.h +275 -0
  435. data/ext/common/ServerKit/Channel.h +747 -0
  436. data/ext/common/ServerKit/Client.h +166 -0
  437. data/ext/common/ServerKit/ClientRef.h +130 -0
  438. data/ext/common/ServerKit/Context.h +129 -0
  439. data/ext/common/ServerKit/Errors.h +103 -0
  440. data/ext/common/ServerKit/FdSinkChannel.h +206 -0
  441. data/ext/common/ServerKit/FdSourceChannel.h +230 -0
  442. data/ext/common/ServerKit/FileBufferedChannel.h +1399 -0
  443. data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +228 -0
  444. data/ext/common/ServerKit/HeaderTable.h +472 -0
  445. data/ext/common/ServerKit/Hooks.h +79 -0
  446. data/ext/common/ServerKit/HttpChunkedBodyParser.h +289 -0
  447. data/ext/common/ServerKit/HttpChunkedBodyParserState.h +70 -0
  448. data/ext/common/ServerKit/HttpClient.h +94 -0
  449. data/ext/common/ServerKit/HttpHeaderParser.h +477 -0
  450. data/ext/common/ServerKit/HttpHeaderParserState.h +60 -0
  451. data/ext/common/ServerKit/HttpRequest.h +276 -0
  452. data/ext/common/ServerKit/HttpRequestRef.h +130 -0
  453. data/ext/common/ServerKit/HttpServer.h +1152 -0
  454. data/ext/common/ServerKit/Implementation.cpp +47 -0
  455. data/ext/common/ServerKit/Server.h +1040 -0
  456. data/ext/common/ServerKit/http_parser.cpp +2259 -0
  457. data/ext/common/ServerKit/http_parser.h +330 -0
  458. data/ext/common/StaticString.h +8 -0
  459. data/ext/common/Utils.cpp +14 -12
  460. data/ext/common/Utils.h +9 -103
  461. data/ext/common/Utils/BufferedIO.h +1 -0
  462. data/ext/common/Utils/CachedFileStat.hpp +1 -7
  463. data/ext/common/Utils/DateParsing.h +379 -0
  464. data/ext/common/Utils/FileChangeChecker.h +3 -9
  465. data/ext/common/Utils/Hasher.cpp +52 -0
  466. data/ext/common/Utils/Hasher.h +58 -0
  467. data/ext/common/Utils/IOUtils.cpp +62 -62
  468. data/ext/common/Utils/JsonUtils.h +21 -0
  469. data/ext/common/Utils/OptionParsing.h +75 -0
  470. data/ext/common/Utils/StrIntUtils.cpp +112 -19
  471. data/ext/common/Utils/StrIntUtils.h +52 -12
  472. data/ext/common/Utils/StrIntUtilsNoStrictAliasing.cpp +174 -0
  473. data/ext/common/Utils/VariantMap.h +18 -7
  474. data/ext/common/Utils/modp_b64.cpp +290 -0
  475. data/ext/common/Utils/modp_b64.h +241 -0
  476. data/ext/common/Utils/modp_b64_data.h +479 -0
  477. data/ext/common/Utils/sysqueue.h +811 -0
  478. data/ext/common/agents/Base.cpp +71 -98
  479. data/ext/common/agents/Base.h +11 -3
  480. data/ext/common/agents/HelperAgent/AdminServer.h +690 -0
  481. data/ext/common/agents/HelperAgent/Main.cpp +899 -487
  482. data/ext/common/agents/HelperAgent/OptionParser.h +311 -0
  483. data/ext/common/agents/HelperAgent/RequestHandler.h +315 -2548
  484. data/ext/common/agents/HelperAgent/RequestHandler/AppResponse.h +225 -0
  485. data/ext/common/agents/HelperAgent/RequestHandler/BufferBody.cpp +93 -0
  486. data/ext/common/agents/HelperAgent/RequestHandler/CheckoutSession.cpp +346 -0
  487. data/ext/common/agents/HelperAgent/RequestHandler/Client.h +54 -0
  488. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +846 -0
  489. data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +231 -0
  490. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +434 -0
  491. data/ext/common/agents/HelperAgent/RequestHandler/Request.h +149 -0
  492. data/ext/common/agents/HelperAgent/RequestHandler/SendRequest.cpp +887 -0
  493. data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +293 -0
  494. data/ext/common/agents/HelperAgent/RequestHandler/Utils.cpp +301 -0
  495. data/ext/common/agents/HelperAgent/ResponseCache.h +624 -0
  496. data/ext/common/agents/HelperAgent/SystemMetricsTool.cpp +21 -23
  497. data/ext/common/agents/LoggingAgent/AdminServer.h +369 -0
  498. data/ext/common/agents/LoggingAgent/LoggingServer.h +1 -0
  499. data/ext/common/agents/LoggingAgent/Main.cpp +422 -215
  500. data/ext/common/agents/LoggingAgent/OptionParser.h +167 -0
  501. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  502. data/ext/common/agents/Main.cpp +107 -0
  503. data/ext/common/agents/SpawnPreparer/Main.cpp +207 -0
  504. data/ext/common/agents/TempDirToucher/Main.cpp +429 -0
  505. data/ext/common/agents/Watchdog/AdminServer.h +390 -0
  506. data/ext/common/agents/Watchdog/AgentWatcher.cpp +7 -5
  507. data/ext/common/agents/Watchdog/HelperAgentWatcher.cpp +18 -39
  508. data/ext/common/agents/Watchdog/InstanceDirToucher.cpp +116 -0
  509. data/ext/common/agents/Watchdog/LoggingAgentWatcher.cpp +13 -17
  510. data/ext/common/agents/Watchdog/Main.cpp +743 -202
  511. data/ext/libeio/eio.c +17 -0
  512. data/ext/libeio/eio.h +2 -0
  513. data/ext/nginx/CacheLocationConfig.c +177 -198
  514. data/ext/nginx/CacheLocationConfig.c.erb +35 -22
  515. data/ext/nginx/Configuration.c +402 -236
  516. data/ext/nginx/Configuration.h +12 -5
  517. data/ext/nginx/ConfigurationCommands.c +35 -15
  518. data/ext/nginx/ConfigurationCommands.c.erb +4 -4
  519. data/ext/nginx/ConfigurationFields.h +9 -5
  520. data/ext/nginx/ConfigurationFields.h.erb +3 -1
  521. data/ext/nginx/ContentHandler.c +393 -362
  522. data/ext/nginx/CreateLocationConfig.c +8 -4
  523. data/ext/nginx/CreateLocationConfig.c.erb +8 -3
  524. data/ext/nginx/MergeLocationConfig.c +36 -6
  525. data/ext/nginx/MergeLocationConfig.c.erb +42 -1
  526. data/ext/nginx/ngx_http_passenger_module.c +28 -15
  527. data/ext/oxt/detail/backtrace_disabled.hpp +2 -1
  528. data/ext/oxt/detail/backtrace_enabled.hpp +15 -2
  529. data/ext/oxt/implementation.cpp +92 -20
  530. data/ext/oxt/thread.hpp +5 -0
  531. data/ext/ruby/extconf.rb +3 -6
  532. data/ext/ruby/passenger_native_support.c +13 -40
  533. data/helper-scripts/download_binaries/extconf.rb +4 -4
  534. data/helper-scripts/meteor-loader.rb +12 -112
  535. data/helper-scripts/node-loader.js +3 -91
  536. data/helper-scripts/rack-loader.rb +13 -14
  537. data/helper-scripts/rack-preloader.rb +16 -17
  538. data/helper-scripts/wsgi-loader.py +11 -7
  539. data/lib/phusion_passenger.rb +100 -79
  540. data/lib/phusion_passenger/abstract_installer.rb +28 -3
  541. data/lib/phusion_passenger/admin_tools.rb +3 -3
  542. data/lib/phusion_passenger/admin_tools/instance.rb +207 -0
  543. data/lib/phusion_passenger/admin_tools/instance_registry.rb +98 -0
  544. data/lib/phusion_passenger/apache2/config_options.rb +72 -22
  545. data/lib/phusion_passenger/common_library.rb +79 -14
  546. data/lib/phusion_passenger/config/about_command.rb +17 -23
  547. data/lib/phusion_passenger/config/admin_command_command.rb +175 -0
  548. data/lib/phusion_passenger/config/agent_compiler.rb +170 -0
  549. data/lib/phusion_passenger/config/command.rb +1 -4
  550. data/lib/phusion_passenger/config/compile_agent_command.rb +102 -0
  551. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +112 -0
  552. data/lib/phusion_passenger/config/detach_process_command.rb +32 -10
  553. data/lib/phusion_passenger/config/download_agent_command.rb +285 -0
  554. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +281 -0
  555. data/lib/phusion_passenger/config/install_agent_command.rb +174 -0
  556. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +231 -0
  557. data/lib/phusion_passenger/config/installation_utils.rb +241 -0
  558. data/lib/phusion_passenger/config/list_instances_command.rb +13 -25
  559. data/lib/phusion_passenger/config/main.rb +43 -14
  560. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +337 -0
  561. data/lib/phusion_passenger/config/reopen_logs_command.rb +110 -0
  562. data/lib/phusion_passenger/config/restart_app_command.rb +61 -14
  563. data/lib/phusion_passenger/config/system_metrics_command.rb +2 -1
  564. data/lib/phusion_passenger/config/utils.rb +64 -39
  565. data/lib/phusion_passenger/config/validate_install_command.rb +2 -2
  566. data/lib/phusion_passenger/constants.rb +27 -6
  567. data/lib/phusion_passenger/debug_logging.rb +32 -15
  568. data/lib/phusion_passenger/loader_shared_helpers.rb +2 -5
  569. data/lib/phusion_passenger/message_client.rb +21 -22
  570. data/lib/phusion_passenger/native_support.rb +26 -31
  571. data/lib/phusion_passenger/nginx/config_options.rb +32 -19
  572. data/lib/phusion_passenger/packaging.rb +7 -3
  573. data/lib/phusion_passenger/platform_info/cxx_portability.rb +1 -2
  574. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +3 -4
  575. data/lib/phusion_passenger/platform_info/operating_system.rb +6 -6
  576. data/lib/phusion_passenger/preloader_shared_helpers.rb +2 -2
  577. data/lib/phusion_passenger/rack/out_of_band_gc.rb +2 -2
  578. data/lib/phusion_passenger/rack/thread_handler_extension.rb +168 -65
  579. data/lib/phusion_passenger/request_handler.rb +47 -82
  580. data/lib/phusion_passenger/request_handler/thread_handler.rb +46 -10
  581. data/lib/phusion_passenger/ruby_core_enhancements.rb +25 -77
  582. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +108 -0
  583. data/lib/phusion_passenger/standalone/app_finder.rb +39 -59
  584. data/lib/phusion_passenger/standalone/command.rb +27 -275
  585. data/lib/phusion_passenger/standalone/command2.rb +292 -0
  586. data/lib/phusion_passenger/standalone/config_utils.rb +87 -0
  587. data/lib/phusion_passenger/standalone/control_utils.rb +88 -0
  588. data/lib/phusion_passenger/standalone/main.rb +69 -71
  589. data/lib/phusion_passenger/standalone/start2_command.rb +799 -0
  590. data/lib/phusion_passenger/standalone/start_command.rb +406 -467
  591. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +167 -0
  592. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +165 -0
  593. data/lib/phusion_passenger/standalone/status_command.rb +64 -23
  594. data/lib/phusion_passenger/standalone/stop_command.rb +69 -32
  595. data/lib/phusion_passenger/standalone/version_command.rb +1 -5
  596. data/lib/phusion_passenger/utils.rb +0 -4
  597. data/lib/phusion_passenger/utils/json.rb +70 -4
  598. data/lib/phusion_passenger/utils/progress_bar.rb +56 -0
  599. data/lib/phusion_passenger/utils/tee_input.rb +3 -3
  600. data/lib/phusion_passenger/utils/unseekable_socket.rb +30 -0
  601. data/packaging/rpm/nginx_spec/nginx.spec.template +4 -3
  602. data/packaging/rpm/passenger_spec/passenger.spec.template +6 -10
  603. data/packaging/rpm/setup-system +2 -1
  604. data/resources/oss-binaries.phusionpassenger.com.crt +208 -0
  605. data/resources/templates/config/agent_compiler/confirm_enable_optimizations.txt.erb +5 -0
  606. data/resources/templates/config/installation_utils/cannot_create_user_support_binaries_dir.txt.erb +15 -0
  607. data/resources/templates/config/installation_utils/download_tool_missing.txt.erb +7 -0
  608. data/resources/templates/config/installation_utils/passenger_not_installed_as_root.txt.erb +12 -0
  609. data/resources/templates/config/installation_utils/support_binaries_dir_not_writable_despite_running_as_root.txt.erb +13 -0
  610. data/resources/templates/config/installation_utils/unexpected_filesystem_problem.txt.erb +16 -0
  611. data/{packaging/debian/debian_specs/passenger/patches/series → resources/templates/config/installation_utils/user_support_binaries_dir_not_writable.txt.erb} +0 -0
  612. data/resources/templates/nginx/nginx_module_sources_not_available.txt.erb +2 -2
  613. data/resources/templates/standalone/config.erb +14 -16
  614. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +1 -1
  615. data/test/.rspec +1 -0
  616. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +20 -17
  617. data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -14
  618. data/test/cxx/ApplicationPool2/PoolTest.cpp +113 -90
  619. data/test/cxx/ApplicationPool2/ProcessTest.cpp +18 -27
  620. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +51 -53
  621. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +55 -57
  622. data/test/cxx/BufferedIOTest.cpp +40 -40
  623. data/test/cxx/CxxTestMain.cpp +4 -22
  624. data/test/cxx/DataStructures/LStringTest.cpp +275 -0
  625. data/test/cxx/DataStructures/StringKeyTableTest.cpp +199 -0
  626. data/test/cxx/MemoryKit/MbufTest.cpp +213 -0
  627. data/test/cxx/MessageServerTest.cpp +62 -55
  628. data/test/cxx/RequestHandlerTest.cpp +26 -27
  629. data/test/cxx/ServerKit/ChannelTest.cpp +1467 -0
  630. data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +817 -0
  631. data/test/cxx/ServerKit/HeaderTableTest.cpp +171 -0
  632. data/test/cxx/ServerKit/HttpServerTest.cpp +1503 -0
  633. data/test/cxx/ServerKit/ServerTest.cpp +408 -0
  634. data/test/cxx/TestSupport.cpp +51 -15
  635. data/test/cxx/TestSupport.h +31 -21
  636. data/test/cxx/UnionStationTest.cpp +121 -122
  637. data/test/cxx/UtilsTest.cpp +9 -33
  638. data/test/integration_tests/apache2_tests.rb +65 -27
  639. data/test/integration_tests/downloaded_binaries_tests.rb +30 -6
  640. data/test/integration_tests/native_packaging_spec.rb +32 -17
  641. data/test/integration_tests/nginx_tests.rb +28 -10
  642. data/test/integration_tests/shared/example_webapp_tests.rb +40 -27
  643. data/test/integration_tests/standalone_tests.rb +232 -169
  644. data/test/ruby/debug_logging_spec.rb +44 -40
  645. data/test/ruby/rails3.0/preloader_spec.rb +1 -1
  646. data/test/ruby/rails3.1/preloader_spec.rb +1 -1
  647. data/test/ruby/rails3.2/preloader_spec.rb +1 -1
  648. data/test/ruby/rails4.0/preloader_spec.rb +1 -1
  649. data/test/ruby/rails4.1/preloader_spec.rb +1 -1
  650. data/test/ruby/request_handler_spec.rb +62 -24
  651. data/test/ruby/shared/loader_sharedspec.rb +10 -9
  652. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +23 -22
  653. data/test/ruby/spec_helper.rb +2 -11
  654. data/test/ruby/standalone/runtime_installer_spec.rb +15 -13
  655. data/test/ruby/union_station_spec.rb +45 -40
  656. data/test/ruby/utils/tee_input_spec.rb +5 -5
  657. data/test/ruby/utils_spec.rb +3 -39
  658. data/test/stub/apache2/httpd.conf.erb +5 -2
  659. data/test/stub/nginx/nginx.conf.erb +3 -1
  660. data/test/support/apache2_controller.rb +25 -25
  661. data/test/support/nginx_controller.rb +14 -14
  662. data/test/support/test_helper.rb +74 -75
  663. metadata +439 -643
  664. metadata.gz.asc +7 -7
  665. data/ext/common/MultiLibeio.cpp +0 -204
  666. data/ext/common/MultiLibeio.h +0 -67
  667. data/ext/common/ServerInstanceDir.h +0 -402
  668. data/ext/common/Utils/Base64.cpp +0 -143
  669. data/ext/common/Utils/Base64.h +0 -83
  670. data/ext/common/Utils/HttpHeaderBufferer.h +0 -184
  671. data/ext/common/Utils/PriorityQueue.h +0 -54
  672. data/ext/common/Utils/StreamBoyerMooreHorspool.h +0 -512
  673. data/ext/common/Utils/fib.c +0 -699
  674. data/ext/common/Utils/fib.h +0 -101
  675. data/ext/common/Utils/fibpriv.h +0 -67
  676. data/ext/common/agents/EnvPrinter.c +0 -16
  677. data/ext/common/agents/HelperAgent/AgentOptions.h +0 -109
  678. data/ext/common/agents/HelperAgent/FileBackedPipe.h +0 -732
  679. data/ext/common/agents/HelperAgent/RequestHandler.cpp +0 -294
  680. data/ext/common/agents/HelperAgent/ScgiRequestParser.h +0 -457
  681. data/ext/common/agents/LoggingAgent/AdminController.h +0 -96
  682. data/ext/common/agents/SpawnPreparer.cpp +0 -206
  683. data/ext/common/agents/TempDirToucher.c +0 -383
  684. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +0 -116
  685. data/helper-scripts/classic-rails-loader.rb +0 -166
  686. data/helper-scripts/classic-rails-preloader.rb +0 -193
  687. data/lib/phusion_passenger/admin_tools/server_instance.rb +0 -339
  688. data/lib/phusion_passenger/classic_rails/cgi_fixed.rb +0 -68
  689. data/lib/phusion_passenger/classic_rails/thread_handler_extension.rb +0 -40
  690. data/lib/phusion_passenger/platform_info/openssl.rb +0 -61
  691. data/lib/phusion_passenger/standalone/config_file.rb +0 -119
  692. data/lib/phusion_passenger/standalone/help_command.rb +0 -57
  693. data/lib/phusion_passenger/standalone/runtime_installer.rb +0 -712
  694. data/lib/phusion_passenger/standalone/runtime_locator.rb +0 -170
  695. data/lib/phusion_passenger/standalone/utils.rb +0 -58
  696. data/lib/phusion_passenger/utils/tmpdir.rb +0 -69
  697. data/packaging/debian/LICENSE.md +0 -19
  698. data/packaging/debian/README.md +0 -320
  699. data/packaging/debian/Vagrantfile +0 -25
  700. data/packaging/debian/build +0 -210
  701. data/packaging/debian/debian_specs/nginx/changelog +0 -1989
  702. data/packaging/debian/debian_specs/nginx/compat.erb +0 -5
  703. data/packaging/debian/debian_specs/nginx/conf/fastcgi.conf +0 -25
  704. data/packaging/debian/debian_specs/nginx/conf/fastcgi_params +0 -24
  705. data/packaging/debian/debian_specs/nginx/conf/koi-utf +0 -109
  706. data/packaging/debian/debian_specs/nginx/conf/koi-win +0 -103
  707. data/packaging/debian/debian_specs/nginx/conf/mime.types +0 -89
  708. data/packaging/debian/debian_specs/nginx/conf/nginx.conf.erb +0 -97
  709. data/packaging/debian/debian_specs/nginx/conf/proxy_params +0 -4
  710. data/packaging/debian/debian_specs/nginx/conf/scgi_params +0 -16
  711. data/packaging/debian/debian_specs/nginx/conf/sites-available/default.erb +0 -93
  712. data/packaging/debian/debian_specs/nginx/conf/snippets/fastcgi-php.conf +0 -13
  713. data/packaging/debian/debian_specs/nginx/conf/snippets/snakeoil.conf +0 -5
  714. data/packaging/debian/debian_specs/nginx/conf/uwsgi_params +0 -16
  715. data/packaging/debian/debian_specs/nginx/conf/win-utf +0 -125
  716. data/packaging/debian/debian_specs/nginx/control.erb +0 -226
  717. data/packaging/debian/debian_specs/nginx/copyright +0 -196
  718. data/packaging/debian/debian_specs/nginx/debian-full.lintian-overrides +0 -1
  719. data/packaging/debian/debian_specs/nginx/gbp.conf +0 -2
  720. data/packaging/debian/debian_specs/nginx/help/docs/fcgiwrap +0 -14
  721. data/packaging/debian/debian_specs/nginx/help/docs/php +0 -119
  722. data/packaging/debian/debian_specs/nginx/help/docs/support-irc +0 -28
  723. data/packaging/debian/debian_specs/nginx/help/docs/upstream +0 -51
  724. data/packaging/debian/debian_specs/nginx/help/examples/drupal +0 -114
  725. data/packaging/debian/debian_specs/nginx/help/examples/http +0 -59
  726. data/packaging/debian/debian_specs/nginx/help/examples/mail +0 -30
  727. data/packaging/debian/debian_specs/nginx/help/examples/mailman +0 -59
  728. data/packaging/debian/debian_specs/nginx/help/examples/nginx.conf +0 -34
  729. data/packaging/debian/debian_specs/nginx/help/examples/nginx_modsite +0 -162
  730. data/packaging/debian/debian_specs/nginx/help/examples/virtual_hosts +0 -155
  731. data/packaging/debian/debian_specs/nginx/help/examples/wordpress +0 -74
  732. data/packaging/debian/debian_specs/nginx/helpers.rb +0 -41
  733. data/packaging/debian/debian_specs/nginx/index-debian.html.in +0 -32
  734. data/packaging/debian/debian_specs/nginx/index-ubuntu.html.in +0 -32
  735. data/packaging/debian/debian_specs/nginx/index.html.erb +0 -10
  736. data/packaging/debian/debian_specs/nginx/modules/README.Modules-versions +0 -65
  737. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/README.markdown +0 -510
  738. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/config +0 -5
  739. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki +0 -395
  740. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ddebug.h +0 -119
  741. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.c +0 -348
  742. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.h +0 -80
  743. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c +0 -826
  744. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.h +0 -26
  745. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.c +0 -716
  746. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.h +0 -26
  747. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.c +0 -380
  748. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h +0 -52
  749. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/util/build.sh +0 -32
  750. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/valgrind.suppress +0 -215
  751. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ChangeLog +0 -35
  752. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/LICENSE +0 -25
  753. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/README.md +0 -93
  754. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/config +0 -4
  755. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ngx_http_auth_pam_module.c +0 -462
  756. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/CHANGES +0 -66
  757. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/LICENSE +0 -26
  758. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/README.md +0 -171
  759. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/TODO.md +0 -7
  760. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/config +0 -21
  761. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/ngx_cache_purge_module.c +0 -1803
  762. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/README +0 -29
  763. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/config +0 -9
  764. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/ngx_http_dav_ext_module.c +0 -824
  765. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README +0 -139
  766. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README_AUTO_LIB +0 -395
  767. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/TODO +0 -1
  768. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/array +0 -10
  769. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/palloc +0 -8
  770. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/build +0 -597
  771. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_replacements +0 -5
  772. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_types +0 -12
  773. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_args +0 -22
  774. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_locs +0 -25
  775. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_macros +0 -35
  776. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/contexts +0 -22
  777. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/header_files +0 -3
  778. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/headers +0 -4
  779. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/module_dependencies +0 -5
  780. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/modules_optional +0 -15
  781. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/prefixes +0 -2
  782. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/array.h +0 -7
  783. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_cmd_basic.h +0 -43
  784. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_merge.h +0 -78
  785. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/palloc.h +0 -6
  786. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/text/autogen +0 -12
  787. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/config +0 -49
  788. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/action_macros +0 -63
  789. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/conf_cmds +0 -62
  790. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/modules/set_var +0 -124
  791. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/patches/more_logging_info +0 -48
  792. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/upstream/list +0 -45
  793. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/README +0 -12
  794. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/config +0 -4
  795. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/ngx_http_set_var_examples_module.c +0 -136
  796. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/ngx_auto_lib_core +0 -797
  797. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/CHANGES +0 -17
  798. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/LICENSE +0 -24
  799. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_array.h +0 -113
  800. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_basic.h +0 -2203
  801. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_extra.h +0 -5423
  802. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_merge.h +0 -227
  803. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.c +0 -72
  804. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.h +0 -98
  805. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_includes.h +0 -66
  806. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_palloc.h +0 -112
  807. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/auto_config +0 -16
  808. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/expose_rewrite_functions +0 -291
  809. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/rewrite_phase_handler +0 -19
  810. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/md5.h +0 -117
  811. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/murmurhash2.c +0 -77
  812. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/sha.h +0 -200
  813. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.c +0 -155
  814. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.h +0 -58
  815. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.c +0 -43
  816. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.h +0 -5
  817. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.c +0 -129
  818. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.h +0 -30
  819. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.c +0 -192
  820. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.h +0 -21
  821. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.c +0 -396
  822. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.h +0 -44
  823. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.c +0 -72
  824. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.h +0 -171
  825. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.c +0 -57
  826. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.h +0 -12
  827. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.c +0 -82
  828. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.h +0 -45
  829. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.c +0 -138
  830. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.h +0 -3
  831. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http_headers.h +0 -35
  832. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.c +0 -3
  833. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.h +0 -165
  834. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_parse.h +0 -67
  835. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.c +0 -583
  836. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.h +0 -22
  837. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.c +0 -20
  838. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.h +0 -12
  839. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.c +0 -215
  840. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.h +0 -7
  841. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.c +0 -103
  842. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.h +0 -26
  843. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.c +0 -602
  844. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.h +0 -44
  845. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.c +0 -434
  846. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.h +0 -37
  847. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string_util.h +0 -14
  848. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.c +0 -205
  849. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.h +0 -27
  850. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.c +0 -45
  851. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.h +0 -6
  852. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/LICENSE +0 -25
  853. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/README.markdown +0 -1850
  854. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/config +0 -5
  855. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/doc/HttpEchoModule.wiki +0 -1558
  856. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ddebug.h +0 -109
  857. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.c +0 -344
  858. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.h +0 -25
  859. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.c +0 -282
  860. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.h +0 -15
  861. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.c +0 -183
  862. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.h +0 -16
  863. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.c +0 -429
  864. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.h +0 -18
  865. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.c +0 -178
  866. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.h +0 -13
  867. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.c +0 -667
  868. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.h +0 -137
  869. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.c +0 -452
  870. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.h +0 -31
  871. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.c +0 -208
  872. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.h +0 -16
  873. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.c +0 -788
  874. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.h +0 -19
  875. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.c +0 -96
  876. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.h +0 -13
  877. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.c +0 -298
  878. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.h +0 -58
  879. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.c +0 -110
  880. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.h +0 -9
  881. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/build.sh +0 -45
  882. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/releng +0 -8
  883. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/wiki2pod.pl +0 -131
  884. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/valgrind.suppress +0 -38
  885. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/LICENCE +0 -24
  886. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/README +0 -206
  887. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/changelog.txt +0 -54
  888. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/config +0 -26
  889. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/protocol.txt +0 -191
  890. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.c +0 -59
  891. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.h +0 -73
  892. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.c +0 -783
  893. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.h +0 -31
  894. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module_setup.c +0 -361
  895. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_types.h +0 -120
  896. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.c +0 -1180
  897. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.h +0 -1
  898. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.c +0 -146
  899. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.h +0 -5
  900. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_store.h +0 -51
  901. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.c +0 -178
  902. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.h +0 -5
  903. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.c +0 -246
  904. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.h +0 -9
  905. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/Changes +0 -51
  906. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/README.markdown +0 -6954
  907. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/config +0 -363
  908. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/doc/HttpLuaModule.wiki +0 -5898
  909. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/dtrace/ngx_lua_provider.d +0 -61
  910. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/Makefile +0 -3
  911. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/lib/RecvUntil.pm +0 -138
  912. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/t/sanity.t +0 -140
  913. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/api/ngx_http_lua_api.h +0 -52
  914. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ddebug.h +0 -82
  915. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.c +0 -377
  916. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.h +0 -22
  917. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_api.c +0 -77
  918. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.c +0 -537
  919. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.h +0 -20
  920. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.c +0 -632
  921. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.h +0 -31
  922. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.c +0 -296
  923. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.h +0 -24
  924. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.c +0 -175
  925. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.h +0 -20
  926. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.c +0 -887
  927. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.h +0 -22
  928. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_common.h +0 -478
  929. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.c +0 -67
  930. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.h +0 -19
  931. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.c +0 -148
  932. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.h +0 -20
  933. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.c +0 -369
  934. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.h +0 -26
  935. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.c +0 -483
  936. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.h +0 -20
  937. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.c +0 -379
  938. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.h +0 -23
  939. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.c +0 -216
  940. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.h +0 -23
  941. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.c +0 -1081
  942. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.h +0 -56
  943. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.c +0 -58
  944. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.h +0 -33
  945. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.c +0 -302
  946. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.h +0 -29
  947. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.c +0 -1370
  948. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.h +0 -22
  949. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.c +0 -782
  950. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.h +0 -22
  951. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.c +0 -625
  952. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.h +0 -23
  953. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.c +0 -42
  954. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.h +0 -23
  955. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.c +0 -320
  956. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.h +0 -25
  957. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.c +0 -300
  958. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.h +0 -20
  959. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.c +0 -227
  960. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.h +0 -22
  961. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.c +0 -252
  962. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.h +0 -20
  963. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_module.c +0 -924
  964. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.c +0 -184
  965. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.h +0 -21
  966. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.c +0 -794
  967. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.h +0 -28
  968. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.c +0 -106
  969. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.h +0 -23
  970. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.c +0 -94
  971. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.h +0 -13
  972. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_probe.h +0 -85
  973. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.c +0 -2468
  974. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.h +0 -22
  975. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.c +0 -1169
  976. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.h +0 -20
  977. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.c +0 -252
  978. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.h +0 -19
  979. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.c +0 -351
  980. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.h +0 -22
  981. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.c +0 -538
  982. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.h +0 -86
  983. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.c +0 -216
  984. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.h +0 -15
  985. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.c +0 -1844
  986. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.h +0 -52
  987. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.c +0 -191
  988. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.h +0 -20
  989. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.c +0 -5314
  990. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.h +0 -156
  991. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.c +0 -1624
  992. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.h +0 -56
  993. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.c +0 -704
  994. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.h +0 -20
  995. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.c +0 -1741
  996. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.h +0 -46
  997. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.c +0 -278
  998. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.h +0 -21
  999. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.c +0 -661
  1000. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.h +0 -20
  1001. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.c +0 -110
  1002. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.h +0 -20
  1003. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.c +0 -283
  1004. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.h +0 -36
  1005. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.c +0 -3972
  1006. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.h +0 -423
  1007. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.c +0 -499
  1008. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.h +0 -20
  1009. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.c +0 -64
  1010. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.h +0 -17
  1011. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/tapset/ngx_lua.stp +0 -5
  1012. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build.sh +0 -39
  1013. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build2.sh +0 -55
  1014. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/fix-comments +0 -27
  1015. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/gdbinit +0 -415
  1016. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/ngx-links +0 -62
  1017. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/reindex +0 -64
  1018. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/releng +0 -8
  1019. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/retab +0 -8
  1020. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/revim +0 -102
  1021. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/run_test.sh +0 -10
  1022. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/update-readme.sh +0 -4
  1023. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/valgrind.suppress +0 -144
  1024. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/CHANGES +0 -107
  1025. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/LICENSE +0 -25
  1026. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/Makefile +0 -8
  1027. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/README +0 -329
  1028. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/config +0 -3
  1029. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/ngx_http_uploadprogress_module.c +0 -1774
  1030. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/README +0 -53
  1031. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/config +0 -3
  1032. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/ngx_http_upstream_fair_module.c +0 -1356
  1033. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/CHANGELOG.md +0 -37
  1034. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/HACKING.md +0 -24
  1035. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/LICENSE +0 -20
  1036. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/README.rst +0 -182
  1037. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/config +0 -8
  1038. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/nginx-0.6-support.patch +0 -23
  1039. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/ngx_http_fancyindex_module.c +0 -1305
  1040. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.awk +0 -52
  1041. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.h +0 -103
  1042. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.html +0 -102
  1043. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/CHANGES +0 -37
  1044. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/README +0 -141
  1045. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/config +0 -3
  1046. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.google_code_home_page.wiki +0 -120
  1047. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.html +0 -199
  1048. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.wiki +0 -123
  1049. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/ngx_http_subs_filter_module.c +0 -1298
  1050. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/README +0 -275
  1051. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/AutoInstall.pm +0 -820
  1052. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install.pm +0 -470
  1053. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/AutoInstall.pm +0 -82
  1054. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Base.pm +0 -83
  1055. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Can.pm +0 -81
  1056. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Fetch.pm +0 -93
  1057. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Include.pm +0 -34
  1058. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Makefile.pm +0 -415
  1059. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Metadata.pm +0 -716
  1060. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/TestBase.pm +0 -29
  1061. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Win32.pm +0 -64
  1062. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/WriteAll.pm +0 -63
  1063. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Spiffy.pm +0 -539
  1064. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base.pm +0 -682
  1065. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base/Filter.pm +0 -341
  1066. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder.pm +0 -1413
  1067. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder/Module.pm +0 -81
  1068. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/More.pm +0 -735
  1069. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx.pm +0 -315
  1070. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/LWP.pm +0 -524
  1071. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Socket.pm +0 -1749
  1072. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Util.pm +0 -874
  1073. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs.t +0 -136
  1074. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_capture.t +0 -32
  1075. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_fix_string.t +0 -32
  1076. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_regex.t +0 -108
  1077. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_types.t +0 -59
  1078. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/test.sh +0 -5
  1079. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/update-readme.sh +0 -7
  1080. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2google_code_homepage.pl +0 -29
  1081. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2pod.pl +0 -129
  1082. data/packaging/debian/debian_specs/nginx/nginx-common.NEWS +0 -135
  1083. data/packaging/debian/debian_specs/nginx/nginx-common.README.Debian +0 -45
  1084. data/packaging/debian/debian_specs/nginx/nginx-common.dirs.erb +0 -32
  1085. data/packaging/debian/debian_specs/nginx/nginx-common.install +0 -3
  1086. data/packaging/debian/debian_specs/nginx/nginx-common.lintian-overrides +0 -2
  1087. data/packaging/debian/debian_specs/nginx/nginx-common.manpages +0 -1
  1088. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.default +0 -10
  1089. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.init.erb +0 -214
  1090. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.logrotate +0 -18
  1091. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.service.erb +0 -37
  1092. data/packaging/debian/debian_specs/nginx/nginx-common.postinst.erb +0 -66
  1093. data/packaging/debian/debian_specs/nginx/nginx-common.postrm.erb +0 -46
  1094. data/packaging/debian/debian_specs/nginx/nginx-common.preinst +0 -47
  1095. data/packaging/debian/debian_specs/nginx/nginx-common.prerm.erb +0 -28
  1096. data/packaging/debian/debian_specs/nginx/nginx-doc.docs +0 -2
  1097. data/packaging/debian/debian_specs/nginx/nginx-doc.examples +0 -1
  1098. data/packaging/debian/debian_specs/nginx/nginx-extras.install.erb +0 -17
  1099. data/packaging/debian/debian_specs/nginx/nginx-extras.lintian-overrides +0 -1
  1100. data/packaging/debian/debian_specs/nginx/nginx-extras.postinst.erb +0 -44
  1101. data/packaging/debian/debian_specs/nginx/nginx-extras.prerm +0 -22
  1102. data/packaging/debian/debian_specs/nginx/nginx.1 +0 -47
  1103. data/packaging/debian/debian_specs/nginx/patches/perl-use-dpkg-buildflags.patch +0 -23
  1104. data/packaging/debian/debian_specs/nginx/patches/series +0 -1
  1105. data/packaging/debian/debian_specs/nginx/rules.erb +0 -185
  1106. data/packaging/debian/debian_specs/nginx/source/format +0 -1
  1107. data/packaging/debian/debian_specs/nginx/tests/control +0 -4
  1108. data/packaging/debian/debian_specs/nginx/ufw/nginx +0 -14
  1109. data/packaging/debian/debian_specs/nginx/upstream/signing-key.asc +0 -34
  1110. data/packaging/debian/debian_specs/nginx/watch +0 -3
  1111. data/packaging/debian/debian_specs/passenger/README.Debian +0 -12
  1112. data/packaging/debian/debian_specs/passenger/changelog +0 -316
  1113. data/packaging/debian/debian_specs/passenger/compat +0 -1
  1114. data/packaging/debian/debian_specs/passenger/control.erb +0 -123
  1115. data/packaging/debian/debian_specs/passenger/copyright +0 -385
  1116. data/packaging/debian/debian_specs/passenger/helpers.rb +0 -24
  1117. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.install +0 -3
  1118. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.postinst +0 -36
  1119. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.prerm +0 -15
  1120. data/packaging/debian/debian_specs/passenger/locations.ini.erb +0 -14
  1121. data/packaging/debian/debian_specs/passenger/passenger-dev.install.erb +0 -3
  1122. data/packaging/debian/debian_specs/passenger/passenger-doc.install.erb +0 -2
  1123. data/packaging/debian/debian_specs/passenger/passenger.conf +0 -6
  1124. data/packaging/debian/debian_specs/passenger/passenger.docs +0 -4
  1125. data/packaging/debian/debian_specs/passenger/passenger.install.erb +0 -16
  1126. data/packaging/debian/debian_specs/passenger/passenger.load +0 -3
  1127. data/packaging/debian/debian_specs/passenger/passenger.manpages +0 -3
  1128. data/packaging/debian/debian_specs/passenger/passenger_free_ruby.c +0 -29
  1129. data/packaging/debian/debian_specs/passenger/passenger_ruby_utils.c +0 -54
  1130. data/packaging/debian/debian_specs/passenger/passenger_system_ruby.c.erb +0 -37
  1131. data/packaging/debian/debian_specs/passenger/rules.erb +0 -84
  1132. data/packaging/debian/debian_specs/passenger/source/format +0 -1
  1133. data/packaging/debian/debian_specs/passenger_enterprise/README.Debian +0 -12
  1134. data/packaging/debian/debian_specs/passenger_enterprise/changelog +0 -316
  1135. data/packaging/debian/debian_specs/passenger_enterprise/compat +0 -1
  1136. data/packaging/debian/debian_specs/passenger_enterprise/control.erb +0 -123
  1137. data/packaging/debian/debian_specs/passenger_enterprise/copyright +0 -385
  1138. data/packaging/debian/debian_specs/passenger_enterprise/helpers.rb +0 -2
  1139. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.install +0 -3
  1140. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.postinst +0 -36
  1141. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.prerm +0 -15
  1142. data/packaging/debian/debian_specs/passenger_enterprise/locations.ini.erb +0 -14
  1143. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-dev.install.erb +0 -3
  1144. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-doc.install.erb +0 -2
  1145. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.docs +0 -4
  1146. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.install.erb +0 -14
  1147. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.manpages +0 -3
  1148. data/packaging/debian/debian_specs/passenger_enterprise/passenger.conf +0 -6
  1149. data/packaging/debian/debian_specs/passenger_enterprise/passenger.load +0 -3
  1150. data/packaging/debian/debian_specs/passenger_enterprise/passenger_free_ruby.c.erb +0 -1
  1151. data/packaging/debian/debian_specs/passenger_enterprise/passenger_ruby_utils.c.erb +0 -1
  1152. data/packaging/debian/debian_specs/passenger_enterprise/passenger_system_ruby.c.erb +0 -1
  1153. data/packaging/debian/debian_specs/passenger_enterprise/patches/series +0 -0
  1154. data/packaging/debian/debian_specs/passenger_enterprise/rules.erb +0 -84
  1155. data/packaging/debian/debian_specs/passenger_enterprise/source/format +0 -1
  1156. data/packaging/debian/docker_images/Makefile +0 -38
  1157. data/packaging/debian/docker_images/buildbox/CONTAINER_VERSION.txt +0 -0
  1158. data/packaging/debian/docker_images/buildbox/Dockerfile +0 -3
  1159. data/packaging/debian/docker_images/buildbox/Gemfile +0 -9
  1160. data/packaging/debian/docker_images/buildbox/Gemfile.lock +0 -42
  1161. data/packaging/debian/docker_images/buildbox/install.sh +0 -85
  1162. data/packaging/debian/docker_images/buildbox/pbuilderrc +0 -4
  1163. data/packaging/debian/docker_images/buildbox/sudoers.conf +0 -6
  1164. data/packaging/debian/docker_images/setup-buildbox-docker-image +0 -7
  1165. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-6 +0 -7
  1166. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-7 +0 -7
  1167. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-8 +0 -7
  1168. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-12.04 +0 -7
  1169. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-14.04 +0 -7
  1170. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.04 +0 -7
  1171. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.10 +0 -7
  1172. data/packaging/debian/docker_images/testbox-debian-6/Dockerfile +0 -3
  1173. data/packaging/debian/docker_images/testbox-debian-6/Gemfile +0 -2
  1174. data/packaging/debian/docker_images/testbox-debian-6/Gemfile.lock +0 -23
  1175. data/packaging/debian/docker_images/testbox-debian-6/argparse.py +0 -2374
  1176. data/packaging/debian/docker_images/testbox-debian-6/install.sh +0 -78
  1177. data/packaging/debian/docker_images/testbox-debian-7/Dockerfile +0 -3
  1178. data/packaging/debian/docker_images/testbox-debian-7/Gemfile +0 -2
  1179. data/packaging/debian/docker_images/testbox-debian-7/Gemfile.lock +0 -23
  1180. data/packaging/debian/docker_images/testbox-debian-7/install.sh +0 -71
  1181. data/packaging/debian/docker_images/testbox-debian-8/Dockerfile +0 -3
  1182. data/packaging/debian/docker_images/testbox-debian-8/Gemfile +0 -2
  1183. data/packaging/debian/docker_images/testbox-debian-8/Gemfile.lock +0 -23
  1184. data/packaging/debian/docker_images/testbox-debian-8/install.sh +0 -70
  1185. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Dockerfile +0 -3
  1186. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile +0 -2
  1187. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile.lock +0 -23
  1188. data/packaging/debian/docker_images/testbox-ubuntu-12.04/install.sh +0 -69
  1189. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Dockerfile +0 -3
  1190. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile +0 -2
  1191. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile.lock +0 -23
  1192. data/packaging/debian/docker_images/testbox-ubuntu-14.04/install.sh +0 -69
  1193. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Dockerfile +0 -3
  1194. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile +0 -2
  1195. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile.lock +0 -23
  1196. data/packaging/debian/docker_images/testbox-ubuntu-15.04/install.sh +0 -69
  1197. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Dockerfile +0 -3
  1198. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile +0 -2
  1199. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile.lock +0 -23
  1200. data/packaging/debian/docker_images/testbox-ubuntu-15.10/install.sh +0 -69
  1201. data/packaging/debian/internal/build/Rakefile +0 -235
  1202. data/packaging/debian/internal/build/build-passenger-orig-tarball.sh +0 -76
  1203. data/packaging/debian/internal/build/build-source-package.rb +0 -121
  1204. data/packaging/debian/internal/build/download-nginx-orig-tarball.sh +0 -17
  1205. data/packaging/debian/internal/build/rakefile_support.rb +0 -96
  1206. data/packaging/debian/internal/build/setup-environment-essentials.sh +0 -15
  1207. data/packaging/debian/internal/build/setup-environment.sh +0 -29
  1208. data/packaging/debian/internal/lib/distro_info.rb +0 -82
  1209. data/packaging/debian/internal/lib/distro_info.sh +0 -303
  1210. data/packaging/debian/internal/lib/distro_info.sh.erb +0 -65
  1211. data/packaging/debian/internal/lib/library.sh +0 -83
  1212. data/packaging/debian/internal/lib/preprocessor.rb +0 -173
  1213. data/packaging/debian/internal/lib/tracking.rb +0 -95
  1214. data/packaging/debian/internal/lib/tracking_category.rb +0 -45
  1215. data/packaging/debian/internal/lib/tracking_database.rb +0 -132
  1216. data/packaging/debian/internal/lib/tracking_task.rb +0 -148
  1217. data/packaging/debian/internal/lib/utils.rb +0 -78
  1218. data/packaging/debian/internal/publish/Rakefile +0 -97
  1219. data/packaging/debian/internal/publish/oss-binaries.phusionpassenger.com-fingerprint.txt +0 -1
  1220. data/packaging/debian/internal/publish/packagecloud_fingerprint.txt +0 -1
  1221. data/packaging/debian/internal/publish/passenger_website_fingerprint.txt +0 -1
  1222. data/packaging/debian/internal/publish/preinit.sh +0 -7
  1223. data/packaging/debian/internal/publish/rakefile_support.rb +0 -183
  1224. data/packaging/debian/internal/scripts/gpg_noninteractive/gpg +0 -11
  1225. data/packaging/debian/internal/scripts/initccache.sh +0 -35
  1226. data/packaging/debian/internal/scripts/inituidgid.sh +0 -19
  1227. data/packaging/debian/internal/scripts/my_init +0 -340
  1228. data/packaging/debian/internal/scripts/pin_certificates +0 -34
  1229. data/packaging/debian/internal/scripts/regen_distro_info_script.sh +0 -3
  1230. data/packaging/debian/internal/scripts/setup-vagrant.sh +0 -12
  1231. data/packaging/debian/internal/scripts/setuser +0 -31
  1232. data/packaging/debian/internal/shell/initpbuilder.sh +0 -3
  1233. data/packaging/debian/internal/shell/preinit.sh +0 -28
  1234. data/packaging/debian/internal/shell/sudoers.conf +0 -1
  1235. data/packaging/debian/internal/test/apache/apache-24.conf +0 -5
  1236. data/packaging/debian/internal/test/apache/apache-pre-24.conf +0 -4
  1237. data/packaging/debian/internal/test/apache/vhost.conf +0 -17
  1238. data/packaging/debian/internal/test/misc/config.json +0 -15
  1239. data/packaging/debian/internal/test/misc/hosts.conf +0 -4
  1240. data/packaging/debian/internal/test/misc/init.sh +0 -25
  1241. data/packaging/debian/internal/test/misc/nodejs_test_app.js +0 -6
  1242. data/packaging/debian/internal/test/misc/python_test_app.py +0 -3
  1243. data/packaging/debian/internal/test/misc/ruby_test_app.rb +0 -5
  1244. data/packaging/debian/internal/test/misc/test_support.rb +0 -61
  1245. data/packaging/debian/internal/test/nginx/vhost.conf +0 -23
  1246. data/packaging/debian/internal/test/system_web_server_test.rb +0 -126
  1247. data/packaging/debian/internal/test/test.sh +0 -141
  1248. data/packaging/debian/jenkins/publish/clear_caches.rb +0 -48
  1249. data/packaging/debian/jenkins/publish/publish.sh +0 -69
  1250. data/packaging/debian/jenkins/test/test.sh +0 -63
  1251. data/packaging/debian/passenger_apt_automation.sublime-project +0 -14
  1252. data/packaging/debian/publish +0 -172
  1253. data/packaging/debian/shell +0 -116
  1254. data/packaging/debian/test +0 -142
  1255. data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-gcc47-include-sys_types.patch +0 -45
  1256. data/test/cxx/Base64Test.cpp +0 -50
  1257. data/test/cxx/FileBackedPipeTest.cpp +0 -626
  1258. data/test/cxx/HttpHeaderBuffererTest.cpp +0 -257
  1259. data/test/cxx/ScgiRequestParserTest.cpp +0 -423
  1260. data/test/cxx/ServerInstanceDirTest.cpp +0 -175
  1261. data/test/ruby/admin_tools_spec.rb +0 -360
  1262. data/test/ruby/classic_rails/loader_spec.rb +0 -46
  1263. data/test/ruby/classic_rails/preloader_spec.rb +0 -52
  1264. data/test/ruby/standalone/runtime_locator_spec.rb +0 -214
  1265. data/test/stub/rails2.3/Rakefile +0 -10
  1266. data/test/stub/rails2.3/app/controllers/application_controller.rb +0 -10
  1267. data/test/stub/rails2.3/app/controllers/bar_controller_1.rb +0 -5
  1268. data/test/stub/rails2.3/app/controllers/bar_controller_2.rb +0 -5
  1269. data/test/stub/rails2.3/app/controllers/foo_controller.rb +0 -21
  1270. data/test/stub/rails2.3/app/helpers/application_helper.rb +0 -3
  1271. data/test/stub/rails2.3/app/helpers/bar_helper.rb +0 -2
  1272. data/test/stub/rails2.3/app/helpers/foo_helper.rb +0 -2
  1273. data/test/stub/rails2.3/config/boot.rb +0 -110
  1274. data/test/stub/rails2.3/config/database.yml +0 -19
  1275. data/test/stub/rails2.3/config/environment.rb +0 -62
  1276. data/test/stub/rails2.3/config/environments/development.rb +0 -17
  1277. data/test/stub/rails2.3/config/environments/production.rb +0 -18
  1278. data/test/stub/rails2.3/config/environments/staging.rb +0 -18
  1279. data/test/stub/rails2.3/config/initializers/inflections.rb +0 -10
  1280. data/test/stub/rails2.3/config/initializers/mime_types.rb +0 -5
  1281. data/test/stub/rails2.3/config/routes.rb +0 -35
  1282. data/test/stub/rails2.3/log/.gitignore +0 -1
  1283. data/test/stub/rails2.3/public/.gitignore +0 -1
  1284. data/test/stub/rails2.3/script/about +0 -3
  1285. data/test/stub/rails2.3/script/console +0 -3
  1286. data/test/stub/rails2.3/script/dbconsole +0 -3
  1287. data/test/stub/rails2.3/script/destroy +0 -3
  1288. data/test/stub/rails2.3/script/generate +0 -3
  1289. data/test/stub/rails2.3/script/performance/benchmarker +0 -3
  1290. data/test/stub/rails2.3/script/performance/profiler +0 -3
  1291. data/test/stub/rails2.3/script/performance/request +0 -3
  1292. data/test/stub/rails2.3/script/plugin +0 -3
  1293. data/test/stub/rails2.3/script/process/inspector +0 -3
  1294. data/test/stub/rails2.3/script/process/reaper +0 -3
  1295. data/test/stub/rails2.3/script/process/spawner +0 -3
  1296. data/test/stub/rails2.3/script/runner +0 -3
  1297. data/test/stub/rails2.3/script/server +0 -3
  1298. data/test/stub/rails2.3/tmp/cache/.gitignore +0 -1
  1299. data/test/stub/rails2.3/tmp/pids/.gitignore +0 -1
  1300. data/test/stub/rails2.3/tmp/sessions/.gitignore +0 -1
  1301. data/test/stub/rails2.3/tmp/sockets/.gitignore +0 -1
@@ -1,1180 +0,0 @@
1
- #include <ngx_http_push_module.h>
2
-
3
- #include "store.h"
4
- #include <store/rbtree_util.h>
5
- #include <store/ngx_rwlock.h>
6
- #include <store/ngx_http_push_module_ipc.h>
7
-
8
- #define NGX_HTTP_PUSH_BROADCAST_CHECK(val, fail, r, errormessage) \
9
- if (val == fail) { \
10
- ngx_log_error(NGX_LOG_ERR, (r)->connection->log, 0, errormessage); \
11
- ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); \
12
- return NULL; \
13
- }
14
-
15
- #define NGX_HTTP_PUSH_BROADCAST_CHECK_LOCKED(val, fail, r, errormessage, shpool) \
16
- if (val == fail) { \
17
- ngx_shmtx_unlock(&(shpool)->mutex); \
18
- ngx_log_error(NGX_LOG_ERR, (r)->connection->log, 0, errormessage); \
19
- ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); \
20
- return NULL; \
21
- }
22
-
23
- #define NGX_HTTP_BUF_ALLOC_SIZE(buf) \
24
- (sizeof(*buf) + \
25
- (((buf)->temporary || (buf)->memory) ? ngx_buf_size(buf) : 0) + \
26
- (((buf)->file!=NULL) ? (sizeof(*(buf)->file) + (buf)->file->name.len + 1) : 0))
27
-
28
- #define ENQUEUED_DBG "msg %p enqueued. ref:%i, p:%p n:%p"
29
- #define CREATED_DBG "msg %p created ref:%i, p:%p n:%p"
30
- #define FREED_DBG "msg %p freed. ref:%i, p:%p n:%p"
31
- #define RESERVED_DBG "msg %p reserved. ref:%i, p:%p n:%p"
32
- #define RELEASED_DBG "msg %p released. ref:%i, p:%p n:%p"
33
-
34
- //#define DEBUG_SHM_ALLOC 1
35
-
36
- static ngx_http_push_channel_queue_t channel_gc_sentinel;
37
- static ngx_slab_pool_t *ngx_http_push_shpool = NULL;
38
- static ngx_shm_zone_t *ngx_http_push_shm_zone = NULL;
39
-
40
- static ngx_int_t ngx_http_push_store_send_worker_message(ngx_http_push_channel_t *channel, ngx_http_push_subscriber_t *subscriber_sentinel, ngx_pid_t pid, ngx_int_t worker_slot, ngx_http_push_msg_t *msg, ngx_int_t status_code);
41
-
42
- static ngx_int_t ngx_http_push_channel_collector(ngx_http_push_channel_t * channel) {
43
- if((ngx_http_push_clean_channel_locked(channel))!=NULL) { //we're up for deletion
44
- ngx_http_push_channel_queue_t *trashy;
45
- if((trashy = ngx_alloc(sizeof(*trashy), ngx_cycle->log))!=NULL) {
46
- //yeah, i'm allocating memory during garbage collection. sue me.
47
- trashy->channel=channel;
48
- ngx_queue_insert_tail(&channel_gc_sentinel.queue, &trashy->queue);
49
- return NGX_OK;
50
- }
51
- return NGX_ERROR;
52
- }
53
- return NGX_OK;
54
- }
55
-
56
- static void ngx_http_push_store_lock_shmem(void){
57
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
58
- }
59
- static void ngx_http_push_store_unlock_shmem(void){
60
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
61
- }
62
-
63
- //garbage-collecting slab allocator
64
- static void * ngx_http_push_slab_alloc_locked(size_t size, char *label) {
65
- void *p;
66
- if((p = ngx_slab_alloc_locked(ngx_http_push_shpool, size))==NULL) {
67
- ngx_http_push_channel_queue_t *ccur, *cnext;
68
- ngx_uint_t collected = 0;
69
- //failed. emergency garbage sweep, then.
70
-
71
- //collect channels
72
- ngx_queue_init(&channel_gc_sentinel.queue);
73
- ngx_http_push_walk_rbtree(ngx_http_push_channel_collector, ngx_http_push_shm_zone);
74
- for(ccur=(ngx_http_push_channel_queue_t *)ngx_queue_next(&channel_gc_sentinel.queue); ccur != &channel_gc_sentinel; ccur=cnext) {
75
- cnext = (ngx_http_push_channel_queue_t *)ngx_queue_next(&ccur->queue);
76
- ngx_http_push_delete_channel_locked(ccur->channel, ngx_http_push_shm_zone);
77
- ngx_free(ccur);
78
- collected++;
79
- }
80
-
81
- //todo: collect worker messages maybe
82
-
83
- ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "push module: out of shared memory. emergency garbage collection deleted %ui unused channels.", collected);
84
-
85
- p = ngx_slab_alloc_locked(ngx_http_push_shpool, size);
86
- }
87
- #if (DEBUG_SHM_ALLOC == 1)
88
- if (p != NULL) {
89
- if(label==NULL)
90
- label="none";
91
- ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "shpool alloc addr %p size %ui label %s", p, size, label);
92
- }
93
- #endif
94
- return p;
95
- }
96
-
97
- static void * ngx_http_push_slab_alloc(size_t size, char *label) {
98
- void * p;
99
- ngx_http_push_store_lock_shmem();
100
- p= ngx_http_push_slab_alloc_locked(size, label);
101
- ngx_http_push_store_unlock_shmem();
102
- return p;
103
- }
104
-
105
- static void ngx_http_push_slab_free_locked(void *ptr) {
106
- ngx_slab_free_locked(ngx_http_push_shpool, ptr);
107
- #if (DEBUG_SHM_ALLOC == 1)
108
- ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "shpool free addr %p", ptr);
109
- #endif
110
- }
111
- /*
112
- static void ngx_http_push_slab_free(void *ptr) {
113
- ngx_http_push_store_lock_shmem();
114
- ngx_http_push_slab_free_locked(ptr);
115
- ngx_http_push_store_unlock_shmem();
116
- }*/
117
-
118
- //shpool is assumed to be locked.
119
- static ngx_http_push_msg_t *ngx_http_push_get_latest_message_locked(ngx_http_push_channel_t * channel) {
120
- ngx_queue_t *sentinel = &channel->message_queue->queue;
121
- if(ngx_queue_empty(sentinel)) {
122
- return NULL;
123
- }
124
- ngx_queue_t *qmsg = ngx_queue_last(sentinel);
125
- return ngx_queue_data(qmsg, ngx_http_push_msg_t, queue);
126
- }
127
-
128
- //shpool must be locked. No memory is freed. O(1)
129
- static ngx_http_push_msg_t *ngx_http_push_get_oldest_message_locked(ngx_http_push_channel_t * channel) {
130
- ngx_queue_t *sentinel = &channel->message_queue->queue;
131
- if(ngx_queue_empty(sentinel)) {
132
- return NULL;
133
- }
134
- ngx_queue_t *qmsg = ngx_queue_head(sentinel);
135
- return ngx_queue_data(qmsg, ngx_http_push_msg_t, queue);
136
- }
137
-
138
- static void ngx_http_push_store_reserve_message_locked(ngx_http_push_channel_t *channel, ngx_http_push_msg_t *msg) {
139
- if(msg == NULL) {
140
- return;
141
- }
142
- msg->refcount++;
143
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, RESERVED_DBG, msg, msg->refcount, msg->queue.prev, msg->queue.next);
144
- //we need a refcount because channel messages MAY be dequed before they are used up. It thus falls on the IPC stuff to free it.
145
- }
146
-
147
- static void ngx_http_push_store_reserve_message_num_locked(ngx_http_push_channel_t *channel, ngx_http_push_msg_t *msg, ngx_int_t reservations) {
148
- if(msg == NULL) {
149
- return;
150
- }
151
- msg->refcount+=reservations;
152
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, RESERVED_DBG, msg, msg->refcount, msg->queue.prev, msg->queue.next);
153
- //we need a refcount because channel messages MAY be dequed before they are used up. It thus falls on the IPC stuff to free it.
154
- }
155
-
156
- static void ngx_http_push_store_reserve_message(ngx_http_push_channel_t *channel, ngx_http_push_msg_t *msg) {
157
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
158
- ngx_http_push_store_reserve_message_locked(channel, msg);
159
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
160
- //we need a refcount because channel messages MAY be dequed before they are used up. It thus falls on the IPC stuff to free it.
161
- }
162
-
163
-
164
-
165
- //free memory for a message.
166
- static ngx_inline void ngx_http_push_free_message_locked(ngx_http_push_msg_t *msg, ngx_slab_pool_t *shpool) {
167
- if(msg->buf->file!=NULL) {
168
- // i'd like to release the shpool lock here while i do stuff to this file, but that
169
- // might unlock during channel rbtree traversal, which is Bad News.
170
- if(msg->buf->file->fd!=NGX_INVALID_FILE) {
171
- ngx_close_file(msg->buf->file->fd);
172
- }
173
- ngx_delete_file(msg->buf->file->name.data); //should I care about deletion errors? doubt it.
174
- }
175
- ngx_http_push_slab_free_locked(msg->buf); //separate block, remember?
176
- ngx_http_push_slab_free_locked(msg);
177
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, FREED_DBG, msg, msg->refcount, msg->queue.prev, msg->queue.next);
178
- if(msg->refcount < 0) { //something worth exploring went wrong
179
- raise(SIGSEGV);
180
- }
181
- ((ngx_http_push_shm_data_t *) ngx_http_push_shm_zone->data)->messages--;
182
- }
183
-
184
- // remove a message from queue and free all associated memory. assumes shpool is already locked.
185
- static ngx_int_t ngx_http_push_delete_message_locked(ngx_http_push_channel_t *channel, ngx_http_push_msg_t *msg, ngx_int_t force) {
186
- if (msg==NULL) {
187
- return NGX_OK;
188
- }
189
- if(channel!=NULL) {
190
- ngx_queue_remove(&msg->queue);
191
- channel->messages--;
192
- }
193
- if(msg->refcount<=0 || force) {
194
- //nobody needs this message, or we were forced at integer-point to delete
195
- ngx_http_push_free_message_locked(msg, ngx_http_push_shpool);
196
- }
197
- return NGX_OK;
198
- }
199
-
200
- static void ngx_http_push_store_release_message_locked(ngx_http_push_channel_t *channel, ngx_http_push_msg_t *msg) {
201
- if(msg == NULL) {
202
- return;
203
- }
204
- msg->refcount--;
205
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, RELEASED_DBG, msg, msg->refcount, msg->queue.prev, msg->queue.next);
206
- if(msg->queue.next==NULL && msg->refcount<=0) {
207
- //message had been dequeued and nobody needs it anymore
208
- ngx_http_push_free_message_locked(msg, ngx_http_push_shpool);
209
- }
210
- if(channel != NULL && channel->messages > msg->delete_oldest_received_min_messages && ngx_http_push_get_oldest_message_locked(channel) == msg) {
211
- ngx_http_push_delete_message_locked(channel, msg, 0);
212
- }
213
- }
214
-
215
- static void ngx_http_push_store_release_message(ngx_http_push_channel_t *channel, ngx_http_push_msg_t *msg) {
216
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
217
- ngx_http_push_store_release_message_locked(channel, msg);
218
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
219
- }
220
-
221
- static ngx_int_t ngx_http_push_delete_message(ngx_http_push_channel_t *channel, ngx_http_push_msg_t *msg, ngx_int_t force) {
222
- ngx_int_t ret;
223
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
224
- ret = ngx_http_push_delete_message_locked(channel, msg, force);
225
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
226
- return ret;
227
- }
228
-
229
-
230
- /** find message with entity tags matching those of the request r.
231
- * @param r subscriber request
232
- */
233
- static ngx_http_push_msg_t * ngx_http_push_find_message_locked(ngx_http_push_channel_t *channel, ngx_http_push_msg_id_t *msgid, ngx_int_t *status) {
234
- //TODO: consider using an RBTree for message storage.
235
- ngx_queue_t *sentinel = &channel->message_queue->queue;
236
- ngx_queue_t *cur = ngx_queue_head(sentinel);
237
- ngx_http_push_msg_t *msg;
238
-
239
- time_t time = msgid->time;
240
- ngx_int_t tag = msgid->tag;
241
-
242
- //channel's message buffer empty?
243
- if(channel->messages==0) {
244
- *status=NGX_HTTP_PUSH_MESSAGE_EXPECTED; //wait.
245
- return NULL;
246
- }
247
-
248
- // do we want a future message?
249
- msg = ngx_queue_data(sentinel->prev, ngx_http_push_msg_t, queue);
250
- if(time <= msg->message_time) { //that's an empty check (Sentinel's values are zero)
251
- if(time == msg->message_time) {
252
- if(tag >= msg->message_tag) {
253
- *status=NGX_HTTP_PUSH_MESSAGE_EXPECTED;
254
- return NULL;
255
- }
256
- }
257
- }
258
- else {
259
- *status=NGX_HTTP_PUSH_MESSAGE_EXPECTED;
260
- return NULL;
261
- }
262
-
263
- while(cur!=sentinel) {
264
- msg = ngx_queue_data(cur, ngx_http_push_msg_t, queue);
265
- if (time < msg->message_time) {
266
- *status = NGX_HTTP_PUSH_MESSAGE_FOUND;
267
- return msg;
268
- }
269
- else if(time == msg->message_time) {
270
- while (tag >= msg->message_tag && time == msg->message_time && ngx_queue_next(cur)!=sentinel) {
271
- cur=ngx_queue_next(cur);
272
- msg = ngx_queue_data(cur, ngx_http_push_msg_t, queue);
273
- }
274
- if(time == msg->message_time && tag < msg->message_tag) {
275
- *status = NGX_HTTP_PUSH_MESSAGE_FOUND;
276
- return msg;
277
- }
278
- continue;
279
- }
280
- cur=ngx_queue_next(cur);
281
- }
282
- *status = NGX_HTTP_PUSH_MESSAGE_EXPIRED; //message too old and was not found.
283
- return NULL;
284
- }
285
-
286
- static ngx_http_push_channel_t * ngx_http_push_store_find_channel(ngx_str_t *id, time_t channel_timeout, ngx_int_t (*callback)(ngx_http_push_channel_t *channel)) {
287
- //get the channel and check channel authorization while we're at it.
288
- ngx_http_push_channel_t *channel;
289
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
290
- channel = ngx_http_push_find_channel(id, channel_timeout, ngx_http_push_shm_zone);
291
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
292
- if(callback!=NULL) {
293
- callback(channel);
294
- }
295
- return channel;
296
- }
297
-
298
- //temporary cheat
299
- static ngx_int_t ngx_http_push_store_publish_raw(ngx_http_push_channel_t *channel, ngx_http_push_msg_t *msg, ngx_int_t status_code, const ngx_str_t *status_line) {
300
-
301
- //subscribers are queued up in a local pool. Queue heads, however, are located
302
- //in shared memory, identified by pid.
303
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
304
- ngx_http_push_pid_queue_t *sentinel = channel->workers_with_subscribers;
305
- ngx_http_push_subscriber_t *subscriber_sentinels[NGX_MAX_PROCESSES];
306
- ngx_http_push_pid_queue_t *pid_queues[NGX_MAX_PROCESSES];
307
- ngx_int_t sub_sentinel_count=0;
308
-
309
- ngx_http_push_pid_queue_t *cur;
310
- ngx_int_t i, received;
311
- received = channel->subscribers > 0 ? NGX_HTTP_PUSH_MESSAGE_RECEIVED : NGX_HTTP_PUSH_MESSAGE_QUEUED;
312
-
313
- //we need to reserve the message for all the workers in advance
314
- for(cur=(ngx_http_push_pid_queue_t *)ngx_queue_next(&sentinel->queue); cur != sentinel; cur=(ngx_http_push_pid_queue_t *)ngx_queue_next(&cur->queue)) {
315
- if(cur->subscriber_sentinel != NULL) {
316
- pid_queues[sub_sentinel_count] = cur;
317
- subscriber_sentinels[sub_sentinel_count] = cur->subscriber_sentinel;
318
- /*
319
- * each time all of a worker's subscribers are removed, so is the sentinel.
320
- * this is done to make garbage collection easier. Assuming we want to avoid
321
- * placing the sentinel in shared memory (for now -- it's a little tricky
322
- * to debug), the owner of the worker pool must be the one to free said sentinel.
323
- * But channels may be deleted by different worker processes, and it seems unwieldy
324
- * (for now) to do IPC just to delete one stinkin' sentinel. Hence a new sentinel
325
- * is used every time the subscriber queue is emptied.
326
- */
327
- cur->subscriber_sentinel = NULL; //think about it it terms of garbage collection. it'll make sense. sort of.
328
- sub_sentinel_count++;
329
- }
330
- }
331
- if(sub_sentinel_count > 0) {
332
- ngx_http_push_store_reserve_message_num_locked(channel, msg, sub_sentinel_count);
333
- }
334
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
335
-
336
- ngx_http_push_subscriber_t *subscriber_sentinel=NULL;
337
- for(i=0; i < sub_sentinel_count; i++) {
338
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
339
- subscriber_sentinel = subscriber_sentinels[i];
340
- pid_t worker_pid = pid_queues[i]->pid;
341
- ngx_int_t worker_slot = pid_queues[i]->slot;
342
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
343
- //if(msg != NULL)
344
- // ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "publish msg %p (ref: %i) for worker %i (slot %i)", msg, msg->refcount, worker_pid, worker_slot);
345
-
346
-
347
- if(subscriber_sentinel != NULL) {
348
- if(worker_pid == ngx_pid) {
349
- //my subscribers
350
- ngx_http_push_respond_to_subscribers(channel, subscriber_sentinel, msg, status_code, status_line);
351
- }
352
- else {
353
- //some other worker's subscribers
354
- //interprocess communication breakdown
355
- if(ngx_http_push_store_send_worker_message(channel, subscriber_sentinel, worker_pid, worker_slot, msg, status_code) != NGX_ERROR) {
356
- ngx_http_push_alert_worker(worker_pid, worker_slot);
357
- }
358
- else {
359
- ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "push module: error communicating with some other worker process");
360
- }
361
- }
362
- } else {
363
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "subscriber sentinel is NULL");
364
- }
365
-
366
-
367
- }
368
- return received;
369
- }
370
-
371
- static ngx_int_t ngx_http_push_store_delete_channel(ngx_str_t *channel_id) {
372
- ngx_http_push_channel_t *channel;
373
- ngx_http_push_msg_t *msg, *sentinel;
374
- ngx_http_push_store_lock_shmem();
375
- channel = ngx_http_push_find_channel(channel_id, NGX_HTTP_PUSH_DEFAULT_CHANNEL_TIMEOUT, ngx_http_push_shm_zone);
376
- if (channel == NULL) {
377
- ngx_http_push_store_unlock_shmem();
378
- return NGX_OK;
379
- }
380
- sentinel = channel->message_queue;
381
- msg = sentinel;
382
-
383
- while((msg=(ngx_http_push_msg_t *)ngx_queue_next(&msg->queue))!=sentinel) {
384
- //force-delete all the messages
385
- ngx_http_push_delete_message_locked(NULL, msg, 1);
386
- }
387
- channel->messages=0;
388
-
389
- //410 gone
390
- ngx_http_push_store_unlock_shmem();
391
-
392
- ngx_http_push_store_publish_raw(channel, NULL, NGX_HTTP_GONE, &NGX_HTTP_PUSH_HTTP_STATUS_410);
393
-
394
- ngx_http_push_store_lock_shmem();
395
- ngx_http_push_delete_channel_locked(channel, ngx_http_push_shm_zone);
396
- ngx_http_push_store_unlock_shmem();
397
- return NGX_OK;
398
- }
399
-
400
- static ngx_http_push_channel_t * ngx_http_push_store_get_channel(ngx_str_t *id, time_t channel_timeout, ngx_int_t (*callback)(ngx_http_push_channel_t *channel)) {
401
- //get the channel and check channel authorization while we're at it.
402
- ngx_http_push_channel_t *channel;
403
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
404
- channel = ngx_http_push_get_channel(id, channel_timeout, ngx_http_push_shm_zone);
405
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
406
- if(channel==NULL) {
407
- ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "push module: unable to allocate memory for new channel");
408
- }
409
- if(callback!=NULL) {
410
- callback(channel);
411
- }
412
- return channel;
413
- }
414
-
415
- static ngx_http_push_msg_t * ngx_http_push_store_get_channel_message(ngx_http_push_channel_t *channel, ngx_http_push_msg_id_t *msgid, ngx_int_t *msg_search_outcome, ngx_http_push_loc_conf_t *cf) {
416
- ngx_http_push_msg_t *msg;
417
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
418
- msg = ngx_http_push_find_message_locked(channel, msgid, msg_search_outcome);
419
- if(*msg_search_outcome == NGX_HTTP_PUSH_MESSAGE_FOUND) {
420
- ngx_http_push_store_reserve_message_locked(channel, msg);
421
- }
422
- channel->last_seen = ngx_time();
423
- channel->expires = ngx_time() + cf->channel_timeout;
424
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
425
- return msg;
426
- }
427
-
428
- static ngx_int_t default_get_message_callback(ngx_http_push_msg_t *msg, ngx_int_t msg_search_outcome, ngx_http_request_t *r) {
429
- return NGX_OK;
430
- }
431
-
432
- static ngx_http_push_msg_t * ngx_http_push_store_get_message(ngx_str_t *channel_id, ngx_http_push_msg_id_t *msg_id, ngx_int_t *msg_search_outcome, ngx_http_request_t *r, ngx_int_t (*callback)(ngx_http_push_msg_t *msg, ngx_int_t msg_search_outcome, ngx_http_request_t *r)) {
433
- ngx_http_push_channel_t *channel;
434
- ngx_http_push_msg_t *msg;
435
- if(callback==NULL) {
436
- callback=&default_get_message_callback;
437
- }
438
- ngx_http_push_store_lock_shmem();
439
- channel = ngx_http_push_get_channel(channel_id, NGX_HTTP_PUSH_DEFAULT_CHANNEL_TIMEOUT, ngx_http_push_shm_zone);
440
- ngx_http_push_store_unlock_shmem();
441
- if (channel == NULL) {
442
- return NULL;
443
- }
444
- msg = ngx_http_push_store_get_channel_message(channel, msg_id, msg_search_outcome, ngx_http_get_module_loc_conf(r, ngx_http_push_module));
445
- callback(msg, *msg_search_outcome, r);
446
- return msg;
447
- }
448
-
449
- // shared memory zone initializer
450
- static ngx_int_t ngx_http_push_init_shm_zone(ngx_shm_zone_t * shm_zone, void *data) {
451
- if(data) { /* zone already initialized */
452
- shm_zone->data = data;
453
- return NGX_OK;
454
- }
455
-
456
- ngx_slab_pool_t *shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
457
- ngx_rbtree_node_t *sentinel;
458
- ngx_http_push_shm_data_t *d;
459
-
460
- ngx_http_push_shpool = shpool; //we'll be using this a bit.
461
- #if (DEBUG_SHM_ALLOC == 1)
462
- ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "ngx_http_push_shpool start %p size %i", shpool->start, (u_char *)shpool->end - (u_char *)shpool->start);
463
- #endif
464
-
465
- if ((d = (ngx_http_push_shm_data_t *)ngx_http_push_slab_alloc(sizeof(*d), "shm data")) == NULL) { //shm_data
466
- return NGX_ERROR;
467
- }
468
- d->channels=0;
469
- d->messages=0;
470
- shm_zone->data = d;
471
- d->ipc=NULL;
472
- //initialize rbtree
473
- if ((sentinel = ngx_http_push_slab_alloc(sizeof(*sentinel), "channel rbtree sentinel"))==NULL) {
474
- return NGX_ERROR;
475
- }
476
- ngx_rbtree_init(&d->tree, sentinel, ngx_http_push_rbtree_insert);
477
- return NGX_OK;
478
- }
479
-
480
- //shared memory
481
- static ngx_str_t ngx_push_shm_name = ngx_string("push_module"); //shared memory segment name
482
- static ngx_int_t ngx_http_push_set_up_shm(ngx_conf_t *cf, size_t shm_size) {
483
- ngx_http_push_shm_zone = ngx_shared_memory_add(cf, &ngx_push_shm_name, shm_size, &ngx_http_push_module);
484
- if (ngx_http_push_shm_zone == NULL) {
485
- return NGX_ERROR;
486
- }
487
- ngx_http_push_shm_zone->init = ngx_http_push_init_shm_zone;
488
- ngx_http_push_shm_zone->data = (void *) 1;
489
- return NGX_OK;
490
- }
491
-
492
- //initialization
493
- static ngx_int_t ngx_http_push_store_init_module(ngx_cycle_t *cycle) {
494
- ngx_core_conf_t *ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
495
- ngx_http_push_worker_processes = ccf->worker_processes;
496
- //initialize our little IPC
497
- return ngx_http_push_init_ipc(cycle, ngx_http_push_worker_processes);
498
- }
499
-
500
- //will be called once per worker
501
- static ngx_int_t ngx_http_push_store_init_ipc_shm(ngx_int_t workers) {
502
- ngx_slab_pool_t *shpool = (ngx_slab_pool_t *) ngx_http_push_shm_zone->shm.addr;
503
- ngx_http_push_shm_data_t *d = (ngx_http_push_shm_data_t *) ngx_http_push_shm_zone->data;
504
- ngx_http_push_worker_msg_sentinel_t *worker_messages=NULL;
505
- ngx_shmtx_lock(&shpool->mutex);
506
- if(d->ipc==NULL) {
507
- //ipc uninitialized. get it done!
508
- if((worker_messages = ngx_http_push_slab_alloc_locked(sizeof(*worker_messages)*NGX_MAX_PROCESSES, "IPC worker message sentinel array"))==NULL) {
509
- ngx_shmtx_unlock(&shpool->mutex);
510
- return NGX_ERROR;
511
- }
512
- d->ipc=worker_messages;
513
- }
514
- else {
515
- worker_messages=d->ipc;
516
- }
517
-
518
- ngx_queue_init(&worker_messages[ngx_process_slot].queue);
519
- ngx_rwlock_init(&worker_messages[ngx_process_slot].lock);
520
-
521
- ngx_shmtx_unlock(&shpool->mutex);
522
- return NGX_OK;
523
- }
524
-
525
- static ngx_int_t ngx_http_push_store_init_worker(ngx_cycle_t *cycle) {
526
- ngx_core_conf_t *ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
527
- if(ngx_http_push_store_init_ipc_shm(ccf->worker_processes) == NGX_OK) {
528
- return ngx_http_push_ipc_init_worker(cycle);
529
- }
530
- else {
531
- return NGX_ERROR;
532
- }
533
- }
534
-
535
- static ngx_int_t ngx_http_push_store_init_postconfig(ngx_conf_t *cf) {
536
- ngx_http_push_main_conf_t *conf = ngx_http_conf_get_module_main_conf(cf, ngx_http_push_module);
537
-
538
- //initialize shared memory
539
- size_t shm_size;
540
- if(conf->shm_size==NGX_CONF_UNSET_SIZE) {
541
- conf->shm_size=NGX_HTTP_PUSH_DEFAULT_SHM_SIZE;
542
- }
543
- shm_size = ngx_align(conf->shm_size, ngx_pagesize);
544
- if (shm_size < 8 * ngx_pagesize) {
545
- ngx_conf_log_error(NGX_LOG_WARN, cf, 0, "The push_max_reserved_memory value must be at least %udKiB", (8 * ngx_pagesize) >> 10);
546
- shm_size = 8 * ngx_pagesize;
547
- }
548
- if(ngx_http_push_shm_zone && ngx_http_push_shm_zone->shm.size != shm_size) {
549
- ngx_conf_log_error(NGX_LOG_WARN, cf, 0, "Cannot change memory area size without restart, ignoring change");
550
- }
551
- ngx_conf_log_error(NGX_LOG_INFO, cf, 0, "Using %udKiB of shared memory for push module", shm_size >> 10);
552
-
553
- return ngx_http_push_set_up_shm(cf, shm_size);
554
- }
555
-
556
- static void ngx_http_push_store_create_main_conf(ngx_conf_t *cf, ngx_http_push_main_conf_t *mcf) {
557
- mcf->shm_size=NGX_CONF_UNSET_SIZE;
558
- }
559
-
560
- //great justice appears to be at hand
561
- static ngx_int_t ngx_http_push_movezig_channel_locked(ngx_http_push_channel_t * channel) {
562
- ngx_queue_t *sentinel = &channel->message_queue->queue;
563
- ngx_http_push_msg_t *msg=NULL;
564
- while(!ngx_queue_empty(sentinel)) {
565
- msg = ngx_queue_data(ngx_queue_head(sentinel), ngx_http_push_msg_t, queue);
566
- ngx_http_push_delete_message_locked(channel, msg, 1);
567
- }
568
- return NGX_OK;
569
- }
570
- static ngx_int_t ngx_http_push_store_channel_subscribers(ngx_http_push_channel_t * channel) {
571
- ngx_int_t subs;
572
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
573
- subs = channel->subscribers;
574
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
575
- return subs;
576
- }
577
-
578
- static ngx_int_t ngx_http_push_store_channel_worker_subscribers(ngx_http_push_subscriber_t * worker_sentinel) {
579
- ngx_http_push_subscriber_t *cur;
580
- ngx_int_t count=0;
581
- cur=(ngx_http_push_subscriber_t *)ngx_queue_head(&worker_sentinel->queue);
582
- while(cur!=worker_sentinel) {
583
- count++;
584
- cur=(ngx_http_push_subscriber_t *)ngx_queue_next(&cur->queue);
585
- }
586
- return count;
587
- }
588
-
589
- static ngx_http_push_subscriber_t *ngx_http_push_store_channel_next_subscriber(ngx_http_push_channel_t *channel, ngx_http_push_subscriber_t *sentinel, ngx_http_push_subscriber_t *cur, int release_previous) {
590
- ngx_http_push_subscriber_t *next;
591
- if(cur==NULL) {
592
- next=(ngx_http_push_subscriber_t *)ngx_queue_head(&sentinel->queue);
593
- }
594
- else{
595
- next=(ngx_http_push_subscriber_t *)ngx_queue_next(&cur->queue);
596
- if(release_previous==1 && cur!=sentinel) {
597
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "freeing subscriber cursor at %p.", cur);
598
- ngx_pfree(ngx_http_push_pool, cur);
599
- }
600
- }
601
- return next!=sentinel ? next : NULL;
602
- }
603
-
604
- static ngx_int_t ngx_http_push_store_channel_release_subscriber_sentinel(ngx_http_push_channel_t *channel, ngx_http_push_subscriber_t *sentinel) {
605
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "freeing subscriber sentinel at %p.", sentinel);
606
- ngx_pfree(ngx_http_push_pool, sentinel);
607
- return NGX_OK;
608
- }
609
-
610
- static void ngx_http_push_store_exit_worker(ngx_cycle_t *cycle) {
611
- ngx_http_push_ipc_exit_worker(cycle);
612
- }
613
-
614
- static void ngx_http_push_store_exit_master(ngx_cycle_t *cycle) {
615
- //destroy channel tree in shared memory
616
- ngx_http_push_walk_rbtree(ngx_http_push_movezig_channel_locked, ngx_http_push_shm_zone);
617
- //deinitialize IPC
618
- ngx_http_push_shutdown_ipc(cycle);
619
- }
620
-
621
- static ngx_http_push_subscriber_t * ngx_http_push_store_subscribe_raw(ngx_http_push_channel_t *channel, ngx_http_request_t *r) {
622
- ngx_http_push_pid_queue_t *sentinel, *cur, *found;
623
- ngx_http_push_subscriber_t *subscriber;
624
- ngx_http_push_subscriber_t *subscriber_sentinel;
625
- //ngx_http_push_loc_conf_t *cf = ngx_http_get_module_loc_conf(r, ngx_http_push_module);
626
-
627
- //subscribers are queued up in a local pool. Queue sentinels are separate and also local, but not in the pool.
628
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
629
- sentinel = channel->workers_with_subscribers;
630
- cur = (ngx_http_push_pid_queue_t *)ngx_queue_head(&sentinel->queue);
631
- found = NULL;
632
-
633
- while(cur!=sentinel) {
634
- if(cur->pid==ngx_pid) {
635
- found = cur;
636
- break;
637
- }
638
- cur = (ngx_http_push_pid_queue_t *)ngx_queue_next(&cur->queue);
639
- }
640
- if(found == NULL) { //found nothing
641
- if((found=ngx_http_push_slab_alloc_locked(sizeof(*found), "worker subscriber sentinel"))==NULL) {
642
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
643
- ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push module: unable to allocate worker subscriber queue marker in shared memory");
644
- return NULL;
645
- }
646
- //initialize
647
- ngx_queue_insert_tail(&sentinel->queue, &found->queue);
648
- found->pid=ngx_pid;
649
- found->slot=ngx_process_slot;
650
- found->subscriber_sentinel=NULL;
651
- }
652
- if((subscriber = ngx_palloc(ngx_http_push_pool, sizeof(*subscriber)))==NULL) { //unable to allocate request queue element
653
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
654
- ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push module: unable to allocate subscriber worker's memory pool");
655
- return NULL;
656
- }
657
- channel->subscribers++; // do this only when we know everything went okay.
658
-
659
- //figure out the subscriber sentinel
660
- subscriber_sentinel = ((ngx_http_push_pid_queue_t *)found)->subscriber_sentinel;
661
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "reserve subscriber sentinel at %p", subscriber_sentinel);
662
-
663
- if(subscriber_sentinel==NULL) {
664
- //it's perfectly normal for the sentinel to be NULL.
665
- if((subscriber_sentinel=ngx_palloc(ngx_http_push_pool, sizeof(*subscriber_sentinel)))==NULL) {
666
- ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push module: unable to allocate channel subscriber sentinel");
667
- return NULL;
668
- }
669
- ngx_queue_init(&subscriber_sentinel->queue);
670
- ((ngx_http_push_pid_queue_t *)found)->subscriber_sentinel=subscriber_sentinel;
671
- }
672
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "add to subscriber sentinel at %p", subscriber_sentinel);
673
- ngx_queue_insert_tail(&subscriber_sentinel->queue, &subscriber->queue);
674
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
675
-
676
- subscriber->request = r;
677
- return subscriber;
678
- }
679
-
680
- static ngx_int_t ngx_http_push_handle_subscriber_concurrency(ngx_http_push_channel_t *channel, ngx_http_request_t *r, ngx_http_push_loc_conf_t *cf) {
681
- ngx_int_t max_subscribers = cf->max_channel_subscribers;
682
- ngx_int_t current_subscribers = ngx_http_push_store->channel_subscribers(channel) ;
683
-
684
-
685
- if(current_subscribers==0) {
686
- //empty channels are always okay.
687
- return NGX_OK;
688
- }
689
-
690
- if(max_subscribers!=0 && current_subscribers >= max_subscribers) {
691
- //max_channel_subscribers setting
692
- ngx_http_push_respond_status_only(r, NGX_HTTP_FORBIDDEN, NULL);
693
- return NGX_DECLINED;
694
- }
695
-
696
- //nonzero number of subscribers present
697
- switch(cf->subscriber_concurrency) {
698
- case NGX_HTTP_PUSH_SUBSCRIBER_CONCURRENCY_BROADCAST:
699
- return NGX_OK;
700
-
701
- case NGX_HTTP_PUSH_SUBSCRIBER_CONCURRENCY_LASTIN:
702
- //send "everyone" a 409 Conflict response.
703
- //in most reasonable cases, there'll be at most one subscriber on the
704
- //channel. However, since settings are bound to locations and not
705
- //specific channels, this assumption need not hold. Hence this broadcast.
706
- ngx_http_push_store_publish_raw(channel, NULL, NGX_HTTP_NOT_FOUND, &NGX_HTTP_PUSH_HTTP_STATUS_409);
707
-
708
- return NGX_OK;
709
-
710
- case NGX_HTTP_PUSH_SUBSCRIBER_CONCURRENCY_FIRSTIN:
711
- ngx_http_push_respond_status_only(r, NGX_HTTP_NOT_FOUND, &NGX_HTTP_PUSH_HTTP_STATUS_409);
712
- return NGX_DECLINED;
713
-
714
- default:
715
- return NGX_ERROR;
716
- }
717
- }
718
-
719
- static ngx_int_t default_subscribe_callback(ngx_int_t status, ngx_http_request_t *r) {
720
- return status;
721
- }
722
-
723
- static ngx_int_t ngx_http_push_store_subscribe(ngx_str_t *channel_id, ngx_http_push_msg_id_t *msg_id, ngx_http_request_t *r, ngx_int_t (*callback)(ngx_int_t status, ngx_http_request_t *r)) {
724
- ngx_http_push_channel_t *channel;
725
- ngx_http_push_msg_t *msg;
726
- ngx_int_t msg_search_outcome;
727
- ngx_http_push_loc_conf_t *cf = ngx_http_get_module_loc_conf(r, ngx_http_push_module);
728
-
729
-
730
- if(callback == NULL) {
731
- callback=&default_subscribe_callback;
732
- }
733
-
734
- if (cf->authorize_channel==1) {
735
- channel = ngx_http_push_store_find_channel(channel_id, cf->channel_timeout, NULL);
736
- }else{
737
- channel = ngx_http_push_store_get_channel(channel_id, cf->channel_timeout, NULL);
738
- }
739
- if (channel==NULL) {
740
- //unable to allocate channel OR channel not found
741
- if(cf->authorize_channel) {
742
- return callback(NGX_HTTP_FORBIDDEN, r);
743
- }
744
- else {
745
- ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "push module: unable to allocate shared memory for channel");
746
- return callback(NGX_HTTP_INTERNAL_SERVER_ERROR, r);
747
- }
748
- }
749
-
750
- switch(ngx_http_push_handle_subscriber_concurrency(channel, r, cf)) {
751
- case NGX_DECLINED: //this request was declined for some reason.
752
- //status codes and whatnot should have already been written. just get out of here quickly.
753
- return callback(NGX_OK, r);
754
- case NGX_ERROR:
755
- ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push module: error handling subscriber concurrency setting");
756
- return callback(NGX_ERROR, r);
757
- }
758
-
759
-
760
- msg = ngx_http_push_store->get_channel_message(channel, msg_id, &msg_search_outcome, cf);
761
-
762
- if (cf->ignore_queue_on_no_cache && !ngx_http_push_allow_caching(r)) {
763
- msg_search_outcome = NGX_HTTP_PUSH_MESSAGE_EXPECTED;
764
- msg = NULL;
765
- }
766
-
767
- switch(msg_search_outcome) {
768
- //for message-found:
769
- ngx_str_t *etag;
770
- ngx_str_t *content_type;
771
- ngx_chain_t *chain;
772
- time_t last_modified;
773
- ngx_http_push_subscriber_t *subscriber;
774
-
775
- case NGX_HTTP_PUSH_MESSAGE_EXPECTED:
776
- // ♫ It's gonna be the future soon ♫
777
- if ((subscriber = ngx_http_push_store_subscribe_raw(channel, r))==NULL) {
778
- return callback(NGX_HTTP_INTERNAL_SERVER_ERROR, r);
779
- }
780
- if(ngx_push_longpoll_subscriber_enqueue(channel, subscriber, cf->subscriber_timeout) == NGX_OK) {
781
- return callback(NGX_DONE, r);
782
- }
783
- else {
784
- return callback(NGX_ERROR, r);
785
- }
786
-
787
- case NGX_HTTP_PUSH_MESSAGE_EXPIRED:
788
- //subscriber wants an expired message
789
- //TODO: maybe respond with entity-identifiers for oldest available message?
790
- return callback(NGX_HTTP_NO_CONTENT, r);
791
-
792
- case NGX_HTTP_PUSH_MESSAGE_FOUND:
793
- ngx_http_push_alloc_for_subscriber_response(r->pool, 0, msg, &chain, &content_type, &etag, &last_modified);
794
- ngx_int_t ret=ngx_http_push_prepare_response_to_subscriber_request(r, chain, content_type, etag, last_modified);
795
- ngx_http_push_store->release_message(channel, msg);
796
- return callback(ret, r);
797
-
798
- default: //we shouldn't be here.
799
- return callback(NGX_HTTP_INTERNAL_SERVER_ERROR, r);
800
- }
801
- }
802
-
803
- static ngx_str_t * ngx_http_push_store_etag_from_message(ngx_http_push_msg_t *msg, ngx_pool_t *pool){
804
- ngx_str_t *etag = NULL;
805
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
806
- if(pool!=NULL && (etag = ngx_palloc(pool, sizeof(*etag) + NGX_INT_T_LEN))==NULL) {
807
- return NULL;
808
- }
809
- else if(pool==NULL && (etag = ngx_alloc(sizeof(*etag) + NGX_INT_T_LEN, ngx_cycle->log))==NULL) {
810
- return NULL;
811
- }
812
- etag->data = (u_char *)(etag+1);
813
- etag->len = ngx_sprintf(etag->data,"%ui", msg->message_tag)- etag->data;
814
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
815
- return etag;
816
- }
817
-
818
- static ngx_str_t * ngx_http_push_store_content_type_from_message(ngx_http_push_msg_t *msg, ngx_pool_t *pool){
819
- ngx_str_t *content_type = NULL;
820
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
821
- if(pool != NULL && (content_type = ngx_palloc(pool, sizeof(*content_type) + msg->content_type.len))==NULL) {
822
- return NULL;
823
- }
824
- else if(pool == NULL && (content_type = ngx_alloc(sizeof(*content_type) + msg->content_type.len, ngx_cycle->log))==NULL) {
825
- return NULL;
826
- }
827
- content_type->data = (u_char *)(content_type+1);
828
- content_type->len = msg->content_type.len;
829
- ngx_memcpy(content_type->data, msg->content_type.data, content_type->len);
830
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
831
- return content_type;
832
- }
833
-
834
- // this function adapted from push stream module. thanks Wandenberg Peixoto <wandenberg@gmail.com> and Rogério Carvalho Schneider <stockrt@gmail.com>
835
- static ngx_buf_t * ngx_http_push_request_body_to_single_buffer(ngx_http_request_t *r) {
836
- ngx_buf_t *buf = NULL;
837
- ngx_chain_t *chain;
838
- ssize_t n;
839
- off_t len;
840
-
841
- chain = r->request_body->bufs;
842
- if (chain->next == NULL) {
843
- return chain->buf;
844
- }
845
- if (chain->buf->in_file) {
846
- if (ngx_buf_in_memory(chain->buf)) {
847
- ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push module: can't handle a buffer in a temp file and in memory ");
848
- }
849
- if (chain->next != NULL) {
850
- ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push module: error reading request body with multiple ");
851
- }
852
- return chain->buf;
853
- }
854
- buf = ngx_create_temp_buf(r->pool, r->headers_in.content_length_n + 1);
855
- if (buf != NULL) {
856
- ngx_memset(buf->start, '\0', r->headers_in.content_length_n + 1);
857
- while ((chain != NULL) && (chain->buf != NULL)) {
858
- len = ngx_buf_size(chain->buf);
859
- // if buffer is equal to content length all the content is in this buffer
860
- if (len >= r->headers_in.content_length_n) {
861
- buf->start = buf->pos;
862
- buf->last = buf->pos;
863
- len = r->headers_in.content_length_n;
864
- }
865
- if (chain->buf->in_file) {
866
- n = ngx_read_file(chain->buf->file, buf->start, len, 0);
867
- if (n == NGX_FILE_ERROR) {
868
- ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push module: cannot read file with request body");
869
- return NULL;
870
- }
871
- buf->last = buf->last + len;
872
- ngx_delete_file(chain->buf->file->name.data);
873
- chain->buf->file->fd = NGX_INVALID_FILE;
874
- } else {
875
- buf->last = ngx_copy(buf->start, chain->buf->pos, len);
876
- }
877
-
878
- chain = chain->next;
879
- buf->start = buf->last;
880
- }
881
- }
882
- return buf;
883
- }
884
-
885
-
886
- static ngx_http_push_msg_t * ngx_http_push_store_create_message(ngx_http_push_channel_t *channel, ngx_http_request_t *r) {
887
- ngx_buf_t *buf = NULL, *buf_copy;
888
- size_t content_type_len;
889
- ngx_http_push_loc_conf_t *cf = ngx_http_get_module_loc_conf(r, ngx_http_push_module);
890
- ngx_http_push_msg_t *msg, *previous_msg;
891
-
892
- //first off, we'll want to extract the body buffer
893
-
894
- //note: this works mostly because of r->request_body_in_single_buf = 1;
895
- //which, i suppose, makes this module a little slower than it could be.
896
- //this block is a little hacky. might be a thorn for forward-compatibility.
897
- if(r->headers_in.content_length_n == -1 || r->headers_in.content_length_n == 0) {
898
- buf = ngx_create_temp_buf(r->pool, 0);
899
- //this buffer will get copied to shared memory in a few lines,
900
- //so it does't matter what pool we make it in.
901
- }
902
- else if(r->request_body->bufs!=NULL) {
903
- buf = ngx_http_push_request_body_to_single_buffer(r);
904
- }
905
- else {
906
- ngx_log_error(NGX_LOG_ERR, (r)->connection->log, 0, "push module: unexpected publisher message request body buffer location. please report this to the push module developers.");
907
- return NULL;
908
- }
909
-
910
- NGX_HTTP_PUSH_BROADCAST_CHECK(buf, NULL, r, "push module: can't find or allocate publisher request body buffer");
911
-
912
- content_type_len = (r->headers_in.content_type!=NULL ? r->headers_in.content_type->value.len : 0);
913
-
914
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
915
-
916
- //create a buffer copy in shared mem
917
- msg = ngx_http_push_slab_alloc_locked(sizeof(*msg) + content_type_len, "message + content_type");
918
- NGX_HTTP_PUSH_BROADCAST_CHECK_LOCKED(msg, NULL, r, "push module: unable to allocate message in shared memory", ngx_http_push_shpool);
919
- previous_msg=ngx_http_push_get_latest_message_locked(channel); //need this for entity-tags generation
920
-
921
- buf_copy = ngx_http_push_slab_alloc_locked(NGX_HTTP_BUF_ALLOC_SIZE(buf), "message buffer copy");
922
- NGX_HTTP_PUSH_BROADCAST_CHECK_LOCKED(buf_copy, NULL, r, "push module: unable to allocate buffer in shared memory", ngx_http_push_shpool) //magic nullcheck
923
- ngx_http_push_copy_preallocated_buffer(buf, buf_copy);
924
-
925
- msg->buf=buf_copy;
926
-
927
- //Stamp the new message with entity tags
928
- msg->message_time=ngx_time(); //ESSENTIAL TODO: make sure this ends up producing GMT time
929
- msg->message_tag=(previous_msg!=NULL && msg->message_time == previous_msg->message_time) ? (previous_msg->message_tag + 1) : 0;
930
-
931
- //store the content-type
932
- if(content_type_len>0) {
933
- msg->content_type.len=r->headers_in.content_type->value.len;
934
- msg->content_type.data=(u_char *) (msg+1); //we had reserved a contiguous chunk, myes?
935
- ngx_memcpy(msg->content_type.data, r->headers_in.content_type->value.data, msg->content_type.len);
936
- }
937
- else {
938
- msg->content_type.len=0;
939
- msg->content_type.data=NULL;
940
- }
941
-
942
- //queue stuff ought to be NULL
943
- msg->queue.prev=NULL;
944
- msg->queue.next=NULL;
945
-
946
- msg->refcount=0;
947
-
948
- //set message expiration time
949
- time_t message_timeout = cf->buffer_timeout;
950
- msg->expires = (message_timeout==0 ? 0 : (ngx_time() + message_timeout));
951
-
952
- msg->delete_oldest_received_min_messages = cf->delete_oldest_received_message ? (ngx_uint_t) cf->min_messages : NGX_MAX_UINT32_VALUE;
953
- //NGX_MAX_UINT32_VALUE to disable, otherwise = min_message_buffer_size of the publisher location from whence the message came
954
-
955
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
956
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, CREATED_DBG, msg, msg->refcount, msg->queue.prev, msg->queue.next);
957
- return msg;
958
- }
959
-
960
- static ngx_int_t ngx_http_push_store_enqueue_message(ngx_http_push_channel_t *channel, ngx_http_push_msg_t *msg, ngx_http_push_loc_conf_t *cf) {
961
- ngx_shmtx_lock(&ngx_http_push_shpool->mutex);
962
- ngx_queue_insert_tail(&channel->message_queue->queue, &msg->queue);
963
- channel->messages++;
964
-
965
- //now see if the queue is too big
966
- if(channel->messages > (ngx_uint_t) cf->max_messages) {
967
- //exceeeds max queue size. don't force it, someone might still be using this message.
968
- ngx_http_push_delete_message_locked(channel, ngx_http_push_get_oldest_message_locked(channel), 0);
969
- }
970
- if(channel->messages > (ngx_uint_t) cf->min_messages) {
971
- //exceeeds min queue size. maybe delete the oldest message
972
- //no, don't do anything for now. This feature is badly implemented and I think I'll deprecate it.
973
- }
974
-
975
- ngx_shmtx_unlock(&ngx_http_push_shpool->mutex);
976
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, ENQUEUED_DBG, msg, msg->refcount, msg->queue.prev, msg->queue.next);
977
- return NGX_OK;
978
- }
979
-
980
- static ngx_int_t default_publish_callback(ngx_int_t status, ngx_http_push_channel_t *ch, ngx_http_request_t *r) {
981
- return status;
982
- }
983
-
984
- static ngx_int_t ngx_http_push_store_publish_message(ngx_str_t *channel_id, ngx_http_request_t *r, ngx_int_t (*callback)(ngx_int_t status, ngx_http_push_channel_t *ch, ngx_http_request_t *r)) {
985
- ngx_http_push_channel_t *channel;
986
- ngx_http_push_msg_t *msg;
987
- ngx_http_push_loc_conf_t *cf = ngx_http_get_module_loc_conf(r, ngx_http_push_module);
988
- ngx_int_t result=0;
989
- if(callback==NULL) {
990
- callback=&default_publish_callback;
991
- }
992
- if((channel=ngx_http_push_store_get_channel(channel_id, cf->channel_timeout, NULL))==NULL) { //always returns a channel, unless no memory left
993
- return callback(NGX_ERROR, NULL, r);
994
- //ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
995
- }
996
-
997
- if((msg = ngx_http_push_store_create_message(channel, r))==NULL) {
998
- return callback(NGX_ERROR, channel, r);
999
- //ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
1000
- }
1001
-
1002
- if(cf->max_messages > 0) { //channel buffers exist
1003
- ngx_http_push_store_enqueue_message(channel, msg, cf);
1004
- }
1005
- else if(cf->max_messages == 0) {
1006
- ngx_http_push_store_reserve_message(NULL, msg);
1007
- }
1008
- result= ngx_http_push_store_publish_raw(channel, msg, 0, NULL);
1009
- return callback(result, channel, r);
1010
- }
1011
-
1012
- static ngx_int_t ngx_http_push_store_send_worker_message(ngx_http_push_channel_t *channel, ngx_http_push_subscriber_t *subscriber_sentinel, ngx_pid_t pid, ngx_int_t worker_slot, ngx_http_push_msg_t *msg, ngx_int_t status_code) {
1013
- ngx_http_push_worker_msg_sentinel_t *worker_messages = ((ngx_http_push_shm_data_t *)ngx_http_push_shm_zone->data)->ipc;
1014
- ngx_http_push_worker_msg_sentinel_t *sentinel = &worker_messages[worker_slot];
1015
- ngx_http_push_worker_msg_t *newmessage;
1016
- if((newmessage=ngx_http_push_slab_alloc(sizeof(*newmessage), "IPC worker message"))==NULL) {
1017
- ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "push module: unable to allocate worker message");
1018
- return NGX_ERROR;
1019
- }
1020
- newmessage->msg = msg;
1021
- newmessage->status_code = status_code;
1022
- newmessage->pid = pid;
1023
- newmessage->subscriber_sentinel = subscriber_sentinel;
1024
- newmessage->channel = channel;
1025
-
1026
- ngx_http_push_store_lock_shmem();
1027
- ngx_queue_insert_tail(&sentinel->queue, &newmessage->queue);
1028
- ngx_http_push_store_unlock_shmem();
1029
- return NGX_OK;
1030
-
1031
- }
1032
-
1033
- static void ngx_http_push_store_receive_worker_message(void) {
1034
- ngx_http_push_worker_msg_t *prev_worker_msg, *worker_msg;
1035
- ngx_http_push_worker_msg_sentinel_t *sentinel;
1036
- const ngx_str_t *status_line = NULL;
1037
- ngx_http_push_channel_t *channel;
1038
- ngx_http_push_subscriber_t *subscriber_sentinel;
1039
- ngx_int_t worker_msg_pid;
1040
-
1041
- ngx_int_t status_code;
1042
- ngx_http_push_msg_t *msg;
1043
-
1044
- sentinel = &(((ngx_http_push_shm_data_t *)ngx_http_push_shm_zone->data)->ipc)[ngx_process_slot];
1045
-
1046
- ngx_http_push_store_lock_shmem();
1047
- worker_msg = (ngx_http_push_worker_msg_t *)ngx_queue_next(&sentinel->queue);
1048
- ngx_http_push_store_unlock_shmem();
1049
- while((void *)worker_msg != (void *)sentinel) {
1050
-
1051
- ngx_http_push_store_lock_shmem();
1052
- worker_msg_pid = worker_msg->pid;
1053
- ngx_http_push_store_unlock_shmem();
1054
-
1055
- if(worker_msg_pid == ngx_pid) {
1056
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "process_worker_message processing proper worker_msg ");
1057
- //everything is okay.
1058
-
1059
- ngx_http_push_store_lock_shmem();
1060
- status_code = worker_msg->status_code;
1061
- msg = worker_msg->msg;
1062
- channel = worker_msg->channel;
1063
- subscriber_sentinel = worker_msg->subscriber_sentinel;
1064
- ngx_http_push_store_unlock_shmem();
1065
-
1066
- if(msg==NULL) {
1067
- //just a status line, is all
1068
- //status code only.
1069
- switch(status_code) {
1070
- case NGX_HTTP_CONFLICT:
1071
- status_line=&NGX_HTTP_PUSH_HTTP_STATUS_409;
1072
- break;
1073
-
1074
- case NGX_HTTP_GONE:
1075
- status_line=&NGX_HTTP_PUSH_HTTP_STATUS_410;
1076
- break;
1077
-
1078
- case 0:
1079
- ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "push module: worker message contains neither a channel message nor a status code");
1080
- //let's let the subscribers know that something went wrong and they might've missed a message
1081
- status_code = NGX_HTTP_INTERNAL_SERVER_ERROR;
1082
- //intentional fall-through
1083
- default:
1084
- status_line=NULL;
1085
- }
1086
- }
1087
-
1088
- ngx_http_push_respond_to_subscribers(channel, subscriber_sentinel, msg, status_code, status_line);
1089
- }
1090
- else {
1091
- //that's quite bad you see. a previous worker died with an undelivered message.
1092
- //but all its subscribers' connections presumably got canned, too. so it's not so bad after all.
1093
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "process_worker_message processing INVALID worker_msg ");
1094
-
1095
- ngx_http_push_store_lock_shmem();
1096
-
1097
- ngx_http_push_pid_queue_t *channel_worker_sentinel = worker_msg->channel->workers_with_subscribers;
1098
-
1099
- ngx_http_push_pid_queue_t *channel_worker_cur = channel_worker_sentinel;
1100
- ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "push module: worker %i intercepted a message intended for another worker process (%i) that probably died", ngx_pid, worker_msg->pid);
1101
-
1102
- //delete that invalid sucker.
1103
- while((channel_worker_cur=(ngx_http_push_pid_queue_t *)ngx_queue_next(&channel_worker_cur->queue))!=channel_worker_sentinel) {
1104
- if(channel_worker_cur->pid == worker_msg->pid) {
1105
- ngx_queue_remove(&channel_worker_cur->queue);
1106
- ngx_http_push_slab_free_locked(channel_worker_cur);
1107
- break;
1108
- }
1109
- }
1110
-
1111
- ngx_http_push_store_unlock_shmem();
1112
-
1113
- }
1114
- //It may be worth it to memzero worker_msg for debugging purposes.
1115
- prev_worker_msg = worker_msg;
1116
-
1117
- ngx_http_push_store_lock_shmem();
1118
- worker_msg = (ngx_http_push_worker_msg_t *)ngx_queue_next(&worker_msg->queue);
1119
- ngx_http_push_slab_free_locked(prev_worker_msg);
1120
- ngx_http_push_store_unlock_shmem();
1121
-
1122
- }
1123
- ngx_http_push_store_lock_shmem();
1124
- ngx_queue_init(&sentinel->queue); //reset the worker message sentinel
1125
- ngx_http_push_store_unlock_shmem();
1126
- //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "process_worker_message finished");
1127
- return;
1128
- }
1129
-
1130
- ngx_http_push_store_t ngx_http_push_store_memory = {
1131
- //init
1132
- &ngx_http_push_store_init_module,
1133
- &ngx_http_push_store_init_worker,
1134
- &ngx_http_push_store_init_postconfig,
1135
- &ngx_http_push_store_create_main_conf,
1136
-
1137
- //shutdown
1138
- &ngx_http_push_store_exit_worker,
1139
- &ngx_http_push_store_exit_master,
1140
-
1141
- //async-friendly functions with callbacks
1142
- &ngx_http_push_store_get_message, //+callback
1143
- &ngx_http_push_store_subscribe, //+callback
1144
- &ngx_http_push_store_publish_message, //+callback
1145
-
1146
- //channel stuff,
1147
- &ngx_http_push_store_get_channel, //creates channel if not found, +callback
1148
- &ngx_http_push_store_find_channel, //returns channel or NULL if not found, +callback
1149
- &ngx_http_push_store_delete_channel,
1150
-
1151
- &ngx_http_push_store_get_channel_message,
1152
- &ngx_http_push_store_reserve_message,
1153
- &ngx_http_push_store_release_message,
1154
-
1155
- //channel properties
1156
- &ngx_http_push_store_channel_subscribers,
1157
- &ngx_http_push_store_channel_worker_subscribers,
1158
- &ngx_http_push_store_channel_next_subscriber,
1159
- &ngx_http_push_store_channel_release_subscriber_sentinel,
1160
-
1161
- //legacy shared-memory store helpers
1162
- &ngx_http_push_store_lock_shmem,
1163
- &ngx_http_push_store_unlock_shmem,
1164
- &ngx_http_push_slab_alloc_locked,
1165
- &ngx_http_push_slab_free_locked,
1166
-
1167
- //message stuff
1168
- &ngx_http_push_store_create_message,
1169
- &ngx_http_push_delete_message,
1170
- &ngx_http_push_delete_message_locked,
1171
- &ngx_http_push_store_enqueue_message,
1172
- &ngx_http_push_store_etag_from_message,
1173
- &ngx_http_push_store_content_type_from_message,
1174
-
1175
- //interprocess communication
1176
- &ngx_http_push_store_send_worker_message,
1177
- &ngx_http_push_store_receive_worker_message
1178
-
1179
-
1180
- };