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
@@ -0,0 +1,171 @@
1
+ #include <TestSupport.h>
2
+ #include <ServerKit/HeaderTable.h>
3
+
4
+ using namespace Passenger;
5
+ using namespace Passenger::ServerKit;
6
+ using namespace std;
7
+
8
+ namespace tut {
9
+ struct ServerKit_HeaderTableTest {
10
+ psg_pool_t *pool;
11
+ HeaderTable table;
12
+
13
+ ServerKit_HeaderTableTest() {
14
+ pool = psg_create_pool(PSG_DEFAULT_POOL_SIZE);
15
+ }
16
+
17
+ ~ServerKit_HeaderTableTest() {
18
+ psg_destroy_pool(pool);
19
+ }
20
+
21
+ Header *createHeader(const HashedStaticString &key, const StaticString &val) {
22
+ Header *header = (Header *) psg_palloc(pool, sizeof(Header));
23
+ psg_lstr_init(&header->key);
24
+ psg_lstr_init(&header->val);
25
+ psg_lstr_append(&header->key, pool, key.data(), key.size());
26
+ psg_lstr_append(&header->val, pool, val.data(), val.size());
27
+ header->hash = key.hash();
28
+ return header;
29
+ }
30
+ };
31
+
32
+ DEFINE_TEST_GROUP(ServerKit_HeaderTableTest);
33
+
34
+ TEST_METHOD(1) {
35
+ set_test_name("Initial state");
36
+ ensure_equals(table.size(), 0u);
37
+ ensure_equals(table.arraySize(), (unsigned int) HeaderTable::DEFAULT_SIZE);
38
+ }
39
+
40
+ TEST_METHOD(2) {
41
+ set_test_name("On an empty HeaderTable, iterators reach the end immediately");
42
+ HeaderTable::Iterator it(table);
43
+ ensure_equals<void *>(*it, NULL);
44
+ }
45
+
46
+ TEST_METHOD(3) {
47
+ set_test_name("On an empty HeaderTable, lookups return NULL");
48
+ ensure_equals<void *>(table.lookup("hello"), NULL);
49
+ ensure_equals<void *>(table.lookup("?"), NULL);
50
+ }
51
+
52
+ TEST_METHOD(4) {
53
+ set_test_name("Insertions work");
54
+ Header *header = createHeader("Content-Length", "5");
55
+ Header *header2 = createHeader("Host", "foo.com");
56
+
57
+ table.insert(header, pool);
58
+ ensure_equals(table.size(), 1u);
59
+ ensure_equals<void *>("(1)", table.lookup("hello"), NULL);
60
+ ensure_equals<void *>("(2)", table.lookup("Host"), NULL);
61
+ ensure("(3)", table.lookup("Content-Length") != NULL);
62
+ ensure("(4)", psg_lstr_cmp(table.lookup("Content-Length"), "5"));
63
+
64
+ table.insert(header2, pool);
65
+ ensure_equals(table.size(), 2u);
66
+ ensure_equals<void *>("(5)", table.lookup("hello"), NULL);
67
+ ensure("(6)", table.lookup("Host") != NULL);
68
+ ensure("(7)", table.lookup("Content-Length") != NULL);
69
+ ensure("(8)", psg_lstr_cmp(table.lookup("Host"), "foo.com"));
70
+ ensure("(9)", psg_lstr_cmp(table.lookup("Content-Length"), "5"));
71
+ }
72
+
73
+ TEST_METHOD(5) {
74
+ set_test_name("Large amounts of insertions");
75
+
76
+ table.insert(createHeader("Host", "foo.com"), pool);
77
+ table.insert(createHeader("Content-Length", "5"), pool);
78
+ table.insert(createHeader("Accept", "text/html"), pool);
79
+ table.insert(createHeader("Accept-Encoding", "gzip"), pool);
80
+ table.insert(createHeader("Accept-Language", "nl"), pool);
81
+ table.insert(createHeader("User-Agent", "Mozilla"), pool);
82
+ table.insert(createHeader("Set-Cookie", "foo=bar"), pool);
83
+ table.insert(createHeader("Connection", "keep-alive"), pool);
84
+ table.insert(createHeader("Cache-Control", "no-cache"), pool);
85
+ table.insert(createHeader("Pragma", "no-cache"), pool);
86
+
87
+ ensure_equals<void *>(table.lookup("MyHeader"), NULL);
88
+ ensure(psg_lstr_cmp(table.lookup("Host"), "foo.com"));
89
+ ensure(psg_lstr_cmp(table.lookup("Content-Length"), "5"));
90
+ ensure(psg_lstr_cmp(table.lookup("Accept"), "text/html"));
91
+ ensure(psg_lstr_cmp(table.lookup("Accept-Encoding"), "gzip"));
92
+ ensure(psg_lstr_cmp(table.lookup("Accept-Language"), "nl"));
93
+ ensure(psg_lstr_cmp(table.lookup("User-Agent"), "Mozilla"));
94
+ ensure(psg_lstr_cmp(table.lookup("Set-Cookie"), "foo=bar"));
95
+ ensure(psg_lstr_cmp(table.lookup("Connection"), "keep-alive"));
96
+ ensure(psg_lstr_cmp(table.lookup("Cache-Control"), "no-cache"));
97
+ ensure(psg_lstr_cmp(table.lookup("Pragma"), "no-cache"));
98
+ }
99
+
100
+ TEST_METHOD(6) {
101
+ set_test_name("Iterators work");
102
+ Header *header = createHeader("Content-Length", "5");
103
+ Header *header2 = createHeader("Host", "foo.com");
104
+ table.insert(header, pool);
105
+ table.insert(header2, pool);
106
+
107
+ HeaderTable::Iterator it(table);
108
+ ensure(*it != NULL);
109
+ if (psg_lstr_cmp(&it->header->key, "Content-Length")) {
110
+ it.next();
111
+ ensure(psg_lstr_cmp(&it->header->key, "Host"));
112
+ } else {
113
+ ensure(psg_lstr_cmp(&it->header->key, "Host"));
114
+ it.next();
115
+ ensure(psg_lstr_cmp(&it->header->key, "Content-Length"));
116
+ }
117
+
118
+ it.next();
119
+ ensure_equals<void *>(*it, NULL);
120
+ }
121
+
122
+ TEST_METHOD(7) {
123
+ set_test_name("Dynamically growing the bucket on insert");
124
+ table = HeaderTable(4);
125
+ ensure_equals(table.size(), 0u);
126
+ ensure_equals(table.arraySize(), 4u);
127
+
128
+ table.insert(createHeader("Host", "foo.com"), pool);
129
+ table.insert(createHeader("Content-Length", "5"), pool);
130
+ ensure_equals(table.size(), 2u);
131
+ ensure_equals(table.arraySize(), 4u);
132
+
133
+ table.insert(createHeader("Accept", "text/html"), pool);
134
+ ensure_equals(table.size(), 3u);
135
+ ensure_equals(table.arraySize(), 8u);
136
+
137
+ ensure_equals<void *>(table.lookup("MyHeader"), NULL);
138
+ ensure(psg_lstr_cmp(table.lookup("Host"), "foo.com"));
139
+ ensure(psg_lstr_cmp(table.lookup("Content-Length"), "5"));
140
+ ensure(psg_lstr_cmp(table.lookup("Accept"), "text/html"));
141
+ }
142
+
143
+ TEST_METHOD(8) {
144
+ set_test_name("Clearing");
145
+
146
+ table.insert(createHeader("Host", "foo.com"), pool);
147
+ table.insert(createHeader("Content-Length", "5"), pool);
148
+ table.insert(createHeader("Accept", "text/html"), pool);
149
+
150
+ table.clear();
151
+ ensure_equals(table.size(), 0u);
152
+ ensure_equals(table.arraySize(), (unsigned int) HeaderTable::DEFAULT_SIZE);
153
+
154
+ ensure_equals<void *>(table.lookup("Host"), NULL);
155
+ ensure_equals<void *>(table.lookup("Content-Length"), NULL);
156
+ ensure_equals<void *>(table.lookup("Accept"), NULL);
157
+ }
158
+
159
+ TEST_METHOD(9) {
160
+ set_test_name("Duplicate header merging");
161
+
162
+ table.insert(createHeader("X-Forwarded-For", "foo.com"), pool);
163
+ table.insert(createHeader("X-Forwarded-For", "bar.com"), pool);
164
+ table.insert(createHeader("Cache-Control", "must-invalidate"), pool);
165
+ table.insert(createHeader("Cache-Control", "private"), pool);
166
+
167
+ ensure_equals(table.size(), 2u);
168
+ ensure("(1)", psg_lstr_cmp(table.lookup("X-Forwarded-For"), "foo.com,bar.com"));
169
+ ensure("(2)", psg_lstr_cmp(table.lookup("Cache-Control"), "must-invalidate,private"));
170
+ }
171
+ }
@@ -0,0 +1,1503 @@
1
+ #include <TestSupport.h>
2
+ #include <boost/foreach.hpp>
3
+ #include <boost/bind.hpp>
4
+ #include <boost/shared_ptr.hpp>
5
+ #include <boost/make_shared.hpp>
6
+ #include <boost/thread.hpp>
7
+ #include <oxt/system_calls.hpp>
8
+ #include <BackgroundEventLoop.h>
9
+ #include <ServerKit/HttpServer.h>
10
+ #include <Logging.h>
11
+ #include <FileDescriptor.h>
12
+ #include <Utils.h>
13
+ #include <Utils/IOUtils.h>
14
+ #include <Utils/BufferedIO.h>
15
+
16
+ using namespace Passenger;
17
+ using namespace Passenger::ServerKit;
18
+ using namespace Passenger::MemoryKit;
19
+ using namespace std;
20
+ using namespace oxt;
21
+
22
+ namespace tut {
23
+ class MyRequest: public BaseHttpRequest {
24
+ public:
25
+ string body;
26
+
27
+ DEFINE_SERVER_KIT_BASE_HTTP_REQUEST_FOOTER(MyRequest);
28
+ };
29
+
30
+ class MyClient: public BaseHttpClient<MyRequest> {
31
+ public:
32
+ MyClient(void *server)
33
+ : BaseHttpClient<MyRequest>(server)
34
+ {
35
+ SERVER_KIT_BASE_HTTP_CLIENT_INIT();
36
+ }
37
+
38
+ DEFINE_SERVER_KIT_BASE_HTTP_CLIENT_FOOTER(MyClient, MyRequest);
39
+ };
40
+
41
+ class MyServer: public HttpServer<MyServer, MyClient> {
42
+ private:
43
+ typedef HttpServer<MyServer, MyClient> ParentClass;
44
+
45
+ void testRequest(MyClient *client, MyRequest *req) {
46
+ HeaderTable headers;
47
+ const unsigned int BUFSIZE = 128;
48
+ char *response = (char *) psg_pnalloc(req->pool, BUFSIZE);
49
+ char *pos = response;
50
+ const char *end = response + BUFSIZE;
51
+ const LString *value;
52
+ const LString::Part *part;
53
+
54
+ headers.insert(req->pool, "date", "Thu, 11 Sep 2014 12:54:09 GMT");
55
+ headers.insert(req->pool, "content-type", "text/plain");
56
+
57
+ pos = appendData(pos, end, "hello ");
58
+ part = req->path.start;
59
+ while (part != NULL) {
60
+ pos = appendData(pos, end, part->data, part->size);
61
+ part = part->next;
62
+ }
63
+
64
+ value = req->headers.lookup("foo");
65
+ if (value != NULL) {
66
+ pos = appendData(pos, end, "\nFoo: ");
67
+ part = value->start;
68
+ while (part != NULL) {
69
+ pos = appendData(pos, end, part->data, part->size);
70
+ part = part->next;
71
+ }
72
+ }
73
+
74
+ value = req->secureHeaders.lookup("!~Secure");
75
+ if (value != NULL) {
76
+ pos = appendData(pos, end, "\nSecure: ");
77
+ part = value->start;
78
+ while (part != NULL) {
79
+ pos = appendData(pos, end, part->data, part->size);
80
+ part = part->next;
81
+ }
82
+ }
83
+
84
+ writeSimpleResponse(client, 200, &headers,
85
+ StaticString(response, pos - response));
86
+ endRequest(&client, &req);
87
+ }
88
+
89
+ void testBody(MyClient *client, MyRequest *req) {
90
+ if (!req->hasBody() && !req->upgraded()) {
91
+ writeSimpleResponse(client, 422, NULL, "Body required");
92
+ if (!req->ended()) {
93
+ endRequest(&client, &req);
94
+ }
95
+ }
96
+ }
97
+
98
+ void testBodyStop(MyClient *client, MyRequest *req) {
99
+ if (!req->hasBody() && !req->upgraded()) {
100
+ writeSimpleResponse(client, 422, NULL, "Body required");
101
+ if (!req->ended()) {
102
+ endRequest(&client, &req);
103
+ }
104
+ } else {
105
+ refRequest(req, __FILE__, __LINE__);
106
+ req->bodyChannel.stop();
107
+ requestsWaitingToStartAcceptingBody.push_back(req);
108
+ // Continues in startAcceptingBody()
109
+ }
110
+ }
111
+
112
+ void startAcceptingBody(MyClient *client, MyRequest *req) {
113
+ req->bodyChannel.start();
114
+ // Continues on onRequestBody()
115
+ }
116
+
117
+ void testLargeResponse(MyClient *client, MyRequest *req) {
118
+ const LString *value = req->headers.lookup("size");
119
+ value = psg_lstr_make_contiguous(value, req->pool);
120
+ unsigned int size = stringToUint(StaticString(value->start->data, value->size));
121
+ char *body = (char *) psg_pnalloc(req->pool, size);
122
+ memset(body, 'x', size);
123
+ writeSimpleResponse(client, 200, NULL, StaticString(body, size));
124
+ if (!req->ended()) {
125
+ endRequest(&client, &req);
126
+ }
127
+ }
128
+
129
+ void testPath(MyClient *client, MyRequest *req) {
130
+ if (req->path.start->next == NULL) {
131
+ writeSimpleResponse(client, 200, NULL, "Contiguous: 1");
132
+ } else {
133
+ writeSimpleResponse(client, 500, NULL, "Contiguous: 0");
134
+ }
135
+ if (!req->ended()) {
136
+ endRequest(&client, &req);
137
+ }
138
+ }
139
+
140
+ protected:
141
+ virtual void onRequestBegin(MyClient *client, MyRequest *req) {
142
+ ParentClass::onRequestBegin(client, req);
143
+
144
+ if (psg_lstr_cmp(&req->path, "/body_test")) {
145
+ testBody(client, req);
146
+ } else if (psg_lstr_cmp(&req->path, "/body_stop_test")) {
147
+ testBodyStop(client, req);
148
+ } else if (psg_lstr_cmp(&req->path, "/large_response")) {
149
+ testLargeResponse(client, req);
150
+ } else if (psg_lstr_cmp(&req->path, "/path_test")) {
151
+ testPath(client, req);
152
+ } else {
153
+ testRequest(client, req);
154
+ }
155
+ }
156
+
157
+ virtual Channel::Result onRequestBody(MyClient *client, MyRequest *req,
158
+ const MemoryKit::mbuf &buffer, int errcode)
159
+ {
160
+ if (buffer.size() > 0) {
161
+ // Data
162
+ bodyBytesRead += buffer.size();
163
+ req->body.append(buffer.start, buffer.size());
164
+ } else if (errcode == 0) {
165
+ // EOF
166
+ req->body.insert(0, toString(req->body.size()) + " bytes: ");
167
+ writeSimpleResponse(client, 200, NULL, req->body);
168
+ endRequest(&client, &req);
169
+ } else {
170
+ // Error
171
+ req->body.insert(0, string("Request body error: ") +
172
+ getErrorDesc(errcode) + "\n" +
173
+ toString(req->body.size()) + " bytes: ");
174
+ writeSimpleResponse(client, 422, NULL, req->body);
175
+ if (!req->ended()) {
176
+ endRequest(&client, &req);
177
+ }
178
+ }
179
+ return Channel::Result(buffer.size(), false);
180
+ }
181
+
182
+ virtual void reinitializeRequest(MyClient *client, MyRequest *req) {
183
+ ParentClass::reinitializeRequest(client, req);
184
+ req->body.clear();
185
+ }
186
+
187
+ virtual void deinitializeRequest(MyClient *client, MyRequest *req) {
188
+ unsigned int i;
189
+
190
+ for (i = 0; i < requestsWaitingToStartAcceptingBody.size(); i++) {
191
+ if (requestsWaitingToStartAcceptingBody[i] == req) {
192
+ requestsWaitingToStartAcceptingBody.erase(
193
+ requestsWaitingToStartAcceptingBody.begin() + i);
194
+ unrefRequest(req, __FILE__, __LINE__);
195
+ break;
196
+ }
197
+ }
198
+ ParentClass::deinitializeRequest(client, req);
199
+ }
200
+
201
+ virtual bool supportsUpgrade(MyClient *client, MyRequest *req) {
202
+ return allowUpgrades;
203
+ }
204
+
205
+ public:
206
+ bool allowUpgrades;
207
+
208
+ vector<MyRequest *> requestsWaitingToStartAcceptingBody;
209
+ unsigned int bodyBytesRead;
210
+
211
+ MyServer(Context *context)
212
+ : ParentClass(context),
213
+ allowUpgrades(true),
214
+ bodyBytesRead(0)
215
+ { }
216
+
217
+ void startAcceptingBody() {
218
+ MyRequest *req;
219
+ vector<MyRequest *> requestsWaitingToStartAcceptingBody;
220
+
221
+ requestsWaitingToStartAcceptingBody.swap(
222
+ this->requestsWaitingToStartAcceptingBody);
223
+
224
+ foreach (req, requestsWaitingToStartAcceptingBody) {
225
+ startAcceptingBody(static_cast<MyClient *>(req->client), req);
226
+ unrefRequest(req, __FILE__, __LINE__);
227
+ }
228
+ }
229
+ };
230
+
231
+ struct ServerKit_HttpServerTest {
232
+ typedef ClientRef<MyServer, MyClient> ClientRefType;
233
+
234
+ BackgroundEventLoop bg;
235
+ ServerKit::Context context;
236
+ boost::shared_ptr<MyServer> server;
237
+ int serverSocket;
238
+ FileDescriptor fd;
239
+ BufferedIO io;
240
+
241
+ ServerKit_HttpServerTest()
242
+ : bg(false, true),
243
+ context(bg.safe)
244
+ {
245
+ initializeLibeio();
246
+ setLogLevel(LVL_WARN);
247
+ serverSocket = createUnixServer("tmp.server");
248
+ server = boost::make_shared<MyServer>(&context);
249
+ server->listen(serverSocket);
250
+ }
251
+
252
+ ~ServerKit_HttpServerTest() {
253
+ startLoop();
254
+ fd.close();
255
+ // Silence error disconnection messages during shutdown.
256
+ setLogLevel(LVL_CRIT);
257
+ bg.safe->runSync(boost::bind(&MyServer::shutdown, server.get(), true));
258
+ while (getServerState() != MyServer::FINISHED_SHUTDOWN) {
259
+ syscalls::usleep(10000);
260
+ }
261
+ safelyClose(serverSocket);
262
+ unlink("tmp.server");
263
+ setLogLevel(DEFAULT_LOG_LEVEL);
264
+ bg.stop();
265
+ shutdownLibeio();
266
+ }
267
+
268
+ void startLoop() {
269
+ if (!bg.isStarted()) {
270
+ bg.start();
271
+ }
272
+ }
273
+
274
+ FileDescriptor &connectToServer() {
275
+ startLoop();
276
+ fd = FileDescriptor(connectToUnixServer("tmp.server"));
277
+ io = BufferedIO(fd);
278
+ return fd;
279
+ }
280
+
281
+ void sendRequest(const StaticString &data) {
282
+ writeExact(fd, data);
283
+ }
284
+
285
+ void sendRequestAndWait(const StaticString &data) {
286
+ unsigned long long totalBytesConsumed = getTotalBytesConsumed();
287
+ sendRequest(data);
288
+ EVENTUALLY(5,
289
+ result = getTotalBytesConsumed() >= totalBytesConsumed + data.size();
290
+ );
291
+ ensure_equals(getTotalBytesConsumed(), totalBytesConsumed + data.size());
292
+ }
293
+
294
+ bool hasResponseData() {
295
+ unsigned long long timeout = 0;
296
+ return waitUntilReadable(fd, &timeout);
297
+ }
298
+
299
+ MyServer::State getServerState() {
300
+ MyServer::State result;
301
+ bg.safe->runSync(boost::bind(&ServerKit_HttpServerTest::_getServerState,
302
+ this, &result));
303
+ return result;
304
+ }
305
+
306
+ void _getServerState(MyServer::State *state) {
307
+ *state = server->serverState;
308
+ }
309
+
310
+ unsigned long long getTotalBytesConsumed() {
311
+ unsigned long long result;
312
+ bg.safe->runSync(boost::bind(&ServerKit_HttpServerTest::_getTotalBytesConsumed,
313
+ this, &result));
314
+ return result;
315
+ }
316
+
317
+ void _getTotalBytesConsumed(unsigned long long *result) {
318
+ *result = server->totalBytesConsumed;
319
+ }
320
+
321
+ unsigned long getTotalRequestsBegun() {
322
+ unsigned long result;
323
+ bg.safe->runSync(boost::bind(&ServerKit_HttpServerTest::_getTotalRequestsBegun,
324
+ this, &result));
325
+ return result;
326
+ }
327
+
328
+ void _getTotalRequestsBegun(unsigned long *result) {
329
+ *result = server->totalRequestsBegun;
330
+ }
331
+
332
+ unsigned int getActiveClientCount() {
333
+ unsigned int result;
334
+ bg.safe->runSync(boost::bind(&ServerKit_HttpServerTest::_getActiveClientCount,
335
+ this, &result));
336
+ return result;
337
+ }
338
+
339
+ void _getActiveClientCount(unsigned int *result) {
340
+ *result = server->activeClientCount;
341
+ }
342
+
343
+ unsigned int getNumRequestsWaitingToStartAcceptingBody() {
344
+ unsigned int result;
345
+ bg.safe->runSync(boost::bind(
346
+ &ServerKit_HttpServerTest::_getNumRequestsWaitingToStartAcceptingBody,
347
+ this, &result));
348
+ return result;
349
+ }
350
+
351
+ void _getNumRequestsWaitingToStartAcceptingBody(unsigned int *result) {
352
+ *result = server->requestsWaitingToStartAcceptingBody.size();
353
+ }
354
+
355
+ void startAcceptingBody() {
356
+ bg.safe->runLater(boost::bind(&ServerKit_HttpServerTest::_startAcceptingBody,
357
+ this));
358
+ }
359
+
360
+ void _startAcceptingBody() {
361
+ server->startAcceptingBody();
362
+ }
363
+
364
+ void shutdownServer() {
365
+ bg.safe->runLater(boost::bind(&ServerKit_HttpServerTest::_shutdownServer,
366
+ this));
367
+ }
368
+
369
+ void _shutdownServer() {
370
+ server->shutdown();
371
+ }
372
+
373
+ string stripHeaders(const string &str) {
374
+ string::size_type pos = str.find("\r\n\r\n");
375
+ if (pos == string::npos) {
376
+ return str;
377
+ } else {
378
+ string result = str;
379
+ result.erase(0, pos + 4);
380
+ return result;
381
+ }
382
+ }
383
+
384
+ string readResponseHeader() {
385
+ string result;
386
+ string line;
387
+ do {
388
+ line = io.readLine();
389
+ if (line.empty()) {
390
+ break;
391
+ } else {
392
+ result.append(line);
393
+ if (line == "\r\n") {
394
+ break;
395
+ }
396
+ }
397
+ } while (true);
398
+ return result;
399
+ }
400
+ };
401
+
402
+ DEFINE_TEST_GROUP_WITH_LIMIT(ServerKit_HttpServerTest, 100);
403
+
404
+
405
+ /***** Valid HTTP header parsing *****/
406
+
407
+ TEST_METHOD(1) {
408
+ set_test_name("A complete header in one part");
409
+
410
+ connectToServer();
411
+ sendRequest(
412
+ "GET / HTTP/1.1\r\n"
413
+ "Connection: close\r\n"
414
+ "Host: foo\r\n\r\n");
415
+ string response = readAll(fd);
416
+ ensure_equals(response,
417
+ "HTTP/1.1 200 OK\r\n"
418
+ "Status: 200 OK\r\n"
419
+ "Content-Type: text/plain\r\n"
420
+ "Date: Thu, 11 Sep 2014 12:54:09 GMT\r\n"
421
+ "Connection: close\r\n"
422
+ "Content-Length: 7\r\n\r\n"
423
+ "hello /");
424
+ }
425
+
426
+ TEST_METHOD(2) {
427
+ set_test_name("A complete header in multiple random-sized parts");
428
+
429
+ connectToServer();
430
+ sendRequestAndWait(
431
+ "GET / HTTP/1.1\r\n"
432
+ "Connect");
433
+ ensure(!hasResponseData());
434
+
435
+ sendRequestAndWait(
436
+ "ion: close\r\n"
437
+ "Host: fo");
438
+ ensure(!hasResponseData());
439
+
440
+ sendRequest(
441
+ "o\r\n\r\n");
442
+
443
+ string response = readAll(fd);
444
+ ensure_equals(response,
445
+ "HTTP/1.1 200 OK\r\n"
446
+ "Status: 200 OK\r\n"
447
+ "Content-Type: text/plain\r\n"
448
+ "Date: Thu, 11 Sep 2014 12:54:09 GMT\r\n"
449
+ "Connection: close\r\n"
450
+ "Content-Length: 7\r\n\r\n"
451
+ "hello /");
452
+ }
453
+
454
+ TEST_METHOD(3) {
455
+ set_test_name("A complete header in multiple complete lines");
456
+
457
+ connectToServer();
458
+
459
+ sendRequestAndWait("GET / HTTP/1.1\r\n");
460
+ ensure(!hasResponseData());
461
+
462
+ sendRequestAndWait("Connection: close\r\n");
463
+ ensure(!hasResponseData());
464
+
465
+ sendRequestAndWait("Host: foo\r\n");
466
+ ensure(!hasResponseData());
467
+
468
+ sendRequest("\r\n");
469
+
470
+ string response = readAll(fd);
471
+ ensure_equals(response,
472
+ "HTTP/1.1 200 OK\r\n"
473
+ "Status: 200 OK\r\n"
474
+ "Content-Type: text/plain\r\n"
475
+ "Date: Thu, 11 Sep 2014 12:54:09 GMT\r\n"
476
+ "Connection: close\r\n"
477
+ "Content-Length: 7\r\n\r\n"
478
+ "hello /");
479
+ }
480
+
481
+ TEST_METHOD(4) {
482
+ set_test_name("The request path is stored in req->path, "
483
+ "and headers are stored in req->headers");
484
+
485
+ connectToServer();
486
+
487
+ sendRequestAndWait("GET /");
488
+ ensure(!hasResponseData());
489
+ sendRequestAndWait("jo");
490
+ ensure(!hasResponseData());
491
+ sendRequestAndWait("o HTTP/1.1\r\n");
492
+ ensure(!hasResponseData());
493
+
494
+ sendRequestAndWait("Connection: close\r\n");
495
+ ensure(!hasResponseData());
496
+
497
+ sendRequestAndWait("Host: foo\r\n");
498
+ ensure(!hasResponseData());
499
+
500
+ sendRequestAndWait("F");
501
+ ensure(!hasResponseData());
502
+ sendRequestAndWait("oo: ");
503
+ ensure(!hasResponseData());
504
+ sendRequestAndWait("b");
505
+ ensure(!hasResponseData());
506
+ sendRequestAndWait("ar\r\n");
507
+ ensure(!hasResponseData());
508
+
509
+ sendRequest("\r\n");
510
+
511
+ string response = readAll(fd);
512
+ ensure_equals(response,
513
+ "HTTP/1.1 200 OK\r\n"
514
+ "Status: 200 OK\r\n"
515
+ "Content-Type: text/plain\r\n"
516
+ "Date: Thu, 11 Sep 2014 12:54:09 GMT\r\n"
517
+ "Connection: close\r\n"
518
+ "Content-Length: 19\r\n\r\n"
519
+ "hello /joo\n"
520
+ "Foo: bar");
521
+ }
522
+
523
+ TEST_METHOD(5) {
524
+ set_test_name("It ensures that req->path is contiguous");
525
+
526
+ connectToServer();
527
+ sendRequestAndWait("GET /p");
528
+ sendRequestAndWait(
529
+ "ath_test HTTP/1.1\r\n"
530
+ "Connection: close\r\n\r\n");
531
+
532
+ string response = readAll(fd);
533
+ ensure(containsSubstring(response, "Contiguous: 1"));
534
+ }
535
+
536
+
537
+ /***** Invalid HTTP header parsing *****/
538
+
539
+ TEST_METHOD(7) {
540
+ set_test_name("Incomplete header, without closing connection");
541
+
542
+ connectToServer();
543
+ sendRequest("GET / HTT");
544
+ SHOULD_NEVER_HAPPEN(100,
545
+ result = hasResponseData();
546
+ );
547
+ }
548
+
549
+ TEST_METHOD(8) {
550
+ set_test_name("Incomplete header, half-closing connection");
551
+
552
+ connectToServer();
553
+ sendRequestAndWait("GET / HTT");
554
+ syscalls::shutdown(fd, SHUT_WR);
555
+ string response = readAll(fd);
556
+ ensure_equals(response, "");
557
+ }
558
+
559
+ TEST_METHOD(9) {
560
+ set_test_name("Invalid header data");
561
+
562
+ connectToServer();
563
+ sendRequest("whatever");
564
+ string response = readAll(fd);
565
+ ensure(containsSubstring(response,
566
+ "HTTP/1.0 400 Bad Request\r\n"
567
+ "Status: 400 Bad Request\r\n"
568
+ "Content-Type: text/html; charset=UTF-8\r\n"));
569
+ ensure(containsSubstring(response,
570
+ "Connection: close\r\n"
571
+ "Content-Length: 19\r\n"
572
+ "cache-control: no-cache, no-store, must-revalidate\r\n\r\n"
573
+ "invalid HTTP method"));
574
+ }
575
+
576
+
577
+ /***** Invalid request *****/
578
+
579
+ TEST_METHOD(14) {
580
+ set_test_name("HTTP > 1.1");
581
+
582
+ connectToServer();
583
+ sendRequest(
584
+ "GET / HTTP/1.2\r\n"
585
+ "Connection: close\r\n"
586
+ "Host: foo\r\n\r\n");
587
+ string response = readAll(fd);
588
+ ensure(containsSubstring(response,
589
+ "HTTP/1.1 505 HTTP Version Not Supported\r\n"
590
+ "Status: 505 HTTP Version Not Supported\r\n"
591
+ "Content-Type: text/html; charset=UTF-8\r\n"));
592
+ ensure(containsSubstring(response,
593
+ "Connection: close\r\n"
594
+ "Content-Length: 27\r\n"
595
+ "cache-control: no-cache, no-store, must-revalidate\r\n"
596
+ "\r\n"
597
+ "HTTP version not supported"));
598
+ }
599
+
600
+ TEST_METHOD(15) {
601
+ set_test_name("Transfer-Encoding and Content-Length given simultaneously");
602
+
603
+ connectToServer();
604
+ sendRequest(
605
+ "GET / HTTP/1.1\r\n"
606
+ "Connection: close\r\n"
607
+ "Content-Length: 3\r\n"
608
+ "Transfer-Encoding: chunked\r\n\r\n");
609
+ string response = readAll(fd);
610
+ ensure(containsSubstring(response,
611
+ "HTTP/1.1 400 Bad Request\r\n"
612
+ "Status: 400 Bad Request\r\n"
613
+ "Content-Type: text/html; charset=UTF-8\r\n"));
614
+ ensure(containsSubstring(response,
615
+ "Connection: close\r\n"
616
+ "Content-Length: 79\r\n"
617
+ "cache-control: no-cache, no-store, must-revalidate\r\n"
618
+ "\r\n"
619
+ "Bad request (request may not contain both Content-Length and Transfer-Encoding)"));
620
+ }
621
+
622
+
623
+ /***** Fixed body handling *****/
624
+
625
+ TEST_METHOD(20) {
626
+ set_test_name("An empty body is treated the same as no body");
627
+
628
+ connectToServer();
629
+ sendRequest(
630
+ "GET /body_test HTTP/1.1\r\n"
631
+ "Connection: close\r\n"
632
+ "Content-Length: 0\r\n\r\n");
633
+ string response = readAll(fd);
634
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 422 Unprocessable Entity\r\n"));
635
+ ensure("(2)", containsSubstring(response, "Body required"));
636
+ }
637
+
638
+ TEST_METHOD(21) {
639
+ set_test_name("Non-empty body in one part");
640
+
641
+ connectToServer();
642
+ sendRequest(
643
+ "GET /body_test HTTP/1.1\r\n"
644
+ "Connection: close\r\n"
645
+ "Content-Length: 2\r\n\r\n"
646
+ "ok");
647
+ string response = readAll(fd);
648
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
649
+ ensure("(2)", containsSubstring(response, "2 bytes: ok"));
650
+ }
651
+
652
+ TEST_METHOD(22) {
653
+ set_test_name("Non-empty body in multiple parts");
654
+
655
+ connectToServer();
656
+ sendRequestAndWait(
657
+ "GET /body_test HTTP/1.1\r\n"
658
+ "Connection: close\r\n"
659
+ "Content-Length: 7\r\n\r\n"
660
+ "hm");
661
+ ensure(!hasResponseData());
662
+ sendRequestAndWait("ok");
663
+ ensure(!hasResponseData());
664
+ sendRequest("!!!");
665
+
666
+ string response = readAll(fd);
667
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
668
+ ensure("(2)", containsSubstring(response, "7 bytes: hmok!!!"));
669
+ }
670
+
671
+ TEST_METHOD(23) {
672
+ set_test_name("req->bodyChannel is stopped before request body data is received");
673
+
674
+ connectToServer();
675
+ sendRequest(
676
+ "GET /body_stop_test HTTP/1.1\r\n"
677
+ "Connection: close\r\n"
678
+ "Content-Length: 7\r\n\r\n"
679
+ "hmok!!!");
680
+ EVENTUALLY(5,
681
+ result = getNumRequestsWaitingToStartAcceptingBody() == 1;
682
+ );
683
+ SHOULD_NEVER_HAPPEN(100,
684
+ result = hasResponseData();
685
+ );
686
+
687
+ startAcceptingBody();
688
+ string response = readAll(fd);
689
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
690
+ ensure("(2)", containsSubstring(response, "7 bytes: hmok!!!"));
691
+ }
692
+
693
+ TEST_METHOD(24) {
694
+ set_test_name("req->bodyChannel is stopped before unexpected request body EOF is encountered");
695
+
696
+ connectToServer();
697
+ sendRequest(
698
+ "GET /body_stop_test HTTP/1.1\r\n"
699
+ "Connection: close\r\n"
700
+ "Content-Length: 3\r\n\r\n");
701
+ syscalls::shutdown(fd, SHUT_WR);
702
+ EVENTUALLY(5,
703
+ result = getNumRequestsWaitingToStartAcceptingBody() == 1;
704
+ );
705
+ SHOULD_NEVER_HAPPEN(100,
706
+ result = hasResponseData();
707
+ );
708
+
709
+ startAcceptingBody();
710
+ string response = readAll(fd);
711
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 422 Unprocessable Entity\r\n"));
712
+ ensure("(2)", containsSubstring(response, "Request body error: Unexpected end-of-stream"));
713
+ }
714
+
715
+ TEST_METHOD(25) {
716
+ set_test_name("Premature body termination");
717
+
718
+ connectToServer();
719
+ sendRequestAndWait(
720
+ "GET /body_test HTTP/1.1\r\n"
721
+ "Connection: close\r\n"
722
+ "Content-Length: 7\r\n\r\n"
723
+ "hm");
724
+ ensure(!hasResponseData());
725
+ sendRequestAndWait("ok");
726
+ ensure(!hasResponseData());
727
+ sendRequestAndWait("!");
728
+ syscalls::shutdown(fd, SHUT_WR);
729
+
730
+ string response = readAll(fd);
731
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 422 Unprocessable Entity\r\n"));
732
+ ensure("(2)", containsSubstring(response,
733
+ "Request body error: Unexpected end-of-stream\n"
734
+ "5 bytes: hmok!"));
735
+ }
736
+
737
+ TEST_METHOD(26) {
738
+ set_test_name("Trailing data after body");
739
+
740
+ connectToServer();
741
+ sendRequest(
742
+ "GET /body_test HTTP/1.1\r\n"
743
+ "Connection: close\r\n"
744
+ "Content-Length: 2\r\n\r\n"
745
+ "hmok");
746
+ string response = readAll(fd);
747
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
748
+ ensure("(2)", containsSubstring(response, "2 bytes: hm"));
749
+ ensure("(3)", !containsSubstring(response, "ok"));
750
+ EVENTUALLY(5,
751
+ result = getTotalBytesConsumed() == strlen(
752
+ "GET /body_test HTTP/1.1\r\n"
753
+ "Connection: close\r\n"
754
+ "Content-Length: 2\r\n\r\n"
755
+ "hm");
756
+ );
757
+ }
758
+
759
+
760
+ /***** Chunked body handling *****/
761
+
762
+ TEST_METHOD(30) {
763
+ set_test_name("Empty body");
764
+
765
+ connectToServer();
766
+ sendRequest(
767
+ "GET /body_test HTTP/1.1\r\n"
768
+ "Connection: close\r\n"
769
+ "Transfer-Encoding: chunked\r\n\r\n"
770
+ "0\r\n\r\n");
771
+ string response = readAll(fd);
772
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
773
+ ensure("(2)", containsSubstring(response, "0 bytes: "));
774
+ }
775
+
776
+ TEST_METHOD(31) {
777
+ set_test_name("Non-empty body in one part");
778
+
779
+ connectToServer();
780
+ sendRequest(
781
+ "GET /body_test HTTP/1.1\r\n"
782
+ "Connection: close\r\n"
783
+ "Transfer-Encoding: chunked\r\n\r\n"
784
+ "2\r\n"
785
+ "ok\r\n"
786
+ "0\r\n\r\n");
787
+ string response = readAll(fd);
788
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
789
+ ensure("(2)", containsSubstring(response, "2 bytes: ok"));
790
+ }
791
+
792
+ TEST_METHOD(32) {
793
+ set_test_name("Non-empty body in multiple parts");
794
+
795
+ connectToServer();
796
+ sendRequestAndWait(
797
+ "GET /body_test HTTP/1.1\r\n"
798
+ "Connection: close\r\n"
799
+ "Transfer-Encoding: chunked\r\n\r\n"
800
+ "2\r\n"
801
+ "h");
802
+ ensure(!hasResponseData());
803
+ sendRequestAndWait("m\r");
804
+ ensure(!hasResponseData());
805
+ sendRequestAndWait("\n2\r");
806
+ ensure(!hasResponseData());
807
+ sendRequestAndWait("\no");
808
+ ensure(!hasResponseData());
809
+ sendRequestAndWait("k");
810
+ ensure(!hasResponseData());
811
+ sendRequestAndWait("\r\n3\r\n");
812
+ ensure(!hasResponseData());
813
+ sendRequestAndWait("!");
814
+ ensure(!hasResponseData());
815
+ sendRequestAndWait("!!\r\n0");
816
+ ensure(!hasResponseData());
817
+ sendRequest("\r\n\r\n");
818
+
819
+ string response = readAll(fd);
820
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
821
+ ensure("(2)", containsSubstring(response, "7 bytes: hmok!!!"));
822
+ }
823
+
824
+ TEST_METHOD(33) {
825
+ set_test_name("Premature body termination");
826
+
827
+ connectToServer();
828
+ sendRequestAndWait(
829
+ "GET /body_test HTTP/1.1\r\n"
830
+ "Connection: close\r\n"
831
+ "Transfer-Encoding: chunked\r\n\r\n"
832
+ "7\r\nhmok!");
833
+ ensure(!hasResponseData());
834
+ syscalls::shutdown(fd, SHUT_WR);
835
+
836
+ string response = readAll(fd);
837
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 422 Unprocessable Entity\r\n"));
838
+ ensure("(2)", containsSubstring(response,
839
+ "Request body error: Unexpected end-of-stream\n"
840
+ "5 bytes: hmok!"));
841
+ }
842
+
843
+ TEST_METHOD(34) {
844
+ set_test_name("req->bodyChannel is stopped before request body data is received");
845
+
846
+ connectToServer();
847
+ sendRequest(
848
+ "GET /body_stop_test HTTP/1.1\r\n"
849
+ "Connection: close\r\n"
850
+ "Transfer-Encoding: chunked\r\n\r\n"
851
+ "3\r\n"
852
+ "abc\r\n"
853
+ "0\r\n"
854
+ "\r\n");
855
+ EVENTUALLY(5,
856
+ result = getNumRequestsWaitingToStartAcceptingBody() == 1;
857
+ );
858
+ SHOULD_NEVER_HAPPEN(100,
859
+ result = hasResponseData();
860
+ );
861
+
862
+ startAcceptingBody();
863
+ string response = readAll(fd);
864
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
865
+ ensure("(2)", containsSubstring(response, "3 bytes: abc"));
866
+ }
867
+
868
+ TEST_METHOD(35) {
869
+ set_test_name("Trailing data after body");
870
+
871
+ connectToServer();
872
+ sendRequest(
873
+ "GET /body_test HTTP/1.1\r\n"
874
+ "Connection: close\r\n"
875
+ "Transfer-Encoding: chunked\r\n\r\n"
876
+ "2\r\n"
877
+ "hm\r\n"
878
+ "0\r\n\r\n"
879
+ "ok");
880
+ string response = readAll(fd);
881
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
882
+ ensure("(2)", containsSubstring(response, "2 bytes: hm"));
883
+ ensure("(3)", !containsSubstring(response, "ok"));
884
+ EVENTUALLY(5,
885
+ result = getTotalBytesConsumed() == strlen(
886
+ "GET /body_test HTTP/1.1\r\n"
887
+ "Connection: close\r\n"
888
+ "Transfer-Encoding: chunked\r\n\r\n"
889
+ "2\r\n"
890
+ "hm\r\n"
891
+ "0\r\n\r\n");
892
+ );
893
+ }
894
+
895
+ TEST_METHOD(36) {
896
+ set_test_name("Unterminated final chunk");
897
+
898
+ connectToServer();
899
+ sendRequestAndWait(
900
+ "GET /body_test HTTP/1.1\r\n"
901
+ "Connection: close\r\n"
902
+ "Transfer-Encoding: chunked\r\n\r\n"
903
+ "7\r\nhmok!!!\r\n0\r\n\r");
904
+ ensure(!hasResponseData());
905
+ syscalls::shutdown(fd, SHUT_WR);
906
+
907
+ string response = readAll(fd);
908
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 422 Unprocessable Entity\r\n"));
909
+ ensure("(2)", containsSubstring(response,
910
+ "Request body error: Unexpected end-of-stream\n"
911
+ "7 bytes: hmok!!!"));
912
+ }
913
+
914
+ TEST_METHOD(37) {
915
+ set_test_name("Invalid chunk header");
916
+
917
+ connectToServer();
918
+ sendRequest(
919
+ "GET /body_test HTTP/1.1\r\n"
920
+ "Connection: close\r\n"
921
+ "Transfer-Encoding: chunked\r\n\r\n"
922
+ "!");
923
+ string response = readAll(fd);
924
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 422 Unprocessable Entity\r\n"));
925
+ ensure("(2)", containsSubstring(response, "0 bytes: "));
926
+ ensure("(3)", !containsSubstring(response, "!"));
927
+ }
928
+
929
+ TEST_METHOD(38) {
930
+ set_test_name("Invalid chunk footer");
931
+
932
+ connectToServer();
933
+ sendRequest(
934
+ "GET /body_test HTTP/1.1\r\n"
935
+ "Connection: close\r\n"
936
+ "Transfer-Encoding: chunked\r\n\r\n"
937
+ "2\r\nok!");
938
+ string response = readAll(fd);
939
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 422 Unprocessable Entity\r\n"));
940
+ ensure("(2)", containsSubstring(response, "2 bytes: ok"));
941
+ ensure("(3)", !containsSubstring(response, "!"));
942
+ }
943
+
944
+
945
+ /***** Upgrade handling *****/
946
+
947
+ TEST_METHOD(40) {
948
+ set_test_name("Empty body");
949
+
950
+ connectToServer();
951
+ sendRequest(
952
+ "GET /body_test HTTP/1.1\r\n"
953
+ "Connection: upgrade\r\n"
954
+ "Upgrade: raw\r\n\r\n");
955
+ syscalls::shutdown(fd, SHUT_WR);
956
+ string response = readAll(fd);
957
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
958
+ ensure("(2)", containsSubstring(response, "0 bytes: "));
959
+ }
960
+
961
+ TEST_METHOD(41) {
962
+ set_test_name("Non-empty data in one part");
963
+
964
+ connectToServer();
965
+ sendRequest(
966
+ "GET /body_test HTTP/1.1\r\n"
967
+ "Connection: upgrade\r\n"
968
+ "Upgrade: raw\r\n\r\n"
969
+ "ok");
970
+ syscalls::shutdown(fd, SHUT_WR);
971
+ string response = readAll(fd);
972
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
973
+ ensure("(2)", containsSubstring(response, "2 bytes: ok"));
974
+ }
975
+
976
+ TEST_METHOD(42) {
977
+ set_test_name("Non-empty body in multiple parts");
978
+
979
+ connectToServer();
980
+ sendRequestAndWait(
981
+ "GET /body_test HTTP/1.1\r\n"
982
+ "Connection: upgrade\r\n"
983
+ "Upgrade: raw\r\n\r\n"
984
+ "hm");
985
+ ensure(!hasResponseData());
986
+ sendRequestAndWait("ok");
987
+ ensure(!hasResponseData());
988
+ sendRequest("!!!");
989
+ syscalls::shutdown(fd, SHUT_WR);
990
+
991
+ string response = readAll(fd);
992
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
993
+ ensure("(2)", containsSubstring(response, "7 bytes: hmok!!!"));
994
+ }
995
+
996
+ TEST_METHOD(43) {
997
+ set_test_name("req->bodyChannel is stopped before request body data is received");
998
+
999
+ connectToServer();
1000
+ sendRequest(
1001
+ "GET /body_stop_test HTTP/1.1\r\n"
1002
+ "Connection: upgrade\r\n"
1003
+ "Upgrade: raw\r\n\r\n"
1004
+ "hmok!!!");
1005
+ syscalls::shutdown(fd, SHUT_WR);
1006
+ EVENTUALLY(5,
1007
+ result = getNumRequestsWaitingToStartAcceptingBody() == 1;
1008
+ );
1009
+ SHOULD_NEVER_HAPPEN(100,
1010
+ result = hasResponseData();
1011
+ );
1012
+
1013
+ startAcceptingBody();
1014
+ string response = readAll(fd);
1015
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
1016
+ ensure("(2)", containsSubstring(response, "7 bytes: hmok!!!"));
1017
+ }
1018
+
1019
+ TEST_METHOD(44) {
1020
+ set_test_name("req->bodyChannel is stopped before request body EOF is encountered");
1021
+
1022
+ connectToServer();
1023
+ sendRequest(
1024
+ "GET /body_stop_test HTTP/1.1\r\n"
1025
+ "Connection: upgrade\r\n"
1026
+ "Upgrade: raw\r\n\r\n");
1027
+ syscalls::shutdown(fd, SHUT_WR);
1028
+ EVENTUALLY(5,
1029
+ result = getNumRequestsWaitingToStartAcceptingBody() == 1;
1030
+ );
1031
+ SHOULD_NEVER_HAPPEN(100,
1032
+ result = hasResponseData();
1033
+ );
1034
+
1035
+ startAcceptingBody();
1036
+ string response = readAll(fd);
1037
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
1038
+ ensure("(2)", containsSubstring(response, "0 bytes: "));
1039
+ }
1040
+
1041
+ TEST_METHOD(45) {
1042
+ set_test_name("It rejects the upgrade if supportsUpgrade() returns false");
1043
+
1044
+ server->allowUpgrades = false;
1045
+ connectToServer();
1046
+ sendRequest(
1047
+ "GET /body_test HTTP/1.1\r\n"
1048
+ "Connection: upgrade\r\n"
1049
+ "Upgrade: raw\r\n\r\n");
1050
+ string response = readAll(fd);
1051
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 422 Unprocessable Entity\r\n"));
1052
+ ensure("(2)", containsSubstring(response, "Connection upgrading not allowed for this request"));
1053
+ }
1054
+
1055
+ TEST_METHOD(46) {
1056
+ set_test_name("It rejects the upgrade if the request contains a request body");
1057
+
1058
+ connectToServer();
1059
+ sendRequest(
1060
+ "GET /body_test HTTP/1.1\r\n"
1061
+ "Connection: upgrade\r\n"
1062
+ "Upgrade: raw\r\n"
1063
+ "Content-Length: 3\r\n\r\n");
1064
+ string response = readAll(fd);
1065
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 400 Bad Request\r\n"));
1066
+ ensure("(2)", containsSubstring(response,
1067
+ "Connection upgrading is only allowed for requests without request body"));
1068
+ }
1069
+
1070
+ TEST_METHOD(47) {
1071
+ set_test_name("It rejects the upgrade if the request is HEAD");
1072
+
1073
+ connectToServer();
1074
+ sendRequest(
1075
+ "HEAD /body_test HTTP/1.1\r\n"
1076
+ "Connection: upgrade\r\n"
1077
+ "Upgrade: raw\r\n\r\n");
1078
+ string response = readAll(fd);
1079
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 400 Bad Request\r\n"));
1080
+ }
1081
+
1082
+
1083
+ /***** Secure headers handling *****/
1084
+
1085
+ TEST_METHOD(50) {
1086
+ set_test_name("It stores secure headers in req->secureHeaders");
1087
+
1088
+ connectToServer();
1089
+ sendRequest(
1090
+ "GET /joo HTTP/1.1\r\n"
1091
+ "Connection: close\r\n"
1092
+ "Host: foo\r\n"
1093
+ "!~: x\r\n"
1094
+ "!~Secure: secret\r\n"
1095
+ "\r\n");
1096
+ string response = readAll(fd);
1097
+ ensure_equals(response,
1098
+ "HTTP/1.1 200 OK\r\n"
1099
+ "Status: 200 OK\r\n"
1100
+ "Content-Type: text/plain\r\n"
1101
+ "Date: Thu, 11 Sep 2014 12:54:09 GMT\r\n"
1102
+ "Connection: close\r\n"
1103
+ "Content-Length: 25\r\n\r\n"
1104
+ "hello /joo\n"
1105
+ "Secure: secret");
1106
+ }
1107
+
1108
+ TEST_METHOD(51) {
1109
+ set_test_name("It rejects normal headers while in secure mode");
1110
+
1111
+ connectToServer();
1112
+ sendRequest(
1113
+ "GET / HTTP/1.1\r\n"
1114
+ "Connection: close\r\n"
1115
+ "Host: foo\r\n"
1116
+ "!~: x\r\n"
1117
+ "!~Secure: secret\r\n"
1118
+ "Foo: bar\r\n"
1119
+ "\r\n");
1120
+ string response = readAll(fd);
1121
+ ensure("(1)", containsSubstring(response, "HTTP/1.0 400 Bad Request\r\n"));
1122
+ ensure("(2)", containsSubstring(response,
1123
+ "A normal header was encountered after the security password header"));
1124
+ }
1125
+
1126
+ TEST_METHOD(52) {
1127
+ set_test_name("It rejects secure headers while in normal mode");
1128
+
1129
+ connectToServer();
1130
+ sendRequest(
1131
+ "GET / HTTP/1.1\r\n"
1132
+ "Connection: close\r\n"
1133
+ "Host: foo\r\n"
1134
+ "!~Secure: secret\r\n"
1135
+ "\r\n");
1136
+ string response = readAll(fd);
1137
+ ensure("(1)", containsSubstring(response, "HTTP/1.0 400 Bad Request\r\n"));
1138
+ ensure("(2)", containsSubstring(response,
1139
+ "A secure header was provided, but no security password was provided"));
1140
+ }
1141
+
1142
+ TEST_METHOD(53) {
1143
+ set_test_name("If no secure mode password is given in the context, "
1144
+ "switching to secure mode is always possible");
1145
+
1146
+ connectToServer();
1147
+ sendRequest(
1148
+ "GET / HTTP/1.1\r\n"
1149
+ "Connection: close\r\n"
1150
+ "Host: foo\r\n"
1151
+ "!~: anything\r\n"
1152
+ "\r\n");
1153
+ string response = readAll(fd);
1154
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
1155
+ }
1156
+
1157
+ TEST_METHOD(54) {
1158
+ set_test_name("If a secure mode password is given in the context, "
1159
+ "it rejects requests that specify the wrong secure mode password");
1160
+
1161
+ context.secureModePassword = "secret";
1162
+ connectToServer();
1163
+ sendRequest(
1164
+ "GET / HTTP/1.1\r\n"
1165
+ "Connection: close\r\n"
1166
+ "Host: foo\r\n"
1167
+ "!~: wrong\r\n"
1168
+ "\r\n");
1169
+ string response = readAll(fd);
1170
+ ensure("(1)", containsSubstring(response, "HTTP/1.0 400 Bad Request\r\n"));
1171
+ ensure("(2)", containsSubstring(response,
1172
+ "Security password mismatch"));
1173
+ }
1174
+
1175
+ TEST_METHOD(55) {
1176
+ set_test_name("If a secure mode password is given in the context, "
1177
+ "it accepts requests that specify the correct secure mode password");
1178
+
1179
+ context.secureModePassword = "secret";
1180
+ connectToServer();
1181
+ sendRequest(
1182
+ "GET / HTTP/1.1\r\n"
1183
+ "Connection: close\r\n"
1184
+ "Host: foo\r\n"
1185
+ "!~: secret\r\n"
1186
+ "!~Foo: bar\r\n"
1187
+ "\r\n");
1188
+ string response = readAll(fd);
1189
+ ensure("(1)", containsSubstring(response, "HTTP/1.1 200 OK\r\n"));
1190
+ }
1191
+
1192
+
1193
+ /***** Request ending *****/
1194
+
1195
+ TEST_METHOD(60) {
1196
+ set_test_name("If all output data is flushed, and keep-alive is not possible, "
1197
+ "it disconnects the client immediately");
1198
+
1199
+ connectToServer();
1200
+ sendRequest(
1201
+ "GET / HTTP/1.1\r\n"
1202
+ "Connection: close\r\n"
1203
+ "Host: foo\r\n\r\n");
1204
+ readAll(fd); // Does not block
1205
+ }
1206
+
1207
+ TEST_METHOD(61) {
1208
+ set_test_name("If all output data is flushed, and keep-alive is possible, "
1209
+ "it handles the next request immediately");
1210
+
1211
+ connectToServer();
1212
+ sendRequest(
1213
+ "GET / HTTP/1.1\r\n"
1214
+ "Connection: keep-alive\r\n"
1215
+ "Host: foo\r\n\r\n"
1216
+ "GET /foo HTTP/1.1\r\n"
1217
+ "Connection: close\r\n"
1218
+ "Host: foo\r\n\r\n");
1219
+
1220
+ string response = readAll(fd);
1221
+ ensure_equals(response,
1222
+ "HTTP/1.1 200 OK\r\n"
1223
+ "Status: 200 OK\r\n"
1224
+ "Content-Type: text/plain\r\n"
1225
+ "Date: Thu, 11 Sep 2014 12:54:09 GMT\r\n"
1226
+ "Connection: keep-alive\r\n"
1227
+ "Content-Length: 7\r\n\r\n"
1228
+ "hello /"
1229
+ "HTTP/1.1 200 OK\r\n"
1230
+ "Status: 200 OK\r\n"
1231
+ "Content-Type: text/plain\r\n"
1232
+ "Date: Thu, 11 Sep 2014 12:54:09 GMT\r\n"
1233
+ "Connection: close\r\n"
1234
+ "Content-Length: 10\r\n\r\n"
1235
+ "hello /foo");
1236
+ }
1237
+
1238
+ TEST_METHOD(62) {
1239
+ set_test_name("If there is unflushed output data, and keep-alive is not possible, "
1240
+ "it disconnects the client after all output data is flushed");
1241
+
1242
+ connectToServer();
1243
+ sendRequest(
1244
+ "GET /large_response HTTP/1.1\r\n"
1245
+ "Connection: close\r\n"
1246
+ "Host: foo\r\n"
1247
+ "Size: 1000000\r\n\r\n");
1248
+ string response = readAll(fd);
1249
+ string body = stripHeaders(response);
1250
+ ensure(startsWith(response, "HTTP/1.1 200 OK\r\n"));
1251
+ ensure_equals(body.size(), 1000000u);
1252
+ }
1253
+
1254
+ TEST_METHOD(63) {
1255
+ set_test_name("If there is unflushed output data, and keep-alive is possible, "
1256
+ "it handles the next request after all output data is flushed");
1257
+
1258
+ connectToServer();
1259
+ sendRequest(
1260
+ "GET /large_response HTTP/1.1\r\n"
1261
+ "Connection: keep-alive\r\n"
1262
+ "Host: foo\r\n"
1263
+ "Size: 1000000\r\n\r\n"
1264
+ "GET /foo HTTP/1.1\r\n"
1265
+ "Connection: close\r\n"
1266
+ "Host: foo\r\n\r\n");
1267
+ SHOULD_NEVER_HAPPEN(100,
1268
+ result = getTotalRequestsBegun() > 1;
1269
+ );
1270
+
1271
+ string data = readAll(fd);
1272
+ string response2 =
1273
+ "HTTP/1.1 200 OK\r\n"
1274
+ "Status: 200 OK\r\n"
1275
+ "Content-Type: text/plain\r\n"
1276
+ "Date: Thu, 11 Sep 2014 12:54:09 GMT\r\n"
1277
+ "Connection: close\r\n"
1278
+ "Content-Length: 10\r\n\r\n"
1279
+ "hello /foo";
1280
+
1281
+ string body = stripHeaders(data);
1282
+ ensure(startsWith(data, "HTTP/1.1 200 OK\r\n"));
1283
+ ensure_equals(body.size(), 1000000u + response2.size());
1284
+ ensure_equals(body.substr(1000000), response2);
1285
+ }
1286
+
1287
+
1288
+ /***** Miscellaneous *****/
1289
+
1290
+ TEST_METHOD(70) {
1291
+ set_test_name("It responds with the same HTTP version as the request");
1292
+
1293
+ connectToServer();
1294
+ sendRequest(
1295
+ "GET / HTTP/1.0\r\n"
1296
+ "Connection: close\r\n"
1297
+ "Host: foo\r\n\r\n");
1298
+ string response = readAll(fd);
1299
+ ensure_equals(response,
1300
+ "HTTP/1.0 200 OK\r\n"
1301
+ "Status: 200 OK\r\n"
1302
+ "Content-Type: text/plain\r\n"
1303
+ "Date: Thu, 11 Sep 2014 12:54:09 GMT\r\n"
1304
+ "Connection: close\r\n"
1305
+ "Content-Length: 7\r\n\r\n"
1306
+ "hello /");
1307
+ }
1308
+
1309
+ TEST_METHOD(71) {
1310
+ set_test_name("For requests without body, keep-alive is possible");
1311
+
1312
+ connectToServer();
1313
+ sendRequest(
1314
+ "GET / HTTP/1.1\r\n"
1315
+ "Connection: keep-alive\r\n"
1316
+ "Host: foo\r\n\r\n");
1317
+ string header = readResponseHeader();
1318
+ ensure(containsSubstring(header, "Connection: keep-alive"));
1319
+ }
1320
+
1321
+ TEST_METHOD(72) {
1322
+ set_test_name("If the request body is fully read, keep-alive is possible");
1323
+
1324
+ connectToServer();
1325
+ sendRequest(
1326
+ "GET /body_test HTTP/1.1\r\n"
1327
+ "Connection: keep-alive\r\n"
1328
+ "Host: foo\r\n"
1329
+ "Content-Length: 2\r\n\r\n"
1330
+ "ok");
1331
+ string header = readResponseHeader();
1332
+ ensure(containsSubstring(header, "Connection: keep-alive"));
1333
+ }
1334
+
1335
+ TEST_METHOD(73) {
1336
+ set_test_name("If the request body is not fully read, keep-alive is not possible");
1337
+
1338
+ connectToServer();
1339
+ sendRequest(
1340
+ "GET / HTTP/1.1\r\n"
1341
+ "Connection: keep-alive\r\n"
1342
+ "Host: foo\r\n"
1343
+ "Content-Length: 2\r\n\r\n");
1344
+ string header = readResponseHeader();
1345
+ ensure(containsSubstring(header, "Connection: close"));
1346
+ }
1347
+
1348
+ TEST_METHOD(74) {
1349
+ set_test_name("It defaults to not using keep-alive for HTTP <= 1.0 requests");
1350
+
1351
+ connectToServer();
1352
+ sendRequest(
1353
+ "GET / HTTP/1.0\r\n"
1354
+ "Host: foo\r\n\r\n");
1355
+ string header = readResponseHeader();
1356
+ ensure(containsSubstring(header, "Connection: close"));
1357
+ }
1358
+
1359
+ TEST_METHOD(75) {
1360
+ set_test_name("It defaults to using keep-alive for HTTP >= 1.1 requests");
1361
+
1362
+ connectToServer();
1363
+ sendRequest(
1364
+ "GET / HTTP/1.1\r\n"
1365
+ "Host: foo\r\n\r\n");
1366
+ string header = readResponseHeader();
1367
+ ensure(containsSubstring(header, "Connection: keep-alive"));
1368
+ }
1369
+
1370
+ TEST_METHOD(76) {
1371
+ set_test_name("writeSimpleResponse() doesn't output the body for HEAD requests");
1372
+
1373
+ connectToServer();
1374
+ sendRequest(
1375
+ "HEAD / HTTP/1.1\r\n"
1376
+ "Connection: close\r\n"
1377
+ "Host: foo\r\n\r\n");
1378
+ string response = readAll(fd);
1379
+ ensure_equals(response,
1380
+ "HTTP/1.1 200 OK\r\n"
1381
+ "Status: 200 OK\r\n"
1382
+ "Content-Type: text/plain\r\n"
1383
+ "Date: Thu, 11 Sep 2014 12:54:09 GMT\r\n"
1384
+ "Connection: close\r\n"
1385
+ "Content-Length: 7\r\n\r\n");
1386
+ }
1387
+
1388
+ TEST_METHOD(77) {
1389
+ set_test_name("Client socket write error handling");
1390
+
1391
+ setLogLevel(LVL_CRIT);
1392
+ connectToServer();
1393
+ sendRequest(
1394
+ "GET /large_response HTTP/1.1\r\n"
1395
+ "Connection: close\r\n"
1396
+ "Size: 1000000\r\n\r\n");
1397
+ fd.close();
1398
+
1399
+ EVENTUALLY(5,
1400
+ result = getActiveClientCount() == 0;
1401
+ );
1402
+ }
1403
+
1404
+ TEST_METHOD(78) {
1405
+ set_test_name("Upon shutting down the server, no requests will be "
1406
+ "eligible for keep-alive");
1407
+
1408
+ connectToServer();
1409
+ sendRequestAndWait(
1410
+ "GET /body_test HTTP/1.1\r\n"
1411
+ "Connection: keep-alive\r\n"
1412
+ "Content-Length: 3\r\n\r\n");
1413
+ shutdownServer();
1414
+
1415
+ sendRequest("ab\n"
1416
+ "GET / HTTP/1.1\r\n"
1417
+ "Connection: close\r\n\r\n");
1418
+ string response = readAll(fd);
1419
+ ensure("(1)", containsSubstring(response, "Connection: close"));
1420
+ ensure("(2)", !containsSubstring(response, "Connection: keep-alive"));
1421
+ ensure("(3)", !containsSubstring(response, "hello /"));
1422
+ }
1423
+
1424
+ TEST_METHOD(79) {
1425
+ set_test_name("Upon shutting down the server, requests for which the "
1426
+ "headers are being parsed are not disconnected");
1427
+
1428
+ connectToServer();
1429
+ sendRequestAndWait(
1430
+ "GET / HTTP/1.1\r\n");
1431
+ shutdownServer();
1432
+ EVENTUALLY(100,
1433
+ result = !hasResponseData();
1434
+ );
1435
+
1436
+ sendRequest("\r\n");
1437
+ string response = readAll(fd);
1438
+ ensure("(1)", containsSubstring(response, "Connection: close"));
1439
+ ensure("(2)", !containsSubstring(response, "Connection: keep-alive"));
1440
+ ensure("(3)", containsSubstring(response, "hello /"));
1441
+ }
1442
+
1443
+ TEST_METHOD(80) {
1444
+ set_test_name("Upon shutting down the server, requests for which the "
1445
+ "headers are being parsed are disconnected when they've been "
1446
+ "identified as upgraded requests");
1447
+
1448
+ connectToServer();
1449
+ sendRequestAndWait(
1450
+ "GET / HTTP/1.1\r\n"
1451
+ "Connection: upgrade\r\n"
1452
+ "Upgrade: tcp\r\n");
1453
+ shutdownServer();
1454
+ EVENTUALLY(100,
1455
+ result = !hasResponseData();
1456
+ );
1457
+
1458
+ sendRequest("\r\n");
1459
+ string response = readAll(fd);
1460
+ ensure("(1)", containsSubstring(response, "503 Service Unavailable"));
1461
+ ensure("(2)", containsSubstring(response, "Connection: close"));
1462
+ ensure("(3)", !containsSubstring(response, "Connection: keep-alive"));
1463
+ }
1464
+
1465
+ TEST_METHOD(81) {
1466
+ set_test_name("Upon shutting down the server, normal requests which "
1467
+ "are being processed are not disconnected");
1468
+
1469
+ connectToServer();
1470
+ sendRequestAndWait(
1471
+ "GET /body_test HTTP/1.1\r\n"
1472
+ "Content-Length: 2\r\n\r\n");
1473
+ shutdownServer();
1474
+ EVENTUALLY(100,
1475
+ result = !hasResponseData();
1476
+ );
1477
+
1478
+ sendRequest("ab");
1479
+ string response = readAll(fd);
1480
+ ensure("(1)", containsSubstring(response, "Connection: close"));
1481
+ ensure("(2)", !containsSubstring(response, "Connection: keep-alive"));
1482
+ ensure("(3)", containsSubstring(response, "2 bytes: ab"));
1483
+ }
1484
+
1485
+ TEST_METHOD(82) {
1486
+ set_test_name("Upon shutting down the server, upgraded requests which "
1487
+ "are being processed are disconnected");
1488
+
1489
+ setLogLevel(LVL_CRIT);
1490
+ connectToServer();
1491
+ sendRequestAndWait(
1492
+ "GET /body_test HTTP/1.1\r\n"
1493
+ "Connection: upgrade\r\n"
1494
+ "Upgrade: tcp\r\n\r\n");
1495
+ shutdownServer();
1496
+ EVENTUALLY(5,
1497
+ result = hasResponseData();
1498
+ );
1499
+
1500
+ string response = readAll(fd);
1501
+ ensure_equals(response, "");
1502
+ }
1503
+ }