passenger 4.0.59 → 4.0.60

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 (579) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/CHANGELOG +15 -0
  5. data/bin/passenger-install-apache2-module +2 -1
  6. data/bin/passenger-install-nginx-module +8 -2
  7. data/ext/apache2/Hooks.cpp +21 -2
  8. data/ext/apache2/MergeDirConfig.cpp +40 -40
  9. data/ext/common/ApplicationPool2/Group.h +14 -10
  10. data/ext/common/ApplicationPool2/Implementation.cpp +13 -7
  11. data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
  12. data/ext/common/Constants.h +1 -1
  13. data/ext/nginx/ContentHandler.c +17 -1
  14. data/lib/phusion_passenger.rb +4 -5
  15. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +4 -3
  16. data/lib/phusion_passenger/platform_info/openssl.rb +61 -0
  17. data/lib/phusion_passenger/standalone/runtime_installer.rb +27 -22
  18. data/packaging/debian/LICENSE.md +19 -0
  19. data/packaging/debian/README.md +320 -0
  20. data/packaging/debian/Vagrantfile +25 -0
  21. data/packaging/debian/build +210 -0
  22. data/packaging/debian/debian_specs/nginx/changelog +1989 -0
  23. data/packaging/debian/debian_specs/nginx/compat.erb +5 -0
  24. data/packaging/debian/debian_specs/nginx/conf/fastcgi.conf +25 -0
  25. data/packaging/debian/debian_specs/nginx/conf/fastcgi_params +24 -0
  26. data/packaging/debian/debian_specs/nginx/conf/koi-utf +109 -0
  27. data/packaging/debian/debian_specs/nginx/conf/koi-win +103 -0
  28. data/packaging/debian/debian_specs/nginx/conf/mime.types +89 -0
  29. data/packaging/debian/debian_specs/nginx/conf/nginx.conf.erb +97 -0
  30. data/packaging/debian/debian_specs/nginx/conf/proxy_params +4 -0
  31. data/packaging/debian/debian_specs/nginx/conf/scgi_params +16 -0
  32. data/packaging/debian/debian_specs/nginx/conf/sites-available/default.erb +93 -0
  33. data/packaging/debian/debian_specs/nginx/conf/snippets/fastcgi-php.conf +13 -0
  34. data/packaging/debian/debian_specs/nginx/conf/snippets/snakeoil.conf +5 -0
  35. data/packaging/debian/debian_specs/nginx/conf/uwsgi_params +16 -0
  36. data/packaging/debian/debian_specs/nginx/conf/win-utf +125 -0
  37. data/packaging/debian/debian_specs/nginx/control.erb +226 -0
  38. data/packaging/debian/debian_specs/nginx/copyright +196 -0
  39. data/packaging/debian/debian_specs/nginx/debian-full.lintian-overrides +1 -0
  40. data/packaging/debian/debian_specs/nginx/gbp.conf +2 -0
  41. data/packaging/debian/debian_specs/nginx/help/docs/fcgiwrap +14 -0
  42. data/packaging/debian/debian_specs/nginx/help/docs/php +119 -0
  43. data/packaging/debian/debian_specs/nginx/help/docs/support-irc +28 -0
  44. data/packaging/debian/debian_specs/nginx/help/docs/upstream +51 -0
  45. data/packaging/debian/debian_specs/nginx/help/examples/drupal +114 -0
  46. data/packaging/debian/debian_specs/nginx/help/examples/http +59 -0
  47. data/packaging/debian/debian_specs/nginx/help/examples/mail +30 -0
  48. data/packaging/debian/debian_specs/nginx/help/examples/mailman +59 -0
  49. data/packaging/debian/debian_specs/nginx/help/examples/nginx.conf +34 -0
  50. data/packaging/debian/debian_specs/nginx/help/examples/nginx_modsite +162 -0
  51. data/packaging/debian/debian_specs/nginx/help/examples/virtual_hosts +155 -0
  52. data/packaging/debian/debian_specs/nginx/help/examples/wordpress +74 -0
  53. data/packaging/debian/debian_specs/nginx/helpers.rb +41 -0
  54. data/packaging/debian/debian_specs/nginx/index-debian.html.in +32 -0
  55. data/packaging/debian/debian_specs/nginx/index-ubuntu.html.in +32 -0
  56. data/packaging/debian/debian_specs/nginx/index.html.erb +10 -0
  57. data/packaging/debian/debian_specs/nginx/modules/README.Modules-versions +65 -0
  58. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/README.markdown +510 -0
  59. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/config +5 -0
  60. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki +395 -0
  61. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ddebug.h +119 -0
  62. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.c +348 -0
  63. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.h +80 -0
  64. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c +826 -0
  65. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.h +26 -0
  66. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.c +716 -0
  67. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.h +26 -0
  68. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.c +380 -0
  69. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h +52 -0
  70. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/util/build.sh +32 -0
  71. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/valgrind.suppress +215 -0
  72. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ChangeLog +35 -0
  73. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/LICENSE +25 -0
  74. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/README.md +93 -0
  75. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/config +4 -0
  76. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ngx_http_auth_pam_module.c +462 -0
  77. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/CHANGES +66 -0
  78. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/LICENSE +26 -0
  79. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/README.md +171 -0
  80. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/TODO.md +7 -0
  81. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/config +21 -0
  82. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/ngx_cache_purge_module.c +1803 -0
  83. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/README +29 -0
  84. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/config +9 -0
  85. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/ngx_http_dav_ext_module.c +824 -0
  86. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README +139 -0
  87. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README_AUTO_LIB +395 -0
  88. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/TODO +1 -0
  89. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/array +10 -0
  90. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/palloc +8 -0
  91. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/build +597 -0
  92. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_replacements +5 -0
  93. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_types +12 -0
  94. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_args +22 -0
  95. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_locs +25 -0
  96. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_macros +35 -0
  97. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/contexts +22 -0
  98. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/header_files +3 -0
  99. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/headers +4 -0
  100. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/module_dependencies +5 -0
  101. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/modules_optional +15 -0
  102. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/prefixes +2 -0
  103. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/array.h +7 -0
  104. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_cmd_basic.h +43 -0
  105. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_merge.h +78 -0
  106. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/palloc.h +6 -0
  107. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/text/autogen +12 -0
  108. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/config +49 -0
  109. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/action_macros +63 -0
  110. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/conf_cmds +62 -0
  111. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/modules/set_var +124 -0
  112. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/patches/more_logging_info +48 -0
  113. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/upstream/list +45 -0
  114. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/README +12 -0
  115. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/config +4 -0
  116. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/ngx_http_set_var_examples_module.c +136 -0
  117. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/ngx_auto_lib_core +797 -0
  118. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/CHANGES +17 -0
  119. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/LICENSE +24 -0
  120. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_array.h +113 -0
  121. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_basic.h +2203 -0
  122. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_extra.h +5423 -0
  123. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_merge.h +227 -0
  124. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.c +72 -0
  125. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.h +98 -0
  126. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_includes.h +66 -0
  127. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_palloc.h +112 -0
  128. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/auto_config +16 -0
  129. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/expose_rewrite_functions +291 -0
  130. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/rewrite_phase_handler +19 -0
  131. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/md5.h +117 -0
  132. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/murmurhash2.c +77 -0
  133. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/sha.h +200 -0
  134. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.c +155 -0
  135. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.h +58 -0
  136. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.c +43 -0
  137. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.h +5 -0
  138. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.c +129 -0
  139. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.h +30 -0
  140. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.c +192 -0
  141. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.h +21 -0
  142. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.c +396 -0
  143. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.h +44 -0
  144. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.c +72 -0
  145. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.h +171 -0
  146. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.c +57 -0
  147. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.h +12 -0
  148. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.c +82 -0
  149. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.h +45 -0
  150. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.c +138 -0
  151. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.h +3 -0
  152. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http_headers.h +35 -0
  153. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.c +3 -0
  154. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.h +165 -0
  155. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_parse.h +67 -0
  156. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.c +583 -0
  157. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.h +22 -0
  158. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.c +20 -0
  159. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.h +12 -0
  160. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.c +215 -0
  161. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.h +7 -0
  162. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.c +103 -0
  163. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.h +26 -0
  164. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.c +602 -0
  165. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.h +44 -0
  166. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.c +434 -0
  167. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.h +37 -0
  168. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string_util.h +14 -0
  169. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.c +205 -0
  170. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.h +27 -0
  171. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.c +45 -0
  172. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.h +6 -0
  173. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/LICENSE +25 -0
  174. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/README.markdown +1850 -0
  175. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/config +5 -0
  176. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/doc/HttpEchoModule.wiki +1558 -0
  177. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ddebug.h +109 -0
  178. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.c +344 -0
  179. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.h +25 -0
  180. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.c +282 -0
  181. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.h +15 -0
  182. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.c +183 -0
  183. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.h +16 -0
  184. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.c +429 -0
  185. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.h +18 -0
  186. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.c +178 -0
  187. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.h +13 -0
  188. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.c +667 -0
  189. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.h +137 -0
  190. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.c +452 -0
  191. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.h +31 -0
  192. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.c +208 -0
  193. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.h +16 -0
  194. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.c +788 -0
  195. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.h +19 -0
  196. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.c +96 -0
  197. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.h +13 -0
  198. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.c +298 -0
  199. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.h +58 -0
  200. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.c +110 -0
  201. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.h +9 -0
  202. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/build.sh +45 -0
  203. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/releng +8 -0
  204. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/wiki2pod.pl +131 -0
  205. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/valgrind.suppress +38 -0
  206. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/LICENCE +24 -0
  207. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/README +206 -0
  208. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/changelog.txt +54 -0
  209. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/config +26 -0
  210. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/protocol.txt +191 -0
  211. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.c +59 -0
  212. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.h +73 -0
  213. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.c +783 -0
  214. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.h +31 -0
  215. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module_setup.c +361 -0
  216. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_types.h +120 -0
  217. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.c +1180 -0
  218. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.h +1 -0
  219. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.c +146 -0
  220. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.h +5 -0
  221. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_store.h +51 -0
  222. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.c +178 -0
  223. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.h +5 -0
  224. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.c +246 -0
  225. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.h +9 -0
  226. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/Changes +51 -0
  227. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/README.markdown +6954 -0
  228. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/config +363 -0
  229. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/doc/HttpLuaModule.wiki +5898 -0
  230. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/dtrace/ngx_lua_provider.d +61 -0
  231. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/Makefile +3 -0
  232. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/lib/RecvUntil.pm +138 -0
  233. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/t/sanity.t +140 -0
  234. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/api/ngx_http_lua_api.h +52 -0
  235. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ddebug.h +82 -0
  236. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.c +377 -0
  237. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.h +22 -0
  238. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_api.c +77 -0
  239. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.c +537 -0
  240. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.h +20 -0
  241. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.c +632 -0
  242. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.h +31 -0
  243. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.c +296 -0
  244. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.h +24 -0
  245. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.c +175 -0
  246. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.h +20 -0
  247. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.c +887 -0
  248. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.h +22 -0
  249. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_common.h +478 -0
  250. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.c +67 -0
  251. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.h +19 -0
  252. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.c +148 -0
  253. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.h +20 -0
  254. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.c +369 -0
  255. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.h +26 -0
  256. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.c +483 -0
  257. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.h +20 -0
  258. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.c +379 -0
  259. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.h +23 -0
  260. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.c +216 -0
  261. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.h +23 -0
  262. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.c +1081 -0
  263. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.h +56 -0
  264. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.c +58 -0
  265. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.h +33 -0
  266. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.c +302 -0
  267. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.h +29 -0
  268. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.c +1370 -0
  269. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.h +22 -0
  270. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.c +782 -0
  271. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.h +22 -0
  272. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.c +625 -0
  273. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.h +23 -0
  274. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.c +42 -0
  275. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.h +23 -0
  276. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.c +320 -0
  277. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.h +25 -0
  278. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.c +300 -0
  279. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.h +20 -0
  280. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.c +227 -0
  281. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.h +22 -0
  282. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.c +252 -0
  283. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.h +20 -0
  284. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_module.c +924 -0
  285. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.c +184 -0
  286. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.h +21 -0
  287. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.c +794 -0
  288. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.h +28 -0
  289. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.c +106 -0
  290. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.h +23 -0
  291. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.c +94 -0
  292. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.h +13 -0
  293. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_probe.h +85 -0
  294. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.c +2468 -0
  295. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.h +22 -0
  296. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.c +1169 -0
  297. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.h +20 -0
  298. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.c +252 -0
  299. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.h +19 -0
  300. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.c +351 -0
  301. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.h +22 -0
  302. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.c +538 -0
  303. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.h +86 -0
  304. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.c +216 -0
  305. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.h +15 -0
  306. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.c +1844 -0
  307. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.h +52 -0
  308. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.c +191 -0
  309. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.h +20 -0
  310. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.c +5314 -0
  311. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.h +156 -0
  312. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.c +1624 -0
  313. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.h +56 -0
  314. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.c +704 -0
  315. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.h +20 -0
  316. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.c +1741 -0
  317. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.h +46 -0
  318. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.c +278 -0
  319. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.h +21 -0
  320. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.c +661 -0
  321. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.h +20 -0
  322. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.c +110 -0
  323. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.h +20 -0
  324. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.c +283 -0
  325. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.h +36 -0
  326. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.c +3972 -0
  327. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.h +423 -0
  328. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.c +499 -0
  329. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.h +20 -0
  330. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.c +64 -0
  331. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.h +17 -0
  332. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/tapset/ngx_lua.stp +5 -0
  333. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build.sh +39 -0
  334. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build2.sh +55 -0
  335. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/fix-comments +27 -0
  336. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/gdbinit +415 -0
  337. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/ngx-links +62 -0
  338. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/reindex +64 -0
  339. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/releng +8 -0
  340. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/retab +8 -0
  341. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/revim +102 -0
  342. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/run_test.sh +10 -0
  343. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/update-readme.sh +4 -0
  344. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/valgrind.suppress +144 -0
  345. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/CHANGES +107 -0
  346. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/LICENSE +25 -0
  347. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/Makefile +8 -0
  348. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/README +329 -0
  349. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/config +3 -0
  350. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/ngx_http_uploadprogress_module.c +1774 -0
  351. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/README +53 -0
  352. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/config +3 -0
  353. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/ngx_http_upstream_fair_module.c +1356 -0
  354. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/CHANGELOG.md +37 -0
  355. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/HACKING.md +24 -0
  356. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/LICENSE +20 -0
  357. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/README.rst +182 -0
  358. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/config +8 -0
  359. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/nginx-0.6-support.patch +23 -0
  360. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/ngx_http_fancyindex_module.c +1305 -0
  361. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.awk +52 -0
  362. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.h +103 -0
  363. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.html +102 -0
  364. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/CHANGES +37 -0
  365. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/README +141 -0
  366. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/config +3 -0
  367. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.google_code_home_page.wiki +120 -0
  368. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.html +199 -0
  369. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.wiki +123 -0
  370. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/ngx_http_subs_filter_module.c +1298 -0
  371. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/README +275 -0
  372. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/AutoInstall.pm +820 -0
  373. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install.pm +470 -0
  374. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/AutoInstall.pm +82 -0
  375. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Base.pm +83 -0
  376. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Can.pm +81 -0
  377. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Fetch.pm +93 -0
  378. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Include.pm +34 -0
  379. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Makefile.pm +415 -0
  380. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Metadata.pm +716 -0
  381. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/TestBase.pm +29 -0
  382. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Win32.pm +64 -0
  383. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/WriteAll.pm +63 -0
  384. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Spiffy.pm +539 -0
  385. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base.pm +682 -0
  386. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base/Filter.pm +341 -0
  387. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder.pm +1413 -0
  388. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder/Module.pm +81 -0
  389. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/More.pm +735 -0
  390. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx.pm +315 -0
  391. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/LWP.pm +524 -0
  392. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Socket.pm +1749 -0
  393. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Util.pm +874 -0
  394. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs.t +136 -0
  395. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_capture.t +32 -0
  396. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_fix_string.t +32 -0
  397. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_regex.t +108 -0
  398. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_types.t +59 -0
  399. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/test.sh +5 -0
  400. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/update-readme.sh +7 -0
  401. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2google_code_homepage.pl +29 -0
  402. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2pod.pl +129 -0
  403. data/packaging/debian/debian_specs/nginx/nginx-common.NEWS +135 -0
  404. data/packaging/debian/debian_specs/nginx/nginx-common.README.Debian +45 -0
  405. data/packaging/debian/debian_specs/nginx/nginx-common.dirs.erb +32 -0
  406. data/packaging/debian/debian_specs/nginx/nginx-common.install +3 -0
  407. data/packaging/debian/debian_specs/nginx/nginx-common.lintian-overrides +2 -0
  408. data/packaging/debian/debian_specs/nginx/nginx-common.manpages +1 -0
  409. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.default +10 -0
  410. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.init.erb +214 -0
  411. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.logrotate +18 -0
  412. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.service.erb +37 -0
  413. data/packaging/debian/debian_specs/nginx/nginx-common.postinst.erb +66 -0
  414. data/packaging/debian/debian_specs/nginx/nginx-common.postrm.erb +46 -0
  415. data/packaging/debian/debian_specs/nginx/nginx-common.preinst +47 -0
  416. data/packaging/debian/debian_specs/nginx/nginx-common.prerm.erb +28 -0
  417. data/packaging/debian/debian_specs/nginx/nginx-doc.docs +2 -0
  418. data/packaging/debian/debian_specs/nginx/nginx-doc.examples +1 -0
  419. data/packaging/debian/debian_specs/nginx/nginx-extras.install.erb +17 -0
  420. data/packaging/debian/debian_specs/nginx/nginx-extras.lintian-overrides +1 -0
  421. data/packaging/debian/debian_specs/nginx/nginx-extras.postinst.erb +44 -0
  422. data/packaging/debian/debian_specs/nginx/nginx-extras.prerm +22 -0
  423. data/packaging/debian/debian_specs/nginx/nginx.1 +47 -0
  424. data/packaging/debian/debian_specs/nginx/patches/perl-use-dpkg-buildflags.patch +23 -0
  425. data/packaging/debian/debian_specs/nginx/patches/series +1 -0
  426. data/packaging/debian/debian_specs/nginx/rules.erb +185 -0
  427. data/packaging/debian/debian_specs/nginx/source/format +1 -0
  428. data/packaging/debian/debian_specs/nginx/tests/control +4 -0
  429. data/packaging/debian/debian_specs/nginx/ufw/nginx +14 -0
  430. data/packaging/debian/debian_specs/nginx/upstream/signing-key.asc +34 -0
  431. data/packaging/debian/debian_specs/nginx/watch +3 -0
  432. data/packaging/debian/debian_specs/passenger/README.Debian +12 -0
  433. data/packaging/debian/debian_specs/passenger/changelog +316 -0
  434. data/packaging/debian/debian_specs/passenger/compat +1 -0
  435. data/packaging/debian/debian_specs/passenger/control.erb +123 -0
  436. data/packaging/debian/debian_specs/passenger/copyright +385 -0
  437. data/packaging/debian/debian_specs/passenger/helpers.rb +24 -0
  438. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.install +3 -0
  439. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.postinst +36 -0
  440. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.prerm +15 -0
  441. data/packaging/debian/debian_specs/passenger/locations.ini.erb +14 -0
  442. data/packaging/debian/debian_specs/passenger/passenger-dev.install.erb +3 -0
  443. data/packaging/debian/debian_specs/passenger/passenger-doc.install.erb +2 -0
  444. data/packaging/debian/debian_specs/passenger/passenger.conf +6 -0
  445. data/packaging/debian/debian_specs/passenger/passenger.docs +4 -0
  446. data/packaging/debian/debian_specs/passenger/passenger.install.erb +16 -0
  447. data/packaging/debian/debian_specs/passenger/passenger.load +3 -0
  448. data/packaging/debian/debian_specs/passenger/passenger.manpages +3 -0
  449. data/packaging/debian/debian_specs/passenger/passenger_free_ruby.c +29 -0
  450. data/packaging/debian/debian_specs/passenger/passenger_ruby_utils.c +54 -0
  451. data/packaging/debian/debian_specs/passenger/passenger_system_ruby.c.erb +37 -0
  452. data/packaging/debian/debian_specs/passenger/patches/series +0 -0
  453. data/packaging/debian/debian_specs/passenger/rules.erb +84 -0
  454. data/packaging/debian/debian_specs/passenger/source/format +1 -0
  455. data/packaging/debian/debian_specs/passenger_enterprise/README.Debian +12 -0
  456. data/packaging/debian/debian_specs/passenger_enterprise/changelog +316 -0
  457. data/packaging/debian/debian_specs/passenger_enterprise/compat +1 -0
  458. data/packaging/debian/debian_specs/passenger_enterprise/control.erb +123 -0
  459. data/packaging/debian/debian_specs/passenger_enterprise/copyright +385 -0
  460. data/packaging/debian/debian_specs/passenger_enterprise/helpers.rb +2 -0
  461. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.install +3 -0
  462. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.postinst +36 -0
  463. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.prerm +15 -0
  464. data/packaging/debian/debian_specs/passenger_enterprise/locations.ini.erb +14 -0
  465. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-dev.install.erb +3 -0
  466. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-doc.install.erb +2 -0
  467. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.docs +4 -0
  468. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.install.erb +14 -0
  469. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.manpages +3 -0
  470. data/packaging/debian/debian_specs/passenger_enterprise/passenger.conf +6 -0
  471. data/packaging/debian/debian_specs/passenger_enterprise/passenger.load +3 -0
  472. data/packaging/debian/debian_specs/passenger_enterprise/passenger_free_ruby.c.erb +1 -0
  473. data/packaging/debian/debian_specs/passenger_enterprise/passenger_ruby_utils.c.erb +1 -0
  474. data/packaging/debian/debian_specs/passenger_enterprise/passenger_system_ruby.c.erb +1 -0
  475. data/packaging/debian/debian_specs/passenger_enterprise/patches/series +0 -0
  476. data/packaging/debian/debian_specs/passenger_enterprise/rules.erb +84 -0
  477. data/packaging/debian/debian_specs/passenger_enterprise/source/format +1 -0
  478. data/packaging/debian/docker_images/Makefile +38 -0
  479. data/packaging/debian/docker_images/buildbox/CONTAINER_VERSION.txt +0 -0
  480. data/packaging/debian/docker_images/buildbox/Dockerfile +3 -0
  481. data/packaging/debian/docker_images/buildbox/Gemfile +9 -0
  482. data/packaging/debian/docker_images/buildbox/Gemfile.lock +42 -0
  483. data/packaging/debian/docker_images/buildbox/install.sh +85 -0
  484. data/packaging/debian/docker_images/buildbox/pbuilderrc +4 -0
  485. data/packaging/debian/docker_images/buildbox/sudoers.conf +6 -0
  486. data/packaging/debian/docker_images/setup-buildbox-docker-image +7 -0
  487. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-6 +7 -0
  488. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-7 +7 -0
  489. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-8 +7 -0
  490. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-12.04 +7 -0
  491. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-14.04 +7 -0
  492. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.04 +7 -0
  493. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.10 +7 -0
  494. data/packaging/debian/docker_images/testbox-debian-6/Dockerfile +3 -0
  495. data/packaging/debian/docker_images/testbox-debian-6/Gemfile +2 -0
  496. data/packaging/debian/docker_images/testbox-debian-6/Gemfile.lock +23 -0
  497. data/packaging/debian/docker_images/testbox-debian-6/argparse.py +2374 -0
  498. data/packaging/debian/docker_images/testbox-debian-6/install.sh +78 -0
  499. data/packaging/debian/docker_images/testbox-debian-7/Dockerfile +3 -0
  500. data/packaging/debian/docker_images/testbox-debian-7/Gemfile +2 -0
  501. data/packaging/debian/docker_images/testbox-debian-7/Gemfile.lock +23 -0
  502. data/packaging/debian/docker_images/testbox-debian-7/install.sh +71 -0
  503. data/packaging/debian/docker_images/testbox-debian-8/Dockerfile +3 -0
  504. data/packaging/debian/docker_images/testbox-debian-8/Gemfile +2 -0
  505. data/packaging/debian/docker_images/testbox-debian-8/Gemfile.lock +23 -0
  506. data/packaging/debian/docker_images/testbox-debian-8/install.sh +70 -0
  507. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Dockerfile +3 -0
  508. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile +2 -0
  509. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile.lock +23 -0
  510. data/packaging/debian/docker_images/testbox-ubuntu-12.04/install.sh +69 -0
  511. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Dockerfile +3 -0
  512. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile +2 -0
  513. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile.lock +23 -0
  514. data/packaging/debian/docker_images/testbox-ubuntu-14.04/install.sh +69 -0
  515. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Dockerfile +3 -0
  516. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile +2 -0
  517. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile.lock +23 -0
  518. data/packaging/debian/docker_images/testbox-ubuntu-15.04/install.sh +69 -0
  519. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Dockerfile +3 -0
  520. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile +2 -0
  521. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile.lock +23 -0
  522. data/packaging/debian/docker_images/testbox-ubuntu-15.10/install.sh +69 -0
  523. data/packaging/debian/internal/build/Rakefile +235 -0
  524. data/packaging/debian/internal/build/build-passenger-orig-tarball.sh +76 -0
  525. data/packaging/debian/internal/build/build-source-package.rb +121 -0
  526. data/packaging/debian/internal/build/download-nginx-orig-tarball.sh +17 -0
  527. data/packaging/debian/internal/build/rakefile_support.rb +96 -0
  528. data/packaging/debian/internal/build/setup-environment-essentials.sh +15 -0
  529. data/packaging/debian/internal/build/setup-environment.sh +29 -0
  530. data/packaging/debian/internal/lib/distro_info.rb +82 -0
  531. data/packaging/debian/internal/lib/distro_info.sh +303 -0
  532. data/packaging/debian/internal/lib/distro_info.sh.erb +65 -0
  533. data/packaging/debian/internal/lib/library.sh +83 -0
  534. data/packaging/debian/internal/lib/preprocessor.rb +173 -0
  535. data/packaging/debian/internal/lib/tracking.rb +95 -0
  536. data/packaging/debian/internal/lib/tracking_category.rb +45 -0
  537. data/packaging/debian/internal/lib/tracking_database.rb +132 -0
  538. data/packaging/debian/internal/lib/tracking_task.rb +148 -0
  539. data/packaging/debian/internal/lib/utils.rb +78 -0
  540. data/packaging/debian/internal/publish/Rakefile +97 -0
  541. data/packaging/debian/internal/publish/oss-binaries.phusionpassenger.com-fingerprint.txt +1 -0
  542. data/packaging/debian/internal/publish/packagecloud_fingerprint.txt +1 -0
  543. data/packaging/debian/internal/publish/passenger_website_fingerprint.txt +1 -0
  544. data/packaging/debian/internal/publish/preinit.sh +7 -0
  545. data/packaging/debian/internal/publish/rakefile_support.rb +183 -0
  546. data/packaging/debian/internal/scripts/gpg_noninteractive/gpg +11 -0
  547. data/packaging/debian/internal/scripts/initccache.sh +35 -0
  548. data/packaging/debian/internal/scripts/inituidgid.sh +19 -0
  549. data/packaging/debian/internal/scripts/my_init +340 -0
  550. data/packaging/debian/internal/scripts/pin_certificates +34 -0
  551. data/packaging/debian/internal/scripts/regen_distro_info_script.sh +3 -0
  552. data/packaging/debian/internal/scripts/setup-vagrant.sh +12 -0
  553. data/packaging/debian/internal/scripts/setuser +31 -0
  554. data/packaging/debian/internal/shell/initpbuilder.sh +3 -0
  555. data/packaging/debian/internal/shell/preinit.sh +28 -0
  556. data/packaging/debian/internal/shell/sudoers.conf +1 -0
  557. data/packaging/debian/internal/test/apache/apache-24.conf +5 -0
  558. data/packaging/debian/internal/test/apache/apache-pre-24.conf +4 -0
  559. data/packaging/debian/internal/test/apache/vhost.conf +17 -0
  560. data/packaging/debian/internal/test/misc/config.json +15 -0
  561. data/packaging/debian/internal/test/misc/hosts.conf +4 -0
  562. data/packaging/debian/internal/test/misc/init.sh +25 -0
  563. data/packaging/debian/internal/test/misc/nodejs_test_app.js +6 -0
  564. data/packaging/debian/internal/test/misc/python_test_app.py +3 -0
  565. data/packaging/debian/internal/test/misc/ruby_test_app.rb +5 -0
  566. data/packaging/debian/internal/test/misc/test_support.rb +61 -0
  567. data/packaging/debian/internal/test/nginx/vhost.conf +23 -0
  568. data/packaging/debian/internal/test/system_web_server_test.rb +126 -0
  569. data/packaging/debian/internal/test/test.sh +141 -0
  570. data/packaging/debian/jenkins/publish/clear_caches.rb +48 -0
  571. data/packaging/debian/jenkins/publish/publish.sh +69 -0
  572. data/packaging/debian/jenkins/test/test.sh +63 -0
  573. data/packaging/debian/passenger_apt_automation.sublime-project +14 -0
  574. data/packaging/debian/publish +172 -0
  575. data/packaging/debian/shell +116 -0
  576. data/packaging/debian/test +142 -0
  577. metadata +563 -3
  578. metadata.gz.asc +7 -7
  579. data/resources/oss-binaries.phusionpassenger.com.crt +0 -208
