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,2259 @@
1
+ /* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev
2
+ *
3
+ * Additional changes are licensed under the same terms as NGINX and
4
+ * copyright Joyent, Inc. and other Node contributors. All rights reserved.
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to
8
+ * deal in the Software without restriction, including without limitation the
9
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10
+ * sell copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in
14
+ * all copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22
+ * IN THE SOFTWARE.
23
+ */
24
+ #include <ServerKit/http_parser.h>
25
+ #include <assert.h>
26
+ #include <stddef.h>
27
+ #include <ctype.h>
28
+ #include <stdlib.h>
29
+ #include <string.h>
30
+ #include <limits.h>
31
+
32
+ #ifndef ULLONG_MAX
33
+ # define ULLONG_MAX ((boost::uint64_t) -1) /* 2^64-1 */
34
+ #endif
35
+
36
+ #ifndef MIN
37
+ # define MIN(a,b) ((a) < (b) ? (a) : (b))
38
+ #endif
39
+
40
+ #ifndef ARRAY_SIZE
41
+ # define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
42
+ #endif
43
+
44
+ #ifndef BIT_AT
45
+ # define BIT_AT(a, i) \
46
+ (!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \
47
+ (1 << ((unsigned int) (i) & 7))))
48
+ #endif
49
+
50
+ #ifndef ELEM_AT
51
+ # define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v))
52
+ #endif
53
+
54
+ #define SET_ERRNO(e) \
55
+ do { \
56
+ parser->http_errno = (e); \
57
+ } while(0)
58
+
59
+
60
+ /* Run the notify callback FOR, returning ER if it fails */
61
+ #define CALLBACK_NOTIFY_(FOR, ER) \
62
+ do { \
63
+ assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \
64
+ \
65
+ if (settings->on_##FOR) { \
66
+ if (0 != settings->on_##FOR(parser)) { \
67
+ SET_ERRNO(HPE_CB_##FOR); \
68
+ } \
69
+ \
70
+ /* We either errored above or got paused; get out */ \
71
+ if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \
72
+ return (ER); \
73
+ } \
74
+ } \
75
+ } while (0)
76
+
77
+ /* Run the notify callback FOR and consume the current byte */
78
+ #define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1)
79
+
80
+ /* Run the notify callback FOR and don't consume the current byte */
81
+ #define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data)
82
+
83
+ /* Run data callback FOR with LEN bytes, returning ER if it fails */
84
+ #define CALLBACK_DATA_(FOR, LEN, ER) \
85
+ do { \
86
+ assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \
87
+ \
88
+ if (FOR##_mark) { \
89
+ if (settings->on_##FOR) { \
90
+ if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \
91
+ SET_ERRNO(HPE_CB_##FOR); \
92
+ } \
93
+ \
94
+ /* We either errored above or got paused; get out */ \
95
+ if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \
96
+ return (ER); \
97
+ } \
98
+ } \
99
+ FOR##_mark = NULL; \
100
+ } \
101
+ } while (0)
102
+
103
+ /* Run the data callback FOR and consume the current byte */
104
+ #define CALLBACK_DATA(FOR) \
105
+ CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)
106
+
107
+ /* Run the data callback FOR and don't consume the current byte */
108
+ #define CALLBACK_DATA_NOADVANCE(FOR) \
109
+ CALLBACK_DATA_(FOR, p - FOR##_mark, p - data)
110
+
111
+ /* Set the mark FOR; non-destructive if mark is already set */
112
+ #define MARK(FOR) \
113
+ do { \
114
+ if (!FOR##_mark) { \
115
+ FOR##_mark = p; \
116
+ } \
117
+ } while (0)
118
+
119
+
120
+ #define PROXY_CONNECTION "proxy-connection"
121
+ #define CONNECTION "connection"
122
+ #define CONTENT_LENGTH "content-length"
123
+ #define TRANSFER_ENCODING "transfer-encoding"
124
+ #define UPGRADE "upgrade"
125
+ #define CHUNKED "chunked"
126
+ #define KEEP_ALIVE "keep-alive"
127
+ #define CLOSE "close"
128
+
129
+
130
+ static const char *method_strings[] =
131
+ {
132
+ #define XX(num, name, string) #string,
133
+ HTTP_METHOD_MAP(XX)
134
+ #undef XX
135
+ };
136
+
137
+
138
+ /* Tokens as defined by rfc 2616. Also lowercases them.
139
+ * token = 1*<any CHAR except CTLs or separators>
140
+ * separators = "(" | ")" | "<" | ">" | "@"
141
+ * | "," | ";" | ":" | "\" | <">
142
+ * | "/" | "[" | "]" | "?" | "="
143
+ * | "{" | "}" | SP | HT
144
+ */
145
+ static const char tokens[256] = {
146
+ /* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */
147
+ 0, 0, 0, 0, 0, 0, 0, 0,
148
+ /* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */
149
+ 0, 0, 0, 0, 0, 0, 0, 0,
150
+ /* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */
151
+ 0, 0, 0, 0, 0, 0, 0, 0,
152
+ /* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */
153
+ 0, 0, 0, 0, 0, 0, 0, 0,
154
+ /* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */
155
+ 0, '!', 0, '#', '$', '%', '&', '\'',
156
+ /* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */
157
+ 0, 0, '*', '+', 0, '-', '.', 0,
158
+ /* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */
159
+ '0', '1', '2', '3', '4', '5', '6', '7',
160
+ /* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */
161
+ '8', '9', 0, 0, 0, 0, 0, 0,
162
+ /* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */
163
+ 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
164
+ /* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */
165
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
166
+ /* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */
167
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
168
+ /* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */
169
+ 'x', 'y', 'z', 0, 0, 0, '^', '_',
170
+ /* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */
171
+ '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
172
+ /* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */
173
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
174
+ /* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */
175
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
176
+ /* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */
177
+ 'x', 'y', 'z', 0, '|', 0, '~', 0 };
178
+
179
+
180
+ static const int8_t unhex[256] =
181
+ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
182
+ ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
183
+ ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
184
+ , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1
185
+ ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
186
+ ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
187
+ ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
188
+ ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
189
+ };
190
+
191
+
192
+ #if HTTP_PARSER_STRICT
193
+ # define T(v) 0
194
+ #else
195
+ # define T(v) v
196
+ #endif
197
+
198
+
199
+ static const boost::uint8_t normal_url_char[32] = {
200
+ /* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */
201
+ 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
202
+ /* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */
203
+ 0 | T(2) | 0 | 0 | T(16) | 0 | 0 | 0,
204
+ /* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */
205
+ 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
206
+ /* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */
207
+ 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
208
+ /* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */
209
+ 0 | 2 | 4 | 0 | 16 | 32 | 64 | 128,
210
+ /* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */
211
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
212
+ /* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */
213
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
214
+ /* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */
215
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0,
216
+ /* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */
217
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
218
+ /* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */
219
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
220
+ /* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */
221
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
222
+ /* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */
223
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
224
+ /* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */
225
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
226
+ /* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */
227
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
228
+ /* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */
229
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
230
+ /* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */
231
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, };
232
+
233
+ #undef T
234
+
235
+ enum state
236
+ { s_dead = 1 /* important that this is > 0 */
237
+
238
+ , s_start_req_or_res
239
+ , s_res_or_resp_H
240
+ , s_start_res
241
+ , s_res_H
242
+ , s_res_HT
243
+ , s_res_HTT
244
+ , s_res_HTTP
245
+ , s_res_first_http_major
246
+ , s_res_http_major
247
+ , s_res_first_http_minor
248
+ , s_res_http_minor
249
+ , s_res_first_status_code
250
+ , s_res_status_code
251
+ , s_res_status_start
252
+ , s_res_status
253
+ , s_res_line_almost_done
254
+
255
+ , s_start_req
256
+
257
+ , s_req_method
258
+ , s_req_spaces_before_url
259
+ , s_req_schema
260
+ , s_req_schema_slash
261
+ , s_req_schema_slash_slash
262
+ , s_req_server_start
263
+ , s_req_server
264
+ , s_req_server_with_at
265
+ , s_req_path
266
+ , s_req_query_string_start
267
+ , s_req_query_string
268
+ , s_req_fragment_start
269
+ , s_req_fragment
270
+ , s_req_http_start
271
+ , s_req_http_H
272
+ , s_req_http_HT
273
+ , s_req_http_HTT
274
+ , s_req_http_HTTP
275
+ , s_req_first_http_major
276
+ , s_req_http_major
277
+ , s_req_first_http_minor
278
+ , s_req_http_minor
279
+ , s_req_line_almost_done
280
+
281
+ , s_header_field_start
282
+ , s_header_field
283
+ , s_header_value_discard_ws
284
+ , s_header_value_discard_ws_almost_done
285
+ , s_header_value_discard_lws
286
+ , s_header_value_start
287
+ , s_header_value
288
+ , s_header_value_lws
289
+
290
+ , s_header_almost_done
291
+
292
+ , s_chunk_size_start
293
+ , s_chunk_size
294
+ , s_chunk_parameters
295
+ , s_chunk_size_almost_done
296
+
297
+ , s_headers_almost_done
298
+ , s_headers_done
299
+
300
+ /* Important: 's_headers_done' must be the last 'header' state. All
301
+ * states beyond this must be 'body' states. It is used for overflow
302
+ * checking. See the PARSING_HEADER() macro.
303
+ */
304
+
305
+ , s_chunk_data
306
+ , s_chunk_data_almost_done
307
+ , s_chunk_data_done
308
+
309
+ , s_body_identity
310
+ , s_body_identity_eof
311
+
312
+ , s_message_done
313
+ };
314
+
315
+
316
+ #define PARSING_HEADER(state) (state <= s_headers_done)
317
+
318
+
319
+ enum header_states
320
+ { h_general = 0
321
+ , h_C
322
+ , h_CO
323
+ , h_CON
324
+
325
+ , h_matching_connection
326
+ , h_matching_proxy_connection
327
+ , h_matching_content_length
328
+ , h_matching_transfer_encoding
329
+ , h_matching_upgrade
330
+
331
+ , h_connection
332
+ , h_content_length
333
+ , h_transfer_encoding
334
+ , h_upgrade
335
+
336
+ , h_matching_transfer_encoding_chunked
337
+ , h_matching_connection_keep_alive
338
+ , h_matching_connection_close
339
+
340
+ , h_transfer_encoding_chunked
341
+ , h_connection_keep_alive
342
+ , h_connection_close
343
+ };
344
+
345
+ enum http_host_state
346
+ {
347
+ s_http_host_dead = 1
348
+ , s_http_userinfo_start
349
+ , s_http_userinfo
350
+ , s_http_host_start
351
+ , s_http_host_v6_start
352
+ , s_http_host
353
+ , s_http_host_v6
354
+ , s_http_host_v6_end
355
+ , s_http_host_port_start
356
+ , s_http_host_port
357
+ };
358
+
359
+ /* Macros for character classes; depends on strict-mode */
360
+ #define CR '\r'
361
+ #define LF '\n'
362
+ #define LOWER(c) (unsigned char)(c | 0x20)
363
+ #define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z')
364
+ #define IS_NUM(c) ((c) >= '0' && (c) <= '9')
365
+ #define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c))
366
+ #define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f'))
367
+ #define IS_MARK(c) ((c) == '-' || (c) == '_' || (c) == '.' || \
368
+ (c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \
369
+ (c) == ')')
370
+ #define IS_USERINFO_CHAR(c) (IS_ALPHANUM(c) || IS_MARK(c) || (c) == '%' || \
371
+ (c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \
372
+ (c) == '$' || (c) == ',')
373
+
374
+ #if HTTP_PARSER_STRICT
375
+ #define TOKEN(c) (tokens[(unsigned char)c])
376
+ #define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c))
377
+ #define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-')
378
+ #else
379
+ #define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c])
380
+ #define IS_URL_CHAR(c) \
381
+ (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80))
382
+ #define IS_HOST_CHAR(c) \
383
+ (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_')
384
+ #endif
385
+
386
+
387
+ #define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
388
+
389
+
390
+ #if HTTP_PARSER_STRICT
391
+ # define STRICT_CHECK(cond) \
392
+ do { \
393
+ if (cond) { \
394
+ SET_ERRNO(HPE_STRICT); \
395
+ goto error; \
396
+ } \
397
+ } while (0)
398
+ # define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead)
399
+ #else
400
+ # define STRICT_CHECK(cond)
401
+ # define NEW_MESSAGE() start_state
402
+ #endif
403
+
404
+
405
+ /* Map errno values to strings for human-readable output */
406
+ #define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s },
407
+ static struct {
408
+ const char *name;
409
+ const char *description;
410
+ } http_strerror_tab[] = {
411
+ HTTP_ERRNO_MAP(HTTP_STRERROR_GEN)
412
+ };
413
+ #undef HTTP_STRERROR_GEN
414
+
415
+ int http_message_needs_eof(const http_parser *parser);
416
+
417
+ /* Our URL parser.
418
+ *
419
+ * This is designed to be shared by http_parser_execute() for URL validation,
420
+ * hence it has a state transition + byte-for-byte interface. In addition, it
421
+ * is meant to be embedded in http_parser_parse_url(), which does the dirty
422
+ * work of turning state transitions URL components for its API.
423
+ *
424
+ * This function should only be invoked with non-space characters. It is
425
+ * assumed that the caller cares about (and can detect) the transition between
426
+ * URL and non-URL states by looking for these.
427
+ */
428
+ static enum state
429
+ parse_url_char(enum state s, const char ch)
430
+ {
431
+ if (ch == ' ' || ch == '\r' || ch == '\n') {
432
+ return s_dead;
433
+ }
434
+
435
+ #if HTTP_PARSER_STRICT
436
+ if (ch == '\t' || ch == '\f') {
437
+ return s_dead;
438
+ }
439
+ #endif
440
+
441
+ switch (s) {
442
+ case s_req_spaces_before_url:
443
+ /* Proxied requests are followed by scheme of an absolute URI (alpha).
444
+ * All methods except CONNECT are followed by '/' or '*'.
445
+ */
446
+
447
+ if (ch == '/' || ch == '*') {
448
+ return s_req_path;
449
+ }
450
+
451
+ if (IS_ALPHA(ch)) {
452
+ return s_req_schema;
453
+ }
454
+
455
+ break;
456
+
457
+ case s_req_schema:
458
+ if (IS_ALPHA(ch)) {
459
+ return s;
460
+ }
461
+
462
+ if (ch == ':') {
463
+ return s_req_schema_slash;
464
+ }
465
+
466
+ break;
467
+
468
+ case s_req_schema_slash:
469
+ if (ch == '/') {
470
+ return s_req_schema_slash_slash;
471
+ }
472
+
473
+ break;
474
+
475
+ case s_req_schema_slash_slash:
476
+ if (ch == '/') {
477
+ return s_req_server_start;
478
+ }
479
+
480
+ break;
481
+
482
+ case s_req_server_with_at:
483
+ if (ch == '@') {
484
+ return s_dead;
485
+ }
486
+
487
+ /* FALLTHROUGH */
488
+ case s_req_server_start:
489
+ case s_req_server:
490
+ if (ch == '/') {
491
+ return s_req_path;
492
+ }
493
+
494
+ if (ch == '?') {
495
+ return s_req_query_string_start;
496
+ }
497
+
498
+ if (ch == '@') {
499
+ return s_req_server_with_at;
500
+ }
501
+
502
+ if (IS_USERINFO_CHAR(ch) || ch == '[' || ch == ']') {
503
+ return s_req_server;
504
+ }
505
+
506
+ break;
507
+
508
+ case s_req_path:
509
+ if (IS_URL_CHAR(ch)) {
510
+ return s;
511
+ }
512
+
513
+ switch (ch) {
514
+ case '?':
515
+ return s_req_query_string_start;
516
+
517
+ case '#':
518
+ return s_req_fragment_start;
519
+ }
520
+
521
+ break;
522
+
523
+ case s_req_query_string_start:
524
+ case s_req_query_string:
525
+ if (IS_URL_CHAR(ch)) {
526
+ return s_req_query_string;
527
+ }
528
+
529
+ switch (ch) {
530
+ case '?':
531
+ /* allow extra '?' in query string */
532
+ return s_req_query_string;
533
+
534
+ case '#':
535
+ return s_req_fragment_start;
536
+ }
537
+
538
+ break;
539
+
540
+ case s_req_fragment_start:
541
+ if (IS_URL_CHAR(ch)) {
542
+ return s_req_fragment;
543
+ }
544
+
545
+ switch (ch) {
546
+ case '?':
547
+ return s_req_fragment;
548
+
549
+ case '#':
550
+ return s;
551
+ }
552
+
553
+ break;
554
+
555
+ case s_req_fragment:
556
+ if (IS_URL_CHAR(ch)) {
557
+ return s;
558
+ }
559
+
560
+ switch (ch) {
561
+ case '?':
562
+ case '#':
563
+ return s;
564
+ }
565
+
566
+ break;
567
+
568
+ default:
569
+ break;
570
+ }
571
+
572
+ /* We should never fall out of the switch above unless there's an error */
573
+ return s_dead;
574
+ }
575
+
576
+ size_t http_parser_execute (http_parser *parser,
577
+ const http_parser_settings *settings,
578
+ const char *data,
579
+ size_t len)
580
+ {
581
+ char c, ch;
582
+ int8_t unhex_val;
583
+ const char *p = data;
584
+ const char *header_field_mark = 0;
585
+ const char *header_value_mark = 0;
586
+ const char *url_mark = 0;
587
+ const char *body_mark = 0;
588
+ const char *status_mark = 0;
589
+
590
+ /* We're in an error state. Don't bother doing anything. */
591
+ if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {
592
+ return 0;
593
+ }
594
+
595
+ if (len == 0) {
596
+ switch (parser->state) {
597
+ case s_body_identity_eof:
598
+ /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if
599
+ * we got paused.
600
+ */
601
+ CALLBACK_NOTIFY_NOADVANCE(message_complete);
602
+ return 0;
603
+
604
+ case s_dead:
605
+ case s_start_req_or_res:
606
+ case s_start_res:
607
+ case s_start_req:
608
+ return 0;
609
+
610
+ default:
611
+ SET_ERRNO(HPE_INVALID_EOF_STATE);
612
+ return 1;
613
+ }
614
+ }
615
+
616
+
617
+ if (parser->state == s_header_field)
618
+ header_field_mark = data;
619
+ if (parser->state == s_header_value)
620
+ header_value_mark = data;
621
+ switch (parser->state) {
622
+ case s_req_path:
623
+ case s_req_schema:
624
+ case s_req_schema_slash:
625
+ case s_req_schema_slash_slash:
626
+ case s_req_server_start:
627
+ case s_req_server:
628
+ case s_req_server_with_at:
629
+ case s_req_query_string_start:
630
+ case s_req_query_string:
631
+ case s_req_fragment_start:
632
+ case s_req_fragment:
633
+ url_mark = data;
634
+ break;
635
+ case s_res_status:
636
+ status_mark = data;
637
+ break;
638
+ }
639
+
640
+ for (p=data; p != data + len; p++) {
641
+ ch = *p;
642
+
643
+ if (PARSING_HEADER(parser->state)) {
644
+ ++parser->nread;
645
+ /* Don't allow the total size of the HTTP headers (including the status
646
+ * line) to exceed HTTP_MAX_HEADER_SIZE. This check is here to protect
647
+ * embedders against denial-of-service attacks where the attacker feeds
648
+ * us a never-ending header that the embedder keeps buffering.
649
+ *
650
+ * This check is arguably the responsibility of embedders but we're doing
651
+ * it on the embedder's behalf because most won't bother and this way we
652
+ * make the web a little safer. HTTP_MAX_HEADER_SIZE is still far bigger
653
+ * than any reasonable request or response so this should never affect
654
+ * day-to-day operation.
655
+ */
656
+ if (parser->nread > (HTTP_MAX_HEADER_SIZE)) {
657
+ SET_ERRNO(HPE_HEADER_OVERFLOW);
658
+ goto error;
659
+ }
660
+ }
661
+
662
+ reexecute_byte:
663
+ switch (parser->state) {
664
+
665
+ case s_dead:
666
+ /* this state is used after a 'Connection: close' message
667
+ * the parser will error out if it reads another message
668
+ */
669
+ if (ch == CR || ch == LF)
670
+ break;
671
+
672
+ SET_ERRNO(HPE_CLOSED_CONNECTION);
673
+ goto error;
674
+
675
+ case s_start_req_or_res:
676
+ {
677
+ if (ch == CR || ch == LF)
678
+ break;
679
+ parser->flags = 0;
680
+ parser->content_length = ULLONG_MAX;
681
+
682
+ if (ch == 'H') {
683
+ parser->state = s_res_or_resp_H;
684
+
685
+ CALLBACK_NOTIFY(message_begin);
686
+ } else {
687
+ parser->type = HTTP_REQUEST;
688
+ parser->state = s_start_req;
689
+ goto reexecute_byte;
690
+ }
691
+
692
+ break;
693
+ }
694
+
695
+ case s_res_or_resp_H:
696
+ if (ch == 'T') {
697
+ parser->type = HTTP_RESPONSE;
698
+ parser->state = s_res_HT;
699
+ } else {
700
+ if (ch != 'E') {
701
+ SET_ERRNO(HPE_INVALID_CONSTANT);
702
+ goto error;
703
+ }
704
+
705
+ parser->type = HTTP_REQUEST;
706
+ parser->method = HTTP_HEAD;
707
+ parser->index = 2;
708
+ parser->state = s_req_method;
709
+ }
710
+ break;
711
+
712
+ case s_start_res:
713
+ {
714
+ parser->flags = 0;
715
+ parser->content_length = ULLONG_MAX;
716
+
717
+ switch (ch) {
718
+ case 'H':
719
+ parser->state = s_res_H;
720
+ break;
721
+
722
+ case CR:
723
+ case LF:
724
+ break;
725
+
726
+ default:
727
+ SET_ERRNO(HPE_INVALID_CONSTANT);
728
+ goto error;
729
+ }
730
+
731
+ CALLBACK_NOTIFY(message_begin);
732
+ break;
733
+ }
734
+
735
+ case s_res_H:
736
+ STRICT_CHECK(ch != 'T');
737
+ parser->state = s_res_HT;
738
+ break;
739
+
740
+ case s_res_HT:
741
+ STRICT_CHECK(ch != 'T');
742
+ parser->state = s_res_HTT;
743
+ break;
744
+
745
+ case s_res_HTT:
746
+ STRICT_CHECK(ch != 'P');
747
+ parser->state = s_res_HTTP;
748
+ break;
749
+
750
+ case s_res_HTTP:
751
+ STRICT_CHECK(ch != '/');
752
+ parser->state = s_res_first_http_major;
753
+ break;
754
+
755
+ case s_res_first_http_major:
756
+ if (ch < '0' || ch > '9') {
757
+ SET_ERRNO(HPE_INVALID_VERSION);
758
+ goto error;
759
+ }
760
+
761
+ parser->http_major = ch - '0';
762
+ parser->state = s_res_http_major;
763
+ break;
764
+
765
+ /* major HTTP version or dot */
766
+ case s_res_http_major:
767
+ {
768
+ if (ch == '.') {
769
+ parser->state = s_res_first_http_minor;
770
+ break;
771
+ }
772
+
773
+ if (!IS_NUM(ch)) {
774
+ SET_ERRNO(HPE_INVALID_VERSION);
775
+ goto error;
776
+ }
777
+
778
+ parser->http_major *= 10;
779
+ parser->http_major += ch - '0';
780
+
781
+ if (parser->http_major > 999) {
782
+ SET_ERRNO(HPE_INVALID_VERSION);
783
+ goto error;
784
+ }
785
+
786
+ break;
787
+ }
788
+
789
+ /* first digit of minor HTTP version */
790
+ case s_res_first_http_minor:
791
+ if (!IS_NUM(ch)) {
792
+ SET_ERRNO(HPE_INVALID_VERSION);
793
+ goto error;
794
+ }
795
+
796
+ parser->http_minor = ch - '0';
797
+ parser->state = s_res_http_minor;
798
+ break;
799
+
800
+ /* minor HTTP version or end of request line */
801
+ case s_res_http_minor:
802
+ {
803
+ if (ch == ' ') {
804
+ parser->state = s_res_first_status_code;
805
+ break;
806
+ }
807
+
808
+ if (!IS_NUM(ch)) {
809
+ SET_ERRNO(HPE_INVALID_VERSION);
810
+ goto error;
811
+ }
812
+
813
+ parser->http_minor *= 10;
814
+ parser->http_minor += ch - '0';
815
+
816
+ if (parser->http_minor > 999) {
817
+ SET_ERRNO(HPE_INVALID_VERSION);
818
+ goto error;
819
+ }
820
+
821
+ break;
822
+ }
823
+
824
+ case s_res_first_status_code:
825
+ {
826
+ if (!IS_NUM(ch)) {
827
+ if (ch == ' ') {
828
+ break;
829
+ }
830
+
831
+ SET_ERRNO(HPE_INVALID_STATUS);
832
+ goto error;
833
+ }
834
+ parser->status_code = ch - '0';
835
+ parser->state = s_res_status_code;
836
+ break;
837
+ }
838
+
839
+ case s_res_status_code:
840
+ {
841
+ if (!IS_NUM(ch)) {
842
+ switch (ch) {
843
+ case ' ':
844
+ parser->state = s_res_status_start;
845
+ break;
846
+ case CR:
847
+ parser->state = s_res_line_almost_done;
848
+ break;
849
+ case LF:
850
+ parser->state = s_header_field_start;
851
+ break;
852
+ default:
853
+ SET_ERRNO(HPE_INVALID_STATUS);
854
+ goto error;
855
+ }
856
+ break;
857
+ }
858
+
859
+ parser->status_code *= 10;
860
+ parser->status_code += ch - '0';
861
+
862
+ if (parser->status_code > 999) {
863
+ SET_ERRNO(HPE_INVALID_STATUS);
864
+ goto error;
865
+ }
866
+
867
+ break;
868
+ }
869
+
870
+ case s_res_status_start:
871
+ {
872
+ if (ch == CR) {
873
+ parser->state = s_res_line_almost_done;
874
+ break;
875
+ }
876
+
877
+ if (ch == LF) {
878
+ parser->state = s_header_field_start;
879
+ break;
880
+ }
881
+
882
+ MARK(status);
883
+ parser->state = s_res_status;
884
+ parser->index = 0;
885
+ break;
886
+ }
887
+
888
+ case s_res_status:
889
+ if (ch == CR) {
890
+ parser->state = s_res_line_almost_done;
891
+ CALLBACK_DATA(status);
892
+ break;
893
+ }
894
+
895
+ if (ch == LF) {
896
+ parser->state = s_header_field_start;
897
+ CALLBACK_DATA(status);
898
+ break;
899
+ }
900
+
901
+ break;
902
+
903
+ case s_res_line_almost_done:
904
+ STRICT_CHECK(ch != LF);
905
+ parser->state = s_header_field_start;
906
+ break;
907
+
908
+ case s_start_req:
909
+ {
910
+ if (ch == CR || ch == LF)
911
+ break;
912
+ parser->flags = 0;
913
+ parser->content_length = ULLONG_MAX;
914
+
915
+ if (!IS_ALPHA(ch)) {
916
+ SET_ERRNO(HPE_INVALID_METHOD);
917
+ goto error;
918
+ }
919
+
920
+ parser->method = (enum http_method) 0;
921
+ parser->index = 1;
922
+ switch (ch) {
923
+ case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break;
924
+ case 'D': parser->method = HTTP_DELETE; break;
925
+ case 'G': parser->method = HTTP_GET; break;
926
+ case 'H': parser->method = HTTP_HEAD; break;
927
+ case 'L': parser->method = HTTP_LOCK; break;
928
+ case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH, MKCALENDAR */ break;
929
+ case 'N': parser->method = HTTP_NOTIFY; break;
930
+ case 'O': parser->method = HTTP_OPTIONS; break;
931
+ case 'P': parser->method = HTTP_POST;
932
+ /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */
933
+ break;
934
+ case 'R': parser->method = HTTP_REPORT; break;
935
+ case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break;
936
+ case 'T': parser->method = HTTP_TRACE; break;
937
+ case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break;
938
+ default:
939
+ SET_ERRNO(HPE_INVALID_METHOD);
940
+ goto error;
941
+ }
942
+ parser->state = s_req_method;
943
+
944
+ CALLBACK_NOTIFY(message_begin);
945
+
946
+ break;
947
+ }
948
+
949
+ case s_req_method:
950
+ {
951
+ const char *matcher;
952
+ if (ch == '\0') {
953
+ SET_ERRNO(HPE_INVALID_METHOD);
954
+ goto error;
955
+ }
956
+
957
+ matcher = method_strings[parser->method];
958
+ if (ch == ' ' && matcher[parser->index] == '\0') {
959
+ parser->state = s_req_spaces_before_url;
960
+ } else if (ch == matcher[parser->index]) {
961
+ ; /* nada */
962
+ } else if (parser->method == HTTP_CONNECT) {
963
+ if (parser->index == 1 && ch == 'H') {
964
+ parser->method = HTTP_CHECKOUT;
965
+ } else if (parser->index == 2 && ch == 'P') {
966
+ parser->method = HTTP_COPY;
967
+ } else {
968
+ SET_ERRNO(HPE_INVALID_METHOD);
969
+ goto error;
970
+ }
971
+ } else if (parser->method == HTTP_MKCOL) {
972
+ if (parser->index == 1 && ch == 'O') {
973
+ parser->method = HTTP_MOVE;
974
+ } else if (parser->index == 1 && ch == 'E') {
975
+ parser->method = HTTP_MERGE;
976
+ } else if (parser->index == 1 && ch == '-') {
977
+ parser->method = HTTP_MSEARCH;
978
+ } else if (parser->index == 2 && ch == 'A') {
979
+ parser->method = HTTP_MKACTIVITY;
980
+ } else if (parser->index == 3 && ch == 'A') {
981
+ parser->method = HTTP_MKCALENDAR;
982
+ } else {
983
+ SET_ERRNO(HPE_INVALID_METHOD);
984
+ goto error;
985
+ }
986
+ } else if (parser->method == HTTP_SUBSCRIBE) {
987
+ if (parser->index == 1 && ch == 'E') {
988
+ parser->method = HTTP_SEARCH;
989
+ } else {
990
+ SET_ERRNO(HPE_INVALID_METHOD);
991
+ goto error;
992
+ }
993
+ } else if (parser->index == 1 && parser->method == HTTP_POST) {
994
+ if (ch == 'R') {
995
+ parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */
996
+ } else if (ch == 'U') {
997
+ parser->method = HTTP_PUT; /* or HTTP_PURGE */
998
+ } else if (ch == 'A') {
999
+ parser->method = HTTP_PATCH;
1000
+ } else {
1001
+ SET_ERRNO(HPE_INVALID_METHOD);
1002
+ goto error;
1003
+ }
1004
+ } else if (parser->index == 2) {
1005
+ if (parser->method == HTTP_PUT) {
1006
+ if (ch == 'R') {
1007
+ parser->method = HTTP_PURGE;
1008
+ } else {
1009
+ SET_ERRNO(HPE_INVALID_METHOD);
1010
+ goto error;
1011
+ }
1012
+ } else if (parser->method == HTTP_UNLOCK) {
1013
+ if (ch == 'S') {
1014
+ parser->method = HTTP_UNSUBSCRIBE;
1015
+ } else {
1016
+ SET_ERRNO(HPE_INVALID_METHOD);
1017
+ goto error;
1018
+ }
1019
+ } else {
1020
+ SET_ERRNO(HPE_INVALID_METHOD);
1021
+ goto error;
1022
+ }
1023
+ } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') {
1024
+ parser->method = HTTP_PROPPATCH;
1025
+ } else {
1026
+ SET_ERRNO(HPE_INVALID_METHOD);
1027
+ goto error;
1028
+ }
1029
+
1030
+ ++parser->index;
1031
+ break;
1032
+ }
1033
+
1034
+ case s_req_spaces_before_url:
1035
+ {
1036
+ if (ch == ' ') break;
1037
+
1038
+ MARK(url);
1039
+ if (parser->method == HTTP_CONNECT) {
1040
+ parser->state = s_req_server_start;
1041
+ }
1042
+
1043
+ parser->state = parse_url_char((enum state)parser->state, ch);
1044
+ if (parser->state == s_dead) {
1045
+ SET_ERRNO(HPE_INVALID_URL);
1046
+ goto error;
1047
+ }
1048
+
1049
+ break;
1050
+ }
1051
+
1052
+ case s_req_schema:
1053
+ case s_req_schema_slash:
1054
+ case s_req_schema_slash_slash:
1055
+ case s_req_server_start:
1056
+ {
1057
+ switch (ch) {
1058
+ /* No whitespace allowed here */
1059
+ case ' ':
1060
+ case CR:
1061
+ case LF:
1062
+ SET_ERRNO(HPE_INVALID_URL);
1063
+ goto error;
1064
+ default:
1065
+ parser->state = parse_url_char((enum state)parser->state, ch);
1066
+ if (parser->state == s_dead) {
1067
+ SET_ERRNO(HPE_INVALID_URL);
1068
+ goto error;
1069
+ }
1070
+ }
1071
+
1072
+ break;
1073
+ }
1074
+
1075
+ case s_req_server:
1076
+ case s_req_server_with_at:
1077
+ case s_req_path:
1078
+ case s_req_query_string_start:
1079
+ case s_req_query_string:
1080
+ case s_req_fragment_start:
1081
+ case s_req_fragment:
1082
+ {
1083
+ switch (ch) {
1084
+ case ' ':
1085
+ parser->state = s_req_http_start;
1086
+ CALLBACK_DATA(url);
1087
+ break;
1088
+ case CR:
1089
+ case LF:
1090
+ parser->http_major = 0;
1091
+ parser->http_minor = 9;
1092
+ parser->state = (ch == CR) ?
1093
+ s_req_line_almost_done :
1094
+ s_header_field_start;
1095
+ CALLBACK_DATA(url);
1096
+ break;
1097
+ default:
1098
+ parser->state = parse_url_char((enum state)parser->state, ch);
1099
+ if (parser->state == s_dead) {
1100
+ SET_ERRNO(HPE_INVALID_URL);
1101
+ goto error;
1102
+ }
1103
+ }
1104
+ break;
1105
+ }
1106
+
1107
+ case s_req_http_start:
1108
+ switch (ch) {
1109
+ case 'H':
1110
+ parser->state = s_req_http_H;
1111
+ break;
1112
+ case ' ':
1113
+ break;
1114
+ default:
1115
+ SET_ERRNO(HPE_INVALID_CONSTANT);
1116
+ goto error;
1117
+ }
1118
+ break;
1119
+
1120
+ case s_req_http_H:
1121
+ STRICT_CHECK(ch != 'T');
1122
+ parser->state = s_req_http_HT;
1123
+ break;
1124
+
1125
+ case s_req_http_HT:
1126
+ STRICT_CHECK(ch != 'T');
1127
+ parser->state = s_req_http_HTT;
1128
+ break;
1129
+
1130
+ case s_req_http_HTT:
1131
+ STRICT_CHECK(ch != 'P');
1132
+ parser->state = s_req_http_HTTP;
1133
+ break;
1134
+
1135
+ case s_req_http_HTTP:
1136
+ STRICT_CHECK(ch != '/');
1137
+ parser->state = s_req_first_http_major;
1138
+ break;
1139
+
1140
+ /* first digit of major HTTP version */
1141
+ case s_req_first_http_major:
1142
+ if (ch < '1' || ch > '9') {
1143
+ SET_ERRNO(HPE_INVALID_VERSION);
1144
+ goto error;
1145
+ }
1146
+
1147
+ parser->http_major = ch - '0';
1148
+ parser->state = s_req_http_major;
1149
+ break;
1150
+
1151
+ /* major HTTP version or dot */
1152
+ case s_req_http_major:
1153
+ {
1154
+ if (ch == '.') {
1155
+ parser->state = s_req_first_http_minor;
1156
+ break;
1157
+ }
1158
+
1159
+ if (!IS_NUM(ch)) {
1160
+ SET_ERRNO(HPE_INVALID_VERSION);
1161
+ goto error;
1162
+ }
1163
+
1164
+ parser->http_major *= 10;
1165
+ parser->http_major += ch - '0';
1166
+
1167
+ if (parser->http_major > 999) {
1168
+ SET_ERRNO(HPE_INVALID_VERSION);
1169
+ goto error;
1170
+ }
1171
+
1172
+ break;
1173
+ }
1174
+
1175
+ /* first digit of minor HTTP version */
1176
+ case s_req_first_http_minor:
1177
+ if (!IS_NUM(ch)) {
1178
+ SET_ERRNO(HPE_INVALID_VERSION);
1179
+ goto error;
1180
+ }
1181
+
1182
+ parser->http_minor = ch - '0';
1183
+ parser->state = s_req_http_minor;
1184
+ break;
1185
+
1186
+ /* minor HTTP version or end of request line */
1187
+ case s_req_http_minor:
1188
+ {
1189
+ if (ch == CR) {
1190
+ parser->state = s_req_line_almost_done;
1191
+ break;
1192
+ }
1193
+
1194
+ if (ch == LF) {
1195
+ parser->state = s_header_field_start;
1196
+ break;
1197
+ }
1198
+
1199
+ /* XXX allow spaces after digit? */
1200
+
1201
+ if (!IS_NUM(ch)) {
1202
+ SET_ERRNO(HPE_INVALID_VERSION);
1203
+ goto error;
1204
+ }
1205
+
1206
+ parser->http_minor *= 10;
1207
+ parser->http_minor += ch - '0';
1208
+
1209
+ if (parser->http_minor > 999) {
1210
+ SET_ERRNO(HPE_INVALID_VERSION);
1211
+ goto error;
1212
+ }
1213
+
1214
+ break;
1215
+ }
1216
+
1217
+ /* end of request line */
1218
+ case s_req_line_almost_done:
1219
+ {
1220
+ if (ch != LF) {
1221
+ SET_ERRNO(HPE_LF_EXPECTED);
1222
+ goto error;
1223
+ }
1224
+
1225
+ parser->state = s_header_field_start;
1226
+ break;
1227
+ }
1228
+
1229
+ case s_header_field_start:
1230
+ {
1231
+ if (ch == CR) {
1232
+ parser->state = s_headers_almost_done;
1233
+ break;
1234
+ }
1235
+
1236
+ if (ch == LF) {
1237
+ /* they might be just sending \n instead of \r\n so this would be
1238
+ * the second \n to denote the end of headers*/
1239
+ parser->state = s_headers_almost_done;
1240
+ goto reexecute_byte;
1241
+ }
1242
+
1243
+ c = TOKEN(ch);
1244
+
1245
+ if (!c) {
1246
+ SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
1247
+ goto error;
1248
+ }
1249
+
1250
+ MARK(header_field);
1251
+
1252
+ parser->index = 0;
1253
+ parser->state = s_header_field;
1254
+
1255
+ switch (c) {
1256
+ case 'c':
1257
+ parser->header_state = h_C;
1258
+ break;
1259
+
1260
+ case 'p':
1261
+ parser->header_state = h_matching_proxy_connection;
1262
+ break;
1263
+
1264
+ case 't':
1265
+ parser->header_state = h_matching_transfer_encoding;
1266
+ break;
1267
+
1268
+ case 'u':
1269
+ parser->header_state = h_matching_upgrade;
1270
+ break;
1271
+
1272
+ default:
1273
+ parser->header_state = h_general;
1274
+ break;
1275
+ }
1276
+ break;
1277
+ }
1278
+
1279
+ case s_header_field:
1280
+ {
1281
+ c = TOKEN(ch);
1282
+
1283
+ if (c) {
1284
+ switch (parser->header_state) {
1285
+ case h_general:
1286
+ break;
1287
+
1288
+ case h_C:
1289
+ parser->index++;
1290
+ parser->header_state = (c == 'o' ? h_CO : h_general);
1291
+ break;
1292
+
1293
+ case h_CO:
1294
+ parser->index++;
1295
+ parser->header_state = (c == 'n' ? h_CON : h_general);
1296
+ break;
1297
+
1298
+ case h_CON:
1299
+ parser->index++;
1300
+ switch (c) {
1301
+ case 'n':
1302
+ parser->header_state = h_matching_connection;
1303
+ break;
1304
+ case 't':
1305
+ parser->header_state = h_matching_content_length;
1306
+ break;
1307
+ default:
1308
+ parser->header_state = h_general;
1309
+ break;
1310
+ }
1311
+ break;
1312
+
1313
+ /* connection */
1314
+
1315
+ case h_matching_connection:
1316
+ parser->index++;
1317
+ if (parser->index > sizeof(CONNECTION)-1
1318
+ || c != CONNECTION[parser->index]) {
1319
+ parser->header_state = h_general;
1320
+ } else if (parser->index == sizeof(CONNECTION)-2) {
1321
+ parser->header_state = h_connection;
1322
+ }
1323
+ break;
1324
+
1325
+ /* proxy-connection */
1326
+
1327
+ case h_matching_proxy_connection:
1328
+ parser->index++;
1329
+ if (parser->index > sizeof(PROXY_CONNECTION)-1
1330
+ || c != PROXY_CONNECTION[parser->index]) {
1331
+ parser->header_state = h_general;
1332
+ } else if (parser->index == sizeof(PROXY_CONNECTION)-2) {
1333
+ parser->header_state = h_connection;
1334
+ }
1335
+ break;
1336
+
1337
+ /* content-length */
1338
+
1339
+ case h_matching_content_length:
1340
+ parser->index++;
1341
+ if (parser->index > sizeof(CONTENT_LENGTH)-1
1342
+ || c != CONTENT_LENGTH[parser->index]) {
1343
+ parser->header_state = h_general;
1344
+ } else if (parser->index == sizeof(CONTENT_LENGTH)-2) {
1345
+ parser->header_state = h_content_length;
1346
+ }
1347
+ break;
1348
+
1349
+ /* transfer-encoding */
1350
+
1351
+ case h_matching_transfer_encoding:
1352
+ parser->index++;
1353
+ if (parser->index > sizeof(TRANSFER_ENCODING)-1
1354
+ || c != TRANSFER_ENCODING[parser->index]) {
1355
+ parser->header_state = h_general;
1356
+ } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) {
1357
+ parser->header_state = h_transfer_encoding;
1358
+ }
1359
+ break;
1360
+
1361
+ /* upgrade */
1362
+
1363
+ case h_matching_upgrade:
1364
+ parser->index++;
1365
+ if (parser->index > sizeof(UPGRADE)-1
1366
+ || c != UPGRADE[parser->index]) {
1367
+ parser->header_state = h_general;
1368
+ } else if (parser->index == sizeof(UPGRADE)-2) {
1369
+ parser->header_state = h_upgrade;
1370
+ }
1371
+ break;
1372
+
1373
+ case h_connection:
1374
+ case h_content_length:
1375
+ case h_transfer_encoding:
1376
+ case h_upgrade:
1377
+ if (ch != ' ') parser->header_state = h_general;
1378
+ break;
1379
+
1380
+ default:
1381
+ assert(0 && "Unknown header_state");
1382
+ break;
1383
+ }
1384
+ break;
1385
+ }
1386
+
1387
+ if (ch == ':') {
1388
+ parser->state = s_header_value_discard_ws;
1389
+ CALLBACK_DATA(header_field);
1390
+ break;
1391
+ }
1392
+
1393
+ if (ch == CR) {
1394
+ parser->state = s_header_almost_done;
1395
+ CALLBACK_DATA(header_field);
1396
+ break;
1397
+ }
1398
+
1399
+ if (ch == LF) {
1400
+ parser->state = s_header_field_start;
1401
+ CALLBACK_DATA(header_field);
1402
+ break;
1403
+ }
1404
+
1405
+ SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
1406
+ goto error;
1407
+ }
1408
+
1409
+ case s_header_value_discard_ws:
1410
+ if (ch == ' ' || ch == '\t') break;
1411
+
1412
+ if (ch == CR) {
1413
+ parser->state = s_header_value_discard_ws_almost_done;
1414
+ break;
1415
+ }
1416
+
1417
+ if (ch == LF) {
1418
+ parser->state = s_header_value_discard_lws;
1419
+ break;
1420
+ }
1421
+
1422
+ /* FALLTHROUGH */
1423
+
1424
+ case s_header_value_start:
1425
+ {
1426
+ MARK(header_value);
1427
+
1428
+ parser->state = s_header_value;
1429
+ parser->index = 0;
1430
+
1431
+ c = LOWER(ch);
1432
+
1433
+ switch (parser->header_state) {
1434
+ case h_upgrade:
1435
+ parser->flags |= F_UPGRADE;
1436
+ parser->header_state = h_general;
1437
+ break;
1438
+
1439
+ case h_transfer_encoding:
1440
+ /* looking for 'Transfer-Encoding: chunked' */
1441
+ if ('c' == c) {
1442
+ parser->header_state = h_matching_transfer_encoding_chunked;
1443
+ } else {
1444
+ parser->header_state = h_general;
1445
+ }
1446
+ break;
1447
+
1448
+ case h_content_length:
1449
+ if (!IS_NUM(ch)) {
1450
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1451
+ goto error;
1452
+ }
1453
+
1454
+ parser->content_length = ch - '0';
1455
+ break;
1456
+
1457
+ case h_connection:
1458
+ /* looking for 'Connection: keep-alive' */
1459
+ if (c == 'k') {
1460
+ parser->header_state = h_matching_connection_keep_alive;
1461
+ /* looking for 'Connection: close' */
1462
+ } else if (c == 'c') {
1463
+ parser->header_state = h_matching_connection_close;
1464
+ } else {
1465
+ parser->header_state = h_general;
1466
+ }
1467
+ break;
1468
+
1469
+ default:
1470
+ parser->header_state = h_general;
1471
+ break;
1472
+ }
1473
+ break;
1474
+ }
1475
+
1476
+ case s_header_value:
1477
+ {
1478
+
1479
+ if (ch == CR) {
1480
+ parser->state = s_header_almost_done;
1481
+ CALLBACK_DATA(header_value);
1482
+ break;
1483
+ }
1484
+
1485
+ if (ch == LF) {
1486
+ parser->state = s_header_almost_done;
1487
+ CALLBACK_DATA_NOADVANCE(header_value);
1488
+ goto reexecute_byte;
1489
+ }
1490
+
1491
+ c = LOWER(ch);
1492
+
1493
+ switch (parser->header_state) {
1494
+ case h_general:
1495
+ break;
1496
+
1497
+ case h_connection:
1498
+ case h_transfer_encoding:
1499
+ assert(0 && "Shouldn't get here.");
1500
+ break;
1501
+
1502
+ case h_content_length:
1503
+ {
1504
+ boost::uint64_t t;
1505
+
1506
+ if (ch == ' ') break;
1507
+
1508
+ if (!IS_NUM(ch)) {
1509
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1510
+ goto error;
1511
+ }
1512
+
1513
+ t = parser->content_length;
1514
+ t *= 10;
1515
+ t += ch - '0';
1516
+
1517
+ /* Overflow? Test against a conservative limit for simplicity. */
1518
+ if ((ULLONG_MAX - 10) / 10 < parser->content_length) {
1519
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1520
+ goto error;
1521
+ }
1522
+
1523
+ parser->content_length = t;
1524
+ break;
1525
+ }
1526
+
1527
+ /* Transfer-Encoding: chunked */
1528
+ case h_matching_transfer_encoding_chunked:
1529
+ parser->index++;
1530
+ if (parser->index > sizeof(CHUNKED)-1
1531
+ || c != CHUNKED[parser->index]) {
1532
+ parser->header_state = h_general;
1533
+ } else if (parser->index == sizeof(CHUNKED)-2) {
1534
+ parser->header_state = h_transfer_encoding_chunked;
1535
+ }
1536
+ break;
1537
+
1538
+ /* looking for 'Connection: keep-alive' */
1539
+ case h_matching_connection_keep_alive:
1540
+ parser->index++;
1541
+ if (parser->index > sizeof(KEEP_ALIVE)-1
1542
+ || c != KEEP_ALIVE[parser->index]) {
1543
+ parser->header_state = h_general;
1544
+ } else if (parser->index == sizeof(KEEP_ALIVE)-2) {
1545
+ parser->header_state = h_connection_keep_alive;
1546
+ }
1547
+ break;
1548
+
1549
+ /* looking for 'Connection: close' */
1550
+ case h_matching_connection_close:
1551
+ parser->index++;
1552
+ if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) {
1553
+ parser->header_state = h_general;
1554
+ } else if (parser->index == sizeof(CLOSE)-2) {
1555
+ parser->header_state = h_connection_close;
1556
+ }
1557
+ break;
1558
+
1559
+ case h_transfer_encoding_chunked:
1560
+ case h_connection_keep_alive:
1561
+ case h_connection_close:
1562
+ if (ch != ' ') parser->header_state = h_general;
1563
+ break;
1564
+
1565
+ default:
1566
+ parser->state = s_header_value;
1567
+ parser->header_state = h_general;
1568
+ break;
1569
+ }
1570
+ break;
1571
+ }
1572
+
1573
+ case s_header_almost_done:
1574
+ {
1575
+ STRICT_CHECK(ch != LF);
1576
+
1577
+ parser->state = s_header_value_lws;
1578
+ break;
1579
+ }
1580
+
1581
+ case s_header_value_lws:
1582
+ {
1583
+ if (ch == ' ' || ch == '\t') {
1584
+ parser->state = s_header_value_start;
1585
+ goto reexecute_byte;
1586
+ }
1587
+
1588
+ /* finished the header */
1589
+ switch (parser->header_state) {
1590
+ case h_connection_keep_alive:
1591
+ parser->flags |= F_CONNECTION_KEEP_ALIVE;
1592
+ break;
1593
+ case h_connection_close:
1594
+ parser->flags |= F_CONNECTION_CLOSE;
1595
+ break;
1596
+ case h_transfer_encoding_chunked:
1597
+ parser->flags |= F_CHUNKED;
1598
+ break;
1599
+ default:
1600
+ break;
1601
+ }
1602
+
1603
+ parser->state = s_header_field_start;
1604
+ goto reexecute_byte;
1605
+ }
1606
+
1607
+ case s_header_value_discard_ws_almost_done:
1608
+ {
1609
+ STRICT_CHECK(ch != LF);
1610
+ parser->state = s_header_value_discard_lws;
1611
+ break;
1612
+ }
1613
+
1614
+ case s_header_value_discard_lws:
1615
+ {
1616
+ if (ch == ' ' || ch == '\t') {
1617
+ parser->state = s_header_value_discard_ws;
1618
+ break;
1619
+ } else {
1620
+ /* header value was empty */
1621
+ MARK(header_value);
1622
+ parser->state = s_header_field_start;
1623
+ CALLBACK_DATA_NOADVANCE(header_value);
1624
+ goto reexecute_byte;
1625
+ }
1626
+ }
1627
+
1628
+ case s_headers_almost_done:
1629
+ {
1630
+ STRICT_CHECK(ch != LF);
1631
+
1632
+ if (parser->flags & F_TRAILING) {
1633
+ /* End of a chunked request */
1634
+ parser->state = NEW_MESSAGE();
1635
+ CALLBACK_NOTIFY(message_complete);
1636
+ break;
1637
+ }
1638
+
1639
+ parser->state = s_headers_done;
1640
+
1641
+ /* Set this here so that on_headers_complete() callbacks can see it */
1642
+ parser->upgrade =
1643
+ (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT);
1644
+
1645
+ /* Here we call the headers_complete callback. This is somewhat
1646
+ * different than other callbacks because if the user returns 1, we
1647
+ * will interpret that as saying that this message has no body. This
1648
+ * is needed for the annoying case of recieving a response to a HEAD
1649
+ * request.
1650
+ *
1651
+ * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so
1652
+ * we have to simulate it by handling a change in errno below.
1653
+ */
1654
+ if (settings->on_headers_complete) {
1655
+ switch (settings->on_headers_complete(parser)) {
1656
+ case 0:
1657
+ break;
1658
+
1659
+ case 1:
1660
+ parser->flags |= F_SKIPBODY;
1661
+ break;
1662
+
1663
+ default:
1664
+ SET_ERRNO(HPE_CB_headers_complete);
1665
+ return p - data; /* Error */
1666
+ }
1667
+ }
1668
+
1669
+ if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {
1670
+ return p - data;
1671
+ }
1672
+
1673
+ goto reexecute_byte;
1674
+ }
1675
+
1676
+ case s_headers_done:
1677
+ {
1678
+ STRICT_CHECK(ch != LF);
1679
+
1680
+ parser->nread = 0;
1681
+
1682
+ /* Exit, the rest of the connect is in a different protocol. */
1683
+ if (parser->upgrade) {
1684
+ parser->state = NEW_MESSAGE();
1685
+ CALLBACK_NOTIFY(message_complete);
1686
+ return (p - data) + 1;
1687
+ }
1688
+
1689
+ if (parser->flags & F_SKIPBODY) {
1690
+ parser->state = NEW_MESSAGE();
1691
+ CALLBACK_NOTIFY(message_complete);
1692
+ } else if (parser->flags & F_CHUNKED) {
1693
+ /* chunked encoding - ignore Content-Length header */
1694
+ parser->state = s_chunk_size_start;
1695
+ } else {
1696
+ if (parser->content_length == 0) {
1697
+ /* Content-Length header given but zero: Content-Length: 0\r\n */
1698
+ parser->state = NEW_MESSAGE();
1699
+ CALLBACK_NOTIFY(message_complete);
1700
+ } else if (parser->content_length != ULLONG_MAX) {
1701
+ /* Content-Length header given and non-zero */
1702
+ parser->state = s_body_identity;
1703
+ } else {
1704
+ if (parser->type == HTTP_REQUEST ||
1705
+ !http_message_needs_eof(parser)) {
1706
+ /* Assume content-length 0 - read the next */
1707
+ parser->state = NEW_MESSAGE();
1708
+ CALLBACK_NOTIFY(message_complete);
1709
+ } else {
1710
+ /* Read body until EOF */
1711
+ parser->state = s_body_identity_eof;
1712
+ }
1713
+ }
1714
+ }
1715
+
1716
+ break;
1717
+ }
1718
+
1719
+ case s_body_identity:
1720
+ {
1721
+ boost::uint64_t to_read = MIN(parser->content_length,
1722
+ (boost::uint64_t) ((data + len) - p));
1723
+
1724
+ assert(parser->content_length != 0
1725
+ && parser->content_length != ULLONG_MAX);
1726
+
1727
+ /* The difference between advancing content_length and p is because
1728
+ * the latter will automaticaly advance on the next loop iteration.
1729
+ * Further, if content_length ends up at 0, we want to see the last
1730
+ * byte again for our message complete callback.
1731
+ */
1732
+ MARK(body);
1733
+ parser->content_length -= to_read;
1734
+ p += to_read - 1;
1735
+
1736
+ if (parser->content_length == 0) {
1737
+ parser->state = s_message_done;
1738
+
1739
+ /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte.
1740
+ *
1741
+ * The alternative to doing this is to wait for the next byte to
1742
+ * trigger the data callback, just as in every other case. The
1743
+ * problem with this is that this makes it difficult for the test
1744
+ * harness to distinguish between complete-on-EOF and
1745
+ * complete-on-length. It's not clear that this distinction is
1746
+ * important for applications, but let's keep it for now.
1747
+ */
1748
+ CALLBACK_DATA_(body, p - body_mark + 1, p - data);
1749
+ goto reexecute_byte;
1750
+ }
1751
+
1752
+ break;
1753
+ }
1754
+
1755
+ /* read until EOF */
1756
+ case s_body_identity_eof:
1757
+ MARK(body);
1758
+ p = data + len - 1;
1759
+
1760
+ break;
1761
+
1762
+ case s_message_done:
1763
+ parser->state = NEW_MESSAGE();
1764
+ CALLBACK_NOTIFY(message_complete);
1765
+ break;
1766
+
1767
+ case s_chunk_size_start:
1768
+ {
1769
+ assert(parser->nread == 1);
1770
+ assert(parser->flags & F_CHUNKED);
1771
+
1772
+ unhex_val = unhex[(unsigned char)ch];
1773
+ if (unhex_val == -1) {
1774
+ SET_ERRNO(HPE_INVALID_CHUNK_SIZE);
1775
+ goto error;
1776
+ }
1777
+
1778
+ parser->content_length = unhex_val;
1779
+ parser->state = s_chunk_size;
1780
+ break;
1781
+ }
1782
+
1783
+ case s_chunk_size:
1784
+ {
1785
+ boost::uint64_t t;
1786
+
1787
+ assert(parser->flags & F_CHUNKED);
1788
+
1789
+ if (ch == CR) {
1790
+ parser->state = s_chunk_size_almost_done;
1791
+ break;
1792
+ }
1793
+
1794
+ unhex_val = unhex[(unsigned char)ch];
1795
+
1796
+ if (unhex_val == -1) {
1797
+ if (ch == ';' || ch == ' ') {
1798
+ parser->state = s_chunk_parameters;
1799
+ break;
1800
+ }
1801
+
1802
+ SET_ERRNO(HPE_INVALID_CHUNK_SIZE);
1803
+ goto error;
1804
+ }
1805
+
1806
+ t = parser->content_length;
1807
+ t *= 16;
1808
+ t += unhex_val;
1809
+
1810
+ /* Overflow? Test against a conservative limit for simplicity. */
1811
+ if ((ULLONG_MAX - 16) / 16 < parser->content_length) {
1812
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1813
+ goto error;
1814
+ }
1815
+
1816
+ parser->content_length = t;
1817
+ break;
1818
+ }
1819
+
1820
+ case s_chunk_parameters:
1821
+ {
1822
+ assert(parser->flags & F_CHUNKED);
1823
+ /* just ignore this shit. TODO check for overflow */
1824
+ if (ch == CR) {
1825
+ parser->state = s_chunk_size_almost_done;
1826
+ break;
1827
+ }
1828
+ break;
1829
+ }
1830
+
1831
+ case s_chunk_size_almost_done:
1832
+ {
1833
+ assert(parser->flags & F_CHUNKED);
1834
+ STRICT_CHECK(ch != LF);
1835
+
1836
+ parser->nread = 0;
1837
+
1838
+ if (parser->content_length == 0) {
1839
+ parser->flags |= F_TRAILING;
1840
+ parser->state = s_header_field_start;
1841
+ } else {
1842
+ parser->state = s_chunk_data;
1843
+ }
1844
+ break;
1845
+ }
1846
+
1847
+ case s_chunk_data:
1848
+ {
1849
+ boost::uint64_t to_read = MIN(parser->content_length,
1850
+ (boost::uint64_t) ((data + len) - p));
1851
+
1852
+ assert(parser->flags & F_CHUNKED);
1853
+ assert(parser->content_length != 0
1854
+ && parser->content_length != ULLONG_MAX);
1855
+
1856
+ /* See the explanation in s_body_identity for why the content
1857
+ * length and data pointers are managed this way.
1858
+ */
1859
+ MARK(body);
1860
+ parser->content_length -= to_read;
1861
+ p += to_read - 1;
1862
+
1863
+ if (parser->content_length == 0) {
1864
+ parser->state = s_chunk_data_almost_done;
1865
+ }
1866
+
1867
+ break;
1868
+ }
1869
+
1870
+ case s_chunk_data_almost_done:
1871
+ assert(parser->flags & F_CHUNKED);
1872
+ assert(parser->content_length == 0);
1873
+ STRICT_CHECK(ch != CR);
1874
+ parser->state = s_chunk_data_done;
1875
+ CALLBACK_DATA(body);
1876
+ break;
1877
+
1878
+ case s_chunk_data_done:
1879
+ assert(parser->flags & F_CHUNKED);
1880
+ STRICT_CHECK(ch != LF);
1881
+ parser->nread = 0;
1882
+ parser->state = s_chunk_size_start;
1883
+ break;
1884
+
1885
+ default:
1886
+ assert(0 && "unhandled state");
1887
+ SET_ERRNO(HPE_INVALID_INTERNAL_STATE);
1888
+ goto error;
1889
+ }
1890
+ }
1891
+
1892
+ /* Run callbacks for any marks that we have leftover after we ran our of
1893
+ * bytes. There should be at most one of these set, so it's OK to invoke
1894
+ * them in series (unset marks will not result in callbacks).
1895
+ *
1896
+ * We use the NOADVANCE() variety of callbacks here because 'p' has already
1897
+ * overflowed 'data' and this allows us to correct for the off-by-one that
1898
+ * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p'
1899
+ * value that's in-bounds).
1900
+ */
1901
+
1902
+ assert(((header_field_mark ? 1 : 0) +
1903
+ (header_value_mark ? 1 : 0) +
1904
+ (url_mark ? 1 : 0) +
1905
+ (body_mark ? 1 : 0) +
1906
+ (status_mark ? 1 : 0)) <= 1);
1907
+
1908
+ CALLBACK_DATA_NOADVANCE(header_field);
1909
+ CALLBACK_DATA_NOADVANCE(header_value);
1910
+ CALLBACK_DATA_NOADVANCE(url);
1911
+ CALLBACK_DATA_NOADVANCE(body);
1912
+ CALLBACK_DATA_NOADVANCE(status);
1913
+
1914
+ return len;
1915
+
1916
+ error:
1917
+ if (HTTP_PARSER_ERRNO(parser) == HPE_OK) {
1918
+ SET_ERRNO(HPE_UNKNOWN);
1919
+ }
1920
+
1921
+ return (p - data);
1922
+ }
1923
+
1924
+
1925
+ /* Does the parser need to see an EOF to find the end of the message? */
1926
+ int
1927
+ http_message_needs_eof (const http_parser *parser)
1928
+ {
1929
+ if (parser->type == HTTP_REQUEST) {
1930
+ return 0;
1931
+ }
1932
+
1933
+ /* See RFC 2616 section 4.4 */
1934
+ if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */
1935
+ parser->status_code == 204 || /* No Content */
1936
+ parser->status_code == 304 || /* Not Modified */
1937
+ parser->flags & F_SKIPBODY) { /* response to a HEAD request */
1938
+ return 0;
1939
+ }
1940
+
1941
+ if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) {
1942
+ return 0;
1943
+ }
1944
+
1945
+ return 1;
1946
+ }
1947
+
1948
+
1949
+ int
1950
+ http_should_keep_alive (const http_parser *parser)
1951
+ {
1952
+ if (parser->http_major > 0 && parser->http_minor > 0) {
1953
+ /* HTTP/1.1 */
1954
+ if (parser->flags & F_CONNECTION_CLOSE) {
1955
+ return 0;
1956
+ }
1957
+ } else {
1958
+ /* HTTP/1.0 or earlier */
1959
+ if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) {
1960
+ return 0;
1961
+ }
1962
+ }
1963
+
1964
+ return !http_message_needs_eof(parser);
1965
+ }
1966
+
1967
+
1968
+ const char *
1969
+ http_method_str (enum http_method m)
1970
+ {
1971
+ return ELEM_AT(method_strings, m, "<unknown>");
1972
+ }
1973
+
1974
+
1975
+ void
1976
+ http_parser_init (http_parser *parser, enum http_parser_type t)
1977
+ {
1978
+ void *data = parser->data; /* preserve application data */
1979
+ memset(parser, 0, sizeof(*parser));
1980
+ parser->data = data;
1981
+ parser->type = t;
1982
+ parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res));
1983
+ parser->http_errno = HPE_OK;
1984
+ }
1985
+
1986
+ const char *
1987
+ http_errno_name(enum http_errno err) {
1988
+ assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0])));
1989
+ return http_strerror_tab[err].name;
1990
+ }
1991
+
1992
+ const char *
1993
+ http_errno_description(enum http_errno err) {
1994
+ assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0])));
1995
+ return http_strerror_tab[err].description;
1996
+ }
1997
+
1998
+ static enum http_host_state
1999
+ http_parse_host_char(enum http_host_state s, const char ch) {
2000
+ switch(s) {
2001
+ case s_http_userinfo:
2002
+ case s_http_userinfo_start:
2003
+ if (ch == '@') {
2004
+ return s_http_host_start;
2005
+ }
2006
+
2007
+ if (IS_USERINFO_CHAR(ch)) {
2008
+ return s_http_userinfo;
2009
+ }
2010
+ break;
2011
+
2012
+ case s_http_host_start:
2013
+ if (ch == '[') {
2014
+ return s_http_host_v6_start;
2015
+ }
2016
+
2017
+ if (IS_HOST_CHAR(ch)) {
2018
+ return s_http_host;
2019
+ }
2020
+
2021
+ break;
2022
+
2023
+ case s_http_host:
2024
+ if (IS_HOST_CHAR(ch)) {
2025
+ return s_http_host;
2026
+ }
2027
+
2028
+ /* FALLTHROUGH */
2029
+ case s_http_host_v6_end:
2030
+ if (ch == ':') {
2031
+ return s_http_host_port_start;
2032
+ }
2033
+
2034
+ break;
2035
+
2036
+ case s_http_host_v6:
2037
+ if (ch == ']') {
2038
+ return s_http_host_v6_end;
2039
+ }
2040
+
2041
+ /* FALLTHROUGH */
2042
+ case s_http_host_v6_start:
2043
+ if (IS_HEX(ch) || ch == ':' || ch == '.') {
2044
+ return s_http_host_v6;
2045
+ }
2046
+
2047
+ break;
2048
+
2049
+ case s_http_host_port:
2050
+ case s_http_host_port_start:
2051
+ if (IS_NUM(ch)) {
2052
+ return s_http_host_port;
2053
+ }
2054
+
2055
+ break;
2056
+
2057
+ default:
2058
+ break;
2059
+ }
2060
+ return s_http_host_dead;
2061
+ }
2062
+
2063
+ static int
2064
+ http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
2065
+ enum http_host_state s;
2066
+
2067
+ const char *p;
2068
+ size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len;
2069
+
2070
+ u->field_data[UF_HOST].len = 0;
2071
+
2072
+ s = found_at ? s_http_userinfo_start : s_http_host_start;
2073
+
2074
+ for (p = buf + u->field_data[UF_HOST].off; p < buf + buflen; p++) {
2075
+ enum http_host_state new_s = http_parse_host_char(s, *p);
2076
+
2077
+ if (new_s == s_http_host_dead) {
2078
+ return 1;
2079
+ }
2080
+
2081
+ switch(new_s) {
2082
+ case s_http_host:
2083
+ if (s != s_http_host) {
2084
+ u->field_data[UF_HOST].off = p - buf;
2085
+ }
2086
+ u->field_data[UF_HOST].len++;
2087
+ break;
2088
+
2089
+ case s_http_host_v6:
2090
+ if (s != s_http_host_v6) {
2091
+ u->field_data[UF_HOST].off = p - buf;
2092
+ }
2093
+ u->field_data[UF_HOST].len++;
2094
+ break;
2095
+
2096
+ case s_http_host_port:
2097
+ if (s != s_http_host_port) {
2098
+ u->field_data[UF_PORT].off = p - buf;
2099
+ u->field_data[UF_PORT].len = 0;
2100
+ u->field_set |= (1 << UF_PORT);
2101
+ }
2102
+ u->field_data[UF_PORT].len++;
2103
+ break;
2104
+
2105
+ case s_http_userinfo:
2106
+ if (s != s_http_userinfo) {
2107
+ u->field_data[UF_USERINFO].off = p - buf ;
2108
+ u->field_data[UF_USERINFO].len = 0;
2109
+ u->field_set |= (1 << UF_USERINFO);
2110
+ }
2111
+ u->field_data[UF_USERINFO].len++;
2112
+ break;
2113
+
2114
+ default:
2115
+ break;
2116
+ }
2117
+ s = new_s;
2118
+ }
2119
+
2120
+ /* Make sure we don't end somewhere unexpected */
2121
+ switch (s) {
2122
+ case s_http_host_start:
2123
+ case s_http_host_v6_start:
2124
+ case s_http_host_v6:
2125
+ case s_http_host_port_start:
2126
+ case s_http_userinfo:
2127
+ case s_http_userinfo_start:
2128
+ return 1;
2129
+ default:
2130
+ break;
2131
+ }
2132
+
2133
+ return 0;
2134
+ }
2135
+
2136
+ int
2137
+ http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
2138
+ struct http_parser_url *u)
2139
+ {
2140
+ enum state s;
2141
+ const char *p;
2142
+ enum http_parser_url_fields uf, old_uf;
2143
+ int found_at = 0;
2144
+
2145
+ u->port = u->field_set = 0;
2146
+ s = is_connect ? s_req_server_start : s_req_spaces_before_url;
2147
+ old_uf = UF_MAX;
2148
+
2149
+ for (p = buf; p < buf + buflen; p++) {
2150
+ s = parse_url_char(s, *p);
2151
+
2152
+ /* Figure out the next field that we're operating on */
2153
+ switch (s) {
2154
+ case s_dead:
2155
+ return 1;
2156
+
2157
+ /* Skip delimeters */
2158
+ case s_req_schema_slash:
2159
+ case s_req_schema_slash_slash:
2160
+ case s_req_server_start:
2161
+ case s_req_query_string_start:
2162
+ case s_req_fragment_start:
2163
+ continue;
2164
+
2165
+ case s_req_schema:
2166
+ uf = UF_SCHEMA;
2167
+ break;
2168
+
2169
+ case s_req_server_with_at:
2170
+ found_at = 1;
2171
+
2172
+ /* FALLTROUGH */
2173
+ case s_req_server:
2174
+ uf = UF_HOST;
2175
+ break;
2176
+
2177
+ case s_req_path:
2178
+ uf = UF_PATH;
2179
+ break;
2180
+
2181
+ case s_req_query_string:
2182
+ uf = UF_QUERY;
2183
+ break;
2184
+
2185
+ case s_req_fragment:
2186
+ uf = UF_FRAGMENT;
2187
+ break;
2188
+
2189
+ default:
2190
+ assert(!"Unexpected state");
2191
+ return 1;
2192
+ }
2193
+
2194
+ /* Nothing's changed; soldier on */
2195
+ if (uf == old_uf) {
2196
+ u->field_data[uf].len++;
2197
+ continue;
2198
+ }
2199
+
2200
+ u->field_data[uf].off = p - buf;
2201
+ u->field_data[uf].len = 1;
2202
+
2203
+ u->field_set |= (1 << uf);
2204
+ old_uf = uf;
2205
+ }
2206
+
2207
+ /* host must be present if there is a schema */
2208
+ /* parsing http:///toto will fail */
2209
+ if ((u->field_set & ((1 << UF_SCHEMA) | (1 << UF_HOST))) != 0) {
2210
+ if (http_parse_host(buf, u, found_at) != 0) {
2211
+ return 1;
2212
+ }
2213
+ }
2214
+
2215
+ /* CONNECT requests can only contain "hostname:port" */
2216
+ if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) {
2217
+ return 1;
2218
+ }
2219
+
2220
+ if (u->field_set & (1 << UF_PORT)) {
2221
+ /* Don't bother with endp; we've already validated the string */
2222
+ unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10);
2223
+
2224
+ /* Ports have a max value of 2^16 */
2225
+ if (v > 0xffff) {
2226
+ return 1;
2227
+ }
2228
+
2229
+ u->port = (boost::uint16_t) v;
2230
+ }
2231
+
2232
+ return 0;
2233
+ }
2234
+
2235
+ void
2236
+ http_parser_pause(http_parser *parser, int paused) {
2237
+ /* Users should only be pausing/unpausing a parser that is not in an error
2238
+ * state. In non-debug builds, there's not much that we can do about this
2239
+ * other than ignore it.
2240
+ */
2241
+ if (HTTP_PARSER_ERRNO(parser) == HPE_OK ||
2242
+ HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) {
2243
+ SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK);
2244
+ } else {
2245
+ assert(0 && "Attempting to pause parser in error state");
2246
+ }
2247
+ }
2248
+
2249
+ int
2250
+ http_body_is_final(const struct http_parser *parser) {
2251
+ return parser->state == s_message_done;
2252
+ }
2253
+
2254
+ unsigned long
2255
+ http_parser_version(void) {
2256
+ return HTTP_PARSER_VERSION_MAJOR * 0x10000 |
2257
+ HTTP_PARSER_VERSION_MINOR * 0x00100 |
2258
+ HTTP_PARSER_VERSION_PATCH * 0x00001;
2259
+ }