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,156 @@
1
+
2
+ /*
3
+ * Copyright (C) Yichun Zhang (agentzh)
4
+ */
5
+
6
+
7
+ #ifndef _NGX_HTTP_LUA_SOCKET_TCP_H_INCLUDED_
8
+ #define _NGX_HTTP_LUA_SOCKET_TCP_H_INCLUDED_
9
+
10
+
11
+ #include "ngx_http_lua_common.h"
12
+
13
+
14
+ #define NGX_HTTP_LUA_SOCKET_FT_ERROR 0x0001
15
+ #define NGX_HTTP_LUA_SOCKET_FT_TIMEOUT 0x0002
16
+ #define NGX_HTTP_LUA_SOCKET_FT_CLOSED 0x0004
17
+ #define NGX_HTTP_LUA_SOCKET_FT_RESOLVER 0x0008
18
+ #define NGX_HTTP_LUA_SOCKET_FT_BUFTOOSMALL 0x0010
19
+ #define NGX_HTTP_LUA_SOCKET_FT_NOMEM 0x0020
20
+ #define NGX_HTTP_LUA_SOCKET_FT_PARTIALWRITE 0x0040
21
+ #define NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT 0x0080
22
+ #define NGX_HTTP_LUA_SOCKET_FT_SSL 0x0100
23
+
24
+
25
+ typedef struct ngx_http_lua_socket_tcp_upstream_s
26
+ ngx_http_lua_socket_tcp_upstream_t;
27
+
28
+
29
+ typedef
30
+ int (*ngx_http_lua_socket_tcp_retval_handler)(ngx_http_request_t *r,
31
+ ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);
32
+
33
+
34
+ typedef void (*ngx_http_lua_socket_tcp_upstream_handler_pt)(
35
+ ngx_http_request_t *r, ngx_http_lua_socket_tcp_upstream_t *u);
36
+
37
+
38
+ typedef struct {
39
+ lua_State *lua_vm;
40
+
41
+ /* active connections == out-of-pool reused connections
42
+ * + in-pool connections */
43
+ ngx_uint_t active_connections;
44
+
45
+ /* queues of ngx_http_lua_socket_pool_item_t: */
46
+ ngx_queue_t cache;
47
+ ngx_queue_t free;
48
+
49
+ u_char key[1];
50
+
51
+ } ngx_http_lua_socket_pool_t;
52
+
53
+
54
+ struct ngx_http_lua_socket_tcp_upstream_s {
55
+ ngx_http_lua_socket_tcp_retval_handler read_prepare_retvals;
56
+ ngx_http_lua_socket_tcp_retval_handler write_prepare_retvals;
57
+ ngx_http_lua_socket_tcp_upstream_handler_pt read_event_handler;
58
+ ngx_http_lua_socket_tcp_upstream_handler_pt write_event_handler;
59
+
60
+ ngx_http_lua_socket_pool_t *socket_pool;
61
+
62
+ ngx_http_lua_loc_conf_t *conf;
63
+ ngx_http_cleanup_pt *cleanup;
64
+ ngx_http_request_t *request;
65
+ ngx_peer_connection_t peer;
66
+
67
+ ngx_msec_t read_timeout;
68
+ ngx_msec_t send_timeout;
69
+ ngx_msec_t connect_timeout;
70
+
71
+ ngx_http_upstream_resolved_t *resolved;
72
+
73
+ ngx_chain_t *bufs_in; /* input data buffers */
74
+ ngx_chain_t *buf_in; /* last input data buffer */
75
+ ngx_buf_t buffer; /* receive buffer */
76
+
77
+ size_t length;
78
+ size_t rest;
79
+
80
+ ngx_err_t socket_errno;
81
+
82
+ ngx_int_t (*input_filter)(void *data, ssize_t bytes);
83
+ void *input_filter_ctx;
84
+
85
+ size_t request_len;
86
+ ngx_chain_t *request_bufs;
87
+
88
+ ngx_http_lua_co_ctx_t *read_co_ctx;
89
+ ngx_http_lua_co_ctx_t *write_co_ctx;
90
+
91
+ ngx_uint_t reused;
92
+
93
+ #if (NGX_HTTP_SSL)
94
+ ngx_str_t ssl_name;
95
+ #endif
96
+
97
+ unsigned ft_type:16;
98
+ unsigned no_close:1;
99
+ unsigned conn_waiting:1;
100
+ unsigned read_waiting:1;
101
+ unsigned write_waiting:1;
102
+ unsigned eof:1;
103
+ unsigned body_downstream:1;
104
+ unsigned raw_downstream:1;
105
+ unsigned read_closed:1;
106
+ unsigned write_closed:1;
107
+ #if (NGX_HTTP_SSL)
108
+ unsigned ssl_verify:1;
109
+ unsigned ssl_session_reuse:1;
110
+ #endif
111
+ };
112
+
113
+
114
+ typedef struct ngx_http_lua_dfa_edge_s ngx_http_lua_dfa_edge_t;
115
+
116
+
117
+ struct ngx_http_lua_dfa_edge_s {
118
+ u_char chr;
119
+ int new_state;
120
+ ngx_http_lua_dfa_edge_t *next;
121
+ };
122
+
123
+
124
+ typedef struct {
125
+ ngx_http_lua_socket_tcp_upstream_t *upstream;
126
+
127
+ ngx_str_t pattern;
128
+ int state;
129
+ ngx_http_lua_dfa_edge_t **recovering;
130
+
131
+ unsigned inclusive:1;
132
+ } ngx_http_lua_socket_compiled_pattern_t;
133
+
134
+
135
+ typedef struct {
136
+ ngx_http_lua_socket_pool_t *socket_pool;
137
+
138
+ ngx_queue_t queue;
139
+ ngx_connection_t *connection;
140
+
141
+ socklen_t socklen;
142
+ struct sockaddr_storage sockaddr;
143
+
144
+ ngx_uint_t reused;
145
+
146
+ } ngx_http_lua_socket_pool_item_t;
147
+
148
+
149
+ void ngx_http_lua_inject_socket_tcp_api(ngx_log_t *log, lua_State *L);
150
+ void ngx_http_lua_inject_req_socket_api(lua_State *L);
151
+ void ngx_http_lua_cleanup_conn_pools(lua_State *L);
152
+
153
+
154
+ #endif /* _NGX_HTTP_LUA_SOCKET_TCP_H_INCLUDED_ */
155
+
156
+ /* vi:set ft=c ts=4 sw=4 et fdm=marker: */
@@ -0,0 +1,1624 @@
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_socket_udp.h"
14
+ #include "ngx_http_lua_socket_tcp.h"
15
+ #include "ngx_http_lua_util.h"
16
+ #include "ngx_http_lua_contentby.h"
17
+ #include "ngx_http_lua_output.h"
18
+ #include "ngx_http_lua_probe.h"
19
+
20
+
21
+ #if 1
22
+ #undef ngx_http_lua_probe_info
23
+ #define ngx_http_lua_probe_info(msg)
24
+ #endif
25
+
26
+
27
+ #define UDP_MAX_DATAGRAM_SIZE 8192
28
+
29
+
30
+ static int ngx_http_lua_socket_udp(lua_State *L);
31
+ static int ngx_http_lua_socket_udp_setpeername(lua_State *L);
32
+ static int ngx_http_lua_socket_udp_send(lua_State *L);
33
+ static int ngx_http_lua_socket_udp_receive(lua_State *L);
34
+ static int ngx_http_lua_socket_udp_settimeout(lua_State *L);
35
+ static void ngx_http_lua_socket_udp_finalize(ngx_http_request_t *r,
36
+ ngx_http_lua_socket_udp_upstream_t *u);
37
+ static int ngx_http_lua_socket_udp_upstream_destroy(lua_State *L);
38
+ static int ngx_http_lua_socket_resolve_retval_handler(ngx_http_request_t *r,
39
+ ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);
40
+ static void ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx);
41
+ static int ngx_http_lua_socket_error_retval_handler(ngx_http_request_t *r,
42
+ ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);
43
+ static void ngx_http_lua_socket_udp_handle_error(ngx_http_request_t *r,
44
+ ngx_http_lua_socket_udp_upstream_t *u, ngx_uint_t ft_type);
45
+ static void ngx_http_lua_socket_udp_cleanup(void *data);
46
+ static void ngx_http_lua_socket_udp_handler(ngx_event_t *ev);
47
+ static void ngx_http_lua_socket_dummy_handler(ngx_http_request_t *r,
48
+ ngx_http_lua_socket_udp_upstream_t *u);
49
+ static int ngx_http_lua_socket_udp_receive_retval_handler(ngx_http_request_t *r,
50
+ ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);
51
+ static ngx_int_t ngx_http_lua_socket_udp_read(ngx_http_request_t *r,
52
+ ngx_http_lua_socket_udp_upstream_t *u);
53
+ static void ngx_http_lua_socket_udp_read_handler(ngx_http_request_t *r,
54
+ ngx_http_lua_socket_udp_upstream_t *u);
55
+ static void ngx_http_lua_socket_udp_handle_success(ngx_http_request_t *r,
56
+ ngx_http_lua_socket_udp_upstream_t *u);
57
+ static ngx_int_t ngx_http_lua_udp_connect(ngx_udp_connection_t *uc);
58
+ static int ngx_http_lua_socket_udp_close(lua_State *L);
59
+ static ngx_int_t ngx_http_lua_socket_udp_resume(ngx_http_request_t *r);
60
+ static void ngx_http_lua_udp_resolve_cleanup(void *data);
61
+ static void ngx_http_lua_udp_socket_cleanup(void *data);
62
+
63
+
64
+ enum {
65
+ SOCKET_CTX_INDEX = 1,
66
+ SOCKET_TIMEOUT_INDEX = 2
67
+ };
68
+
69
+
70
+ static char ngx_http_lua_socket_udp_metatable_key;
71
+ static char ngx_http_lua_udp_udata_metatable_key;
72
+ static u_char ngx_http_lua_socket_udp_buffer[UDP_MAX_DATAGRAM_SIZE];
73
+
74
+
75
+ void
76
+ ngx_http_lua_inject_socket_udp_api(ngx_log_t *log, lua_State *L)
77
+ {
78
+ lua_getfield(L, -1, "socket"); /* ngx socket */
79
+
80
+ lua_pushcfunction(L, ngx_http_lua_socket_udp);
81
+ lua_setfield(L, -2, "udp"); /* ngx socket */
82
+
83
+ /* udp socket object metatable */
84
+ lua_pushlightuserdata(L, &ngx_http_lua_socket_udp_metatable_key);
85
+ lua_createtable(L, 0 /* narr */, 4 /* nrec */);
86
+
87
+ lua_pushcfunction(L, ngx_http_lua_socket_udp_setpeername);
88
+ lua_setfield(L, -2, "setpeername"); /* ngx socket mt */
89
+
90
+ lua_pushcfunction(L, ngx_http_lua_socket_udp_send);
91
+ lua_setfield(L, -2, "send");
92
+
93
+ lua_pushcfunction(L, ngx_http_lua_socket_udp_receive);
94
+ lua_setfield(L, -2, "receive");
95
+
96
+ lua_pushcfunction(L, ngx_http_lua_socket_udp_settimeout);
97
+ lua_setfield(L, -2, "settimeout"); /* ngx socket mt */
98
+
99
+ lua_pushcfunction(L, ngx_http_lua_socket_udp_close);
100
+ lua_setfield(L, -2, "close"); /* ngx socket mt */
101
+
102
+ lua_pushvalue(L, -1);
103
+ lua_setfield(L, -2, "__index");
104
+ lua_rawset(L, LUA_REGISTRYINDEX);
105
+ /* }}} */
106
+
107
+ /* udp socket object metatable */
108
+ lua_pushlightuserdata(L, &ngx_http_lua_udp_udata_metatable_key);
109
+ lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */
110
+ lua_pushcfunction(L, ngx_http_lua_socket_udp_upstream_destroy);
111
+ lua_setfield(L, -2, "__gc");
112
+ lua_rawset(L, LUA_REGISTRYINDEX);
113
+ /* }}} */
114
+
115
+ lua_pop(L, 1);
116
+ }
117
+
118
+
119
+ static int
120
+ ngx_http_lua_socket_udp(lua_State *L)
121
+ {
122
+ ngx_http_request_t *r;
123
+ ngx_http_lua_ctx_t *ctx;
124
+
125
+ if (lua_gettop(L) != 0) {
126
+ return luaL_error(L, "expecting zero arguments, but got %d",
127
+ lua_gettop(L));
128
+ }
129
+
130
+ r = ngx_http_lua_get_req(L);
131
+ if (r == NULL) {
132
+ return luaL_error(L, "no request found");
133
+ }
134
+
135
+ ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
136
+ if (ctx == NULL) {
137
+ return luaL_error(L, "no ctx found");
138
+ }
139
+
140
+ ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE
141
+ | NGX_HTTP_LUA_CONTEXT_ACCESS
142
+ | NGX_HTTP_LUA_CONTEXT_CONTENT
143
+ | NGX_HTTP_LUA_CONTEXT_TIMER);
144
+
145
+ lua_createtable(L, 3 /* narr */, 1 /* nrec */);
146
+ lua_pushlightuserdata(L, &ngx_http_lua_socket_udp_metatable_key);
147
+ lua_rawget(L, LUA_REGISTRYINDEX);
148
+ lua_setmetatable(L, -2);
149
+
150
+ dd("top: %d", lua_gettop(L));
151
+
152
+ return 1;
153
+ }
154
+
155
+
156
+ static int
157
+ ngx_http_lua_socket_udp_setpeername(lua_State *L)
158
+ {
159
+ ngx_http_request_t *r;
160
+ ngx_http_lua_ctx_t *ctx;
161
+ ngx_str_t host;
162
+ int port;
163
+ ngx_resolver_ctx_t *rctx, temp;
164
+ ngx_http_core_loc_conf_t *clcf;
165
+ int saved_top;
166
+ int n;
167
+ u_char *p;
168
+ size_t len;
169
+ ngx_url_t url;
170
+ ngx_int_t rc;
171
+ ngx_http_lua_loc_conf_t *llcf;
172
+ ngx_udp_connection_t *uc;
173
+ int timeout;
174
+ ngx_http_lua_co_ctx_t *coctx;
175
+
176
+ ngx_http_lua_socket_udp_upstream_t *u;
177
+
178
+ /*
179
+ * TODO: we should probably accept an extra argument to setpeername()
180
+ * to allow the user bind the datagram unix domain socket himself,
181
+ * which is necessary for systems without autobind support.
182
+ */
183
+
184
+ n = lua_gettop(L);
185
+ if (n != 2 && n != 3) {
186
+ return luaL_error(L, "ngx.socket.udp setpeername: expecting 2 or 3 "
187
+ "arguments (including the object), but seen %d", n);
188
+ }
189
+
190
+ r = ngx_http_lua_get_req(L);
191
+ if (r == NULL) {
192
+ return luaL_error(L, "no request found");
193
+ }
194
+
195
+ ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
196
+ if (ctx == NULL) {
197
+ return luaL_error(L, "no ctx found");
198
+ }
199
+
200
+ ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE
201
+ | NGX_HTTP_LUA_CONTEXT_ACCESS
202
+ | NGX_HTTP_LUA_CONTEXT_CONTENT
203
+ | NGX_HTTP_LUA_CONTEXT_TIMER);
204
+
205
+ luaL_checktype(L, 1, LUA_TTABLE);
206
+
207
+ p = (u_char *) luaL_checklstring(L, 2, &len);
208
+
209
+ host.data = ngx_palloc(r->pool, len + 1);
210
+ if (host.data == NULL) {
211
+ return luaL_error(L, "no memory");
212
+ }
213
+
214
+ host.len = len;
215
+
216
+ ngx_memcpy(host.data, p, len);
217
+ host.data[len] = '\0';
218
+
219
+ if (n == 3) {
220
+ port = luaL_checkinteger(L, 3);
221
+
222
+ if (port < 0 || port > 65536) {
223
+ lua_pushnil(L);
224
+ lua_pushfstring(L, "bad port number: %d", port);
225
+ return 2;
226
+ }
227
+
228
+ } else { /* n == 2 */
229
+ port = 0;
230
+ }
231
+
232
+ lua_rawgeti(L, 1, SOCKET_CTX_INDEX);
233
+ u = lua_touserdata(L, -1);
234
+ lua_pop(L, 1);
235
+
236
+ if (u) {
237
+ if (u->request && u->request != r) {
238
+ return luaL_error(L, "bad request");
239
+ }
240
+
241
+ if (u->waiting) {
242
+ lua_pushnil(L);
243
+ lua_pushliteral(L, "socket busy");
244
+ return 2;
245
+ }
246
+
247
+ if (u->udp_connection.connection) {
248
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
249
+ "lua udp socket reconnect without shutting down");
250
+
251
+ ngx_http_lua_socket_udp_finalize(r, u);
252
+ }
253
+
254
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
255
+ "lua reuse socket upstream ctx");
256
+
257
+ } else {
258
+ u = lua_newuserdata(L, sizeof(ngx_http_lua_socket_udp_upstream_t));
259
+ if (u == NULL) {
260
+ return luaL_error(L, "no memory");
261
+ }
262
+
263
+ #if 1
264
+ lua_pushlightuserdata(L, &ngx_http_lua_udp_udata_metatable_key);
265
+ lua_rawget(L, LUA_REGISTRYINDEX);
266
+ lua_setmetatable(L, -2);
267
+ #endif
268
+
269
+ lua_rawseti(L, 1, SOCKET_CTX_INDEX);
270
+ }
271
+
272
+ ngx_memzero(u, sizeof(ngx_http_lua_socket_udp_upstream_t));
273
+
274
+ u->request = r; /* set the controlling request */
275
+ llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);
276
+
277
+ u->conf = llcf;
278
+
279
+ uc = &u->udp_connection;
280
+
281
+ uc->log = *r->connection->log;
282
+
283
+ dd("lua peer connection log: %p", &uc->log);
284
+
285
+ lua_rawgeti(L, 1, SOCKET_TIMEOUT_INDEX);
286
+ timeout = (ngx_int_t) lua_tointeger(L, -1);
287
+ lua_pop(L, 1);
288
+
289
+ if (timeout > 0) {
290
+ u->read_timeout = (ngx_msec_t) timeout;
291
+
292
+ } else {
293
+ u->read_timeout = u->conf->read_timeout;
294
+ }
295
+
296
+ ngx_memzero(&url, sizeof(ngx_url_t));
297
+
298
+ url.url.len = host.len;
299
+ url.url.data = host.data;
300
+ url.default_port = (in_port_t) port;
301
+ url.no_resolve = 1;
302
+
303
+ if (ngx_parse_url(r->pool, &url) != NGX_OK) {
304
+ lua_pushnil(L);
305
+
306
+ if (url.err) {
307
+ lua_pushfstring(L, "failed to parse host name \"%s\": %s",
308
+ host.data, url.err);
309
+
310
+ } else {
311
+ lua_pushfstring(L, "failed to parse host name \"%s\"", host.data);
312
+ }
313
+
314
+ return 2;
315
+ }
316
+
317
+ u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));
318
+ if (u->resolved == NULL) {
319
+ return luaL_error(L, "no memory");
320
+ }
321
+
322
+ if (url.addrs && url.addrs[0].sockaddr) {
323
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
324
+ "lua udp socket network address given directly");
325
+
326
+ u->resolved->sockaddr = url.addrs[0].sockaddr;
327
+ u->resolved->socklen = url.addrs[0].socklen;
328
+ u->resolved->naddrs = 1;
329
+ u->resolved->host = url.addrs[0].name;
330
+
331
+ } else {
332
+ u->resolved->host = host;
333
+ u->resolved->port = (in_port_t) port;
334
+ }
335
+
336
+ if (u->resolved->sockaddr) {
337
+ rc = ngx_http_lua_socket_resolve_retval_handler(r, u, L);
338
+ if (rc == NGX_AGAIN) {
339
+ return lua_yield(L, 0);
340
+ }
341
+
342
+ return rc;
343
+ }
344
+
345
+ clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
346
+
347
+ temp.name = host;
348
+ rctx = ngx_resolve_start(clcf->resolver, &temp);
349
+ if (rctx == NULL) {
350
+ u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;
351
+ lua_pushnil(L);
352
+ lua_pushliteral(L, "failed to start the resolver");
353
+ return 2;
354
+ }
355
+
356
+ if (rctx == NGX_NO_RESOLVER) {
357
+ u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;
358
+ lua_pushnil(L);
359
+ lua_pushfstring(L, "no resolver defined to resolve \"%s\"", host.data);
360
+ return 2;
361
+ }
362
+
363
+ rctx->name = host;
364
+ #if !defined(nginx_version) || nginx_version < 1005008
365
+ rctx->type = NGX_RESOLVE_A;
366
+ #endif
367
+ rctx->handler = ngx_http_lua_socket_resolve_handler;
368
+ rctx->data = u;
369
+ rctx->timeout = clcf->resolver_timeout;
370
+
371
+ u->co_ctx = ctx->cur_co_ctx;
372
+ u->resolved->ctx = rctx;
373
+
374
+ saved_top = lua_gettop(L);
375
+
376
+ coctx = ctx->cur_co_ctx;
377
+ ngx_http_lua_cleanup_pending_operation(coctx);
378
+ coctx->cleanup = ngx_http_lua_udp_resolve_cleanup;
379
+
380
+ if (ngx_resolve_name(rctx) != NGX_OK) {
381
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
382
+ "lua udp socket fail to run resolver immediately");
383
+
384
+ u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;
385
+
386
+ u->resolved->ctx = NULL;
387
+ lua_pushnil(L);
388
+ lua_pushfstring(L, "%s could not be resolved", host.data);
389
+
390
+ return 2;
391
+ }
392
+
393
+ if (u->waiting == 1) {
394
+ /* resolved and already connecting */
395
+ return lua_yield(L, 0);
396
+ }
397
+
398
+ n = lua_gettop(L) - saved_top;
399
+ if (n) {
400
+ /* errors occurred during resolving or connecting
401
+ * or already connected */
402
+ return n;
403
+ }
404
+
405
+ /* still resolving */
406
+
407
+ u->waiting = 1;
408
+ u->prepare_retvals = ngx_http_lua_socket_resolve_retval_handler;
409
+
410
+ coctx->data = u;
411
+
412
+ if (ctx->entered_content_phase) {
413
+ r->write_event_handler = ngx_http_lua_content_wev_handler;
414
+
415
+ } else {
416
+ r->write_event_handler = ngx_http_core_run_phases;
417
+ }
418
+
419
+ return lua_yield(L, 0);
420
+ }
421
+
422
+
423
+ static void
424
+ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
425
+ {
426
+ ngx_http_request_t *r;
427
+ ngx_connection_t *c;
428
+ ngx_http_upstream_resolved_t *ur;
429
+ ngx_http_lua_ctx_t *lctx;
430
+ lua_State *L;
431
+ ngx_http_lua_socket_udp_upstream_t *u;
432
+ u_char *p;
433
+ size_t len;
434
+ #if defined(nginx_version) && nginx_version >= 1005008
435
+ socklen_t socklen;
436
+ struct sockaddr *sockaddr;
437
+ #else
438
+ struct sockaddr_in *sin;
439
+ #endif
440
+ ngx_uint_t i;
441
+ unsigned waiting;
442
+
443
+ u = ctx->data;
444
+ r = u->request;
445
+ c = r->connection;
446
+ ur = u->resolved;
447
+
448
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
449
+ "lua udp socket resolve handler");
450
+
451
+ lctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
452
+ if (lctx == NULL) {
453
+ return;
454
+ }
455
+
456
+ lctx->cur_co_ctx = u->co_ctx;
457
+
458
+ u->co_ctx->cleanup = NULL;
459
+
460
+ L = lctx->cur_co_ctx->co;
461
+
462
+ dd("setting socket_ready to 1");
463
+
464
+ waiting = u->waiting;
465
+
466
+ if (ctx->state) {
467
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
468
+ "lua udp socket resolver error: %s (waiting: %d)",
469
+ ngx_resolver_strerror(ctx->state), (int) u->waiting);
470
+
471
+ lua_pushnil(L);
472
+ lua_pushlstring(L, (char *) ctx->name.data, ctx->name.len);
473
+ lua_pushfstring(L, " could not be resolved (%d: %s)",
474
+ (int) ctx->state,
475
+ ngx_resolver_strerror(ctx->state));
476
+ lua_concat(L, 2);
477
+
478
+ #if 1
479
+ ngx_resolve_name_done(ctx);
480
+ ur->ctx = NULL;
481
+ #endif
482
+
483
+ u->prepare_retvals = ngx_http_lua_socket_error_retval_handler;
484
+ ngx_http_lua_socket_udp_handle_error(r, u,
485
+ NGX_HTTP_LUA_SOCKET_FT_RESOLVER);
486
+
487
+ if (waiting) {
488
+ ngx_http_run_posted_requests(c);
489
+ }
490
+
491
+ return;
492
+ }
493
+
494
+ ur->naddrs = ctx->naddrs;
495
+ ur->addrs = ctx->addrs;
496
+
497
+ #if (NGX_DEBUG)
498
+ {
499
+ # if defined(nginx_version) && nginx_version >= 1005008
500
+ u_char text[NGX_SOCKADDR_STRLEN];
501
+ ngx_str_t addr;
502
+ # else
503
+ in_addr_t addr;
504
+ # endif
505
+ ngx_uint_t i;
506
+
507
+ # if defined(nginx_version) && nginx_version >= 1005008
508
+ addr.data = text;
509
+
510
+ for (i = 0; i < ctx->naddrs; i++) {
511
+ addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,
512
+ text, NGX_SOCKADDR_STRLEN, 0);
513
+
514
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
515
+ "name was resolved to %V", &addr);
516
+ }
517
+ # else
518
+ for (i = 0; i < ctx->naddrs; i++) {
519
+ dd("addr i: %d %p", (int) i, &ctx->addrs[i]);
520
+
521
+ addr = ntohl(ctx->addrs[i]);
522
+
523
+ ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,
524
+ "name was resolved to %ud.%ud.%ud.%ud",
525
+ (addr >> 24) & 0xff, (addr >> 16) & 0xff,
526
+ (addr >> 8) & 0xff, addr & 0xff);
527
+ }
528
+ # endif
529
+ }
530
+ #endif
531
+
532
+ ngx_http_lua_assert(ur->naddrs > 0);
533
+
534
+ if (ur->naddrs == 1) {
535
+ i = 0;
536
+
537
+ } else {
538
+ i = ngx_random() % ur->naddrs;
539
+ }
540
+
541
+ dd("selected addr index: %d", (int) i);
542
+
543
+ #if defined(nginx_version) && nginx_version >= 1005008
544
+ socklen = ur->addrs[i].socklen;
545
+
546
+ sockaddr = ngx_palloc(r->pool, socklen);
547
+ if (sockaddr == NULL) {
548
+ goto nomem;
549
+ }
550
+
551
+ ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);
552
+
553
+ switch (sockaddr->sa_family) {
554
+ #if (NGX_HAVE_INET6)
555
+ case AF_INET6:
556
+ ((struct sockaddr_in6 *) sockaddr)->sin6_port = htons(ur->port);
557
+ break;
558
+ #endif
559
+ default: /* AF_INET */
560
+ ((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);
561
+ }
562
+
563
+ p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);
564
+ if (p == NULL) {
565
+ goto nomem;
566
+ }
567
+
568
+ len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);
569
+ ur->sockaddr = sockaddr;
570
+ ur->socklen = socklen;
571
+
572
+ #else
573
+ /* for nginx older than 1.5.8 */
574
+
575
+ len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
576
+
577
+ p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));
578
+ if (p == NULL) {
579
+ goto nomem;
580
+ }
581
+
582
+ sin = (struct sockaddr_in *) &p[len];
583
+ ngx_memzero(sin, sizeof(struct sockaddr_in));
584
+
585
+ len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);
586
+ len = ngx_sprintf(&p[len], ":%d", ur->port) - p;
587
+
588
+ sin->sin_family = AF_INET;
589
+ sin->sin_port = htons(ur->port);
590
+ sin->sin_addr.s_addr = ur->addrs[i];
591
+
592
+ ur->sockaddr = (struct sockaddr *) sin;
593
+ ur->socklen = sizeof(struct sockaddr_in);
594
+ #endif
595
+
596
+ ur->host.data = p;
597
+ ur->host.len = len;
598
+ ur->naddrs = 1;
599
+
600
+ ngx_resolve_name_done(ctx);
601
+ ur->ctx = NULL;
602
+
603
+ u->waiting = 0;
604
+
605
+ if (waiting) {
606
+ lctx->resume_handler = ngx_http_lua_socket_udp_resume;
607
+ r->write_event_handler(r);
608
+ ngx_http_run_posted_requests(c);
609
+
610
+ } else {
611
+ (void) ngx_http_lua_socket_resolve_retval_handler(r, u, L);
612
+ }
613
+
614
+ return;
615
+
616
+ nomem:
617
+
618
+ if (ur->ctx) {
619
+ ngx_resolve_name_done(ctx);
620
+ ur->ctx = NULL;
621
+ }
622
+
623
+ u->prepare_retvals = ngx_http_lua_socket_error_retval_handler;
624
+ ngx_http_lua_socket_udp_handle_error(r, u,
625
+ NGX_HTTP_LUA_SOCKET_FT_NOMEM);
626
+
627
+ if (waiting) {
628
+ ngx_http_run_posted_requests(c);
629
+
630
+ } else {
631
+ lua_pushnil(L);
632
+ lua_pushliteral(L, "no memory");
633
+ }
634
+ }
635
+
636
+
637
+ static int
638
+ ngx_http_lua_socket_resolve_retval_handler(ngx_http_request_t *r,
639
+ ngx_http_lua_socket_udp_upstream_t *u, lua_State *L)
640
+ {
641
+ ngx_http_lua_ctx_t *ctx;
642
+ ngx_http_lua_co_ctx_t *coctx;
643
+ ngx_udp_connection_t *uc;
644
+ ngx_connection_t *c;
645
+ ngx_http_cleanup_t *cln;
646
+ ngx_http_upstream_resolved_t *ur;
647
+ ngx_int_t rc;
648
+
649
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
650
+ "lua udp socket resolve retval handler");
651
+
652
+ if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_RESOLVER) {
653
+ return 2;
654
+ }
655
+
656
+ uc = &u->udp_connection;
657
+
658
+ ur = u->resolved;
659
+
660
+ if (ur->sockaddr) {
661
+ uc->sockaddr = ur->sockaddr;
662
+ uc->socklen = ur->socklen;
663
+ uc->server = ur->host;
664
+
665
+ } else {
666
+ lua_pushnil(L);
667
+ lua_pushliteral(L, "resolver not working");
668
+ return 2;
669
+ }
670
+
671
+ rc = ngx_http_lua_udp_connect(uc);
672
+
673
+ if (rc != NGX_OK) {
674
+ u->socket_errno = ngx_socket_errno;
675
+ }
676
+
677
+ if (u->cleanup == NULL) {
678
+ cln = ngx_http_cleanup_add(r, 0);
679
+ if (cln == NULL) {
680
+ u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;
681
+ lua_pushnil(L);
682
+ lua_pushliteral(L, "no memory");
683
+ return 2;
684
+ }
685
+
686
+ cln->handler = ngx_http_lua_socket_udp_cleanup;
687
+ cln->data = u;
688
+ u->cleanup = &cln->handler;
689
+ }
690
+
691
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
692
+ "lua udp socket connect: %i", rc);
693
+
694
+ if (rc != NGX_OK) {
695
+ return ngx_http_lua_socket_error_retval_handler(r, u, L);
696
+ }
697
+
698
+ /* rc == NGX_OK */
699
+
700
+ c = uc->connection;
701
+
702
+ c->data = u;
703
+
704
+ c->write->handler = NULL;
705
+ c->read->handler = ngx_http_lua_socket_udp_handler;
706
+ c->read->resolver = 0;
707
+
708
+ c->pool = r->pool;
709
+ c->log = r->connection->log;
710
+ c->read->log = c->log;
711
+ c->write->log = c->log;
712
+
713
+ ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
714
+
715
+ coctx = ctx->cur_co_ctx;
716
+
717
+ coctx->data = u;
718
+
719
+ u->read_event_handler = ngx_http_lua_socket_dummy_handler;
720
+
721
+ lua_pushinteger(L, 1);
722
+ return 1;
723
+ }
724
+
725
+
726
+ static int
727
+ ngx_http_lua_socket_error_retval_handler(ngx_http_request_t *r,
728
+ ngx_http_lua_socket_udp_upstream_t *u, lua_State *L)
729
+ {
730
+ u_char errstr[NGX_MAX_ERROR_STR];
731
+ u_char *p;
732
+
733
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
734
+ "lua udp socket error retval handler");
735
+
736
+ if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_RESOLVER) {
737
+ return 2;
738
+ }
739
+
740
+ lua_pushnil(L);
741
+
742
+ if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_PARTIALWRITE) {
743
+ lua_pushliteral(L, "partial write");
744
+
745
+ } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_TIMEOUT) {
746
+ lua_pushliteral(L, "timeout");
747
+
748
+ } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_CLOSED) {
749
+ lua_pushliteral(L, "closed");
750
+
751
+ } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_BUFTOOSMALL) {
752
+ lua_pushliteral(L, "buffer too small");
753
+
754
+ } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_NOMEM) {
755
+ lua_pushliteral(L, "no memory");
756
+
757
+ } else {
758
+
759
+ if (u->socket_errno) {
760
+ #if defined(nginx_version) && nginx_version >= 9000
761
+ p = ngx_strerror(u->socket_errno, errstr, sizeof(errstr));
762
+ #else
763
+ p = ngx_strerror_r(u->socket_errno, errstr, sizeof(errstr));
764
+ #endif
765
+ /* for compatibility with LuaSocket */
766
+ ngx_strlow(errstr, errstr, p - errstr);
767
+ lua_pushlstring(L, (char *) errstr, p - errstr);
768
+
769
+ } else {
770
+ lua_pushliteral(L, "error");
771
+ }
772
+ }
773
+
774
+ return 2;
775
+ }
776
+
777
+
778
+ static int
779
+ ngx_http_lua_socket_udp_send(lua_State *L)
780
+ {
781
+ ssize_t n;
782
+ ngx_http_request_t *r;
783
+ u_char *p;
784
+ size_t len;
785
+ ngx_http_lua_socket_udp_upstream_t *u;
786
+ int type;
787
+ const char *msg;
788
+ ngx_str_t query;
789
+ ngx_http_lua_loc_conf_t *llcf;
790
+
791
+ if (lua_gettop(L) != 2) {
792
+ return luaL_error(L, "expecting 2 arguments (including the object), "
793
+ "but got %d", lua_gettop(L));
794
+ }
795
+
796
+ r = ngx_http_lua_get_req(L);
797
+ if (r == NULL) {
798
+ return luaL_error(L, "request object not found");
799
+ }
800
+
801
+ luaL_checktype(L, 1, LUA_TTABLE);
802
+
803
+ lua_rawgeti(L, 1, SOCKET_CTX_INDEX);
804
+ u = lua_touserdata(L, -1);
805
+ lua_pop(L, 1);
806
+
807
+ if (u == NULL || u->udp_connection.connection == NULL) {
808
+ llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);
809
+
810
+ if (llcf->log_socket_errors) {
811
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
812
+ "attempt to send data on a closed socket: u:%p, c:%p",
813
+ u, u ? u->udp_connection.connection : NULL);
814
+ }
815
+
816
+ lua_pushnil(L);
817
+ lua_pushliteral(L, "closed");
818
+ return 2;
819
+ }
820
+
821
+ if (u->request != r) {
822
+ return luaL_error(L, "bad request");
823
+ }
824
+
825
+ if (u->ft_type) {
826
+ u->ft_type = 0;
827
+ }
828
+
829
+ if (u->waiting) {
830
+ lua_pushnil(L);
831
+ lua_pushliteral(L, "socket busy");
832
+ return 2;
833
+ }
834
+
835
+ type = lua_type(L, 2);
836
+ switch (type) {
837
+ case LUA_TNUMBER:
838
+ case LUA_TSTRING:
839
+ lua_tolstring(L, 2, &len);
840
+ break;
841
+
842
+ case LUA_TTABLE:
843
+ len = ngx_http_lua_calc_strlen_in_table(L, 2, 2, 1 /* strict */);
844
+ break;
845
+
846
+ default:
847
+ msg = lua_pushfstring(L, "string, number, boolean, nil, "
848
+ "or array table expected, got %s",
849
+ lua_typename(L, type));
850
+
851
+ return luaL_argerror(L, 2, msg);
852
+ }
853
+
854
+ query.data = lua_newuserdata(L, len);
855
+ query.len = len;
856
+
857
+ switch (type) {
858
+ case LUA_TNUMBER:
859
+ case LUA_TSTRING:
860
+ p = (u_char *) lua_tolstring(L, 2, &len);
861
+ ngx_memcpy(query.data, (u_char *) p, len);
862
+ break;
863
+
864
+ case LUA_TTABLE:
865
+ (void) ngx_http_lua_copy_str_in_table(L, 2, query.data);
866
+ break;
867
+
868
+ default:
869
+ return luaL_error(L, "impossible to reach here");
870
+ }
871
+
872
+ u->ft_type = 0;
873
+
874
+ /* mimic ngx_http_upstream_init_request here */
875
+
876
+ #if 1
877
+ u->waiting = 0;
878
+ #endif
879
+
880
+ dd("sending query %.*s", (int) query.len, query.data);
881
+
882
+ n = ngx_send(u->udp_connection.connection, query.data, query.len);
883
+
884
+ dd("ngx_send returns %d (query len %d)", (int) n, (int) query.len);
885
+
886
+ if (n == NGX_ERROR || n == NGX_AGAIN) {
887
+ u->socket_errno = ngx_socket_errno;
888
+
889
+ return ngx_http_lua_socket_error_retval_handler(r, u, L);
890
+ }
891
+
892
+ if (n != (ssize_t) query.len) {
893
+ dd("not the while query was sent");
894
+
895
+ u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_PARTIALWRITE;
896
+ return ngx_http_lua_socket_error_retval_handler(r, u, L);
897
+ }
898
+
899
+ dd("n == len");
900
+
901
+ lua_pushinteger(L, 1);
902
+ return 1;
903
+ }
904
+
905
+
906
+ static int
907
+ ngx_http_lua_socket_udp_receive(lua_State *L)
908
+ {
909
+ ngx_http_request_t *r;
910
+ ngx_http_lua_socket_udp_upstream_t *u;
911
+ ngx_int_t rc;
912
+ ngx_http_lua_ctx_t *ctx;
913
+ ngx_http_lua_co_ctx_t *coctx;
914
+ size_t size;
915
+ int nargs;
916
+ ngx_http_lua_loc_conf_t *llcf;
917
+
918
+ nargs = lua_gettop(L);
919
+ if (nargs != 1 && nargs != 2) {
920
+ return luaL_error(L, "expecting 1 or 2 arguments "
921
+ "(including the object), but got %d", nargs);
922
+ }
923
+
924
+ r = ngx_http_lua_get_req(L);
925
+ if (r == NULL) {
926
+ return luaL_error(L, "no request found");
927
+ }
928
+
929
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
930
+ "lua udp socket calling receive() method");
931
+
932
+ luaL_checktype(L, 1, LUA_TTABLE);
933
+
934
+ lua_rawgeti(L, 1, SOCKET_CTX_INDEX);
935
+ u = lua_touserdata(L, -1);
936
+ lua_pop(L, 1);
937
+
938
+ if (u == NULL || u->udp_connection.connection == NULL) {
939
+ llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);
940
+
941
+ if (llcf->log_socket_errors) {
942
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
943
+ "attempt to receive data on a closed socket: u:%p, "
944
+ "c:%p", u, u ? u->udp_connection.connection : NULL);
945
+ }
946
+
947
+ lua_pushnil(L);
948
+ lua_pushliteral(L, "closed");
949
+ return 2;
950
+ }
951
+
952
+ if (u->request != r) {
953
+ return luaL_error(L, "bad request");
954
+ }
955
+
956
+ if (u->ft_type) {
957
+ u->ft_type = 0;
958
+ }
959
+
960
+ #if 1
961
+ if (u->waiting) {
962
+ lua_pushnil(L);
963
+ lua_pushliteral(L, "socket busy");
964
+ return 2;
965
+ }
966
+ #endif
967
+
968
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
969
+ "lua udp socket read timeout: %M", u->read_timeout);
970
+
971
+ size = (size_t) luaL_optnumber(L, 2, UDP_MAX_DATAGRAM_SIZE);
972
+ size = ngx_min(size, UDP_MAX_DATAGRAM_SIZE);
973
+
974
+ u->recv_buf_size = size;
975
+
976
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
977
+ "lua udp socket receive buffer size: %uz", u->recv_buf_size);
978
+
979
+ rc = ngx_http_lua_socket_udp_read(r, u);
980
+
981
+ if (rc == NGX_ERROR) {
982
+ dd("read failed: %d", (int) u->ft_type);
983
+ rc = ngx_http_lua_socket_udp_receive_retval_handler(r, u, L);
984
+ dd("udp receive retval returned: %d", (int) rc);
985
+ return rc;
986
+ }
987
+
988
+ if (rc == NGX_OK) {
989
+
990
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
991
+ "lua udp socket receive done in a single run");
992
+
993
+ return ngx_http_lua_socket_udp_receive_retval_handler(r, u, L);
994
+ }
995
+
996
+ /* n == NGX_AGAIN */
997
+
998
+ u->read_event_handler = ngx_http_lua_socket_udp_read_handler;
999
+
1000
+ ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
1001
+ if (ctx == NULL) {
1002
+ return luaL_error(L, "no request ctx found");
1003
+ }
1004
+
1005
+ coctx = ctx->cur_co_ctx;
1006
+
1007
+ ngx_http_lua_cleanup_pending_operation(coctx);
1008
+ coctx->cleanup = ngx_http_lua_udp_socket_cleanup;
1009
+ coctx->data = u;
1010
+
1011
+ if (ctx->entered_content_phase) {
1012
+ r->write_event_handler = ngx_http_lua_content_wev_handler;
1013
+
1014
+ } else {
1015
+ r->write_event_handler = ngx_http_core_run_phases;
1016
+ }
1017
+
1018
+ u->co_ctx = coctx;
1019
+ u->waiting = 1;
1020
+ u->prepare_retvals = ngx_http_lua_socket_udp_receive_retval_handler;
1021
+
1022
+ return lua_yield(L, 0);
1023
+ }
1024
+
1025
+
1026
+ static int
1027
+ ngx_http_lua_socket_udp_receive_retval_handler(ngx_http_request_t *r,
1028
+ ngx_http_lua_socket_udp_upstream_t *u, lua_State *L)
1029
+ {
1030
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1031
+ "lua udp socket receive return value handler");
1032
+
1033
+ if (u->ft_type) {
1034
+ return ngx_http_lua_socket_error_retval_handler(r, u, L);
1035
+ }
1036
+
1037
+ lua_pushlstring(L, (char *) ngx_http_lua_socket_udp_buffer, u->received);
1038
+ return 1;
1039
+ }
1040
+
1041
+
1042
+ static int
1043
+ ngx_http_lua_socket_udp_settimeout(lua_State *L)
1044
+ {
1045
+ int n;
1046
+ ngx_int_t timeout;
1047
+
1048
+ ngx_http_lua_socket_udp_upstream_t *u;
1049
+
1050
+ n = lua_gettop(L);
1051
+
1052
+ if (n != 2) {
1053
+ return luaL_error(L, "ngx.socket settimout: expecting at least 2 "
1054
+ "arguments (including the object) but seen %d",
1055
+ lua_gettop(L));
1056
+ }
1057
+
1058
+ timeout = (ngx_int_t) lua_tonumber(L, 2);
1059
+
1060
+ lua_rawseti(L, 1, SOCKET_TIMEOUT_INDEX);
1061
+
1062
+ lua_rawgeti(L, 1, SOCKET_CTX_INDEX);
1063
+ u = lua_touserdata(L, -1);
1064
+
1065
+ if (u) {
1066
+ if (timeout > 0) {
1067
+ u->read_timeout = (ngx_msec_t) timeout;
1068
+
1069
+ } else {
1070
+ u->read_timeout = u->conf->read_timeout;
1071
+ }
1072
+ }
1073
+
1074
+ return 0;
1075
+ }
1076
+
1077
+
1078
+ static void
1079
+ ngx_http_lua_socket_udp_finalize(ngx_http_request_t *r,
1080
+ ngx_http_lua_socket_udp_upstream_t *u)
1081
+ {
1082
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1083
+ "lua finalize socket");
1084
+
1085
+ if (u->cleanup) {
1086
+ *u->cleanup = NULL;
1087
+ u->cleanup = NULL;
1088
+ }
1089
+
1090
+ if (u->resolved && u->resolved->ctx) {
1091
+ ngx_resolve_name_done(u->resolved->ctx);
1092
+ u->resolved->ctx = NULL;
1093
+ }
1094
+
1095
+ if (u->udp_connection.connection) {
1096
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1097
+ "lua close socket connection");
1098
+
1099
+ ngx_close_connection(u->udp_connection.connection);
1100
+ u->udp_connection.connection = NULL;
1101
+ }
1102
+
1103
+ if (u->waiting) {
1104
+ u->waiting = 0;
1105
+ }
1106
+ }
1107
+
1108
+
1109
+ static int
1110
+ ngx_http_lua_socket_udp_upstream_destroy(lua_State *L)
1111
+ {
1112
+ ngx_http_lua_socket_udp_upstream_t *u;
1113
+
1114
+ dd("upstream destroy triggered by Lua GC");
1115
+
1116
+ u = lua_touserdata(L, 1);
1117
+ if (u == NULL) {
1118
+ return 0;
1119
+ }
1120
+
1121
+ if (u->cleanup) {
1122
+ ngx_http_lua_socket_udp_cleanup(u); /* it will clear u->cleanup */
1123
+ }
1124
+
1125
+ return 0;
1126
+ }
1127
+
1128
+
1129
+ static void
1130
+ ngx_http_lua_socket_dummy_handler(ngx_http_request_t *r,
1131
+ ngx_http_lua_socket_udp_upstream_t *u)
1132
+ {
1133
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1134
+ "lua udp socket dummy handler");
1135
+ }
1136
+
1137
+
1138
+ static ngx_int_t
1139
+ ngx_http_lua_socket_udp_read(ngx_http_request_t *r,
1140
+ ngx_http_lua_socket_udp_upstream_t *u)
1141
+ {
1142
+ ngx_connection_t *c;
1143
+ ngx_event_t *rev;
1144
+ ssize_t n;
1145
+
1146
+ c = u->udp_connection.connection;
1147
+ rev = c->read;
1148
+
1149
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
1150
+ "lua udp socket read data: waiting: %d", (int) u->waiting);
1151
+
1152
+ n = ngx_udp_recv(u->udp_connection.connection,
1153
+ ngx_http_lua_socket_udp_buffer, u->recv_buf_size);
1154
+
1155
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
1156
+ "lua udp recv returned %z", n);
1157
+
1158
+ if (n >= 0) {
1159
+ u->received = n;
1160
+ ngx_http_lua_socket_udp_handle_success(r, u);
1161
+ return NGX_OK;
1162
+ }
1163
+
1164
+ if (n == NGX_ERROR) {
1165
+ u->socket_errno = ngx_socket_errno;
1166
+ ngx_http_lua_socket_udp_handle_error(r, u,
1167
+ NGX_HTTP_LUA_SOCKET_FT_ERROR);
1168
+ return NGX_ERROR;
1169
+ }
1170
+
1171
+ /* n == NGX_AGAIN */
1172
+
1173
+ #if 1
1174
+ if (ngx_handle_read_event(rev, 0) != NGX_OK) {
1175
+ ngx_http_lua_socket_udp_handle_error(r, u,
1176
+ NGX_HTTP_LUA_SOCKET_FT_ERROR);
1177
+ return NGX_ERROR;
1178
+ }
1179
+ #endif
1180
+
1181
+ if (rev->active) {
1182
+ ngx_add_timer(rev, u->read_timeout);
1183
+
1184
+ } else if (rev->timer_set) {
1185
+ ngx_del_timer(rev);
1186
+ }
1187
+
1188
+ return NGX_AGAIN;
1189
+ }
1190
+
1191
+
1192
+ static void
1193
+ ngx_http_lua_socket_udp_read_handler(ngx_http_request_t *r,
1194
+ ngx_http_lua_socket_udp_upstream_t *u)
1195
+ {
1196
+ ngx_connection_t *c;
1197
+ ngx_http_lua_loc_conf_t *llcf;
1198
+
1199
+ c = u->udp_connection.connection;
1200
+
1201
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1202
+ "lua udp socket read handler");
1203
+
1204
+ if (c->read->timedout) {
1205
+ c->read->timedout = 0;
1206
+
1207
+ llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);
1208
+
1209
+ if (llcf->log_socket_errors) {
1210
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1211
+ "lua udp socket read timed out");
1212
+ }
1213
+
1214
+ ngx_http_lua_socket_udp_handle_error(r, u,
1215
+ NGX_HTTP_LUA_SOCKET_FT_TIMEOUT);
1216
+ return;
1217
+ }
1218
+
1219
+ #if 1
1220
+ if (c->read->timer_set) {
1221
+ ngx_del_timer(c->read);
1222
+ }
1223
+ #endif
1224
+
1225
+ (void) ngx_http_lua_socket_udp_read(r, u);
1226
+ }
1227
+
1228
+
1229
+ static void
1230
+ ngx_http_lua_socket_udp_handle_error(ngx_http_request_t *r,
1231
+ ngx_http_lua_socket_udp_upstream_t *u, ngx_uint_t ft_type)
1232
+ {
1233
+ ngx_http_lua_ctx_t *ctx;
1234
+ ngx_http_lua_co_ctx_t *coctx;
1235
+
1236
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1237
+ "lua udp socket handle error");
1238
+
1239
+ u->ft_type |= ft_type;
1240
+
1241
+ #if 0
1242
+ ngx_http_lua_socket_udp_finalize(r, u);
1243
+ #endif
1244
+
1245
+ u->read_event_handler = ngx_http_lua_socket_dummy_handler;
1246
+
1247
+ coctx = u->co_ctx;
1248
+
1249
+ if (coctx) {
1250
+ coctx->cleanup = NULL;
1251
+ }
1252
+
1253
+ if (u->waiting) {
1254
+ u->waiting = 0;
1255
+
1256
+ ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
1257
+ if (ctx == NULL) {
1258
+ return;
1259
+ }
1260
+
1261
+ ctx->resume_handler = ngx_http_lua_socket_udp_resume;
1262
+ ctx->cur_co_ctx = coctx;
1263
+
1264
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1265
+ "lua udp socket waking up the current request");
1266
+
1267
+ r->write_event_handler(r);
1268
+ }
1269
+ }
1270
+
1271
+
1272
+ static void
1273
+ ngx_http_lua_socket_udp_cleanup(void *data)
1274
+ {
1275
+ ngx_http_lua_socket_udp_upstream_t *u = data;
1276
+
1277
+ ngx_http_request_t *r;
1278
+
1279
+ r = u->request;
1280
+
1281
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1282
+ "cleanup lua udp socket upstream request: \"%V\"", &r->uri);
1283
+
1284
+ ngx_http_lua_socket_udp_finalize(r, u);
1285
+ }
1286
+
1287
+
1288
+ static void
1289
+ ngx_http_lua_socket_udp_handler(ngx_event_t *ev)
1290
+ {
1291
+ ngx_connection_t *c;
1292
+ ngx_http_request_t *r;
1293
+ ngx_http_log_ctx_t *ctx;
1294
+
1295
+ ngx_http_lua_socket_udp_upstream_t *u;
1296
+
1297
+ c = ev->data;
1298
+ u = c->data;
1299
+ r = u->request;
1300
+ c = r->connection;
1301
+
1302
+ if (c->fd != -1) { /* not a fake connection */
1303
+ ctx = c->log->data;
1304
+ ctx->current_request = r;
1305
+ }
1306
+
1307
+ ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,
1308
+ "lua udp socket handler for \"%V?%V\", wev %d", &r->uri,
1309
+ &r->args, (int) ev->write);
1310
+
1311
+ u->read_event_handler(r, u);
1312
+
1313
+ ngx_http_run_posted_requests(c);
1314
+ }
1315
+
1316
+
1317
+ static void
1318
+ ngx_http_lua_socket_udp_handle_success(ngx_http_request_t *r,
1319
+ ngx_http_lua_socket_udp_upstream_t *u)
1320
+ {
1321
+ ngx_http_lua_ctx_t *ctx;
1322
+
1323
+ u->read_event_handler = ngx_http_lua_socket_dummy_handler;
1324
+
1325
+ if (u->co_ctx) {
1326
+ u->co_ctx->cleanup = NULL;
1327
+ }
1328
+
1329
+ if (u->waiting) {
1330
+ u->waiting = 0;
1331
+
1332
+ ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
1333
+ if (ctx == NULL) {
1334
+ return;
1335
+ }
1336
+
1337
+ ctx->resume_handler = ngx_http_lua_socket_udp_resume;
1338
+ ctx->cur_co_ctx = u->co_ctx;
1339
+
1340
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1341
+ "lua udp socket waking up the current request");
1342
+
1343
+ r->write_event_handler(r);
1344
+ }
1345
+ }
1346
+
1347
+
1348
+ static ngx_int_t
1349
+ ngx_http_lua_udp_connect(ngx_udp_connection_t *uc)
1350
+ {
1351
+ int rc;
1352
+ ngx_int_t event;
1353
+ ngx_event_t *rev, *wev;
1354
+ ngx_socket_t s;
1355
+ ngx_connection_t *c;
1356
+
1357
+ s = ngx_socket(uc->sockaddr->sa_family, SOCK_DGRAM, 0);
1358
+
1359
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &uc->log, 0, "UDP socket %d", s);
1360
+
1361
+ if (s == -1) {
1362
+ ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
1363
+ ngx_socket_n " failed");
1364
+
1365
+ return NGX_ERROR;
1366
+ }
1367
+
1368
+ c = ngx_get_connection(s, &uc->log);
1369
+
1370
+ if (c == NULL) {
1371
+ if (ngx_close_socket(s) == -1) {
1372
+ ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
1373
+ ngx_close_socket_n "failed");
1374
+ }
1375
+
1376
+ return NGX_ERROR;
1377
+ }
1378
+
1379
+ if (ngx_nonblocking(s) == -1) {
1380
+ ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
1381
+ ngx_nonblocking_n " failed");
1382
+
1383
+ ngx_free_connection(c);
1384
+
1385
+ if (ngx_close_socket(s) == -1) {
1386
+ ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
1387
+ ngx_close_socket_n " failed");
1388
+ }
1389
+
1390
+ return NGX_ERROR;
1391
+ }
1392
+
1393
+ rev = c->read;
1394
+ wev = c->write;
1395
+
1396
+ rev->log = &uc->log;
1397
+ wev->log = &uc->log;
1398
+
1399
+ uc->connection = c;
1400
+
1401
+ c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
1402
+
1403
+ #if (NGX_THREADS)
1404
+
1405
+ /* TODO: lock event when call completion handler */
1406
+
1407
+ rev->lock = &c->lock;
1408
+ wev->lock = &c->lock;
1409
+ rev->own_lock = &c->lock;
1410
+ wev->own_lock = &c->lock;
1411
+
1412
+ #endif
1413
+
1414
+ #if (NGX_HTTP_LUA_HAVE_SO_PASSCRED)
1415
+ if (uc->sockaddr->sa_family == AF_UNIX) {
1416
+ struct sockaddr addr;
1417
+
1418
+ addr.sa_family = AF_UNIX;
1419
+
1420
+ /* just to make valgrind happy */
1421
+ ngx_memzero(addr.sa_data, sizeof(addr.sa_data));
1422
+
1423
+ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &uc->log, 0, "datagram unix "
1424
+ "domain socket autobind");
1425
+
1426
+ if (bind(uc->connection->fd, &addr, sizeof(sa_family_t)) != 0) {
1427
+ ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,
1428
+ "bind() failed");
1429
+
1430
+ return NGX_ERROR;
1431
+ }
1432
+ }
1433
+ #endif
1434
+
1435
+ ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &uc->log, 0,
1436
+ "connect to %V, fd:%d #%d", &uc->server, s, c->number);
1437
+
1438
+ rc = connect(s, uc->sockaddr, uc->socklen);
1439
+
1440
+ /* TODO: aio, iocp */
1441
+
1442
+ if (rc == -1) {
1443
+ ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,
1444
+ "connect() failed");
1445
+
1446
+ return NGX_ERROR;
1447
+ }
1448
+
1449
+ /* UDP sockets are always ready to write */
1450
+ wev->ready = 1;
1451
+
1452
+ if (ngx_add_event) {
1453
+
1454
+ event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ?
1455
+ /* kqueue, epoll */ NGX_CLEAR_EVENT:
1456
+ /* select, poll, /dev/poll */ NGX_LEVEL_EVENT;
1457
+ /* eventport event type has no meaning: oneshot only */
1458
+
1459
+ if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
1460
+ return NGX_ERROR;
1461
+ }
1462
+
1463
+ } else {
1464
+ /* rtsig */
1465
+
1466
+ if (ngx_add_conn(c) == NGX_ERROR) {
1467
+ return NGX_ERROR;
1468
+ }
1469
+ }
1470
+
1471
+ return NGX_OK;
1472
+ }
1473
+
1474
+
1475
+ static int
1476
+ ngx_http_lua_socket_udp_close(lua_State *L)
1477
+ {
1478
+ ngx_http_request_t *r;
1479
+ ngx_http_lua_socket_udp_upstream_t *u;
1480
+
1481
+ if (lua_gettop(L) != 1) {
1482
+ return luaL_error(L, "expecting 1 argument "
1483
+ "(including the object) but seen %d", lua_gettop(L));
1484
+ }
1485
+
1486
+ r = ngx_http_lua_get_req(L);
1487
+ if (r == NULL) {
1488
+ return luaL_error(L, "no request found");
1489
+ }
1490
+
1491
+ luaL_checktype(L, 1, LUA_TTABLE);
1492
+
1493
+ lua_rawgeti(L, 1, SOCKET_CTX_INDEX);
1494
+ u = lua_touserdata(L, -1);
1495
+ lua_pop(L, 1);
1496
+
1497
+ if (u == NULL || u->udp_connection.connection == NULL) {
1498
+ lua_pushnil(L);
1499
+ lua_pushliteral(L, "closed");
1500
+ return 2;
1501
+ }
1502
+
1503
+ if (u->request != r) {
1504
+ return luaL_error(L, "bad request");
1505
+ }
1506
+
1507
+ if (u->waiting) {
1508
+ lua_pushnil(L);
1509
+ lua_pushliteral(L, "socket busy");
1510
+ return 2;
1511
+ }
1512
+
1513
+ ngx_http_lua_socket_udp_finalize(r, u);
1514
+
1515
+ lua_pushinteger(L, 1);
1516
+ return 1;
1517
+ }
1518
+
1519
+
1520
+ static ngx_int_t
1521
+ ngx_http_lua_socket_udp_resume(ngx_http_request_t *r)
1522
+ {
1523
+ int nret;
1524
+ lua_State *vm;
1525
+ ngx_int_t rc;
1526
+ ngx_connection_t *c;
1527
+ ngx_http_lua_ctx_t *ctx;
1528
+ ngx_http_lua_co_ctx_t *coctx;
1529
+
1530
+ ngx_http_lua_socket_udp_upstream_t *u;
1531
+
1532
+ ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
1533
+ if (ctx == NULL) {
1534
+ return NGX_ERROR;
1535
+ }
1536
+
1537
+ ctx->resume_handler = ngx_http_lua_wev_handler;
1538
+
1539
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1540
+ "lua udp operation done, resuming lua thread");
1541
+
1542
+ coctx = ctx->cur_co_ctx;
1543
+
1544
+ #if 0
1545
+ ngx_http_lua_probe_info("udp resume");
1546
+ #endif
1547
+
1548
+ u = coctx->data;
1549
+
1550
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1551
+ "lua udp socket calling prepare retvals handler %p, "
1552
+ "u:%p", u->prepare_retvals, u);
1553
+
1554
+ nret = u->prepare_retvals(r, u, ctx->cur_co_ctx->co);
1555
+ if (nret == NGX_AGAIN) {
1556
+ return NGX_DONE;
1557
+ }
1558
+
1559
+ c = r->connection;
1560
+ vm = ngx_http_lua_get_lua_vm(r, ctx);
1561
+
1562
+ rc = ngx_http_lua_run_thread(vm, r, ctx, nret);
1563
+
1564
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1565
+ "lua run thread returned %d", rc);
1566
+
1567
+ if (rc == NGX_AGAIN) {
1568
+ return ngx_http_lua_run_posted_threads(c, vm, r, ctx);
1569
+ }
1570
+
1571
+ if (rc == NGX_DONE) {
1572
+ ngx_http_lua_finalize_request(r, NGX_DONE);
1573
+ return ngx_http_lua_run_posted_threads(c, vm, r, ctx);
1574
+ }
1575
+
1576
+ if (ctx->entered_content_phase) {
1577
+ ngx_http_lua_finalize_request(r, rc);
1578
+ return NGX_DONE;
1579
+ }
1580
+
1581
+ return rc;
1582
+ }
1583
+
1584
+
1585
+ static void
1586
+ ngx_http_lua_udp_resolve_cleanup(void *data)
1587
+ {
1588
+ ngx_resolver_ctx_t *rctx;
1589
+ ngx_http_lua_socket_udp_upstream_t *u;
1590
+ ngx_http_lua_co_ctx_t *coctx = data;
1591
+
1592
+ u = coctx->data;
1593
+ if (u == NULL) {
1594
+ return;
1595
+ }
1596
+
1597
+ rctx = u->resolved->ctx;
1598
+ if (rctx == NULL) {
1599
+ return;
1600
+ }
1601
+
1602
+ ngx_resolve_name_done(rctx);
1603
+ }
1604
+
1605
+
1606
+ static void
1607
+ ngx_http_lua_udp_socket_cleanup(void *data)
1608
+ {
1609
+ ngx_http_lua_socket_udp_upstream_t *u;
1610
+ ngx_http_lua_co_ctx_t *coctx = data;
1611
+
1612
+ u = coctx->data;
1613
+ if (u == NULL) {
1614
+ return;
1615
+ }
1616
+
1617
+ if (u->request == NULL) {
1618
+ return;
1619
+ }
1620
+
1621
+ ngx_http_lua_socket_udp_finalize(u->request, u);
1622
+ }
1623
+
1624
+ /* vi:set ft=c ts=4 sw=4 et fdm=marker: */