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,86 @@
1
+
2
+ /*
3
+ * Copyright (C) Yichun Zhang (agentzh)
4
+ */
5
+
6
+
7
+ #ifndef _NGX_HTTP_LUA_SCRIPT_H_INCLUDED_
8
+ #define _NGX_HTTP_LUA_SCRIPT_H_INCLUDED_
9
+
10
+
11
+ #include "ngx_http_lua_common.h"
12
+
13
+
14
+ typedef struct {
15
+ ngx_log_t *log;
16
+ ngx_pool_t *pool;
17
+ ngx_str_t *source;
18
+
19
+ ngx_array_t **lengths;
20
+ ngx_array_t **values;
21
+
22
+ ngx_uint_t variables;
23
+
24
+ unsigned complete_lengths:1;
25
+ unsigned complete_values:1;
26
+ } ngx_http_lua_script_compile_t;
27
+
28
+
29
+ typedef struct {
30
+ ngx_str_t value;
31
+ void *lengths;
32
+ void *values;
33
+ } ngx_http_lua_complex_value_t;
34
+
35
+
36
+ typedef struct {
37
+ ngx_log_t *log;
38
+ ngx_pool_t *pool;
39
+ ngx_str_t *value;
40
+ ngx_http_lua_complex_value_t *complex_value;
41
+ } ngx_http_lua_compile_complex_value_t;
42
+
43
+
44
+ typedef struct {
45
+ u_char *ip;
46
+ u_char *pos;
47
+
48
+ ngx_str_t buf;
49
+
50
+ int *captures;
51
+ ngx_uint_t ncaptures;
52
+ u_char *captures_data;
53
+
54
+ unsigned skip:1;
55
+
56
+ ngx_log_t *log;
57
+ } ngx_http_lua_script_engine_t;
58
+
59
+
60
+ typedef void (*ngx_http_lua_script_code_pt) (ngx_http_lua_script_engine_t *e);
61
+ typedef size_t (*ngx_http_lua_script_len_code_pt)
62
+ (ngx_http_lua_script_engine_t *e);
63
+
64
+
65
+ typedef struct {
66
+ ngx_http_lua_script_code_pt code;
67
+ uintptr_t len;
68
+ } ngx_http_lua_script_copy_code_t;
69
+
70
+
71
+ typedef struct {
72
+ ngx_http_lua_script_code_pt code;
73
+ uintptr_t n;
74
+ } ngx_http_lua_script_capture_code_t;
75
+
76
+
77
+ ngx_int_t ngx_http_lua_compile_complex_value(
78
+ ngx_http_lua_compile_complex_value_t *ccv);
79
+ ngx_int_t ngx_http_lua_complex_value(ngx_http_request_t *r, ngx_str_t *subj,
80
+ size_t offset, ngx_int_t count, int *cap,
81
+ ngx_http_lua_complex_value_t *val, luaL_Buffer *luabuf);
82
+
83
+
84
+ #endif /* _NGX_HTTP_LUA_SCRIPT_H_INCLUDED_ */
85
+
86
+ /* vi:set ft=c ts=4 sw=4 et fdm=marker: */
@@ -0,0 +1,216 @@
1
+
2
+ /*
3
+ * Copyright (C) Xiaozhe Wang (chaoslawful)
4
+ * Copyright (C) Yichun Zhang (agentzh)
5
+ */
6
+
7
+
8
+ #ifndef DDEBUG
9
+ #define DDEBUG 0
10
+ #endif
11
+ #include "ddebug.h"
12
+
13
+
14
+ #include "ngx_http_lua_setby.h"
15
+ #include "ngx_http_lua_exception.h"
16
+ #include "ngx_http_lua_util.h"
17
+ #include "ngx_http_lua_pcrefix.h"
18
+ #include "ngx_http_lua_time.h"
19
+ #include "ngx_http_lua_log.h"
20
+ #include "ngx_http_lua_regex.h"
21
+ #include "ngx_http_lua_variable.h"
22
+ #include "ngx_http_lua_string.h"
23
+ #include "ngx_http_lua_misc.h"
24
+ #include "ngx_http_lua_consts.h"
25
+ #include "ngx_http_lua_shdict.h"
26
+ #include "ngx_http_lua_util.h"
27
+
28
+
29
+ static void ngx_http_lua_set_by_lua_env(lua_State *L, ngx_http_request_t *r,
30
+ size_t nargs, ngx_http_variable_value_t *args);
31
+
32
+
33
+ /* keys in Lua thread for fetching args and nargs in set_by_lua* */
34
+
35
+ #define ngx_http_lua_nargs_key "__ngx_nargs"
36
+
37
+ #define ngx_http_lua_args_key "__ngx_args"
38
+
39
+
40
+ ngx_int_t
41
+ ngx_http_lua_set_by_chunk(lua_State *L, ngx_http_request_t *r, ngx_str_t *val,
42
+ ngx_http_variable_value_t *args, size_t nargs, ngx_str_t *script)
43
+ {
44
+ size_t i;
45
+ ngx_int_t rc;
46
+ u_char *err_msg;
47
+ size_t len;
48
+ u_char *data;
49
+ #if (NGX_PCRE)
50
+ ngx_pool_t *old_pool;
51
+ #endif
52
+
53
+ dd("nargs: %d", (int) nargs);
54
+
55
+ dd("set Lua VM panic handler");
56
+
57
+ lua_atpanic(L, ngx_http_lua_atpanic);
58
+
59
+ NGX_LUA_EXCEPTION_TRY {
60
+ dd("initialize nginx context in Lua VM, code chunk at "
61
+ "stack top sp = 1");
62
+ ngx_http_lua_set_by_lua_env(L, r, nargs, args);
63
+
64
+ /* passing directive arguments to the user code */
65
+ for (i = 0; i < nargs; i++) {
66
+ lua_pushlstring(L, (const char *) args[i].data, args[i].len);
67
+ }
68
+
69
+ #if (NGX_PCRE)
70
+ /* XXX: work-around to nginx regex subsystem */
71
+ old_pool = ngx_http_lua_pcre_malloc_init(r->pool);
72
+ #endif
73
+
74
+ lua_pushcfunction(L, ngx_http_lua_traceback);
75
+ lua_insert(L, 1); /* put it under chunk and args */
76
+
77
+ dd("protected call user code");
78
+
79
+ rc = lua_pcall(L, nargs, 1, 1);
80
+
81
+ dd("after protected call user code");
82
+
83
+ lua_remove(L, 1); /* remove traceback function */
84
+
85
+ #if (NGX_PCRE)
86
+ /* XXX: work-around to nginx regex subsystem */
87
+ ngx_http_lua_pcre_malloc_done(old_pool);
88
+ #endif
89
+
90
+ if (rc != 0) {
91
+ /* error occured when running loaded code */
92
+ err_msg = (u_char *) lua_tolstring(L, -1, &len);
93
+
94
+ if (err_msg == NULL) {
95
+ err_msg = (u_char *) "unknown reason";
96
+ len = sizeof("unknown reason") - 1;
97
+ }
98
+
99
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
100
+ "failed to run set_by_lua*: %*s", len, err_msg);
101
+
102
+ lua_settop(L, 0); /* clear remaining elems on stack */
103
+
104
+ return NGX_ERROR;
105
+ }
106
+
107
+ data = (u_char *) lua_tolstring(L, -1, &len);
108
+
109
+ if (data) {
110
+ val->data = ngx_palloc(r->pool, len);
111
+ if (val->data == NULL) {
112
+ return NGX_ERROR;
113
+ }
114
+
115
+ ngx_memcpy(val->data, data, len);
116
+ val->len = len;
117
+
118
+ } else {
119
+ val->data = NULL;
120
+ val->len = 0;
121
+ }
122
+
123
+ } NGX_LUA_EXCEPTION_CATCH {
124
+
125
+ dd("nginx execution restored");
126
+ return NGX_ERROR;
127
+ }
128
+
129
+ /* clear Lua stack */
130
+ lua_settop(L, 0);
131
+
132
+ return NGX_OK;
133
+ }
134
+
135
+
136
+ int
137
+ ngx_http_lua_setby_param_get(lua_State *L)
138
+ {
139
+ int idx;
140
+ int n;
141
+
142
+ ngx_http_variable_value_t *v;
143
+
144
+ idx = luaL_checkint(L, 2);
145
+ idx--;
146
+
147
+ /* get number of args from globals */
148
+ lua_getglobal(L, ngx_http_lua_nargs_key);
149
+ n = (int) lua_tointeger(L, -1);
150
+
151
+ /* get args from globals */
152
+ lua_getglobal(L, ngx_http_lua_args_key);
153
+ v = lua_touserdata(L, -1);
154
+
155
+ if (idx < 0 || idx > n - 1) {
156
+ lua_pushnil(L);
157
+
158
+ } else {
159
+ lua_pushlstring(L, (const char *) (v[idx].data), v[idx].len);
160
+ }
161
+
162
+ return 1;
163
+ }
164
+
165
+
166
+ /**
167
+ * Set environment table for the given code closure.
168
+ *
169
+ * Before:
170
+ * | code closure | <- top
171
+ * | ... |
172
+ *
173
+ * After:
174
+ * | code closure | <- top
175
+ * | ... |
176
+ * */
177
+ static void
178
+ ngx_http_lua_set_by_lua_env(lua_State *L, ngx_http_request_t *r, size_t nargs,
179
+ ngx_http_variable_value_t *args)
180
+ {
181
+ /* set nginx request pointer to current lua thread's globals table */
182
+ ngx_http_lua_set_req(L, r);
183
+
184
+ lua_pushinteger(L, nargs);
185
+ lua_setglobal(L, ngx_http_lua_nargs_key);
186
+
187
+ lua_pushlightuserdata(L, args);
188
+ lua_setglobal(L, ngx_http_lua_args_key);
189
+
190
+ /**
191
+ * we want to create empty environment for current script
192
+ *
193
+ * newt = {}
194
+ * newt["_G"] = newt
195
+ * setmetatable(newt, {__index = _G})
196
+ *
197
+ * if a function or symbol is not defined in our env, __index will lookup
198
+ * in the global env.
199
+ *
200
+ * all variables created in the script-env will be thrown away at the end
201
+ * of the script run.
202
+ * */
203
+ ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);
204
+
205
+ /* {{{ make new env inheriting main thread's globals table */
206
+ /* the metatable for the new env */
207
+ lua_createtable(L, 0 /* narr */, 1 /* nrec */);
208
+ ngx_http_lua_get_globals_table(L);
209
+ lua_setfield(L, -2, "__index");
210
+ lua_setmetatable(L, -2); /* setmetatable(newt, {__index = _G}) */
211
+ /* }}} */
212
+
213
+ lua_setfenv(L, -2); /* set new running env for the code closure */
214
+ }
215
+
216
+ /* vi:set ft=c ts=4 sw=4 et fdm=marker: */
@@ -0,0 +1,15 @@
1
+ #ifndef _NGX_HTTP_LUA_SET_BY_H_INCLUDED_
2
+ #define _NGX_HTTP_LUA_SET_BY_H_INCLUDED_
3
+
4
+ #include "ngx_http_lua_common.h"
5
+
6
+
7
+ ngx_int_t ngx_http_lua_set_by_chunk(lua_State *L, ngx_http_request_t *r,
8
+ ngx_str_t *val, ngx_http_variable_value_t *args, size_t nargs,
9
+ ngx_str_t *script);
10
+ int ngx_http_lua_setby_param_get(lua_State *L);
11
+
12
+
13
+ #endif /* _NGX_HTTP_LUA_SET_BY_H_INCLUDED_ */
14
+
15
+ /* vi:set ft=c ts=4 sw=4 et fdm=marker: */
@@ -0,0 +1,1844 @@
1
+
2
+ /*
3
+ * Copyright (C) Yichun Zhang (agentzh)
4
+ */
5
+
6
+
7
+ #ifndef DDEBUG
8
+ #define DDEBUG 0
9
+ #endif
10
+ #include "ddebug.h"
11
+
12
+
13
+ #include "ngx_http_lua_shdict.h"
14
+ #include "ngx_http_lua_util.h"
15
+ #include "ngx_http_lua_api.h"
16
+
17
+
18
+ static int ngx_http_lua_shdict_set(lua_State *L);
19
+ static int ngx_http_lua_shdict_safe_set(lua_State *L);
20
+ static int ngx_http_lua_shdict_get(lua_State *L);
21
+ static int ngx_http_lua_shdict_get_stale(lua_State *L);
22
+ static int ngx_http_lua_shdict_get_helper(lua_State *L, int get_stale);
23
+ static int ngx_http_lua_shdict_expire(ngx_http_lua_shdict_ctx_t *ctx,
24
+ ngx_uint_t n);
25
+ static ngx_int_t ngx_http_lua_shdict_lookup(ngx_shm_zone_t *shm_zone,
26
+ ngx_uint_t hash, u_char *kdata, size_t klen,
27
+ ngx_http_lua_shdict_node_t **sdp);
28
+ static int ngx_http_lua_shdict_set_helper(lua_State *L, int flags);
29
+ static int ngx_http_lua_shdict_add(lua_State *L);
30
+ static int ngx_http_lua_shdict_safe_add(lua_State *L);
31
+ static int ngx_http_lua_shdict_replace(lua_State *L);
32
+ static int ngx_http_lua_shdict_incr(lua_State *L);
33
+ static int ngx_http_lua_shdict_delete(lua_State *L);
34
+ static int ngx_http_lua_shdict_flush_all(lua_State *L);
35
+ static int ngx_http_lua_shdict_flush_expired(lua_State *L);
36
+ static int ngx_http_lua_shdict_get_keys(lua_State *L);
37
+
38
+
39
+ #define NGX_HTTP_LUA_SHDICT_ADD 0x0001
40
+ #define NGX_HTTP_LUA_SHDICT_REPLACE 0x0002
41
+ #define NGX_HTTP_LUA_SHDICT_SAFE_STORE 0x0004
42
+
43
+
44
+ ngx_int_t
45
+ ngx_http_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data)
46
+ {
47
+ ngx_http_lua_shdict_ctx_t *octx = data;
48
+
49
+ size_t len;
50
+ ngx_http_lua_shdict_ctx_t *ctx;
51
+ ngx_http_lua_main_conf_t *lmcf;
52
+
53
+ dd("init zone");
54
+
55
+ ctx = shm_zone->data;
56
+
57
+ if (octx) {
58
+ ctx->sh = octx->sh;
59
+ ctx->shpool = octx->shpool;
60
+
61
+ goto done;
62
+ }
63
+
64
+ ctx->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
65
+
66
+ if (shm_zone->shm.exists) {
67
+ ctx->sh = ctx->shpool->data;
68
+
69
+ goto done;
70
+ }
71
+
72
+ ctx->sh = ngx_slab_alloc(ctx->shpool, sizeof(ngx_http_lua_shdict_shctx_t));
73
+ if (ctx->sh == NULL) {
74
+ return NGX_ERROR;
75
+ }
76
+
77
+ ctx->shpool->data = ctx->sh;
78
+
79
+ ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel,
80
+ ngx_http_lua_shdict_rbtree_insert_value);
81
+
82
+ ngx_queue_init(&ctx->sh->queue);
83
+
84
+ len = sizeof(" in lua_shared_dict zone \"\"") + shm_zone->shm.name.len;
85
+
86
+ ctx->shpool->log_ctx = ngx_slab_alloc(ctx->shpool, len);
87
+ if (ctx->shpool->log_ctx == NULL) {
88
+ return NGX_ERROR;
89
+ }
90
+
91
+ ngx_sprintf(ctx->shpool->log_ctx, " in lua_shared_dict zone \"%V\"%Z",
92
+ &shm_zone->shm.name);
93
+
94
+ #if defined(nginx_version) && nginx_version >= 1005013
95
+ ctx->shpool->log_nomem = 0;
96
+ #endif
97
+
98
+ done:
99
+
100
+ dd("get lmcf");
101
+
102
+ lmcf = ctx->main_conf;
103
+
104
+ dd("lmcf->lua: %p", lmcf->lua);
105
+
106
+ lmcf->shm_zones_inited++;
107
+
108
+ if (lmcf->shm_zones_inited == lmcf->shm_zones->nelts
109
+ && lmcf->init_handler)
110
+ {
111
+ if (lmcf->init_handler(ctx->log, lmcf, lmcf->lua) != NGX_OK) {
112
+ /* an error happened */
113
+ return NGX_ERROR;
114
+ }
115
+ }
116
+
117
+ return NGX_OK;
118
+ }
119
+
120
+
121
+ void
122
+ ngx_http_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp,
123
+ ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
124
+ {
125
+ ngx_rbtree_node_t **p;
126
+ ngx_http_lua_shdict_node_t *sdn, *sdnt;
127
+
128
+ for ( ;; ) {
129
+
130
+ if (node->key < temp->key) {
131
+
132
+ p = &temp->left;
133
+
134
+ } else if (node->key > temp->key) {
135
+
136
+ p = &temp->right;
137
+
138
+ } else { /* node->key == temp->key */
139
+
140
+ sdn = (ngx_http_lua_shdict_node_t *) &node->color;
141
+ sdnt = (ngx_http_lua_shdict_node_t *) &temp->color;
142
+
143
+ p = ngx_memn2cmp(sdn->data, sdnt->data, sdn->key_len,
144
+ sdnt->key_len) < 0 ? &temp->left : &temp->right;
145
+ }
146
+
147
+ if (*p == sentinel) {
148
+ break;
149
+ }
150
+
151
+ temp = *p;
152
+ }
153
+
154
+ *p = node;
155
+ node->parent = temp;
156
+ node->left = sentinel;
157
+ node->right = sentinel;
158
+ ngx_rbt_red(node);
159
+ }
160
+
161
+
162
+ static ngx_int_t
163
+ ngx_http_lua_shdict_lookup(ngx_shm_zone_t *shm_zone, ngx_uint_t hash,
164
+ u_char *kdata, size_t klen, ngx_http_lua_shdict_node_t **sdp)
165
+ {
166
+ ngx_int_t rc;
167
+ ngx_time_t *tp;
168
+ uint64_t now;
169
+ int64_t ms;
170
+ ngx_rbtree_node_t *node, *sentinel;
171
+ ngx_http_lua_shdict_ctx_t *ctx;
172
+ ngx_http_lua_shdict_node_t *sd;
173
+
174
+ ctx = shm_zone->data;
175
+
176
+ node = ctx->sh->rbtree.root;
177
+ sentinel = ctx->sh->rbtree.sentinel;
178
+
179
+ while (node != sentinel) {
180
+
181
+ if (hash < node->key) {
182
+ node = node->left;
183
+ continue;
184
+ }
185
+
186
+ if (hash > node->key) {
187
+ node = node->right;
188
+ continue;
189
+ }
190
+
191
+ /* hash == node->key */
192
+
193
+ sd = (ngx_http_lua_shdict_node_t *) &node->color;
194
+
195
+ rc = ngx_memn2cmp(kdata, sd->data, klen, (size_t) sd->key_len);
196
+
197
+ if (rc == 0) {
198
+ ngx_queue_remove(&sd->queue);
199
+ ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);
200
+
201
+ *sdp = sd;
202
+
203
+ dd("node expires: %lld", (long long) sd->expires);
204
+
205
+ if (sd->expires != 0) {
206
+ tp = ngx_timeofday();
207
+
208
+ now = (uint64_t) tp->sec * 1000 + tp->msec;
209
+ ms = sd->expires - now;
210
+
211
+ dd("time to live: %lld", (long long) ms);
212
+
213
+ if (ms < 0) {
214
+ dd("node already expired");
215
+ return NGX_DONE;
216
+ }
217
+ }
218
+
219
+ return NGX_OK;
220
+ }
221
+
222
+ node = (rc < 0) ? node->left : node->right;
223
+ }
224
+
225
+ *sdp = NULL;
226
+
227
+ return NGX_DECLINED;
228
+ }
229
+
230
+
231
+ static int
232
+ ngx_http_lua_shdict_expire(ngx_http_lua_shdict_ctx_t *ctx, ngx_uint_t n)
233
+ {
234
+ ngx_time_t *tp;
235
+ uint64_t now;
236
+ ngx_queue_t *q;
237
+ int64_t ms;
238
+ ngx_rbtree_node_t *node;
239
+ ngx_http_lua_shdict_node_t *sd;
240
+ int freed = 0;
241
+
242
+ tp = ngx_timeofday();
243
+
244
+ now = (uint64_t) tp->sec * 1000 + tp->msec;
245
+
246
+ /*
247
+ * n == 1 deletes one or two expired entries
248
+ * n == 0 deletes oldest entry by force
249
+ * and one or two zero rate entries
250
+ */
251
+
252
+ while (n < 3) {
253
+
254
+ if (ngx_queue_empty(&ctx->sh->queue)) {
255
+ return freed;
256
+ }
257
+
258
+ q = ngx_queue_last(&ctx->sh->queue);
259
+
260
+ sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);
261
+
262
+ if (n++ != 0) {
263
+
264
+ if (sd->expires == 0) {
265
+ return freed;
266
+ }
267
+
268
+ ms = sd->expires - now;
269
+ if (ms > 0) {
270
+ return freed;
271
+ }
272
+ }
273
+
274
+ ngx_queue_remove(q);
275
+
276
+ node = (ngx_rbtree_node_t *)
277
+ ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));
278
+
279
+ ngx_rbtree_delete(&ctx->sh->rbtree, node);
280
+
281
+ ngx_slab_free_locked(ctx->shpool, node);
282
+
283
+ freed++;
284
+ }
285
+
286
+ return freed;
287
+ }
288
+
289
+
290
+ void
291
+ ngx_http_lua_inject_shdict_api(ngx_http_lua_main_conf_t *lmcf, lua_State *L)
292
+ {
293
+ ngx_http_lua_shdict_ctx_t *ctx;
294
+ ngx_uint_t i;
295
+ ngx_shm_zone_t **zone;
296
+
297
+ if (lmcf->shm_zones != NULL) {
298
+ lua_createtable(L, 0, lmcf->shm_zones->nelts /* nrec */);
299
+ /* ngx.shared */
300
+
301
+ lua_createtable(L, 0 /* narr */, 13 /* nrec */); /* shared mt */
302
+
303
+ lua_pushcfunction(L, ngx_http_lua_shdict_get);
304
+ lua_setfield(L, -2, "get");
305
+
306
+ lua_pushcfunction(L, ngx_http_lua_shdict_get_stale);
307
+ lua_setfield(L, -2, "get_stale");
308
+
309
+ lua_pushcfunction(L, ngx_http_lua_shdict_set);
310
+ lua_setfield(L, -2, "set");
311
+
312
+ lua_pushcfunction(L, ngx_http_lua_shdict_safe_set);
313
+ lua_setfield(L, -2, "safe_set");
314
+
315
+ lua_pushcfunction(L, ngx_http_lua_shdict_add);
316
+ lua_setfield(L, -2, "add");
317
+
318
+ lua_pushcfunction(L, ngx_http_lua_shdict_safe_add);
319
+ lua_setfield(L, -2, "safe_add");
320
+
321
+ lua_pushcfunction(L, ngx_http_lua_shdict_replace);
322
+ lua_setfield(L, -2, "replace");
323
+
324
+ lua_pushcfunction(L, ngx_http_lua_shdict_incr);
325
+ lua_setfield(L, -2, "incr");
326
+
327
+ lua_pushcfunction(L, ngx_http_lua_shdict_delete);
328
+ lua_setfield(L, -2, "delete");
329
+
330
+ lua_pushcfunction(L, ngx_http_lua_shdict_flush_all);
331
+ lua_setfield(L, -2, "flush_all");
332
+
333
+ lua_pushcfunction(L, ngx_http_lua_shdict_flush_expired);
334
+ lua_setfield(L, -2, "flush_expired");
335
+
336
+ lua_pushcfunction(L, ngx_http_lua_shdict_get_keys);
337
+ lua_setfield(L, -2, "get_keys");
338
+
339
+ lua_pushvalue(L, -1); /* shared mt mt */
340
+ lua_setfield(L, -2, "__index"); /* shared mt */
341
+
342
+ zone = lmcf->shm_zones->elts;
343
+
344
+ for (i = 0; i < lmcf->shm_zones->nelts; i++) {
345
+ ctx = zone[i]->data;
346
+
347
+ lua_pushlstring(L, (char *) ctx->name.data, ctx->name.len);
348
+ /* shared mt key */
349
+
350
+ lua_pushlightuserdata(L, zone[i]); /* shared mt key ud */
351
+ lua_pushvalue(L, -3); /* shared mt key ud mt */
352
+ lua_setmetatable(L, -2); /* shared mt key ud */
353
+ lua_rawset(L, -4); /* shared mt */
354
+ }
355
+
356
+ lua_pop(L, 1); /* shared */
357
+
358
+ } else {
359
+ lua_newtable(L); /* ngx.shared */
360
+ }
361
+
362
+ lua_setfield(L, -2, "shared");
363
+ }
364
+
365
+
366
+ static int
367
+ ngx_http_lua_shdict_get(lua_State *L)
368
+ {
369
+ return ngx_http_lua_shdict_get_helper(L, 0 /* stale */);
370
+ }
371
+
372
+
373
+ static int
374
+ ngx_http_lua_shdict_get_stale(lua_State *L)
375
+ {
376
+ return ngx_http_lua_shdict_get_helper(L, 1 /* stale */);
377
+ }
378
+
379
+
380
+ static int
381
+ ngx_http_lua_shdict_get_helper(lua_State *L, int get_stale)
382
+ {
383
+ int n;
384
+ ngx_str_t name;
385
+ ngx_str_t key;
386
+ uint32_t hash;
387
+ ngx_int_t rc;
388
+ ngx_http_lua_shdict_ctx_t *ctx;
389
+ ngx_http_lua_shdict_node_t *sd;
390
+ ngx_str_t value;
391
+ int value_type;
392
+ double num;
393
+ u_char c;
394
+ ngx_shm_zone_t *zone;
395
+ uint32_t user_flags = 0;
396
+
397
+ n = lua_gettop(L);
398
+
399
+ if (n != 2) {
400
+ return luaL_error(L, "expecting exactly two arguments, "
401
+ "but only seen %d", n);
402
+ }
403
+
404
+ zone = lua_touserdata(L, 1);
405
+ if (zone == NULL) {
406
+ return luaL_error(L, "bad \"zone\" argument");
407
+ }
408
+
409
+ ctx = zone->data;
410
+ name = ctx->name;
411
+
412
+ if (lua_isnil(L, 2)) {
413
+ lua_pushnil(L);
414
+ lua_pushliteral(L, "nil key");
415
+ return 2;
416
+ }
417
+
418
+ key.data = (u_char *) luaL_checklstring(L, 2, &key.len);
419
+
420
+ if (key.len == 0) {
421
+ lua_pushnil(L);
422
+ lua_pushliteral(L, "empty key");
423
+ return 2;
424
+ }
425
+
426
+ if (key.len > 65535) {
427
+ lua_pushnil(L);
428
+ lua_pushliteral(L, "key too long");
429
+ return 2;
430
+ }
431
+
432
+ hash = ngx_crc32_short(key.data, key.len);
433
+
434
+ #if (NGX_DEBUG)
435
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
436
+ "fetching key \"%V\" in shared dict \"%V\"", &key, &name);
437
+ #endif /* NGX_DEBUG */
438
+
439
+ ngx_shmtx_lock(&ctx->shpool->mutex);
440
+
441
+ #if 1
442
+ if (!get_stale) {
443
+ ngx_http_lua_shdict_expire(ctx, 1);
444
+ }
445
+ #endif
446
+
447
+ rc = ngx_http_lua_shdict_lookup(zone, hash, key.data, key.len, &sd);
448
+
449
+ dd("shdict lookup returns %d", (int) rc);
450
+
451
+ if (rc == NGX_DECLINED || (rc == NGX_DONE && !get_stale)) {
452
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
453
+ lua_pushnil(L);
454
+ return 1;
455
+ }
456
+
457
+ /* rc == NGX_OK || (rc == NGX_DONE && get_stale) */
458
+
459
+ value_type = sd->value_type;
460
+
461
+ dd("data: %p", sd->data);
462
+ dd("key len: %d", (int) sd->key_len);
463
+
464
+ value.data = sd->data + sd->key_len;
465
+ value.len = (size_t) sd->value_len;
466
+
467
+ switch (value_type) {
468
+ case LUA_TSTRING:
469
+
470
+ lua_pushlstring(L, (char *) value.data, value.len);
471
+ break;
472
+
473
+ case LUA_TNUMBER:
474
+
475
+ if (value.len != sizeof(double)) {
476
+
477
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
478
+
479
+ return luaL_error(L, "bad lua number value size found for key %s "
480
+ "in shared_dict %s: %lu", key.data, name.data,
481
+ (unsigned long) value.len);
482
+ }
483
+
484
+ ngx_memcpy(&num, value.data, sizeof(double));
485
+
486
+ lua_pushnumber(L, num);
487
+ break;
488
+
489
+ case LUA_TBOOLEAN:
490
+
491
+ if (value.len != sizeof(u_char)) {
492
+
493
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
494
+
495
+ return luaL_error(L, "bad lua boolean value size found for key %s "
496
+ "in shared_dict %s: %lu", key.data, name.data,
497
+ (unsigned long) value.len);
498
+ }
499
+
500
+ c = *value.data;
501
+
502
+ lua_pushboolean(L, c ? 1 : 0);
503
+ break;
504
+
505
+ default:
506
+
507
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
508
+
509
+ return luaL_error(L, "bad value type found for key %s in "
510
+ "shared_dict %s: %d", key.data, name.data,
511
+ value_type);
512
+ }
513
+
514
+ user_flags = sd->user_flags;
515
+
516
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
517
+
518
+ if (get_stale) {
519
+
520
+ /* always return value, flags, stale */
521
+
522
+ if (user_flags) {
523
+ lua_pushinteger(L, (lua_Integer) user_flags);
524
+
525
+ } else {
526
+ lua_pushnil(L);
527
+ }
528
+
529
+ lua_pushboolean(L, rc == NGX_DONE);
530
+ return 3;
531
+ }
532
+
533
+ if (user_flags) {
534
+ lua_pushinteger(L, (lua_Integer) user_flags);
535
+ return 2;
536
+ }
537
+
538
+ return 1;
539
+ }
540
+
541
+
542
+ static int
543
+ ngx_http_lua_shdict_delete(lua_State *L)
544
+ {
545
+ int n;
546
+
547
+ n = lua_gettop(L);
548
+
549
+ if (n != 2) {
550
+ return luaL_error(L, "expecting 2 arguments, "
551
+ "but only seen %d", n);
552
+ }
553
+
554
+ lua_pushnil(L);
555
+
556
+ return ngx_http_lua_shdict_set_helper(L, 0);
557
+ }
558
+
559
+
560
+ static int
561
+ ngx_http_lua_shdict_flush_all(lua_State *L)
562
+ {
563
+ ngx_queue_t *q;
564
+ ngx_http_lua_shdict_node_t *sd;
565
+ int n;
566
+ ngx_http_lua_shdict_ctx_t *ctx;
567
+ ngx_shm_zone_t *zone;
568
+
569
+ n = lua_gettop(L);
570
+
571
+ if (n != 1) {
572
+ return luaL_error(L, "expecting 1 argument, but seen %d", n);
573
+ }
574
+
575
+ luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
576
+
577
+ zone = lua_touserdata(L, 1);
578
+ if (zone == NULL) {
579
+ return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");
580
+ }
581
+
582
+ ctx = zone->data;
583
+
584
+ ngx_shmtx_lock(&ctx->shpool->mutex);
585
+
586
+ for (q = ngx_queue_head(&ctx->sh->queue);
587
+ q != ngx_queue_sentinel(&ctx->sh->queue);
588
+ q = ngx_queue_next(q))
589
+ {
590
+ sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);
591
+ sd->expires = 1;
592
+ }
593
+
594
+ ngx_http_lua_shdict_expire(ctx, 0);
595
+
596
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
597
+
598
+ return 0;
599
+ }
600
+
601
+
602
+ static int
603
+ ngx_http_lua_shdict_flush_expired(lua_State *L)
604
+ {
605
+ ngx_queue_t *q, *prev;
606
+ ngx_http_lua_shdict_node_t *sd;
607
+ ngx_http_lua_shdict_ctx_t *ctx;
608
+ ngx_shm_zone_t *zone;
609
+ ngx_time_t *tp;
610
+ int freed = 0;
611
+ int attempts = 0;
612
+ ngx_rbtree_node_t *node;
613
+ uint64_t now;
614
+ int n;
615
+
616
+ n = lua_gettop(L);
617
+
618
+ if (n != 1 && n != 2) {
619
+ return luaL_error(L, "expecting 1 or 2 argument(s), but saw %d", n);
620
+ }
621
+
622
+ luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
623
+
624
+ zone = lua_touserdata(L, 1);
625
+ if (zone == NULL) {
626
+ return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");
627
+ }
628
+
629
+ if (n == 2) {
630
+ attempts = luaL_checkint(L, 2);
631
+ }
632
+
633
+ ctx = zone->data;
634
+
635
+ ngx_shmtx_lock(&ctx->shpool->mutex);
636
+
637
+ if (ngx_queue_empty(&ctx->sh->queue)) {
638
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
639
+ lua_pushnumber(L, 0);
640
+ return 1;
641
+ }
642
+
643
+ tp = ngx_timeofday();
644
+
645
+ now = (uint64_t) tp->sec * 1000 + tp->msec;
646
+
647
+ q = ngx_queue_last(&ctx->sh->queue);
648
+
649
+ while (q != ngx_queue_sentinel(&ctx->sh->queue)) {
650
+ prev = ngx_queue_prev(q);
651
+
652
+ sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);
653
+
654
+ if (sd->expires != 0 && sd->expires <= now) {
655
+ ngx_queue_remove(q);
656
+
657
+ node = (ngx_rbtree_node_t *)
658
+ ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));
659
+
660
+ ngx_rbtree_delete(&ctx->sh->rbtree, node);
661
+ ngx_slab_free_locked(ctx->shpool, node);
662
+ freed++;
663
+
664
+ if (attempts && freed == attempts) {
665
+ break;
666
+ }
667
+ }
668
+
669
+ q = prev;
670
+ }
671
+
672
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
673
+
674
+ lua_pushnumber(L, freed);
675
+ return 1;
676
+ }
677
+
678
+
679
+ /*
680
+ * This trades CPU for memory. This is potentially slow. O(2n)
681
+ */
682
+
683
+ static int
684
+ ngx_http_lua_shdict_get_keys(lua_State *L)
685
+ {
686
+ ngx_queue_t *q, *prev;
687
+ ngx_http_lua_shdict_node_t *sd;
688
+ ngx_http_lua_shdict_ctx_t *ctx;
689
+ ngx_shm_zone_t *zone;
690
+ ngx_time_t *tp;
691
+ int total = 0;
692
+ int attempts = 1024;
693
+ uint64_t now;
694
+ int n;
695
+
696
+ n = lua_gettop(L);
697
+
698
+ if (n != 1 && n != 2) {
699
+ return luaL_error(L, "expecting 1 or 2 argument(s), "
700
+ "but saw %d", n);
701
+ }
702
+
703
+ luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
704
+
705
+ zone = lua_touserdata(L, 1);
706
+ if (zone == NULL) {
707
+ return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");
708
+ }
709
+
710
+ if (n == 2) {
711
+ attempts = luaL_checkint(L, 2);
712
+ }
713
+
714
+ ctx = zone->data;
715
+
716
+ ngx_shmtx_lock(&ctx->shpool->mutex);
717
+
718
+ if (ngx_queue_empty(&ctx->sh->queue)) {
719
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
720
+ lua_createtable(L, 0, 0);
721
+ return 1;
722
+ }
723
+
724
+ tp = ngx_timeofday();
725
+
726
+ now = (uint64_t) tp->sec * 1000 + tp->msec;
727
+
728
+ /* first run through: get total number of elements we need to allocate */
729
+
730
+ q = ngx_queue_last(&ctx->sh->queue);
731
+
732
+ while (q != ngx_queue_sentinel(&ctx->sh->queue)) {
733
+ prev = ngx_queue_prev(q);
734
+
735
+ sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);
736
+
737
+ if (sd->expires == 0 || sd->expires > now) {
738
+ total++;
739
+ if (attempts && total == attempts) {
740
+ break;
741
+ }
742
+ }
743
+
744
+ q = prev;
745
+ }
746
+
747
+ lua_createtable(L, total, 0);
748
+
749
+ /* second run through: add keys to table */
750
+
751
+ total = 0;
752
+ q = ngx_queue_last(&ctx->sh->queue);
753
+
754
+ while (q != ngx_queue_sentinel(&ctx->sh->queue)) {
755
+ prev = ngx_queue_prev(q);
756
+
757
+ sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);
758
+
759
+ if (sd->expires == 0 || sd->expires > now) {
760
+ lua_pushlstring(L, (char *) sd->data, sd->key_len);
761
+ lua_rawseti(L, -2, ++total);
762
+ if (attempts && total == attempts) {
763
+ break;
764
+ }
765
+ }
766
+
767
+ q = prev;
768
+ }
769
+
770
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
771
+
772
+ /* table is at top of stack */
773
+ return 1;
774
+ }
775
+
776
+
777
+ static int
778
+ ngx_http_lua_shdict_add(lua_State *L)
779
+ {
780
+ return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_ADD);
781
+ }
782
+
783
+
784
+ static int
785
+ ngx_http_lua_shdict_safe_add(lua_State *L)
786
+ {
787
+ return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_ADD
788
+ |NGX_HTTP_LUA_SHDICT_SAFE_STORE);
789
+ }
790
+
791
+
792
+ static int
793
+ ngx_http_lua_shdict_replace(lua_State *L)
794
+ {
795
+ return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_REPLACE);
796
+ }
797
+
798
+
799
+ static int
800
+ ngx_http_lua_shdict_set(lua_State *L)
801
+ {
802
+ return ngx_http_lua_shdict_set_helper(L, 0);
803
+ }
804
+
805
+
806
+ static int
807
+ ngx_http_lua_shdict_safe_set(lua_State *L)
808
+ {
809
+ return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_SAFE_STORE);
810
+ }
811
+
812
+
813
+ static int
814
+ ngx_http_lua_shdict_set_helper(lua_State *L, int flags)
815
+ {
816
+ int i, n;
817
+ ngx_str_t key;
818
+ uint32_t hash;
819
+ ngx_int_t rc;
820
+ ngx_http_lua_shdict_ctx_t *ctx;
821
+ ngx_http_lua_shdict_node_t *sd;
822
+ ngx_str_t value;
823
+ int value_type;
824
+ double num;
825
+ u_char c;
826
+ lua_Number exptime = 0;
827
+ u_char *p;
828
+ ngx_rbtree_node_t *node;
829
+ ngx_time_t *tp;
830
+ ngx_shm_zone_t *zone;
831
+ int forcible = 0;
832
+ /* indicates whether to foricibly override other
833
+ * valid entries */
834
+ int32_t user_flags = 0;
835
+
836
+ n = lua_gettop(L);
837
+
838
+ if (n != 3 && n != 4 && n != 5) {
839
+ return luaL_error(L, "expecting 3, 4 or 5 arguments, "
840
+ "but only seen %d", n);
841
+ }
842
+
843
+ zone = lua_touserdata(L, 1);
844
+ if (zone == NULL) {
845
+ return luaL_error(L, "bad \"zone\" argument");
846
+ }
847
+
848
+ ctx = zone->data;
849
+
850
+ if (lua_isnil(L, 2)) {
851
+ lua_pushnil(L);
852
+ lua_pushliteral(L, "nil key");
853
+ return 2;
854
+ }
855
+
856
+ key.data = (u_char *) luaL_checklstring(L, 2, &key.len);
857
+
858
+ if (key.len == 0) {
859
+ lua_pushnil(L);
860
+ lua_pushliteral(L, "empty key");
861
+ return 2;
862
+ }
863
+
864
+ if (key.len > 65535) {
865
+ lua_pushnil(L);
866
+ lua_pushliteral(L, "key too long");
867
+ return 2;
868
+ }
869
+
870
+ hash = ngx_crc32_short(key.data, key.len);
871
+
872
+ value_type = lua_type(L, 3);
873
+
874
+ switch (value_type) {
875
+ case LUA_TSTRING:
876
+ value.data = (u_char *) lua_tolstring(L, 3, &value.len);
877
+ break;
878
+
879
+ case LUA_TNUMBER:
880
+ value.len = sizeof(double);
881
+ num = lua_tonumber(L, 3);
882
+ value.data = (u_char *) &num;
883
+ break;
884
+
885
+ case LUA_TBOOLEAN:
886
+ value.len = sizeof(u_char);
887
+ c = lua_toboolean(L, 3) ? 1 : 0;
888
+ value.data = &c;
889
+ break;
890
+
891
+ case LUA_TNIL:
892
+ if (flags & (NGX_HTTP_LUA_SHDICT_ADD|NGX_HTTP_LUA_SHDICT_REPLACE)) {
893
+ lua_pushnil(L);
894
+ lua_pushliteral(L, "attempt to add or replace nil values");
895
+ return 2;
896
+ }
897
+
898
+ ngx_str_null(&value);
899
+ break;
900
+
901
+ default:
902
+ lua_pushnil(L);
903
+ lua_pushliteral(L, "bad value type");
904
+ return 2;
905
+ }
906
+
907
+ if (n >= 4) {
908
+ exptime = luaL_checknumber(L, 4);
909
+ if (exptime < 0) {
910
+ exptime = 0;
911
+ }
912
+ }
913
+
914
+ if (n == 5) {
915
+ user_flags = (uint32_t) luaL_checkinteger(L, 5);
916
+ }
917
+
918
+ ngx_shmtx_lock(&ctx->shpool->mutex);
919
+
920
+ #if 1
921
+ ngx_http_lua_shdict_expire(ctx, 1);
922
+ #endif
923
+
924
+ rc = ngx_http_lua_shdict_lookup(zone, hash, key.data, key.len, &sd);
925
+
926
+ dd("shdict lookup returned %d", (int) rc);
927
+
928
+ if (flags & NGX_HTTP_LUA_SHDICT_REPLACE) {
929
+
930
+ if (rc == NGX_DECLINED || rc == NGX_DONE) {
931
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
932
+
933
+ lua_pushboolean(L, 0);
934
+ lua_pushliteral(L, "not found");
935
+ lua_pushboolean(L, forcible);
936
+ return 3;
937
+ }
938
+
939
+ /* rc == NGX_OK */
940
+
941
+ goto replace;
942
+ }
943
+
944
+ if (flags & NGX_HTTP_LUA_SHDICT_ADD) {
945
+
946
+ if (rc == NGX_OK) {
947
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
948
+
949
+ lua_pushboolean(L, 0);
950
+ lua_pushliteral(L, "exists");
951
+ lua_pushboolean(L, forcible);
952
+ return 3;
953
+ }
954
+
955
+ if (rc == NGX_DONE) {
956
+ /* exists but expired */
957
+
958
+ dd("go to replace");
959
+ goto replace;
960
+ }
961
+
962
+ /* rc == NGX_DECLINED */
963
+
964
+ dd("go to insert");
965
+ goto insert;
966
+ }
967
+
968
+ if (rc == NGX_OK || rc == NGX_DONE) {
969
+
970
+ if (value_type == LUA_TNIL) {
971
+ goto remove;
972
+ }
973
+
974
+ replace:
975
+
976
+ if (value.data && value.len == (size_t) sd->value_len) {
977
+
978
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
979
+ "lua shared dict set: found old entry and value "
980
+ "size matched, reusing it");
981
+
982
+ ngx_queue_remove(&sd->queue);
983
+ ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);
984
+
985
+ sd->key_len = (u_short) key.len;
986
+
987
+ if (exptime > 0) {
988
+ tp = ngx_timeofday();
989
+ sd->expires = (uint64_t) tp->sec * 1000 + tp->msec
990
+ + (uint64_t) (exptime * 1000);
991
+
992
+ } else {
993
+ sd->expires = 0;
994
+ }
995
+
996
+ sd->user_flags = user_flags;
997
+
998
+ sd->value_len = (uint32_t) value.len;
999
+
1000
+ dd("setting value type to %d", value_type);
1001
+
1002
+ sd->value_type = (uint8_t) value_type;
1003
+
1004
+ p = ngx_copy(sd->data, key.data, key.len);
1005
+ ngx_memcpy(p, value.data, value.len);
1006
+
1007
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1008
+
1009
+ lua_pushboolean(L, 1);
1010
+ lua_pushnil(L);
1011
+ lua_pushboolean(L, forcible);
1012
+ return 3;
1013
+ }
1014
+
1015
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
1016
+ "lua shared dict set: found old entry bug value size "
1017
+ "NOT matched, removing it first");
1018
+
1019
+ remove:
1020
+
1021
+ ngx_queue_remove(&sd->queue);
1022
+
1023
+ node = (ngx_rbtree_node_t *)
1024
+ ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));
1025
+
1026
+ ngx_rbtree_delete(&ctx->sh->rbtree, node);
1027
+
1028
+ ngx_slab_free_locked(ctx->shpool, node);
1029
+
1030
+ }
1031
+
1032
+ insert:
1033
+
1034
+ /* rc == NGX_DECLINED or value size unmatch */
1035
+
1036
+ if (value.data == NULL) {
1037
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1038
+
1039
+ lua_pushboolean(L, 1);
1040
+ lua_pushnil(L);
1041
+ lua_pushboolean(L, 0);
1042
+ return 3;
1043
+ }
1044
+
1045
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
1046
+ "lua shared dict set: creating a new entry");
1047
+
1048
+ n = offsetof(ngx_rbtree_node_t, color)
1049
+ + offsetof(ngx_http_lua_shdict_node_t, data)
1050
+ + key.len
1051
+ + value.len;
1052
+
1053
+ node = ngx_slab_alloc_locked(ctx->shpool, n);
1054
+
1055
+ if (node == NULL) {
1056
+
1057
+ if (flags & NGX_HTTP_LUA_SHDICT_SAFE_STORE) {
1058
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1059
+
1060
+ lua_pushboolean(L, 0);
1061
+ lua_pushliteral(L, "no memory");
1062
+ return 2;
1063
+ }
1064
+
1065
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
1066
+ "lua shared dict set: overriding non-expired items "
1067
+ "due to memory shortage for entry \"%V\"", &key);
1068
+
1069
+ for (i = 0; i < 30; i++) {
1070
+ if (ngx_http_lua_shdict_expire(ctx, 0) == 0) {
1071
+ break;
1072
+ }
1073
+
1074
+ forcible = 1;
1075
+
1076
+ node = ngx_slab_alloc_locked(ctx->shpool, n);
1077
+ if (node != NULL) {
1078
+ goto allocated;
1079
+ }
1080
+ }
1081
+
1082
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1083
+
1084
+ lua_pushboolean(L, 0);
1085
+ lua_pushliteral(L, "no memory");
1086
+ lua_pushboolean(L, forcible);
1087
+ return 3;
1088
+ }
1089
+
1090
+ allocated:
1091
+
1092
+ sd = (ngx_http_lua_shdict_node_t *) &node->color;
1093
+
1094
+ node->key = hash;
1095
+ sd->key_len = (u_short) key.len;
1096
+
1097
+ if (exptime > 0) {
1098
+ tp = ngx_timeofday();
1099
+ sd->expires = (uint64_t) tp->sec * 1000 + tp->msec
1100
+ + (uint64_t) (exptime * 1000);
1101
+
1102
+ } else {
1103
+ sd->expires = 0;
1104
+ }
1105
+
1106
+ sd->user_flags = user_flags;
1107
+
1108
+ sd->value_len = (uint32_t) value.len;
1109
+
1110
+ dd("setting value type to %d", value_type);
1111
+
1112
+ sd->value_type = (uint8_t) value_type;
1113
+
1114
+ p = ngx_copy(sd->data, key.data, key.len);
1115
+ ngx_memcpy(p, value.data, value.len);
1116
+
1117
+ ngx_rbtree_insert(&ctx->sh->rbtree, node);
1118
+
1119
+ ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);
1120
+
1121
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1122
+
1123
+ lua_pushboolean(L, 1);
1124
+ lua_pushnil(L);
1125
+ lua_pushboolean(L, forcible);
1126
+ return 3;
1127
+ }
1128
+
1129
+
1130
+ static int
1131
+ ngx_http_lua_shdict_incr(lua_State *L)
1132
+ {
1133
+ int n;
1134
+ ngx_str_t key;
1135
+ uint32_t hash;
1136
+ ngx_int_t rc;
1137
+ ngx_http_lua_shdict_ctx_t *ctx;
1138
+ ngx_http_lua_shdict_node_t *sd;
1139
+ double num;
1140
+ u_char *p;
1141
+ ngx_shm_zone_t *zone;
1142
+ double value;
1143
+
1144
+ n = lua_gettop(L);
1145
+
1146
+ if (n != 3) {
1147
+ return luaL_error(L, "expecting 3 arguments, but only seen %d", n);
1148
+ }
1149
+
1150
+ if (lua_type(L, 1) != LUA_TLIGHTUSERDATA) {
1151
+ return luaL_error(L, "bad \"zone\" argument");
1152
+ }
1153
+
1154
+ zone = lua_touserdata(L, 1);
1155
+ if (zone == NULL) {
1156
+ return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");
1157
+ }
1158
+
1159
+ ctx = zone->data;
1160
+
1161
+ if (lua_isnil(L, 2)) {
1162
+ lua_pushnil(L);
1163
+ lua_pushliteral(L, "nil key");
1164
+ return 2;
1165
+ }
1166
+
1167
+ key.data = (u_char *) luaL_checklstring(L, 2, &key.len);
1168
+
1169
+ if (key.len == 0) {
1170
+ lua_pushnil(L);
1171
+ lua_pushliteral(L, "empty key");
1172
+ return 2;
1173
+ }
1174
+
1175
+ if (key.len > 65535) {
1176
+ lua_pushnil(L);
1177
+ lua_pushliteral(L, "key too long");
1178
+ return 2;
1179
+ }
1180
+
1181
+ hash = ngx_crc32_short(key.data, key.len);
1182
+
1183
+ value = luaL_checknumber(L, 3);
1184
+
1185
+ dd("looking up key %.*s in shared dict %.*s", (int) key.len, key.data,
1186
+ (int) ctx->name.len, ctx->name.data);
1187
+
1188
+ ngx_shmtx_lock(&ctx->shpool->mutex);
1189
+
1190
+ #if 1
1191
+ ngx_http_lua_shdict_expire(ctx, 1);
1192
+ #endif
1193
+
1194
+ rc = ngx_http_lua_shdict_lookup(zone, hash, key.data, key.len, &sd);
1195
+
1196
+ dd("shdict lookup returned %d", (int) rc);
1197
+
1198
+ if (rc == NGX_DECLINED || rc == NGX_DONE) {
1199
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1200
+
1201
+ lua_pushnil(L);
1202
+ lua_pushliteral(L, "not found");
1203
+ return 2;
1204
+ }
1205
+
1206
+ /* rc == NGX_OK */
1207
+
1208
+ if (sd->value_type != LUA_TNUMBER || sd->value_len != sizeof(double)) {
1209
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1210
+
1211
+ lua_pushnil(L);
1212
+ lua_pushliteral(L, "not a number");
1213
+ return 2;
1214
+ }
1215
+
1216
+ ngx_queue_remove(&sd->queue);
1217
+ ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);
1218
+
1219
+ dd("setting value type to %d", (int) sd->value_type);
1220
+
1221
+ p = sd->data + key.len;
1222
+
1223
+ ngx_memcpy(&num, p, sizeof(double));
1224
+ num += value;
1225
+
1226
+ ngx_memcpy(p, (double *) &num, sizeof(double));
1227
+
1228
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1229
+
1230
+ lua_pushnumber(L, num);
1231
+ lua_pushnil(L);
1232
+ return 2;
1233
+ }
1234
+
1235
+
1236
+ ngx_int_t
1237
+ ngx_http_lua_shared_dict_get(ngx_shm_zone_t *zone, u_char *key_data,
1238
+ size_t key_len, ngx_http_lua_value_t *value)
1239
+ {
1240
+ u_char *data;
1241
+ size_t len;
1242
+ uint32_t hash;
1243
+ ngx_int_t rc;
1244
+ ngx_http_lua_shdict_ctx_t *ctx;
1245
+ ngx_http_lua_shdict_node_t *sd;
1246
+
1247
+ if (zone == NULL) {
1248
+ return NGX_ERROR;
1249
+ }
1250
+
1251
+ hash = ngx_crc32_short(key_data, key_len);
1252
+
1253
+ ctx = zone->data;
1254
+
1255
+ ngx_shmtx_lock(&ctx->shpool->mutex);
1256
+
1257
+ rc = ngx_http_lua_shdict_lookup(zone, hash, key_data, key_len, &sd);
1258
+
1259
+ dd("shdict lookup returned %d", (int) rc);
1260
+
1261
+ if (rc == NGX_DECLINED || rc == NGX_DONE) {
1262
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1263
+
1264
+ return rc;
1265
+ }
1266
+
1267
+ /* rc == NGX_OK */
1268
+
1269
+ value->type = sd->value_type;
1270
+
1271
+ dd("type: %d", (int) value->type);
1272
+
1273
+ data = sd->data + sd->key_len;
1274
+ len = (size_t) sd->value_len;
1275
+
1276
+ switch (value->type) {
1277
+ case LUA_TSTRING:
1278
+
1279
+ if (value->value.s.data == NULL || value->value.s.len == 0) {
1280
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "no string buffer "
1281
+ "initialized");
1282
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1283
+ return NGX_ERROR;
1284
+ }
1285
+
1286
+ if (len > value->value.s.len) {
1287
+ len = value->value.s.len;
1288
+
1289
+ } else {
1290
+ value->value.s.len = len;
1291
+ }
1292
+
1293
+ ngx_memcpy(value->value.s.data, data, len);
1294
+ break;
1295
+
1296
+ case LUA_TNUMBER:
1297
+
1298
+ if (len != sizeof(double)) {
1299
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua number "
1300
+ "value size found for key %*s: %lu", key_len,
1301
+ key_data, (unsigned long) len);
1302
+
1303
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1304
+ return NGX_ERROR;
1305
+ }
1306
+
1307
+ ngx_memcpy(&value->value.b, data, len);
1308
+ break;
1309
+
1310
+ case LUA_TBOOLEAN:
1311
+
1312
+ if (len != sizeof(u_char)) {
1313
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua boolean "
1314
+ "value size found for key %*s: %lu", key_len,
1315
+ key_data, (unsigned long) len);
1316
+
1317
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1318
+ return NGX_ERROR;
1319
+ }
1320
+
1321
+ value->value.b = *data;
1322
+ break;
1323
+
1324
+ default:
1325
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua value type "
1326
+ "found for key %*s: %d", key_len, key_data,
1327
+ (int) value->type);
1328
+
1329
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1330
+ return NGX_ERROR;
1331
+ }
1332
+
1333
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1334
+ return NGX_OK;
1335
+ }
1336
+
1337
+
1338
+ ngx_shm_zone_t *
1339
+ ngx_http_lua_find_zone(u_char *name_data, size_t name_len)
1340
+ {
1341
+ ngx_str_t *name;
1342
+ ngx_uint_t i;
1343
+ ngx_shm_zone_t *zone;
1344
+ volatile ngx_list_part_t *part;
1345
+
1346
+ part = &ngx_cycle->shared_memory.part;
1347
+ zone = part->elts;
1348
+
1349
+ for (i = 0; /* void */ ; i++) {
1350
+
1351
+ if (i >= part->nelts) {
1352
+ if (part->next == NULL) {
1353
+ break;
1354
+ }
1355
+
1356
+ part = part->next;
1357
+ zone = part->elts;
1358
+ i = 0;
1359
+ }
1360
+
1361
+ name = &zone[i].shm.name;
1362
+
1363
+ dd("name: [%.*s] %d", (int) name->len, name->data, (int) name->len);
1364
+ dd("name2: [%.*s] %d", (int) name_len, name_data, (int) name_len);
1365
+
1366
+ if (name->len == name_len
1367
+ && ngx_strncmp(name->data, name_data, name_len) == 0)
1368
+ {
1369
+ return zone;
1370
+ }
1371
+ }
1372
+
1373
+ return NULL;
1374
+ }
1375
+
1376
+
1377
+ #ifndef NGX_LUA_NO_FFI_API
1378
+ int
1379
+ ngx_http_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key,
1380
+ size_t key_len, int value_type, u_char *str_value_buf,
1381
+ size_t str_value_len, double num_value, int exptime, int user_flags,
1382
+ char **errmsg, int *forcible)
1383
+ {
1384
+ int i, n;
1385
+ u_char c, *p;
1386
+ uint32_t hash;
1387
+ ngx_int_t rc;
1388
+ ngx_time_t *tp;
1389
+ ngx_rbtree_node_t *node;
1390
+ ngx_http_lua_shdict_ctx_t *ctx;
1391
+ ngx_http_lua_shdict_node_t *sd;
1392
+
1393
+ if (zone == NULL) {
1394
+ return NGX_ERROR;
1395
+ }
1396
+
1397
+ dd("exptime: %d", exptime);
1398
+
1399
+ ctx = zone->data;
1400
+
1401
+ *forcible = 0;
1402
+
1403
+ hash = ngx_crc32_short(key, key_len);
1404
+
1405
+ switch (value_type) {
1406
+ case LUA_TSTRING:
1407
+ /* do nothing */
1408
+ break;
1409
+
1410
+ case LUA_TNUMBER:
1411
+ dd("num value: %lf", num_value);
1412
+ str_value_buf = (u_char *) &num_value;
1413
+ str_value_len = sizeof(double);
1414
+ break;
1415
+
1416
+ case LUA_TBOOLEAN:
1417
+ c = num_value ? 1 : 0;
1418
+ str_value_buf = &c;
1419
+ str_value_len = sizeof(u_char);
1420
+ break;
1421
+
1422
+ case LUA_TNIL:
1423
+ if (op & (NGX_HTTP_LUA_SHDICT_ADD|NGX_HTTP_LUA_SHDICT_REPLACE)) {
1424
+ *errmsg = "attempt to add or replace nil values";
1425
+ return NGX_ERROR;
1426
+ }
1427
+
1428
+ str_value_buf = NULL;
1429
+ str_value_len = 0;
1430
+ break;
1431
+
1432
+ default:
1433
+ *errmsg = "unsupported value type";
1434
+ return NGX_ERROR;
1435
+ }
1436
+
1437
+ ngx_shmtx_lock(&ctx->shpool->mutex);
1438
+
1439
+ #if 1
1440
+ ngx_http_lua_shdict_expire(ctx, 1);
1441
+ #endif
1442
+
1443
+ rc = ngx_http_lua_shdict_lookup(zone, hash, key, key_len, &sd);
1444
+
1445
+ dd("lookup returns %d", (int) rc);
1446
+
1447
+ if (op & NGX_HTTP_LUA_SHDICT_REPLACE) {
1448
+
1449
+ if (rc == NGX_DECLINED || rc == NGX_DONE) {
1450
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1451
+ *errmsg = "not found";
1452
+ return NGX_DECLINED;
1453
+ }
1454
+ /* rc == NGX_OK */
1455
+
1456
+ goto replace;
1457
+ }
1458
+
1459
+ if (op & NGX_HTTP_LUA_SHDICT_ADD) {
1460
+
1461
+ if (rc == NGX_OK) {
1462
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1463
+ *errmsg = "exists";
1464
+ return NGX_DECLINED;
1465
+ }
1466
+
1467
+ if (rc == NGX_DONE) {
1468
+ /* exists but expired */
1469
+
1470
+ dd("go to replace");
1471
+ goto replace;
1472
+ }
1473
+
1474
+ /* rc == NGX_DECLINED */
1475
+
1476
+ dd("go to insert");
1477
+ goto insert;
1478
+ }
1479
+
1480
+ if (rc == NGX_OK || rc == NGX_DONE) {
1481
+
1482
+ if (value_type == LUA_TNIL) {
1483
+ goto remove;
1484
+ }
1485
+
1486
+ replace:
1487
+
1488
+ if (str_value_buf && str_value_len == (size_t) sd->value_len) {
1489
+
1490
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
1491
+ "lua shared dict set: found old entry and value "
1492
+ "size matched, reusing it");
1493
+
1494
+ ngx_queue_remove(&sd->queue);
1495
+ ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);
1496
+
1497
+ sd->key_len = (u_short) key_len;
1498
+
1499
+ if (exptime > 0) {
1500
+ tp = ngx_timeofday();
1501
+ sd->expires = (uint64_t) tp->sec * 1000 + tp->msec
1502
+ + (uint64_t) exptime;
1503
+
1504
+ } else {
1505
+ sd->expires = 0;
1506
+ }
1507
+
1508
+ sd->user_flags = user_flags;
1509
+
1510
+ sd->value_len = (uint32_t) str_value_len;
1511
+
1512
+ dd("setting value type to %d", value_type);
1513
+
1514
+ sd->value_type = (uint8_t) value_type;
1515
+
1516
+ p = ngx_copy(sd->data, key, key_len);
1517
+ ngx_memcpy(p, str_value_buf, str_value_len);
1518
+
1519
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1520
+
1521
+ return NGX_OK;
1522
+ }
1523
+
1524
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
1525
+ "lua shared dict set: found old entry bug value size "
1526
+ "NOT matched, removing it first");
1527
+
1528
+ remove:
1529
+
1530
+ ngx_queue_remove(&sd->queue);
1531
+
1532
+ node = (ngx_rbtree_node_t *)
1533
+ ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));
1534
+
1535
+ ngx_rbtree_delete(&ctx->sh->rbtree, node);
1536
+
1537
+ ngx_slab_free_locked(ctx->shpool, node);
1538
+
1539
+ }
1540
+
1541
+ insert:
1542
+
1543
+ /* rc == NGX_DECLINED or value size unmatch */
1544
+
1545
+ if (str_value_buf == NULL) {
1546
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1547
+ return NGX_OK;
1548
+ }
1549
+
1550
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
1551
+ "lua shared dict set: creating a new entry");
1552
+
1553
+ n = offsetof(ngx_rbtree_node_t, color)
1554
+ + offsetof(ngx_http_lua_shdict_node_t, data)
1555
+ + key_len
1556
+ + str_value_len;
1557
+
1558
+ node = ngx_slab_alloc_locked(ctx->shpool, n);
1559
+
1560
+ if (node == NULL) {
1561
+
1562
+ if (op & NGX_HTTP_LUA_SHDICT_SAFE_STORE) {
1563
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1564
+
1565
+ *errmsg = "no memory";
1566
+ return NGX_ERROR;
1567
+ }
1568
+
1569
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
1570
+ "lua shared dict set: overriding non-expired items "
1571
+ "due to memory shortage for entry \"%*s\"", key_len,
1572
+ key);
1573
+
1574
+ for (i = 0; i < 30; i++) {
1575
+ if (ngx_http_lua_shdict_expire(ctx, 0) == 0) {
1576
+ break;
1577
+ }
1578
+
1579
+ *forcible = 1;
1580
+
1581
+ node = ngx_slab_alloc_locked(ctx->shpool, n);
1582
+ if (node != NULL) {
1583
+ goto allocated;
1584
+ }
1585
+ }
1586
+
1587
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1588
+
1589
+ *errmsg = "no memory";
1590
+ return NGX_ERROR;
1591
+ }
1592
+
1593
+ allocated:
1594
+
1595
+ sd = (ngx_http_lua_shdict_node_t *) &node->color;
1596
+
1597
+ node->key = hash;
1598
+ sd->key_len = (u_short) key_len;
1599
+
1600
+ if (exptime > 0) {
1601
+ tp = ngx_timeofday();
1602
+ sd->expires = (uint64_t) tp->sec * 1000 + tp->msec
1603
+ + (uint64_t) exptime;
1604
+
1605
+ } else {
1606
+ sd->expires = 0;
1607
+ }
1608
+
1609
+ sd->user_flags = user_flags;
1610
+ sd->value_len = (uint32_t) str_value_len;
1611
+ dd("setting value type to %d", value_type);
1612
+ sd->value_type = (uint8_t) value_type;
1613
+
1614
+ p = ngx_copy(sd->data, key, key_len);
1615
+ ngx_memcpy(p, str_value_buf, str_value_len);
1616
+
1617
+ ngx_rbtree_insert(&ctx->sh->rbtree, node);
1618
+ ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);
1619
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1620
+
1621
+ return NGX_OK;
1622
+ }
1623
+
1624
+
1625
+ int
1626
+ ngx_http_lua_ffi_shdict_get(ngx_shm_zone_t *zone, u_char *key,
1627
+ size_t key_len, int *value_type, u_char **str_value_buf,
1628
+ size_t *str_value_len, double *num_value, int *user_flags,
1629
+ int get_stale, int *is_stale)
1630
+ {
1631
+ ngx_str_t name;
1632
+ uint32_t hash;
1633
+ ngx_int_t rc;
1634
+ ngx_http_lua_shdict_ctx_t *ctx;
1635
+ ngx_http_lua_shdict_node_t *sd;
1636
+ ngx_str_t value;
1637
+
1638
+ if (zone == NULL) {
1639
+ return NGX_ERROR;
1640
+ }
1641
+
1642
+ ctx = zone->data;
1643
+ name = ctx->name;
1644
+
1645
+ hash = ngx_crc32_short(key, key_len);
1646
+
1647
+ #if (NGX_DEBUG)
1648
+ ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
1649
+ "fetching key \"%*s\" in shared dict \"%V\"", key_len,
1650
+ key, &name);
1651
+ #endif /* NGX_DEBUG */
1652
+
1653
+ ngx_shmtx_lock(&ctx->shpool->mutex);
1654
+
1655
+ #if 1
1656
+ if (!get_stale) {
1657
+ ngx_http_lua_shdict_expire(ctx, 1);
1658
+ }
1659
+ #endif
1660
+
1661
+ rc = ngx_http_lua_shdict_lookup(zone, hash, key, key_len, &sd);
1662
+
1663
+ dd("shdict lookup returns %d", (int) rc);
1664
+
1665
+ if (rc == NGX_DECLINED || (rc == NGX_DONE && !get_stale)) {
1666
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1667
+ *value_type = LUA_TNIL;
1668
+ return NGX_OK;
1669
+ }
1670
+
1671
+ /* rc == NGX_OK || (rc == NGX_DONE && get_stale) */
1672
+
1673
+ *value_type = sd->value_type;
1674
+
1675
+ dd("data: %p", sd->data);
1676
+ dd("key len: %d", (int) sd->key_len);
1677
+
1678
+ value.data = sd->data + sd->key_len;
1679
+ value.len = (size_t) sd->value_len;
1680
+
1681
+ if (*str_value_len < (size_t) value.len) {
1682
+ if (*value_type == LUA_TBOOLEAN) {
1683
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1684
+ return NGX_ERROR;
1685
+ }
1686
+
1687
+ if (*value_type == LUA_TSTRING) {
1688
+ *str_value_buf = malloc(value.len);
1689
+ if (*str_value_buf == NULL) {
1690
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1691
+ return NGX_ERROR;
1692
+ }
1693
+ }
1694
+ }
1695
+
1696
+ switch (*value_type) {
1697
+ case LUA_TSTRING:
1698
+ *str_value_len = value.len;
1699
+ ngx_memcpy(*str_value_buf, value.data, value.len);
1700
+ break;
1701
+
1702
+ case LUA_TNUMBER:
1703
+
1704
+ if (value.len != sizeof(double)) {
1705
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1706
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,
1707
+ "bad lua number value size found for key %*s "
1708
+ "in shared_dict %V: %z", key_len, key,
1709
+ &name, value.len);
1710
+ return NGX_ERROR;
1711
+ }
1712
+
1713
+ *str_value_len = value.len;
1714
+ ngx_memcpy(num_value, value.data, sizeof(double));
1715
+ break;
1716
+
1717
+ case LUA_TBOOLEAN:
1718
+
1719
+ if (value.len != sizeof(u_char)) {
1720
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1721
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,
1722
+ "bad lua boolean value size found for key %*s "
1723
+ "in shared_dict %V: %z", key_len, key, &name,
1724
+ value.len);
1725
+ return NGX_ERROR;
1726
+ }
1727
+
1728
+ ngx_memcpy(*str_value_buf, value.data, value.len);
1729
+ break;
1730
+
1731
+ default:
1732
+
1733
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1734
+ ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,
1735
+ "bad value type found for key %*s in "
1736
+ "shared_dict %V: %d", key_len, key, &name,
1737
+ *value_type);
1738
+ return NGX_ERROR;
1739
+ }
1740
+
1741
+ *user_flags = sd->user_flags;
1742
+ dd("user flags: %d", *user_flags);
1743
+
1744
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1745
+
1746
+ if (get_stale) {
1747
+
1748
+ /* always return value, flags, stale */
1749
+
1750
+ *is_stale = (rc == NGX_DONE);
1751
+ return NGX_OK;
1752
+ }
1753
+
1754
+ return NGX_OK;
1755
+ }
1756
+
1757
+
1758
+ int
1759
+ ngx_http_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key,
1760
+ size_t key_len, double *value, char **err)
1761
+ {
1762
+ uint32_t hash;
1763
+ ngx_int_t rc;
1764
+ ngx_http_lua_shdict_ctx_t *ctx;
1765
+ ngx_http_lua_shdict_node_t *sd;
1766
+ double num;
1767
+ u_char *p;
1768
+
1769
+ ctx = zone->data;
1770
+ hash = ngx_crc32_short(key, key_len);
1771
+
1772
+ dd("looking up key %.*s in shared dict %.*s", (int) key_len, key,
1773
+ (int) ctx->name.len, ctx->name.data);
1774
+
1775
+ ngx_shmtx_lock(&ctx->shpool->mutex);
1776
+ #if 1
1777
+ ngx_http_lua_shdict_expire(ctx, 1);
1778
+ #endif
1779
+ rc = ngx_http_lua_shdict_lookup(zone, hash, key, key_len, &sd);
1780
+
1781
+ dd("shdict lookup returned %d", (int) rc);
1782
+
1783
+ if (rc == NGX_DECLINED || rc == NGX_DONE) {
1784
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1785
+ *err = "not found";
1786
+ return NGX_ERROR;
1787
+ }
1788
+
1789
+ /* rc == NGX_OK */
1790
+
1791
+ if (sd->value_type != LUA_TNUMBER || sd->value_len != sizeof(double)) {
1792
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1793
+ *err = "not a number";
1794
+ return NGX_ERROR;
1795
+ }
1796
+
1797
+ ngx_queue_remove(&sd->queue);
1798
+ ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);
1799
+
1800
+ dd("setting value type to %d", (int) sd->value_type);
1801
+
1802
+ p = sd->data + key_len;
1803
+
1804
+ ngx_memcpy(&num, p, sizeof(double));
1805
+ num += *value;
1806
+
1807
+ ngx_memcpy(p, (double *) &num, sizeof(double));
1808
+
1809
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1810
+
1811
+ *value = num;
1812
+ return NGX_OK;
1813
+ }
1814
+
1815
+
1816
+ int
1817
+ ngx_http_lua_ffi_shdict_flush_all(ngx_shm_zone_t *zone)
1818
+ {
1819
+ ngx_queue_t *q;
1820
+ ngx_http_lua_shdict_node_t *sd;
1821
+ ngx_http_lua_shdict_ctx_t *ctx;
1822
+
1823
+ ctx = zone->data;
1824
+
1825
+ ngx_shmtx_lock(&ctx->shpool->mutex);
1826
+
1827
+ for (q = ngx_queue_head(&ctx->sh->queue);
1828
+ q != ngx_queue_sentinel(&ctx->sh->queue);
1829
+ q = ngx_queue_next(q))
1830
+ {
1831
+ sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);
1832
+ sd->expires = 1;
1833
+ }
1834
+
1835
+ ngx_http_lua_shdict_expire(ctx, 0);
1836
+
1837
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
1838
+
1839
+ return NGX_OK;
1840
+ }
1841
+ #endif /* NGX_LUA_NO_FFI_API */
1842
+
1843
+
1844
+ /* vi:set ft=c ts=4 sw=4 et fdm=marker: */