@@ -0,0 +1,54 @@
1
+ 0.73 (Sep. 2 2014)
2
+ fix: turning on gzip cleared Etag subscriber response header
3
+ fix: channels incorrectly deleted when overwhelmed with connections
4
+ feature: CORS support via OPTIONS request method response
5
+ fix: file descriptor leak when restarting nginx via SIGHUP
6
+ improve: concurrency for interprocess notifications
7
+ refactor: completely encapsulated message store
8
+ fix: slow memory leak introduced in 0.7
9
+ fix: memory leak when not using message buffer
10
+ 0.712 (Mar. 21 2014)
11
+ fix: intermittently dropped long-polling connections on internal redirects
12
+ fix: unable to proxy long-polling subscribers. (thanks wandenberg and sanmai)
13
+ 0.711 (Mar. 13 2014)
14
+ fix: incompatibility with cache manager (proxy_cache and fastcgi_cache directives)
15
+ 0.71 (Mar. 1 2014)
16
+ fix: removed unused variables and functions to quiet down GCC
17
+ 0.7: (Feb. 20 2014)
18
+ fix: last-in concurrency setting wasn't working reliably
19
+ refactor: partially separated message storage. add a test harness.
20
+ fix: segfault from concurrency bug while garbage-collecting channels
21
+ fix: some large messages got lost
22
+ 0.692 (Feb. 3 2010)
23
+ fix: error log reported failed close() for some publisher requests with large messages
24
+ fix: occasional memory leak during message deletion
25
+ fix: worker messages intended for dead worker processes were not deleted
26
+ 0.691 (Feb. 2 2010)
27
+ fix: server reload (via SIGHUP signal) was failing
28
+ fix: segfault on messages longer than client_body_buffer_size (thanks wfelipe)
29
+ change: removed push_min_message_recipients, added push_delete_oldest_received_message
30
+ 0.69 (Nov. 17 2009)
31
+ fix: publisher got a 201 Created response even if the channel had no subscribers at the time (should be 202 Accepted)
32
+ fix: small memory leak after each message broadcast to a channel
33
+ feature: optional push_max_channel_subscribers setting added
34
+ fix: first-in concurrency setting wasn't responding to subscribers with a correct status code on conflict
35
+ fix: reused subscriber connections sometimes failed to receive messages
36
+ unfeature: no more nginx 0.6 support. not worth the hassle.
37
+ 0.683 (Nov. 10 2009)
38
+ change: default max. reserved memory size changed form 16MB to 32 MB
39
+ change: unused node garbage collection made a little more aggressive (max. 3 unused channels per channel search instead of 1)
40
+ fix: unused nodes were deleted only on channel id hash collision (very rare)
41
+ fix: segmentation fault from allocating insufficient memory for interprocess messaging
42
+ 0.681 (Nov. 6 2009)
43
+ feature: added push_message_buffer_length setting, which sets push_message_max_buffer_length and push_message_min_buffer_length at once.
44
+ fix: publisher channel info text/json response now uses double quotes instead of single.
45
+ fix: interprocess messages were not removed from shared memory correctly, causing weird errors
46
+ 0.68 (Nov. 5 2009)
47
+ change: default push_subscriber_concurrency value is now "broadcast"
48
+ fix: incorrect error messages for invalid push_pubscriber and push_subscriber_concurrency settings
49
+ change: removed deprecated push_buffer_size and push_queue_messages settings
50
+ feature: rudimentary content-type negotiation for publisher channel info response.
51
+ support text/plain, text/json, text/yaml and application/xml (and mimetype equivalents)
52
+ fix: publisher GET response has HTTP status 0
53
+ 0.67beta (Nov. 4 2009) and older
54
+ see git repository
@@ -0,0 +1,26 @@
1
+ ngx_feature="http_push_module"
2
+ ngx_feature_name=
3
+ ngx_feature_run=no
4
+ ngx_feature_incs=
5
+ ngx_feature_path=
6
+ ngx_feature_libs=
7
+ ngx_feature_test=
8
+
9
+ ngx_addon_name=ngx_http_push_module
10
+ HTTP_MODULES="$HTTP_MODULES ngx_http_push_module"
11
+ CORE_INCS="$CORE_INCS \
12
+ $ngx_addon_dir/src"
13
+ NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
14
+ ${ngx_addon_dir}/src/ngx_http_push_defs.c \
15
+ ${ngx_addon_dir}/src/store/rbtree_util.c \
16
+ ${ngx_addon_dir}/src/store/ngx_http_push_module_ipc.c \
17
+ ${ngx_addon_dir}/src/store/memory/store.c \
18
+ ${ngx_addon_dir}/src/store/ngx_rwlock.c \
19
+ ${ngx_addon_dir}/src/ngx_http_push_module.c \
20
+ "
21
+
22
+ have=NGX_HTTP_HEADERS . auto/have
23
+ . auto/feature
24
+
25
+ CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
26
+ CORE_INCS="$CORE_INCS $ngx_feature_incs"
@@ -0,0 +1,191 @@
1
+ Basic HTTP Push Relay Protocol
2
+
3
+ Rev. 2.23
4
+
5
+ 1. Introduction
6
+
7
+ 1.1. Purpose
8
+
9
+ The primary purpose of this protocol is to enable a method of
10
+ long-polling, transparent to the web client, where client connections
11
+ idle only on the HTTP server and need not be forwarded.
12
+
13
+ 1.2. Requirements
14
+
15
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
16
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
17
+ document are to be interpreted as described in RFC2119. An
18
+ implementation is not compliant if it fails to satisfy one or more of
19
+ the MUST or REQUIRED level requirements for the protocols it
20
+ implements.
21
+
22
+ An implementation that satisfies all the MUST or REQUIRED level and all
23
+ the SHOULD level requirements for its protocols is said to be
24
+ "unconditionally compliant"; one that satisfies all the MUST level
25
+ requirements but not all the SHOULD level requirements for its
26
+ protocols is said to be "conditionally compliant."
27
+
28
+ 1.3. Terminology
29
+
30
+ This specification uses a number of terms to refer to the roles played
31
+ by participants in, and objects of, this protocol:
32
+
33
+ server
34
+ The HTTP server implementing this protocol.
35
+
36
+ client
37
+ A program that initiates TCP/IP connections with the HTTP server
38
+ for the purpose of sending HTTP requests.
39
+
40
+ message
41
+ Application specific data, usually enclosed in a request or
42
+ response body.
43
+
44
+ channel
45
+ A resource representing an isolated pathway for message
46
+ transmission. Each channel has a single unique message queue.
47
+
48
+ subscriber
49
+ A client that sends HTTP requests to the server for the purposes
50
+ of receiving messages via some channel.
51
+
52
+ publisher
53
+ A client that sends HTTP requests to the server in order to
54
+ transmit messages to subscribers via a channel.
55
+
56
+ channel id
57
+ A unique identifier for a channel.
58
+
59
+ location
60
+ A url (or set of urls) on the server.
61
+
62
+ 2. Requirements
63
+
64
+ 2.1. Server Requirements
65
+
66
+ The HTTP server MUST have a mechanism of specifying a url, or a set of
67
+ urls as publisher and subscriber locations. All requests to the
68
+ publisher location MUST be treated as publisher requests, all to the
69
+ subscriber location as subscriber requests.
70
+
71
+ The server MUST implement a mechanism for identifying channels with
72
+ unique ids. This MAY, for example, be a url parameter (/foo/?id=123) or
73
+ a cookie. Methods of channel identification other than those using the
74
+ url MAY be used, but are strongly discouraged.
75
+
76
+ The server MUST accept requests on publisher locations and respond to
77
+ them immediately. It MUST also accept requests on subscriber locations,
78
+ but need not respond immediately.
79
+
80
+ 2.2. Client Requirements
81
+
82
+ All clients must prodice valid HTTP requests. Subscriber clients must
83
+ have a caching mechanism that appropriately reacts to Last-Modified and
84
+ Etag response headers (web browsers, for example).
85
+
86
+ 2.3. The Channel ID
87
+
88
+ It is not the responsibility of the server to generate IDs.
89
+
90
+ 3. Server Operation
91
+
92
+ A publisher request functions as notification to the server of a
93
+ message to send to some subscribers over some channel. A subscriber
94
+ request notifies the server of the subscriber's intent to receive a
95
+ message.
96
+
97
+ 3.1. The Subscriber
98
+
99
+ The server MUST accept all valid HTTP GET requests to the subscriber
100
+ location. All other request methods SHOULD be responded to with a 405
101
+ Method Not Allowed status code.
102
+
103
+ Subscriber requests are considered notifications of intent to receive
104
+ some message. Subscribers may request existing messages, messages that
105
+ are not yet available, and messages that are no longer available. The
106
+ requested message is identified using the If-Modified-Since and
107
+ If-None-Match request headers. A request with no If-Modified-Since
108
+ header MUST be assumed to be requesting the oldest available message in
109
+ a channel. Each 200 OK response containing a message MUST have its
110
+ Last-Modified and Etag headers set so that a request using those
111
+ headers will be interpreted as a request for the next available
112
+ message. Additionally, said 200 OK MUST contain the Content-Type header
113
+ of the message publisher request, unless no Content-Type header had
114
+ been provided or it is explicitly overridden by server configuration.
115
+
116
+ There are several common mechanisms for performing an HTTP server push.
117
+ The rest of the behavior of the server in response to a subscriber
118
+ request SHOULD be configurable and MUST be selected from the following
119
+ list of mechanisms:
120
+
121
+ Long-Polling
122
+ Requests for existing messages will be responded to immediately;
123
+ responses to requests for messages not yet available MUST be
124
+ delayed until the message becomes available. Delayed responses
125
+ MUST satisfy all of the following conditions:
126
+
127
+ + A 200 OK response containing the message (and its
128
+ Content-Type) MUST be sent immediately after the message
129
+ becomes available. The entire response must be
130
+ indistinguishable from a response to a request for an existing
131
+ message.
132
+ + If the channel the subscriber is waiting on is deleted or for
133
+ some reason becomes unavailable, the server MUST immediately
134
+ send a 410 Gone response.
135
+ + If another subscriber has conflicted with this request, the
136
+ server MUST immediately send a 409 Conflict response.
137
+
138
+ Interval-Polling
139
+ All requests will be responded to immediately. Requests for
140
+ messages not yet available MUST produce a 304 Not Modified
141
+ response code.
142
+
143
+ In addition, when the server receives more than one concurrent
144
+ subscriber request on the same channel, it MUST do one of the
145
+ following:
146
+
147
+ Broadcast
148
+ No additional actions are performed
149
+
150
+ Last-in, first-out
151
+ All but the most recent long-held subscriber request on the
152
+ channel are sent a 409 Conflict response.
153
+
154
+ First-in, last-out
155
+ All but the oldest request will be sent a 409 Conflict
156
+
157
+ The server SHOULD make this selection configurable, and MUST default to
158
+ broadcast behavior.
159
+
160
+ 3.2. The Publisher
161
+
162
+ The server MUST accept all valid HTTP requests to the publisher
163
+ location. The server, when sent a publisher request, MUST satisfy all
164
+ of the following conditions:
165
+ * GET requests receive a 200 OK response for existing channels and a
166
+ 404 Not Found otherwise.
167
+ * PUT requests receive a 200 OK response. The request creates a
168
+ channel if no channel with the given channel id exists.
169
+ * DELETE requests receive a 200 OK if the channel identified by the
170
+ channel id exists and has been completely deleted. All subscribers
171
+ MUST have been sent a 410 Gone response. Requests for nonexistent
172
+ channels MUST be responded to with a 404 Not Found.
173
+ * POST requests are used to send messages. The request MAY contain a
174
+ body in any encoding representing a message to be sent over the
175
+ channel. The message MUST be immediately delivered to all currently
176
+ long-held subscriber requests. Additionally, the message MAY be
177
+ stored for future retrieval and the oldest message stored for the
178
+ channel MAY be deleted.
179
+ A POST request MUST be replied to with a 201 Created if there were
180
+ any long-held subscribers that have been sent this message, and
181
+ with a 202 Accepted otherwise.
182
+ The Content-Type header of the request MUST be forwarded with the
183
+ message.
184
+
185
+ Message storage limits SHOULD be configurable. publisher locations
186
+ SHOULD be configurable to allow foregoing message storage on POST
187
+ requests. All 200-level responses MUST, in the response body, contain
188
+ information about the applicable channel. This information MAY contain
189
+ the number of stored messages and the number of subscribers' requests
190
+ being long-held prior to this request. The server MAY implement a
191
+ content-negotiation scheme for this information.
@@ -0,0 +1,59 @@
1
+ #include <ngx_http.h>
2
+ #include "ngx_http_push_defs.h"
3
+
4
+ //string constants
5
+ //headers
6
+ const ngx_str_t NGX_HTTP_PUSH_HEADER_ETAG = ngx_string("Etag");
7
+ const ngx_str_t NGX_HTTP_PUSH_HEADER_IF_NONE_MATCH = ngx_string("If-None-Match");
8
+ const ngx_str_t NGX_HTTP_PUSH_HEADER_VARY = ngx_string("Vary");
9
+ const ngx_str_t NGX_HTTP_PUSH_HEADER_ALLOW = ngx_string("Allow");
10
+ const ngx_str_t NGX_HTTP_PUSH_HEADER_CACHE_CONTROL = ngx_string("Cache-Control");
11
+ const ngx_str_t NGX_HTTP_PUSH_HEADER_PRAGMA = ngx_string("Pragma");
12
+ const ngx_str_t NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_HEADERS = ngx_string("Access-Control-Allow-Headers");
13
+ const ngx_str_t NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_METHODS = ngx_string("Access-Control-Allow-Methods");
14
+ const ngx_str_t NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN = ngx_string("Access-Control-Allow-Origin");
15
+
16
+ //header values
17
+ const ngx_str_t NGX_HTTP_PUSH_CACHE_CONTROL_VALUE = ngx_string("no-cache");
18
+
19
+ //status strings
20
+ const ngx_str_t NGX_HTTP_PUSH_HTTP_STATUS_409 = ngx_string("409 Conflict");
21
+ const ngx_str_t NGX_HTTP_PUSH_HTTP_STATUS_410 = ngx_string("410 Gone");
22
+
23
+ //other stuff
24
+ const ngx_str_t NGX_HTTP_PUSH_ANYSTRING= ngx_string("*");
25
+ const ngx_str_t NGX_HTTP_PUSH_ACCESS_CONTROL_ALLOWED_PUBLISHER_HEADERS = ngx_string("Content-Type, Origin");
26
+ const ngx_str_t NGX_HTTP_PUSH_ACCESS_CONTROL_ALLOWED_SUBSCRIBER_HEADERS = ngx_string("If-None-Match, If-Modified-Since, Origin");
27
+ const ngx_str_t NGX_HTTP_PUSH_ALLOW_GET_POST_PUT_DELETE_OPTIONS= ngx_string("GET, POST, PUT, DELETE, OPTIONS");
28
+ const ngx_str_t NGX_HTTP_PUSH_ALLOW_GET_OPTIONS= ngx_string("GET, OPTIONS");
29
+ const ngx_str_t NGX_HTTP_PUSH_VARY_HEADER_VALUE = ngx_string("If-None-Match, If-Modified-Since");
30
+
31
+
32
+ const ngx_str_t NGX_HTTP_PUSH_CHANNEL_INFO_PLAIN = ngx_string(
33
+ "queued messages: %ui" CRLF
34
+ "last requested: %d sec. ago (-1=never)" CRLF
35
+ "active subscribers: %ui"
36
+ "\0");
37
+
38
+ const ngx_str_t NGX_HTTP_PUSH_CHANNEL_INFO_JSON = ngx_string(
39
+ "{\"messages\": %ui, "
40
+ "\"requested\": %d, "
41
+ "\"subscribers\": %ui }"
42
+ "\0");
43
+
44
+ const ngx_str_t NGX_HTTP_PUSH_CHANNEL_INFO_XML = ngx_string(
45
+ "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" CRLF
46
+ "<channel>" CRLF
47
+ " <messages>%ui</messages>" CRLF
48
+ " <requested>%d</requested>" CRLF
49
+ " <subscribers>%ui</subscribers>" CRLF
50
+ "</channel>"
51
+ "\0");
52
+
53
+ const ngx_str_t NGX_HTTP_PUSH_CHANNEL_INFO_YAML = ngx_string(
54
+ "---" CRLF
55
+ "messages: %ui" CRLF
56
+ "requested: %d" CRLF
57
+ "subscribers: %ui" CRLF
58
+ CRLF
59
+ "\0");
@@ -0,0 +1,73 @@
1
+
2
+ #define NGX_HTTP_PUSH_DEFAULT_SHM_SIZE 33554432 //32 megs
3
+ #define NGX_HTTP_PUSH_DEFAULT_BUFFER_TIMEOUT 3600
4
+ #define NGX_HTTP_PUSH_DEFAULT_SUBSCRIBER_TIMEOUT 0 //default: never timeout
5
+ //(liucougar: this is a bit confusing, but it is what's the default behavior before this option is introducecd)
6
+ #define NGX_HTTP_PUSH_DEFAULT_CHANNEL_TIMEOUT 5 //default: timeout in 5 seconds
7
+
8
+ #define NGX_HTTP_PUSH_DEFAULT_MIN_MESSAGES 1
9
+ #define NGX_HTTP_PUSH_DEFAULT_MAX_MESSAGES 10
10
+
11
+ #define NGX_HTTP_PUSH_SUBSCRIBER_CONCURRENCY_LASTIN 0
12
+ #define NGX_HTTP_PUSH_SUBSCRIBER_CONCURRENCY_FIRSTIN 1
13
+ #define NGX_HTTP_PUSH_SUBSCRIBER_CONCURRENCY_BROADCAST 2
14
+
15
+ #define NGX_HTTP_PUSH_MECHANISM_LONGPOLL 0
16
+ #define NGX_HTTP_PUSH_MECHANISM_INTERVALPOLL 1
17
+
18
+ #define NGX_HTTP_PUSH_MIN_MESSAGE_RECIPIENTS 0
19
+
20
+ #define NGX_HTTP_PUSH_MAX_CHANNEL_ID_LENGTH 1024 //bytes
21
+
22
+ #ifndef NGX_HTTP_CONFLICT
23
+ #define NGX_HTTP_CONFLICT 409
24
+ #endif
25
+
26
+ #ifndef NGX_HTTP_GONE
27
+ #define NGX_HTTP_GONE 410
28
+ #endif
29
+
30
+ #ifndef NGX_HTTP_CREATED
31
+ #define NGX_HTTP_CREATED 201
32
+ #endif
33
+
34
+ #ifndef NGX_HTTP_ACCEPTED
35
+ #define NGX_HTTP_ACCEPTED 202
36
+ #endif
37
+
38
+
39
+ #define NGX_HTTP_PUSH_MESSAGE_RECEIVED 9000
40
+ #define NGX_HTTP_PUSH_MESSAGE_QUEUED 9001
41
+
42
+ #define NGX_HTTP_PUSH_MESSAGE_FOUND 1000
43
+ #define NGX_HTTP_PUSH_MESSAGE_EXPECTED 1001
44
+ #define NGX_HTTP_PUSH_MESSAGE_EXPIRED 1002
45
+
46
+ extern const ngx_str_t NGX_HTTP_PUSH_HEADER_ETAG;
47
+ extern const ngx_str_t NGX_HTTP_PUSH_HEADER_IF_NONE_MATCH;
48
+ extern const ngx_str_t NGX_HTTP_PUSH_HEADER_VARY;
49
+ extern const ngx_str_t NGX_HTTP_PUSH_HEADER_ALLOW;
50
+ extern const ngx_str_t NGX_HTTP_PUSH_HEADER_CACHE_CONTROL;
51
+ extern const ngx_str_t NGX_HTTP_PUSH_HEADER_PRAGMA;
52
+ extern const ngx_str_t NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_METHODS;
53
+ extern const ngx_str_t NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_HEADERS;
54
+ extern const ngx_str_t NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN;
55
+
56
+ //header values
57
+ extern const ngx_str_t NGX_HTTP_PUSH_CACHE_CONTROL_VALUE;
58
+
59
+ //status strings
60
+ extern const ngx_str_t NGX_HTTP_PUSH_HTTP_STATUS_409;
61
+ extern const ngx_str_t NGX_HTTP_PUSH_HTTP_STATUS_410;
62
+
63
+ //other stuff
64
+ extern const ngx_str_t NGX_HTTP_PUSH_ANYSTRING;
65
+ extern const ngx_str_t NGX_HTTP_PUSH_ACCESS_CONTROL_ALLOWED_PUBLISHER_HEADERS;
66
+ extern const ngx_str_t NGX_HTTP_PUSH_ACCESS_CONTROL_ALLOWED_SUBSCRIBER_HEADERS;
67
+ extern const ngx_str_t NGX_HTTP_PUSH_ALLOW_GET_POST_PUT_DELETE_OPTIONS;
68
+ extern const ngx_str_t NGX_HTTP_PUSH_ALLOW_GET_OPTIONS;
69
+ extern const ngx_str_t NGX_HTTP_PUSH_VARY_HEADER_VALUE;
70
+ extern const ngx_str_t NGX_HTTP_PUSH_CHANNEL_INFO_PLAIN;
71
+ extern const ngx_str_t NGX_HTTP_PUSH_CHANNEL_INFO_JSON;
72
+ extern const ngx_str_t NGX_HTTP_PUSH_CHANNEL_INFO_XML;
73
+ extern const ngx_str_t NGX_HTTP_PUSH_CHANNEL_INFO_YAML;
@@ -0,0 +1,783 @@
1
+ /*
2
+ * Copyright 2009 Leo Ponomarev.
3
+ */
4
+
5
+ #include <ngx_http_push_module.h>
6
+
7
+ #include <store/memory/store.h>
8
+ #include <ngx_http_push_module_setup.c>
9
+
10
+ ngx_int_t ngx_http_push_worker_processes;
11
+ ngx_pool_t *ngx_http_push_pool;
12
+ ngx_module_t ngx_http_push_module;
13
+
14
+ ngx_http_push_store_t *ngx_http_push_store = &ngx_http_push_store_memory;
15
+
16
+
17
+ ngx_int_t ngx_http_push_respond_status_only(ngx_http_request_t *r, ngx_int_t status_code, const ngx_str_t *statusline) {
18
+ r->headers_out.status=status_code;
19
+ if(statusline!=NULL) {
20
+ r->headers_out.status_line.len =statusline->len;
21
+ r->headers_out.status_line.data=statusline->data;
22
+ }
23
+ r->headers_out.content_length_n = 0;
24
+ r->header_only = 1;
25
+ return ngx_http_send_header(r);
26
+ }
27
+
28
+ void ngx_http_push_clean_timeouted_subscriber(ngx_event_t *ev)
29
+ {
30
+ ngx_http_push_subscriber_t *subscriber = NULL;
31
+ ngx_http_request_t *r = NULL;
32
+
33
+ subscriber = ev->data;
34
+ r = subscriber->request;
35
+
36
+ if (r->connection->destroyed) {
37
+ return;
38
+ }
39
+
40
+ ngx_int_t rc = ngx_http_push_respond_status_only(r, NGX_HTTP_NOT_MODIFIED, NULL);
41
+ ngx_http_finalize_request(r, rc);
42
+ //the subscriber and channel counter will be freed by the pool cleanup callback
43
+ }
44
+
45
+ void ngx_http_push_subscriber_del_timer(ngx_http_push_subscriber_t *sb) {
46
+ if (sb->event.timer_set) {
47
+ ngx_del_timer(&sb->event);
48
+ }
49
+ }
50
+
51
+ void ngx_http_push_subscriber_clear_ctx(ngx_http_push_subscriber_t *sb) {
52
+ ngx_http_push_subscriber_del_timer(sb);
53
+ sb->clndata->subscriber = NULL;
54
+ sb->clndata->channel = NULL;
55
+ }
56
+
57
+
58
+ #define NGX_HTTP_BUF_ALLOC_SIZE(buf) \
59
+ (sizeof(*buf) + \
60
+ (((buf)->temporary || (buf)->memory) ? ngx_buf_size(buf) : 0) + \
61
+ (((buf)->file!=NULL) ? (sizeof(*(buf)->file) + (buf)->file->name.len + 1) : 0))
62
+
63
+ //buffer is _copied_
64
+ ngx_chain_t * ngx_http_push_create_output_chain(ngx_buf_t *buf, ngx_pool_t *pool, ngx_log_t *log) {
65
+ ngx_chain_t *out;
66
+ ngx_file_t *file;
67
+
68
+ if((out = ngx_pcalloc(pool, sizeof(*out)))==NULL) {
69
+ return NULL;
70
+ }
71
+ ngx_buf_t *buf_copy;
72
+
73
+ if((buf_copy = ngx_pcalloc(pool, NGX_HTTP_BUF_ALLOC_SIZE(buf)))==NULL) {
74
+ return NULL;
75
+ }
76
+ ngx_http_push_copy_preallocated_buffer(buf, buf_copy);
77
+
78
+ if (buf->file!=NULL) {
79
+ file = buf_copy->file;
80
+ file->log=log;
81
+ if(file->fd==NGX_INVALID_FILE) {
82
+ file->fd=ngx_open_file(file->name.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, NGX_FILE_OWNER_ACCESS);
83
+ }
84
+ if(file->fd==NGX_INVALID_FILE) {
85
+ return NULL;
86
+ }
87
+ }
88
+ buf_copy->last_buf = 1;
89
+ out->buf = buf_copy;
90
+ out->next = NULL;
91
+ return out;
92
+ }
93
+
94
+ #define NGX_HTTP_PUSH_NO_CHANNEL_ID_MESSAGE "No channel id provided."
95
+ static ngx_str_t * ngx_http_push_get_channel_id(ngx_http_request_t *r, ngx_http_push_loc_conf_t *cf) {
96
+ ngx_http_variable_value_t *vv = ngx_http_get_indexed_variable(r, cf->index);
97
+ ngx_str_t *group = &cf->channel_group;
98
+ size_t group_len = group->len;
99
+ size_t var_len;
100
+ size_t len;
101
+ ngx_str_t *id;
102
+ if (vv == NULL || vv->not_found || vv->len == 0) {
103
+ ngx_buf_t *buf = ngx_create_temp_buf(r->pool, sizeof(NGX_HTTP_PUSH_NO_CHANNEL_ID_MESSAGE));
104
+ ngx_chain_t *chain;
105
+ if(buf==NULL) {
106
+ return NULL;
107
+ }
108
+ buf->pos=(u_char *)NGX_HTTP_PUSH_NO_CHANNEL_ID_MESSAGE;
109
+ buf->last=buf->pos + sizeof(NGX_HTTP_PUSH_NO_CHANNEL_ID_MESSAGE)-1;
110
+ chain = ngx_http_push_create_output_chain(buf, r->pool, r->connection->log);
111
+ buf->last_buf=1;
112
+ r->headers_out.content_length_n=ngx_buf_size(buf);
113
+ r->headers_out.status=NGX_HTTP_NOT_FOUND;
114
+ r->headers_out.content_type.len = sizeof("text/plain") - 1;
115
+ r->headers_out.content_type.data = (u_char *) "text/plain";
116
+ r->headers_out.content_type_len = r->headers_out.content_type.len;
117
+ ngx_http_send_header(r);
118
+ ngx_http_output_filter(r, chain);
119
+ ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,
120
+ "push module: the $push_channel_id variable is required but is not set");
121
+ return NULL;
122
+ }
123
+ //maximum length limiter for channel id
124
+ var_len = vv->len <= cf->max_channel_id_length ? vv->len : cf->max_channel_id_length;
125
+ len = group_len + 1 + var_len;
126
+ if((id = ngx_palloc(r->pool, sizeof(*id) + len))==NULL) {
127
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
128
+ "push module: unable to allocate memory for $push_channel_id string");
129
+ return NULL;
130
+ }
131
+ id->len=len;
132
+ id->data=(u_char *)(id+1);
133
+ ngx_memcpy(id->data, group->data, group_len);
134
+ id->data[group_len]='/';
135
+ ngx_memcpy(id->data + group_len + 1, vv->data, var_len);
136
+ return id;
137
+ }
138
+
139
+ ngx_table_elt_t * ngx_http_push_add_response_header(ngx_http_request_t *r, const ngx_str_t *header_name, const ngx_str_t *header_value) {
140
+ ngx_table_elt_t *h = ngx_list_push(&r->headers_out.headers);
141
+ if (h == NULL) {
142
+ return NULL;
143
+ }
144
+ h->hash = 1;
145
+ h->key.len = header_name->len;
146
+ h->key.data = header_name->data;
147
+ h->value.len = header_value->len;
148
+ h->value.data = header_value->data;
149
+ return h;
150
+ }
151
+
152
+ static ngx_str_t * ngx_http_push_find_in_header_value(ngx_http_request_t * r, ngx_str_t header_name) {
153
+ ngx_uint_t i;
154
+ ngx_list_part_t *part = &r->headers_in.headers.part;
155
+ ngx_table_elt_t *header= part->elts;
156
+
157
+ for (i = 0; /* void */ ; i++) {
158
+ if (i >= part->nelts) {
159
+ if (part->next == NULL) {
160
+ break;
161
+ }
162
+ part = part->next;
163
+ header = part->elts;
164
+ i = 0;
165
+ }
166
+ if (header[i].key.len == header_name.len
167
+ && ngx_strncasecmp(header[i].key.data, header_name.data, header[i].key.len) == 0) {
168
+ return &header[i].value;
169
+ }
170
+ }
171
+ return NULL;
172
+ }
173
+
174
+ ngx_int_t ngx_http_push_allow_caching(ngx_http_request_t * r) {
175
+ ngx_str_t *tmp_header;
176
+ ngx_str_t header_checks[2] = { NGX_HTTP_PUSH_HEADER_CACHE_CONTROL, NGX_HTTP_PUSH_HEADER_PRAGMA };
177
+ ngx_int_t i = 0;
178
+
179
+ for(; i < 2; i++) {
180
+ tmp_header = ngx_http_push_find_in_header_value(r, header_checks[i]);
181
+
182
+ if (tmp_header != NULL) {
183
+ return !!ngx_strncasecmp(tmp_header->data, NGX_HTTP_PUSH_CACHE_CONTROL_VALUE.data, tmp_header->len);
184
+ }
185
+ }
186
+
187
+ return 1;
188
+ }
189
+
190
+ void ngx_http_push_subscriber_cleanup(ngx_http_push_subscriber_cleanup_t *data) {
191
+ if(data->subscriber!=NULL) { //still queued up
192
+ ngx_http_push_subscriber_t* sb = data->subscriber;
193
+ ngx_http_push_subscriber_del_timer(sb);
194
+ ngx_queue_remove(&data->subscriber->queue);
195
+ ngx_pfree(ngx_http_push_pool, data->subscriber); //was there an error? oh whatever.
196
+ }
197
+ if (data->rchain != NULL) {
198
+ ngx_pfree(data->rpool, data->rchain->buf);
199
+ ngx_pfree(data->rpool, data->rchain);
200
+ data->rchain=NULL;
201
+ }
202
+ if(data->buf_use_count != NULL && --(*data->buf_use_count) <= 0) {
203
+ ngx_buf_t *buf;
204
+ ngx_pfree(ngx_http_push_pool, data->buf_use_count);
205
+ buf=data->buf;
206
+ if(buf->file) {
207
+ ngx_close_file(buf->file->fd);
208
+ }
209
+ ngx_pfree(ngx_http_push_pool, buf);
210
+ }
211
+
212
+ if(data->channel!=NULL) { //we're expected to decrement the subscriber count
213
+ ngx_http_push_store->lock();
214
+ data->channel->subscribers--;
215
+ ngx_http_push_store->unlock();
216
+ }
217
+ }
218
+
219
+ ngx_str_t * ngx_http_push_subscriber_get_etag(ngx_http_request_t * r) {
220
+ ngx_uint_t i;
221
+ ngx_list_part_t *part = &r->headers_in.headers.part;
222
+ ngx_table_elt_t *header= part->elts;
223
+
224
+ for (i = 0; /* void */ ; i++) {
225
+ if (i >= part->nelts) {
226
+ if (part->next == NULL) {
227
+ break;
228
+ }
229
+ part = part->next;
230
+ header = part->elts;
231
+ i = 0;
232
+ }
233
+ if (header[i].key.len == NGX_HTTP_PUSH_HEADER_IF_NONE_MATCH.len
234
+ && ngx_strncasecmp(header[i].key.data, NGX_HTTP_PUSH_HEADER_IF_NONE_MATCH.data, header[i].key.len) == 0) {
235
+ return &header[i].value;
236
+ }
237
+ }
238
+ return NULL;
239
+ }
240
+
241
+ ngx_int_t ngx_http_push_subscriber_get_msg_id(ngx_http_request_t *r, ngx_http_push_msg_id_t *id) {
242
+ ngx_str_t *if_none_match = ngx_http_push_subscriber_get_etag(r);
243
+ ngx_int_t tag=0;
244
+ id->time=(r->headers_in.if_modified_since == NULL) ? 0 : ngx_http_parse_time(r->headers_in.if_modified_since->value.data, r->headers_in.if_modified_since->value.len);
245
+ if(if_none_match==NULL || (if_none_match!=NULL && (tag = ngx_atoi(if_none_match->data, if_none_match->len))==NGX_ERROR)) {
246
+ tag=0;
247
+ }
248
+ id->tag=ngx_abs(tag);
249
+ return NGX_OK;
250
+ }
251
+
252
+ //allocates nothing
253
+ ngx_int_t ngx_http_push_prepare_response_to_subscriber_request(ngx_http_request_t *r, ngx_chain_t *chain, ngx_str_t *content_type, ngx_str_t *etag, time_t last_modified) {
254
+ ngx_int_t res;
255
+ if (content_type!=NULL) {
256
+ r->headers_out.content_type.len=content_type->len;
257
+ r->headers_out.content_type.data = content_type->data;
258
+ r->headers_out.content_type_len = r->headers_out.content_type.len;
259
+ }
260
+ if(last_modified) {
261
+ //if-modified-since header
262
+ r->headers_out.last_modified_time=last_modified;
263
+ }
264
+ if(etag!=NULL) {
265
+ //etag, if we need one
266
+ if ((ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_ETAG, etag))==NULL) {
267
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
268
+ }
269
+ }
270
+ //Vary header needed for proper HTTP caching.
271
+ ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_VARY, &NGX_HTTP_PUSH_VARY_HEADER_VALUE);
272
+
273
+ r->headers_out.status=NGX_HTTP_OK;
274
+ //we know the entity length, and we're using just one buffer. so no chunking please.
275
+ r->headers_out.content_length_n=ngx_buf_size(chain->buf);
276
+ if((res = ngx_http_send_header(r)) >= NGX_HTTP_SPECIAL_RESPONSE) {
277
+ return res;
278
+ }
279
+
280
+ return ngx_http_output_filter(r, chain);
281
+ }
282
+
283
+ //allocates message and responds to subscriber
284
+ ngx_int_t ngx_http_push_alloc_for_subscriber_response(ngx_pool_t *pool, ngx_int_t shared, ngx_http_push_msg_t *msg, ngx_chain_t **chain, ngx_str_t **content_type, ngx_str_t **etag, time_t *last_modified) {
285
+ if(etag != NULL && (*etag = ngx_http_push_store->message_etag(msg, pool))==NULL) {
286
+ //oh, nevermind...
287
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "push module: unable to allocate memory for Etag header");
288
+ return NGX_ERROR;
289
+ }
290
+ if(content_type != NULL && (*content_type= ngx_http_push_store->message_content_type(msg, pool))==NULL) {
291
+ //oh, nevermind...
292
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "push module: unable to allocate memory for Content Type header");
293
+ if(pool == NULL) {
294
+ ngx_free(*etag);
295
+ }
296
+ else {
297
+ ngx_pfree(pool, *etag);
298
+ }
299
+ return NGX_ERROR;
300
+ }
301
+
302
+ //preallocate output chain. yes, same one for every waiting subscriber
303
+ if(chain != NULL && (*chain = ngx_http_push_create_output_chain(msg->buf, pool, ngx_cycle->log))==NULL) {
304
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "push module: unable to allocate buffer chain while responding to subscriber request");
305
+ if(pool == NULL) {
306
+ ngx_free(*etag);
307
+ ngx_free(*content_type);
308
+ }
309
+ else {
310
+ ngx_pfree(pool, *etag);
311
+ ngx_pfree(pool, *content_type);
312
+ }
313
+ return NGX_ERROR;
314
+ }
315
+
316
+ if(last_modified != NULL) {
317
+ *last_modified = msg->message_time;
318
+ }
319
+ ngx_http_push_store->unlock();
320
+
321
+
322
+ if(pool!=NULL && shared == 0 && ((*chain)->buf->file!=NULL)) {
323
+ //close file when we're done with it
324
+ ngx_pool_cleanup_t *cln;
325
+ ngx_pool_cleanup_file_t *clnf;
326
+
327
+ if((cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t)))==NULL) {
328
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "push module: unable to allocate buffer chain pool cleanup while responding to subscriber request");
329
+ ngx_pfree(pool, *etag);
330
+ ngx_pfree(pool, *content_type);
331
+ ngx_pfree(pool, *chain);
332
+ return NGX_ERROR;
333
+ }
334
+ cln->handler = ngx_pool_cleanup_file;
335
+ clnf = cln->data;
336
+ clnf->fd = (*chain)->buf->file->fd;
337
+ clnf->name = (*chain)->buf->file->name.data;
338
+ clnf->log = ngx_cycle->log;
339
+ }
340
+ return NGX_OK;
341
+ }
342
+
343
+
344
+
345
+ static void ngx_http_push_match_channel_info_subtype(size_t off, u_char *cur, size_t rem, u_char **priority, const ngx_str_t **format, ngx_str_t *content_type) {
346
+ static ngx_http_push_content_subtype_t subtypes[] = {
347
+ { "json" , 4, &NGX_HTTP_PUSH_CHANNEL_INFO_JSON },
348
+ { "yaml" , 4, &NGX_HTTP_PUSH_CHANNEL_INFO_YAML },
349
+ { "xml" , 3, &NGX_HTTP_PUSH_CHANNEL_INFO_XML },
350
+ { "x-json", 6, &NGX_HTTP_PUSH_CHANNEL_INFO_JSON },
351
+ { "x-yaml", 6, &NGX_HTTP_PUSH_CHANNEL_INFO_YAML }
352
+ };
353
+ u_char *start = cur + off;
354
+ ngx_uint_t i;
355
+
356
+ for(i=0; i<(sizeof(subtypes)/sizeof(ngx_http_push_content_subtype_t)); i++) {
357
+ if(ngx_strncmp(start, subtypes[i].subtype, rem<subtypes[i].len ? rem : subtypes[i].len)==0) {
358
+ if(*priority>start) {
359
+ *format = subtypes[i].format;
360
+ *priority = start;
361
+ content_type->data=cur;
362
+ content_type->len= off + 1 + subtypes[i].len;
363
+ }
364
+ }
365
+ }
366
+ }
367
+
368
+ //print information about a channel
369
+ static ngx_int_t ngx_http_push_channel_info(ngx_http_request_t *r, ngx_uint_t messages, ngx_uint_t subscribers, time_t last_seen) {
370
+ ngx_buf_t *b;
371
+ ngx_uint_t len;
372
+ ngx_str_t content_type = ngx_string("text/plain");
373
+ const ngx_str_t *format = &NGX_HTTP_PUSH_CHANNEL_INFO_PLAIN;
374
+ time_t time_elapsed = ngx_time() - last_seen;
375
+
376
+ if(r->headers_in.accept) {
377
+ //lame content-negotiation (without regard for qvalues)
378
+ u_char *accept = r->headers_in.accept->value.data;
379
+ size_t len = r->headers_in.accept->value.len;
380
+ size_t rem;
381
+ u_char *cur = accept;
382
+ u_char *priority=&accept[len-1];
383
+ for(rem=len; (cur = ngx_strnstr(cur, "text/", rem))!=NULL; cur += sizeof("text/")-1) {
384
+ rem=len - ((size_t)(cur-accept)+sizeof("text/")-1);
385
+ if(ngx_strncmp(cur+sizeof("text/")-1, "plain", rem<5 ? rem : 5)==0) {
386
+ if(priority) {
387
+ format = &NGX_HTTP_PUSH_CHANNEL_INFO_PLAIN;
388
+ priority = cur+sizeof("text/")-1;
389
+ //content-type is already set by default
390
+ }
391
+ }
392
+ ngx_http_push_match_channel_info_subtype(sizeof("text/")-1, cur, rem, &priority, &format, &content_type);
393
+ }
394
+ cur = accept;
395
+ for(rem=len; (cur = ngx_strnstr(cur, "application/", rem))!=NULL; cur += sizeof("application/")-1) {
396
+ rem=len - ((size_t)(cur-accept)+sizeof("application/")-1);
397
+ ngx_http_push_match_channel_info_subtype(sizeof("application/")-1, cur, rem, &priority, &format, &content_type);
398
+ }
399
+ }
400
+
401
+ r->headers_out.content_type.len = content_type.len;
402
+ r->headers_out.content_type.data = content_type.data;
403
+ r->headers_out.content_type_len = r->headers_out.content_type.len;
404
+
405
+ len = format->len - 8 - 1 + 3*NGX_INT_T_LEN; //minus 8 sprintf
406
+
407
+ if ((b = ngx_create_temp_buf(r->pool, len)) == NULL) {
408
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
409
+ }
410
+ b->last = ngx_sprintf(b->last, (char *)format->data, messages, last_seen==0 ? -1 : (ngx_int_t) time_elapsed ,subscribers);
411
+
412
+ //lastly, set the content-length, because if the status code isn't 200, nginx may not do so automatically
413
+ r->headers_out.content_length_n = ngx_buf_size(b);
414
+
415
+ if (ngx_http_send_header(r) > NGX_HTTP_SPECIAL_RESPONSE) {
416
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
417
+ }
418
+
419
+ return ngx_http_output_filter(r, ngx_http_push_create_output_chain(b, r->pool, r->connection->log));
420
+ }
421
+
422
+
423
+
424
+ #define NGX_HTTP_PUSH_MAKE_CONTENT_TYPE(content_type, content_type_len, msg, pool) \
425
+ if(((content_type) = ngx_palloc(pool, sizeof(*content_type)+content_type_len))!=NULL) { \
426
+ (content_type)->len=content_type_len; \
427
+ (content_type)->data=(u_char *)((content_type)+1); \
428
+ ngx_memcpy(content_type->data, (msg)->content_type.data, content_type_len); \
429
+ }
430
+
431
+ #define NGX_HTTP_PUSH_OPTIONS_OK_MESSAGE "Go ahead"
432
+
433
+
434
+ ngx_int_t ngx_push_longpoll_subscriber_enqueue(ngx_http_push_channel_t *channel, ngx_http_push_subscriber_t *subscriber, ngx_int_t subscriber_timeout) {
435
+ ngx_http_cleanup_t *cln;
436
+ ngx_http_push_subscriber_cleanup_t *clndata;
437
+ ngx_http_request_t *r = subscriber->request;
438
+ //attach a cleaner to remove the request from the channel and handle shared buffer deallocation.
439
+ if ((cln=ngx_http_cleanup_add(r, sizeof(*clndata))) == NULL) { //make sure we can.
440
+ return NGX_ERROR;
441
+ }
442
+ cln->handler = (ngx_http_cleanup_pt) ngx_http_push_subscriber_cleanup;
443
+ clndata = (ngx_http_push_subscriber_cleanup_t *) cln->data;
444
+ clndata->channel=channel;
445
+ clndata->subscriber=subscriber;
446
+ clndata->buf_use_count=0;
447
+ clndata->buf=NULL;
448
+ clndata->rchain=NULL;
449
+ clndata->rpool=NULL;
450
+ subscriber->clndata=clndata;
451
+
452
+ //set up subscriber timeout event
453
+ ngx_memzero(&subscriber->event, sizeof(subscriber->event));
454
+ if (subscriber_timeout > 0) {
455
+ subscriber->event.handler = ngx_http_push_clean_timeouted_subscriber;
456
+ subscriber->event.data = subscriber;
457
+ subscriber->event.log = r->connection->log;
458
+ ngx_add_timer(&subscriber->event, subscriber_timeout * 1000);
459
+ }
460
+
461
+ r->read_event_handler = ngx_http_test_reading;
462
+ r->write_event_handler = ngx_http_request_empty_handler;
463
+ r->main->count++; //this is the right way to hold and finalize the request... maybe
464
+ //r->keepalive = 1; //stayin' alive!!
465
+ return NGX_OK;
466
+ }
467
+
468
+ /*
469
+ ngx_int_t ngx_push_longpoll_subscriber_dequeue(ngx_http_push_subscriber_t *subscriber) {
470
+ return NGX_OK;
471
+ }
472
+ */
473
+
474
+ static ngx_int_t ngx_http_push_response_channel_ptr_info(ngx_http_push_channel_t *channel, ngx_http_request_t *r, ngx_int_t status_code) {
475
+ time_t last_seen = 0;
476
+ ngx_uint_t subscribers = 0;
477
+ ngx_uint_t messages = 0;
478
+ if(channel!=NULL) {
479
+ ngx_http_push_store->lock();
480
+ subscribers = channel->subscribers;
481
+ last_seen = channel->last_seen;
482
+ messages = channel->messages;
483
+ ngx_http_push_store->unlock();
484
+ r->headers_out.status = status_code == (ngx_int_t) NULL ? NGX_HTTP_OK : status_code;
485
+ if (status_code == NGX_HTTP_CREATED) {
486
+ r->headers_out.status_line.len =sizeof("201 Created")- 1;
487
+ r->headers_out.status_line.data=(u_char *) "201 Created";
488
+ }
489
+ else if (status_code == NGX_HTTP_ACCEPTED) {
490
+ r->headers_out.status_line.len =sizeof("202 Accepted")- 1;
491
+ r->headers_out.status_line.data=(u_char *) "202 Accepted";
492
+ }
493
+ ngx_http_push_channel_info(r, messages, subscribers, last_seen);
494
+ }
495
+ else {
496
+ //404!
497
+ r->headers_out.status=NGX_HTTP_NOT_FOUND;
498
+ //just the headers, please. we don't care to describe the situation or
499
+ //respond with an html page
500
+ r->headers_out.content_length_n=0;
501
+ r->header_only = 1;
502
+ ngx_http_send_header(r);
503
+ }
504
+ return NGX_OK;
505
+ }
506
+
507
+ static ngx_int_t ngx_http_push_response_channel_info(ngx_str_t *channel_id, ngx_http_request_t *r, ngx_int_t status_code) {
508
+ ngx_http_push_channel_t *channel;
509
+ ngx_http_push_loc_conf_t *cf = ngx_http_get_module_loc_conf(r, ngx_http_push_module);
510
+ channel = channel_id == NULL ? NULL : ngx_http_push_store->find_channel(channel_id, cf->channel_timeout, NULL);
511
+ return ngx_http_push_response_channel_ptr_info(channel, r, status_code);
512
+ }
513
+
514
+ static ngx_int_t subscribe_longpoll_callback(ngx_int_t status, ngx_http_request_t *r) {
515
+ ngx_http_finalize_request(r, status);
516
+ return NGX_OK;
517
+ }
518
+
519
+ static ngx_int_t subscribe_intervalpoll_callback(ngx_http_push_msg_t *msg, ngx_int_t msg_search_outcome, ngx_http_request_t *r) {
520
+ ngx_chain_t *chain;
521
+ ngx_str_t *content_type, *etag;
522
+ time_t last_modified;
523
+ switch(msg_search_outcome) {
524
+ case NGX_HTTP_PUSH_MESSAGE_EXPECTED:
525
+ //interval-polling subscriber requests get a 304 with their entity tags preserved.
526
+ if (r->headers_in.if_modified_since != NULL) {
527
+ r->headers_out.last_modified_time=ngx_http_parse_time(r->headers_in.if_modified_since->value.data, r->headers_in.if_modified_since->value.len);
528
+ }
529
+ if ((etag=ngx_http_push_subscriber_get_etag(r)) != NULL) {
530
+ ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_ETAG, etag);
531
+ }
532
+ ngx_http_finalize_request(r, NGX_HTTP_NOT_MODIFIED);
533
+ return NGX_OK;
534
+
535
+ case NGX_HTTP_PUSH_MESSAGE_FOUND:
536
+ ngx_http_push_alloc_for_subscriber_response(r->pool, 0, msg, &chain, &content_type, &etag, &last_modified);
537
+ ngx_http_push_prepare_response_to_subscriber_request(r, chain, content_type, etag, last_modified);
538
+ ngx_http_push_store->release_message(NULL, msg);
539
+ ngx_http_finalize_request(r, NGX_OK);
540
+ return NGX_OK;
541
+
542
+ default:
543
+ ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
544
+ return NGX_ERROR;
545
+ }
546
+ }
547
+
548
+ ngx_int_t ngx_http_push_subscriber_handler(ngx_http_request_t *r) {
549
+ ngx_http_push_loc_conf_t *cf = ngx_http_get_module_loc_conf(r, ngx_http_push_module);
550
+ ngx_str_t *channel_id;
551
+ ngx_http_push_msg_id_t msg_id;
552
+
553
+ if((channel_id=ngx_http_push_get_channel_id(r, cf)) == NULL) {
554
+ return r->headers_out.status ? NGX_OK : NGX_HTTP_INTERNAL_SERVER_ERROR;
555
+ }
556
+
557
+ switch(r->method) {
558
+ case NGX_HTTP_GET:
559
+ ngx_http_push_subscriber_get_msg_id(r, &msg_id);
560
+
561
+ r->main->count++; //let it linger until callback
562
+ switch(cf->subscriber_poll_mechanism) {
563
+ ngx_int_t msg_search_outcome;
564
+
565
+ //for NGX_HTTP_PUSH_MECHANISM_LONGPOLL
566
+ case NGX_HTTP_PUSH_MECHANISM_INTERVALPOLL:
567
+ ngx_http_push_store->get_message(channel_id, &msg_id, &msg_search_outcome, r, &subscribe_intervalpoll_callback);
568
+ break;
569
+
570
+ case NGX_HTTP_PUSH_MECHANISM_LONGPOLL:
571
+ ngx_http_push_store->subscribe(channel_id, &msg_id, r, &subscribe_longpoll_callback);
572
+ break;
573
+ }
574
+ return NGX_DONE;
575
+
576
+ case NGX_HTTP_OPTIONS:
577
+ ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN, &NGX_HTTP_PUSH_ANYSTRING);
578
+ ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_HEADERS, &NGX_HTTP_PUSH_ACCESS_CONTROL_ALLOWED_SUBSCRIBER_HEADERS);
579
+ ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_METHODS, &NGX_HTTP_PUSH_ALLOW_GET_OPTIONS);
580
+ r->headers_out.content_length_n = 0;
581
+ r->header_only = 1;
582
+ r->headers_out.status=NGX_HTTP_OK;
583
+ ngx_http_send_header(r);
584
+ return NGX_OK;
585
+
586
+ default:
587
+ ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_ALLOW, &NGX_HTTP_PUSH_ALLOW_GET_OPTIONS); //valid HTTP for the win
588
+ return NGX_HTTP_NOT_ALLOWED;
589
+ }
590
+ }
591
+
592
+ static ngx_int_t publish_callback(ngx_int_t status, ngx_http_push_channel_t *ch, ngx_http_request_t *r) {
593
+ switch(status) {
594
+ case NGX_HTTP_PUSH_MESSAGE_QUEUED:
595
+ //message was queued successfully, but there were no subscribers to receive it.
596
+ ngx_http_finalize_request(r, ngx_http_push_response_channel_ptr_info(ch, r, NGX_HTTP_ACCEPTED));
597
+ return NGX_OK;
598
+
599
+ case NGX_HTTP_PUSH_MESSAGE_RECEIVED:
600
+ //message was queued successfully, and it was already sent to at least one subscriber
601
+ ngx_http_finalize_request(r, ngx_http_push_response_channel_ptr_info(ch, r, NGX_HTTP_CREATED));
602
+ return NGX_OK;
603
+
604
+ case NGX_ERROR:
605
+ //WTF?
606
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push module: error broadcasting message to workers");
607
+ ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
608
+ return NGX_ERROR;
609
+
610
+ default:
611
+ //for debugging, mostly. I don't expect this branch to behit during regular operation
612
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push module: TOTALLY UNEXPECTED error broadcasting message to workers");
613
+ ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
614
+ return NGX_ERROR;
615
+ }
616
+ }
617
+
618
+ static void ngx_http_push_publisher_body_handler(ngx_http_request_t * r) {
619
+ ngx_str_t *channel_id;
620
+ ngx_http_push_loc_conf_t *cf = ngx_http_get_module_loc_conf(r, ngx_http_push_module);
621
+ ngx_uint_t method = r->method;
622
+
623
+ if((channel_id = ngx_http_push_get_channel_id(r, cf))==NULL) {
624
+ ngx_http_finalize_request(r, r->headers_out.status ? NGX_OK : NGX_HTTP_INTERNAL_SERVER_ERROR);
625
+ return;
626
+ }
627
+
628
+ switch(method) {
629
+ case NGX_HTTP_POST:
630
+ case NGX_HTTP_PUT:
631
+ ngx_http_push_store->publish(channel_id, r, &publish_callback);
632
+ break;
633
+
634
+ case NGX_HTTP_DELETE:
635
+ ngx_http_finalize_request(r, ngx_http_push_response_channel_info(channel_id, r, NGX_HTTP_OK));
636
+ ngx_http_push_store->delete_channel(channel_id);
637
+ break;
638
+
639
+ case NGX_HTTP_GET:
640
+ ngx_http_finalize_request(r, ngx_http_push_response_channel_info(channel_id, r, NGX_HTTP_OK));
641
+ break;
642
+
643
+ case NGX_HTTP_OPTIONS:
644
+ ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN, &NGX_HTTP_PUSH_ANYSTRING);
645
+ ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_HEADERS, &NGX_HTTP_PUSH_ACCESS_CONTROL_ALLOWED_PUBLISHER_HEADERS);
646
+ ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_ACCESS_CONTROL_ALLOW_METHODS, &NGX_HTTP_PUSH_ALLOW_GET_POST_PUT_DELETE_OPTIONS);
647
+ r->header_only = 1;
648
+ r->headers_out.content_length_n = 0;
649
+ r->headers_out.status=NGX_HTTP_OK;
650
+ ngx_http_send_header(r);
651
+ ngx_http_finalize_request(r, NGX_HTTP_OK);
652
+ break;
653
+
654
+ default:
655
+ //some other weird request method
656
+ ngx_http_push_add_response_header(r, &NGX_HTTP_PUSH_HEADER_ALLOW, &NGX_HTTP_PUSH_ALLOW_GET_POST_PUT_DELETE_OPTIONS);
657
+ ngx_http_finalize_request(r, NGX_HTTP_NOT_ALLOWED);
658
+ break;
659
+ }
660
+ }
661
+
662
+ ngx_int_t ngx_http_push_respond_to_subscribers(ngx_http_push_channel_t *channel, ngx_http_push_subscriber_t *sentinel, ngx_http_push_msg_t *msg, ngx_int_t status_code, const ngx_str_t *status_line) {
663
+
664
+ //copy everything we need first
665
+ ngx_str_t *content_type=NULL;
666
+ ngx_str_t *etag=NULL;
667
+ time_t last_modified = 0;
668
+ ngx_chain_t *chain=NULL;
669
+ ngx_http_request_t *r;
670
+ ngx_buf_t *buffer = NULL;
671
+ ngx_chain_t *rchain;
672
+ ngx_buf_t *rbuffer;
673
+ ngx_int_t *buf_use_count = NULL;
674
+ ngx_http_push_subscriber_cleanup_t *clndata;
675
+ ngx_http_push_subscriber_t *cur=NULL;
676
+ ngx_int_t responded_subscribers=0;
677
+
678
+ if(sentinel==NULL) {
679
+ //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "respond_to_subscribers with sentinel==NULL");
680
+ return NGX_OK;
681
+ }
682
+
683
+ if(msg!=NULL) {
684
+ if(ngx_http_push_alloc_for_subscriber_response(ngx_http_push_pool, 1, msg, &chain, &content_type, &etag, &last_modified)==NGX_ERROR) {
685
+ ngx_http_push_store->release_message(channel, msg);
686
+ return NGX_ERROR;
687
+ }
688
+
689
+ buffer = chain->buf;
690
+ buffer->recycled = 1;
691
+
692
+ buf_use_count = ngx_pcalloc(ngx_http_push_pool, sizeof(*buf_use_count));
693
+ *buf_use_count = ngx_http_push_store->channel_worker_subscribers(sentinel);
694
+ }
695
+
696
+ while((cur=ngx_http_push_store->next_subscriber(channel, sentinel, cur, 1))!=NULL) {
697
+ //in this block, nothing in shared memory should be dereferenced.
698
+ r=cur->request;
699
+
700
+ if(msg!=NULL) {
701
+ //chain and buffer for this request
702
+ rchain = ngx_pcalloc(r->pool, sizeof(*rchain));
703
+ rchain->next = NULL;
704
+ rbuffer = ngx_pcalloc(r->pool, sizeof(*rbuffer));
705
+ rchain->buf = rbuffer;
706
+ ngx_memcpy(rbuffer, buffer, sizeof(*buffer));
707
+
708
+ //request buffer cleanup
709
+ clndata = cur->clndata;
710
+ clndata->buf = buffer;
711
+ clndata->buf_use_count = buf_use_count;
712
+ clndata->rchain = rchain;
713
+ clndata->rpool = r->pool;
714
+
715
+ if (rbuffer->in_file && (fcntl(rbuffer->file->fd, F_GETFD) == -1)) {
716
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push module: buffer in invalid file descriptor");
717
+ }
718
+ //cleanup oughtn't dequeue anything. or decrement the subscriber count, for that matter
719
+ ngx_http_push_subscriber_clear_ctx(cur);
720
+ ngx_http_finalize_request(r, ngx_http_push_prepare_response_to_subscriber_request(r, rchain, content_type, etag, last_modified)); //BAM!
721
+ }
722
+ else {
723
+ ngx_http_push_subscriber_clear_ctx(cur);
724
+ ngx_http_finalize_request(r, ngx_http_push_respond_status_only(r, status_code, status_line));
725
+ }
726
+ responded_subscribers++;
727
+ }
728
+ if(msg!=NULL) {
729
+ ngx_http_push_store->release_message(channel, msg);
730
+ ngx_pfree(ngx_http_push_pool, etag);
731
+ ngx_pfree(ngx_http_push_pool, content_type);
732
+ ngx_pfree(ngx_http_push_pool, chain);
733
+ }
734
+
735
+ //ngx_log_error(NGX_LOG_WARN, ngx_cycle->log, 0, "respond_to_subscribers with msg %p finished", msg);
736
+ ngx_http_push_store->lock();
737
+ channel->subscribers-=responded_subscribers;
738
+ //is the message still needed?
739
+ ngx_http_push_store->unlock();
740
+ ngx_http_push_store->release_subscriber_sentinel(channel, sentinel);
741
+ return NGX_OK;
742
+ }
743
+
744
+ ngx_int_t ngx_http_push_publisher_handler(ngx_http_request_t * r) {
745
+ ngx_int_t rc;
746
+
747
+ /* Instruct ngx_http_read_subscriber_request_body to store the request
748
+ body entirely in a memory buffer or in a file */
749
+ r->request_body_in_single_buf = 1;
750
+ r->request_body_in_persistent_file = 1;
751
+ r->request_body_in_clean_file = 0;
752
+ r->request_body_file_log_level = 0;
753
+
754
+ rc = ngx_http_read_client_request_body(r, ngx_http_push_publisher_body_handler);
755
+ if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
756
+ return rc;
757
+ }
758
+ return NGX_DONE;
759
+ }
760
+
761
+ void ngx_http_push_copy_preallocated_buffer(ngx_buf_t *buf, ngx_buf_t *cbuf) {
762
+ if (cbuf!=NULL) {
763
+ ngx_memcpy(cbuf, buf, sizeof(*buf)); //overkill?
764
+ if(buf->temporary || buf->memory) { //we don't want to copy mmpapped memory, so no ngx_buf_in_momory(buf)
765
+ cbuf->pos = (u_char *) (cbuf+1);
766
+ cbuf->last = cbuf->pos + ngx_buf_size(buf);
767
+ cbuf->start=cbuf->pos;
768
+ cbuf->end = cbuf->start + ngx_buf_size(buf);
769
+ ngx_memcpy(cbuf->pos, buf->pos, ngx_buf_size(buf));
770
+ cbuf->memory=ngx_buf_in_memory_only(buf) ? 1 : 0;
771
+ }
772
+ if (buf->file!=NULL) {
773
+ cbuf->file = (ngx_file_t *) (cbuf+1) + ((buf->temporary || buf->memory) ? ngx_buf_size(buf) : 0);
774
+ cbuf->file->fd=NGX_INVALID_FILE;
775
+ cbuf->file->log=NULL;
776
+ cbuf->file->offset=buf->file->offset;
777
+ cbuf->file->sys_offset=buf->file->sys_offset;
778
+ cbuf->file->name.len=buf->file->name.len;
779
+ cbuf->file->name.data=(u_char *) (cbuf->file+1);
780
+ ngx_memcpy(cbuf->file->name.data, buf->file->name.data, buf->file->name.len);
781
+ }
782
+ }
783
+ }