nginxtra 1.0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (363) hide show
  1. data/VERSION +1 -0
  2. data/bin/nginxtra +5 -0
  3. data/lib/nginxtra.rb +12 -0
  4. data/lib/nginxtra/action.rb +36 -0
  5. data/lib/nginxtra/actions/compile.rb +60 -0
  6. data/lib/nginxtra/actions/install.rb +99 -0
  7. data/lib/nginxtra/actions/reload.rb +14 -0
  8. data/lib/nginxtra/actions/restart.rb +15 -0
  9. data/lib/nginxtra/actions/start.rb +53 -0
  10. data/lib/nginxtra/actions/status.rb +31 -0
  11. data/lib/nginxtra/actions/stop.rb +14 -0
  12. data/lib/nginxtra/cli.rb +77 -0
  13. data/lib/nginxtra/config.rb +339 -0
  14. data/lib/nginxtra/error.rb +13 -0
  15. data/lib/nginxtra/status.rb +57 -0
  16. data/src/nginx/CHANGES +5630 -0
  17. data/src/nginx/CHANGES.ru +5716 -0
  18. data/src/nginx/LICENSE +25 -0
  19. data/src/nginx/README +3 -0
  20. data/src/nginx/auto/cc/acc +15 -0
  21. data/src/nginx/auto/cc/bcc +72 -0
  22. data/src/nginx/auto/cc/ccc +46 -0
  23. data/src/nginx/auto/cc/conf +189 -0
  24. data/src/nginx/auto/cc/gcc +183 -0
  25. data/src/nginx/auto/cc/icc +121 -0
  26. data/src/nginx/auto/cc/msvc +138 -0
  27. data/src/nginx/auto/cc/name +101 -0
  28. data/src/nginx/auto/cc/owc +104 -0
  29. data/src/nginx/auto/cc/sunc +158 -0
  30. data/src/nginx/auto/define +12 -0
  31. data/src/nginx/auto/endianess +45 -0
  32. data/src/nginx/auto/feature +123 -0
  33. data/src/nginx/auto/have +12 -0
  34. data/src/nginx/auto/have_headers +12 -0
  35. data/src/nginx/auto/headers +13 -0
  36. data/src/nginx/auto/include +61 -0
  37. data/src/nginx/auto/init +51 -0
  38. data/src/nginx/auto/install +184 -0
  39. data/src/nginx/auto/lib/conf +83 -0
  40. data/src/nginx/auto/lib/geoip/conf +79 -0
  41. data/src/nginx/auto/lib/google-perftools/conf +45 -0
  42. data/src/nginx/auto/lib/libatomic/conf +43 -0
  43. data/src/nginx/auto/lib/libatomic/make +14 -0
  44. data/src/nginx/auto/lib/libgd/conf +83 -0
  45. data/src/nginx/auto/lib/libxslt/conf +156 -0
  46. data/src/nginx/auto/lib/make +32 -0
  47. data/src/nginx/auto/lib/md5/conf +103 -0
  48. data/src/nginx/auto/lib/md5/make +96 -0
  49. data/src/nginx/auto/lib/md5/makefile.bcc +22 -0
  50. data/src/nginx/auto/lib/md5/makefile.msvc +22 -0
  51. data/src/nginx/auto/lib/md5/makefile.owc +11 -0
  52. data/src/nginx/auto/lib/openssl/conf +74 -0
  53. data/src/nginx/auto/lib/openssl/make +67 -0
  54. data/src/nginx/auto/lib/openssl/makefile.bcc +18 -0
  55. data/src/nginx/auto/lib/openssl/makefile.msvc +14 -0
  56. data/src/nginx/auto/lib/pcre/conf +180 -0
  57. data/src/nginx/auto/lib/pcre/make +64 -0
  58. data/src/nginx/auto/lib/pcre/makefile.bcc +26 -0
  59. data/src/nginx/auto/lib/pcre/makefile.msvc +22 -0
  60. data/src/nginx/auto/lib/pcre/makefile.owc +24 -0
  61. data/src/nginx/auto/lib/perl/conf +60 -0
  62. data/src/nginx/auto/lib/perl/make +36 -0
  63. data/src/nginx/auto/lib/sha1/conf +79 -0
  64. data/src/nginx/auto/lib/sha1/make +96 -0
  65. data/src/nginx/auto/lib/sha1/makefile.bcc +22 -0
  66. data/src/nginx/auto/lib/sha1/makefile.msvc +22 -0
  67. data/src/nginx/auto/lib/sha1/makefile.owc +11 -0
  68. data/src/nginx/auto/lib/test +40 -0
  69. data/src/nginx/auto/lib/zlib/conf +76 -0
  70. data/src/nginx/auto/lib/zlib/make +114 -0
  71. data/src/nginx/auto/lib/zlib/makefile.bcc +15 -0
  72. data/src/nginx/auto/lib/zlib/makefile.msvc +14 -0
  73. data/src/nginx/auto/lib/zlib/makefile.owc +14 -0
  74. data/src/nginx/auto/lib/zlib/patch.zlib.h +10 -0
  75. data/src/nginx/auto/make +417 -0
  76. data/src/nginx/auto/modules +479 -0
  77. data/src/nginx/auto/nohave +12 -0
  78. data/src/nginx/auto/options +490 -0
  79. data/src/nginx/auto/os/conf +105 -0
  80. data/src/nginx/auto/os/darwin +116 -0
  81. data/src/nginx/auto/os/freebsd +136 -0
  82. data/src/nginx/auto/os/linux +152 -0
  83. data/src/nginx/auto/os/solaris +60 -0
  84. data/src/nginx/auto/os/win32 +29 -0
  85. data/src/nginx/auto/sources +518 -0
  86. data/src/nginx/auto/stubs +8 -0
  87. data/src/nginx/auto/summary +114 -0
  88. data/src/nginx/auto/types/sizeof +83 -0
  89. data/src/nginx/auto/types/typedef +77 -0
  90. data/src/nginx/auto/types/uintptr_t +42 -0
  91. data/src/nginx/auto/types/value +12 -0
  92. data/src/nginx/auto/unix +719 -0
  93. data/src/nginx/conf/fastcgi.conf +24 -0
  94. data/src/nginx/conf/fastcgi_params +23 -0
  95. data/src/nginx/conf/koi-utf +109 -0
  96. data/src/nginx/conf/koi-win +103 -0
  97. data/src/nginx/conf/mime.types +80 -0
  98. data/src/nginx/conf/nginx.conf +118 -0
  99. data/src/nginx/conf/scgi_params +15 -0
  100. data/src/nginx/conf/uwsgi_params +15 -0
  101. data/src/nginx/conf/win-utf +126 -0
  102. data/src/nginx/configure +108 -0
  103. data/src/nginx/contrib/README +15 -0
  104. data/src/nginx/contrib/geo2nginx.pl +58 -0
  105. data/src/nginx/contrib/unicode2nginx/koi-utf +131 -0
  106. data/src/nginx/contrib/unicode2nginx/unicode-to-nginx.pl +45 -0
  107. data/src/nginx/contrib/unicode2nginx/win-utf +130 -0
  108. data/src/nginx/html/50x.html +18 -0
  109. data/src/nginx/html/index.html +8 -0
  110. data/src/nginx/man/nginx.8 +202 -0
  111. data/src/nginx/src/core/nginx.c +1333 -0
  112. data/src/nginx/src/core/nginx.h +20 -0
  113. data/src/nginx/src/core/ngx_array.c +147 -0
  114. data/src/nginx/src/core/ngx_array.h +53 -0
  115. data/src/nginx/src/core/ngx_buf.c +218 -0
  116. data/src/nginx/src/core/ngx_buf.h +162 -0
  117. data/src/nginx/src/core/ngx_conf_file.c +1506 -0
  118. data/src/nginx/src/core/ngx_conf_file.h +348 -0
  119. data/src/nginx/src/core/ngx_config.h +134 -0
  120. data/src/nginx/src/core/ngx_connection.c +1074 -0
  121. data/src/nginx/src/core/ngx_connection.h +195 -0
  122. data/src/nginx/src/core/ngx_core.h +95 -0
  123. data/src/nginx/src/core/ngx_cpuinfo.c +139 -0
  124. data/src/nginx/src/core/ngx_crc.h +39 -0
  125. data/src/nginx/src/core/ngx_crc32.c +129 -0
  126. data/src/nginx/src/core/ngx_crc32.h +79 -0
  127. data/src/nginx/src/core/ngx_crypt.c +238 -0
  128. data/src/nginx/src/core/ngx_crypt.h +20 -0
  129. data/src/nginx/src/core/ngx_cycle.c +1379 -0
  130. data/src/nginx/src/core/ngx_cycle.h +142 -0
  131. data/src/nginx/src/core/ngx_file.c +993 -0
  132. data/src/nginx/src/core/ngx_file.h +151 -0
  133. data/src/nginx/src/core/ngx_hash.c +976 -0
  134. data/src/nginx/src/core/ngx_hash.h +122 -0
  135. data/src/nginx/src/core/ngx_inet.c +1008 -0
  136. data/src/nginx/src/core/ngx_inet.h +120 -0
  137. data/src/nginx/src/core/ngx_list.c +71 -0
  138. data/src/nginx/src/core/ngx_list.h +83 -0
  139. data/src/nginx/src/core/ngx_log.c +459 -0
  140. data/src/nginx/src/core/ngx_log.h +250 -0
  141. data/src/nginx/src/core/ngx_md5.c +289 -0
  142. data/src/nginx/src/core/ngx_md5.h +60 -0
  143. data/src/nginx/src/core/ngx_murmurhash.c +50 -0
  144. data/src/nginx/src/core/ngx_murmurhash.h +19 -0
  145. data/src/nginx/src/core/ngx_open_file_cache.c +882 -0
  146. data/src/nginx/src/core/ngx_open_file_cache.h +119 -0
  147. data/src/nginx/src/core/ngx_output_chain.c +673 -0
  148. data/src/nginx/src/core/ngx_palloc.c +433 -0
  149. data/src/nginx/src/core/ngx_palloc.h +95 -0
  150. data/src/nginx/src/core/ngx_parse.c +249 -0
  151. data/src/nginx/src/core/ngx_parse.h +24 -0
  152. data/src/nginx/src/core/ngx_queue.c +80 -0
  153. data/src/nginx/src/core/ngx_queue.h +112 -0
  154. data/src/nginx/src/core/ngx_radix_tree.c +291 -0
  155. data/src/nginx/src/core/ngx_radix_tree.h +46 -0
  156. data/src/nginx/src/core/ngx_rbtree.c +383 -0
  157. data/src/nginx/src/core/ngx_rbtree.h +84 -0
  158. data/src/nginx/src/core/ngx_regex.c +206 -0
  159. data/src/nginx/src/core/ngx_regex.h +56 -0
  160. data/src/nginx/src/core/ngx_resolver.c +2201 -0
  161. data/src/nginx/src/core/ngx_resolver.h +149 -0
  162. data/src/nginx/src/core/ngx_sha1.h +31 -0
  163. data/src/nginx/src/core/ngx_shmtx.c +284 -0
  164. data/src/nginx/src/core/ngx_shmtx.h +38 -0
  165. data/src/nginx/src/core/ngx_slab.c +701 -0
  166. data/src/nginx/src/core/ngx_slab.h +54 -0
  167. data/src/nginx/src/core/ngx_spinlock.c +53 -0
  168. data/src/nginx/src/core/ngx_string.c +1837 -0
  169. data/src/nginx/src/core/ngx_string.h +231 -0
  170. data/src/nginx/src/core/ngx_times.c +407 -0
  171. data/src/nginx/src/core/ngx_times.h +51 -0
  172. data/src/nginx/src/event/modules/ngx_aio_module.c +171 -0
  173. data/src/nginx/src/event/modules/ngx_devpoll_module.c +569 -0
  174. data/src/nginx/src/event/modules/ngx_epoll_module.c +833 -0
  175. data/src/nginx/src/event/modules/ngx_eventport_module.c +602 -0
  176. data/src/nginx/src/event/modules/ngx_kqueue_module.c +785 -0
  177. data/src/nginx/src/event/modules/ngx_poll_module.c +443 -0
  178. data/src/nginx/src/event/modules/ngx_rtsig_module.c +735 -0
  179. data/src/nginx/src/event/modules/ngx_select_module.c +435 -0
  180. data/src/nginx/src/event/modules/ngx_win32_select_module.c +400 -0
  181. data/src/nginx/src/event/ngx_event.c +1275 -0
  182. data/src/nginx/src/event/ngx_event.h +573 -0
  183. data/src/nginx/src/event/ngx_event_accept.c +428 -0
  184. data/src/nginx/src/event/ngx_event_busy_lock.c +286 -0
  185. data/src/nginx/src/event/ngx_event_busy_lock.h +65 -0
  186. data/src/nginx/src/event/ngx_event_connect.c +258 -0
  187. data/src/nginx/src/event/ngx_event_connect.h +76 -0
  188. data/src/nginx/src/event/ngx_event_mutex.c +70 -0
  189. data/src/nginx/src/event/ngx_event_openssl.c +2382 -0
  190. data/src/nginx/src/event/ngx_event_openssl.h +162 -0
  191. data/src/nginx/src/event/ngx_event_pipe.c +996 -0
  192. data/src/nginx/src/event/ngx_event_pipe.h +95 -0
  193. data/src/nginx/src/event/ngx_event_posted.c +173 -0
  194. data/src/nginx/src/event/ngx_event_posted.h +75 -0
  195. data/src/nginx/src/event/ngx_event_timer.c +159 -0
  196. data/src/nginx/src/event/ngx_event_timer.h +102 -0
  197. data/src/nginx/src/http/modules/ngx_http_access_module.c +384 -0
  198. data/src/nginx/src/http/modules/ngx_http_addition_filter_module.c +250 -0
  199. data/src/nginx/src/http/modules/ngx_http_auth_basic_module.c +478 -0
  200. data/src/nginx/src/http/modules/ngx_http_autoindex_module.c +701 -0
  201. data/src/nginx/src/http/modules/ngx_http_browser_module.c +713 -0
  202. data/src/nginx/src/http/modules/ngx_http_charset_filter_module.c +1681 -0
  203. data/src/nginx/src/http/modules/ngx_http_chunked_filter_module.c +242 -0
  204. data/src/nginx/src/http/modules/ngx_http_dav_module.c +1141 -0
  205. data/src/nginx/src/http/modules/ngx_http_degradation_module.c +243 -0
  206. data/src/nginx/src/http/modules/ngx_http_empty_gif_module.c +140 -0
  207. data/src/nginx/src/http/modules/ngx_http_fastcgi_module.c +2916 -0
  208. data/src/nginx/src/http/modules/ngx_http_flv_module.c +254 -0
  209. data/src/nginx/src/http/modules/ngx_http_geo_module.c +1441 -0
  210. data/src/nginx/src/http/modules/ngx_http_geoip_module.c +671 -0
  211. data/src/nginx/src/http/modules/ngx_http_gzip_filter_module.c +1206 -0
  212. data/src/nginx/src/http/modules/ngx_http_gzip_static_module.c +299 -0
  213. data/src/nginx/src/http/modules/ngx_http_headers_filter_module.c +616 -0
  214. data/src/nginx/src/http/modules/ngx_http_image_filter_module.c +1489 -0
  215. data/src/nginx/src/http/modules/ngx_http_index_module.c +516 -0
  216. data/src/nginx/src/http/modules/ngx_http_limit_req_module.c +809 -0
  217. data/src/nginx/src/http/modules/ngx_http_limit_zone_module.c +553 -0
  218. data/src/nginx/src/http/modules/ngx_http_log_module.c +1357 -0
  219. data/src/nginx/src/http/modules/ngx_http_map_module.c +575 -0
  220. data/src/nginx/src/http/modules/ngx_http_memcached_module.c +624 -0
  221. data/src/nginx/src/http/modules/ngx_http_mp4_module.c +3000 -0
  222. data/src/nginx/src/http/modules/ngx_http_not_modified_filter_module.c +143 -0
  223. data/src/nginx/src/http/modules/ngx_http_proxy_module.c +2831 -0
  224. data/src/nginx/src/http/modules/ngx_http_random_index_module.c +317 -0
  225. data/src/nginx/src/http/modules/ngx_http_range_filter_module.c +855 -0
  226. data/src/nginx/src/http/modules/ngx_http_realip_module.c +476 -0
  227. data/src/nginx/src/http/modules/ngx_http_referer_module.c +613 -0
  228. data/src/nginx/src/http/modules/ngx_http_rewrite_module.c +1019 -0
  229. data/src/nginx/src/http/modules/ngx_http_scgi_module.c +1714 -0
  230. data/src/nginx/src/http/modules/ngx_http_secure_link_module.c +355 -0
  231. data/src/nginx/src/http/modules/ngx_http_split_clients_module.c +242 -0
  232. data/src/nginx/src/http/modules/ngx_http_ssi_filter_module.c +2913 -0
  233. data/src/nginx/src/http/modules/ngx_http_ssi_filter_module.h +114 -0
  234. data/src/nginx/src/http/modules/ngx_http_ssl_module.c +652 -0
  235. data/src/nginx/src/http/modules/ngx_http_ssl_module.h +52 -0
  236. data/src/nginx/src/http/modules/ngx_http_static_module.c +278 -0
  237. data/src/nginx/src/http/modules/ngx_http_stub_status_module.c +144 -0
  238. data/src/nginx/src/http/modules/ngx_http_sub_filter_module.c +716 -0
  239. data/src/nginx/src/http/modules/ngx_http_upstream_ip_hash_module.c +237 -0
  240. data/src/nginx/src/http/modules/ngx_http_userid_filter_module.c +846 -0
  241. data/src/nginx/src/http/modules/ngx_http_uwsgi_module.c +1774 -0
  242. data/src/nginx/src/http/modules/ngx_http_xslt_filter_module.c +984 -0
  243. data/src/nginx/src/http/modules/perl/Makefile.PL +42 -0
  244. data/src/nginx/src/http/modules/perl/nginx.pm +137 -0
  245. data/src/nginx/src/http/modules/perl/nginx.xs +986 -0
  246. data/src/nginx/src/http/modules/perl/ngx_http_perl_module.c +1076 -0
  247. data/src/nginx/src/http/modules/perl/ngx_http_perl_module.h +67 -0
  248. data/src/nginx/src/http/modules/perl/typemap +3 -0
  249. data/src/nginx/src/http/ngx_http.c +2073 -0
  250. data/src/nginx/src/http/ngx_http.h +160 -0
  251. data/src/nginx/src/http/ngx_http_busy_lock.c +307 -0
  252. data/src/nginx/src/http/ngx_http_busy_lock.h +54 -0
  253. data/src/nginx/src/http/ngx_http_cache.h +148 -0
  254. data/src/nginx/src/http/ngx_http_config.h +75 -0
  255. data/src/nginx/src/http/ngx_http_copy_filter_module.c +300 -0
  256. data/src/nginx/src/http/ngx_http_core_module.c +4736 -0
  257. data/src/nginx/src/http/ngx_http_core_module.h +541 -0
  258. data/src/nginx/src/http/ngx_http_file_cache.c +1715 -0
  259. data/src/nginx/src/http/ngx_http_header_filter_module.c +623 -0
  260. data/src/nginx/src/http/ngx_http_parse.c +1734 -0
  261. data/src/nginx/src/http/ngx_http_parse_time.c +276 -0
  262. data/src/nginx/src/http/ngx_http_postpone_filter_module.c +178 -0
  263. data/src/nginx/src/http/ngx_http_request.c +3181 -0
  264. data/src/nginx/src/http/ngx_http_request.h +573 -0
  265. data/src/nginx/src/http/ngx_http_request_body.c +644 -0
  266. data/src/nginx/src/http/ngx_http_script.c +1752 -0
  267. data/src/nginx/src/http/ngx_http_script.h +257 -0
  268. data/src/nginx/src/http/ngx_http_special_response.c +789 -0
  269. data/src/nginx/src/http/ngx_http_upstream.c +4555 -0
  270. data/src/nginx/src/http/ngx_http_upstream.h +350 -0
  271. data/src/nginx/src/http/ngx_http_upstream_round_robin.c +791 -0
  272. data/src/nginx/src/http/ngx_http_upstream_round_robin.h +85 -0
  273. data/src/nginx/src/http/ngx_http_variables.c +2053 -0
  274. data/src/nginx/src/http/ngx_http_variables.h +115 -0
  275. data/src/nginx/src/http/ngx_http_write_filter_module.c +315 -0
  276. data/src/nginx/src/mail/ngx_mail.c +542 -0
  277. data/src/nginx/src/mail/ngx_mail.h +407 -0
  278. data/src/nginx/src/mail/ngx_mail_auth_http_module.c +1452 -0
  279. data/src/nginx/src/mail/ngx_mail_core_module.c +553 -0
  280. data/src/nginx/src/mail/ngx_mail_handler.c +773 -0
  281. data/src/nginx/src/mail/ngx_mail_imap_handler.c +457 -0
  282. data/src/nginx/src/mail/ngx_mail_imap_module.c +253 -0
  283. data/src/nginx/src/mail/ngx_mail_imap_module.h +39 -0
  284. data/src/nginx/src/mail/ngx_mail_parse.c +885 -0
  285. data/src/nginx/src/mail/ngx_mail_pop3_handler.c +500 -0
  286. data/src/nginx/src/mail/ngx_mail_pop3_module.c +264 -0
  287. data/src/nginx/src/mail/ngx_mail_pop3_module.h +38 -0
  288. data/src/nginx/src/mail/ngx_mail_proxy_module.c +1089 -0
  289. data/src/nginx/src/mail/ngx_mail_smtp_handler.c +872 -0
  290. data/src/nginx/src/mail/ngx_mail_smtp_module.c +308 -0
  291. data/src/nginx/src/mail/ngx_mail_smtp_module.h +45 -0
  292. data/src/nginx/src/mail/ngx_mail_ssl_module.c +491 -0
  293. data/src/nginx/src/mail/ngx_mail_ssl_module.h +52 -0
  294. data/src/nginx/src/misc/ngx_cpp_test_module.cpp +27 -0
  295. data/src/nginx/src/misc/ngx_google_perftools_module.c +126 -0
  296. data/src/nginx/src/os/unix/ngx_aio_read.c +109 -0
  297. data/src/nginx/src/os/unix/ngx_aio_read_chain.c +78 -0
  298. data/src/nginx/src/os/unix/ngx_aio_write.c +109 -0
  299. data/src/nginx/src/os/unix/ngx_aio_write_chain.c +100 -0
  300. data/src/nginx/src/os/unix/ngx_alloc.c +90 -0
  301. data/src/nginx/src/os/unix/ngx_alloc.h +45 -0
  302. data/src/nginx/src/os/unix/ngx_atomic.h +311 -0
  303. data/src/nginx/src/os/unix/ngx_channel.c +258 -0
  304. data/src/nginx/src/os/unix/ngx_channel.h +34 -0
  305. data/src/nginx/src/os/unix/ngx_daemon.c +69 -0
  306. data/src/nginx/src/os/unix/ngx_darwin.h +20 -0
  307. data/src/nginx/src/os/unix/ngx_darwin_config.h +96 -0
  308. data/src/nginx/src/os/unix/ngx_darwin_init.c +166 -0
  309. data/src/nginx/src/os/unix/ngx_darwin_sendfile_chain.c +366 -0
  310. data/src/nginx/src/os/unix/ngx_errno.c +87 -0
  311. data/src/nginx/src/os/unix/ngx_errno.h +68 -0
  312. data/src/nginx/src/os/unix/ngx_file_aio_read.c +208 -0
  313. data/src/nginx/src/os/unix/ngx_files.c +566 -0
  314. data/src/nginx/src/os/unix/ngx_files.h +343 -0
  315. data/src/nginx/src/os/unix/ngx_freebsd.h +24 -0
  316. data/src/nginx/src/os/unix/ngx_freebsd_config.h +119 -0
  317. data/src/nginx/src/os/unix/ngx_freebsd_init.c +259 -0
  318. data/src/nginx/src/os/unix/ngx_freebsd_rfork_thread.c +756 -0
  319. data/src/nginx/src/os/unix/ngx_freebsd_rfork_thread.h +122 -0
  320. data/src/nginx/src/os/unix/ngx_freebsd_sendfile_chain.c +436 -0
  321. data/src/nginx/src/os/unix/ngx_gcc_atomic_amd64.h +82 -0
  322. data/src/nginx/src/os/unix/ngx_gcc_atomic_ppc.h +155 -0
  323. data/src/nginx/src/os/unix/ngx_gcc_atomic_sparc64.h +82 -0
  324. data/src/nginx/src/os/unix/ngx_gcc_atomic_x86.h +127 -0
  325. data/src/nginx/src/os/unix/ngx_linux.h +18 -0
  326. data/src/nginx/src/os/unix/ngx_linux_aio_read.c +137 -0
  327. data/src/nginx/src/os/unix/ngx_linux_config.h +117 -0
  328. data/src/nginx/src/os/unix/ngx_linux_init.c +91 -0
  329. data/src/nginx/src/os/unix/ngx_linux_sendfile_chain.c +378 -0
  330. data/src/nginx/src/os/unix/ngx_os.h +84 -0
  331. data/src/nginx/src/os/unix/ngx_posix_config.h +153 -0
  332. data/src/nginx/src/os/unix/ngx_posix_init.c +124 -0
  333. data/src/nginx/src/os/unix/ngx_process.c +590 -0
  334. data/src/nginx/src/os/unix/ngx_process.h +87 -0
  335. data/src/nginx/src/os/unix/ngx_process_cycle.c +1390 -0
  336. data/src/nginx/src/os/unix/ngx_process_cycle.h +61 -0
  337. data/src/nginx/src/os/unix/ngx_pthread_thread.c +278 -0
  338. data/src/nginx/src/os/unix/ngx_readv_chain.c +258 -0
  339. data/src/nginx/src/os/unix/ngx_recv.c +180 -0
  340. data/src/nginx/src/os/unix/ngx_send.c +73 -0
  341. data/src/nginx/src/os/unix/ngx_setproctitle.c +135 -0
  342. data/src/nginx/src/os/unix/ngx_setproctitle.h +52 -0
  343. data/src/nginx/src/os/unix/ngx_shmem.c +126 -0
  344. data/src/nginx/src/os/unix/ngx_shmem.h +29 -0
  345. data/src/nginx/src/os/unix/ngx_socket.c +116 -0
  346. data/src/nginx/src/os/unix/ngx_socket.h +64 -0
  347. data/src/nginx/src/os/unix/ngx_solaris.h +16 -0
  348. data/src/nginx/src/os/unix/ngx_solaris_config.h +107 -0
  349. data/src/nginx/src/os/unix/ngx_solaris_init.c +75 -0
  350. data/src/nginx/src/os/unix/ngx_solaris_sendfilev_chain.c +251 -0
  351. data/src/nginx/src/os/unix/ngx_sunpro_amd64.il +43 -0
  352. data/src/nginx/src/os/unix/ngx_sunpro_atomic_sparc64.h +61 -0
  353. data/src/nginx/src/os/unix/ngx_sunpro_sparc64.il +36 -0
  354. data/src/nginx/src/os/unix/ngx_sunpro_x86.il +44 -0
  355. data/src/nginx/src/os/unix/ngx_thread.h +128 -0
  356. data/src/nginx/src/os/unix/ngx_time.c +104 -0
  357. data/src/nginx/src/os/unix/ngx_time.h +66 -0
  358. data/src/nginx/src/os/unix/ngx_udp_recv.c +115 -0
  359. data/src/nginx/src/os/unix/ngx_user.c +109 -0
  360. data/src/nginx/src/os/unix/ngx_user.h +24 -0
  361. data/src/nginx/src/os/unix/ngx_writev_chain.c +181 -0
  362. data/src/nginx/src/os/unix/rfork_thread.S +73 -0
  363. metadata +419 -0
@@ -0,0 +1,67 @@
1
+
2
+ /*
3
+ * Copyright (C) Igor Sysoev
4
+ * Copyright (C) Nginx, Inc.
5
+ */
6
+
7
+
8
+ #ifndef _NGX_HTTP_PERL_MODULE_H_INCLUDED_
9
+ #define _NGX_HTTP_PERL_MODULE_H_INCLUDED_
10
+
11
+
12
+ #include <ngx_config.h>
13
+ #include <ngx_core.h>
14
+ #include <ngx_http.h>
15
+ #include <nginx.h>
16
+
17
+ #include <EXTERN.h>
18
+ #include <perl.h>
19
+
20
+
21
+ typedef ngx_http_request_t *nginx;
22
+
23
+ typedef struct {
24
+ ngx_str_t filename;
25
+ ngx_str_t redirect_uri;
26
+ ngx_str_t redirect_args;
27
+
28
+ SV *next;
29
+
30
+ ngx_uint_t done; /* unsigned done:1; */
31
+
32
+ ngx_array_t *variables; /* array of ngx_http_perl_var_t */
33
+
34
+ #if (NGX_HTTP_SSI)
35
+ ngx_http_ssi_ctx_t *ssi;
36
+ #endif
37
+ } ngx_http_perl_ctx_t;
38
+
39
+
40
+ typedef struct {
41
+ ngx_uint_t hash;
42
+ ngx_str_t name;
43
+ ngx_str_t value;
44
+ } ngx_http_perl_var_t;
45
+
46
+
47
+ extern ngx_module_t ngx_http_perl_module;
48
+
49
+
50
+ /*
51
+ * workaround for "unused variable `Perl___notused'" warning
52
+ * when building with perl 5.6.1
53
+ */
54
+ #ifndef PERL_IMPLICIT_CONTEXT
55
+ #undef dTHXa
56
+ #define dTHXa(a)
57
+ #endif
58
+
59
+
60
+ extern void boot_DynaLoader(pTHX_ CV* cv);
61
+
62
+
63
+ void ngx_http_perl_handle_request(ngx_http_request_t *r);
64
+ void ngx_http_perl_sleep_handler(ngx_http_request_t *r);
65
+
66
+
67
+ #endif /* _NGX_HTTP_PERL_MODULE_H_INCLUDED_ */
@@ -0,0 +1,3 @@
1
+ TYPEMAP
2
+
3
+ nginx T_PTROBJ
@@ -0,0 +1,2073 @@
1
+
2
+ /*
3
+ * Copyright (C) Igor Sysoev
4
+ * Copyright (C) Nginx, Inc.
5
+ */
6
+
7
+
8
+ #include <ngx_config.h>
9
+ #include <ngx_core.h>
10
+ #include <ngx_http.h>
11
+
12
+
13
+ static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
14
+ static ngx_int_t ngx_http_init_phases(ngx_conf_t *cf,
15
+ ngx_http_core_main_conf_t *cmcf);
16
+ static ngx_int_t ngx_http_init_headers_in_hash(ngx_conf_t *cf,
17
+ ngx_http_core_main_conf_t *cmcf);
18
+ static ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf,
19
+ ngx_http_core_main_conf_t *cmcf);
20
+
21
+ static ngx_int_t ngx_http_add_addresses(ngx_conf_t *cf,
22
+ ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,
23
+ ngx_http_listen_opt_t *lsopt);
24
+ static ngx_int_t ngx_http_add_address(ngx_conf_t *cf,
25
+ ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,
26
+ ngx_http_listen_opt_t *lsopt);
27
+ static ngx_int_t ngx_http_add_server(ngx_conf_t *cf,
28
+ ngx_http_core_srv_conf_t *cscf, ngx_http_conf_addr_t *addr);
29
+
30
+ static char *ngx_http_merge_servers(ngx_conf_t *cf,
31
+ ngx_http_core_main_conf_t *cmcf, ngx_http_module_t *module,
32
+ ngx_uint_t ctx_index);
33
+ static char *ngx_http_merge_locations(ngx_conf_t *cf,
34
+ ngx_queue_t *locations, void **loc_conf, ngx_http_module_t *module,
35
+ ngx_uint_t ctx_index);
36
+ static ngx_int_t ngx_http_init_locations(ngx_conf_t *cf,
37
+ ngx_http_core_srv_conf_t *cscf, ngx_http_core_loc_conf_t *pclcf);
38
+ static ngx_int_t ngx_http_init_static_location_trees(ngx_conf_t *cf,
39
+ ngx_http_core_loc_conf_t *pclcf);
40
+ static ngx_int_t ngx_http_cmp_locations(const ngx_queue_t *one,
41
+ const ngx_queue_t *two);
42
+ static ngx_int_t ngx_http_join_exact_locations(ngx_conf_t *cf,
43
+ ngx_queue_t *locations);
44
+ static void ngx_http_create_locations_list(ngx_queue_t *locations,
45
+ ngx_queue_t *q);
46
+ static ngx_http_location_tree_node_t *
47
+ ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations,
48
+ size_t prefix);
49
+
50
+ static ngx_int_t ngx_http_optimize_servers(ngx_conf_t *cf,
51
+ ngx_http_core_main_conf_t *cmcf, ngx_array_t *ports);
52
+ static ngx_int_t ngx_http_server_names(ngx_conf_t *cf,
53
+ ngx_http_core_main_conf_t *cmcf, ngx_http_conf_addr_t *addr);
54
+ static ngx_int_t ngx_http_cmp_conf_addrs(const void *one, const void *two);
55
+ static int ngx_libc_cdecl ngx_http_cmp_dns_wildcards(const void *one,
56
+ const void *two);
57
+
58
+ static ngx_int_t ngx_http_init_listening(ngx_conf_t *cf,
59
+ ngx_http_conf_port_t *port);
60
+ static ngx_listening_t *ngx_http_add_listening(ngx_conf_t *cf,
61
+ ngx_http_conf_addr_t *addr);
62
+ static ngx_int_t ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,
63
+ ngx_http_conf_addr_t *addr);
64
+ #if (NGX_HAVE_INET6)
65
+ static ngx_int_t ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,
66
+ ngx_http_conf_addr_t *addr);
67
+ #endif
68
+
69
+ ngx_uint_t ngx_http_max_module;
70
+
71
+
72
+ ngx_int_t (*ngx_http_top_header_filter) (ngx_http_request_t *r);
73
+ ngx_int_t (*ngx_http_top_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch);
74
+
75
+
76
+ ngx_str_t ngx_http_html_default_types[] = {
77
+ ngx_string("text/html"),
78
+ ngx_null_string
79
+ };
80
+
81
+
82
+ static ngx_command_t ngx_http_commands[] = {
83
+
84
+ { ngx_string("http"),
85
+ NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
86
+ ngx_http_block,
87
+ 0,
88
+ 0,
89
+ NULL },
90
+
91
+ ngx_null_command
92
+ };
93
+
94
+
95
+ static ngx_core_module_t ngx_http_module_ctx = {
96
+ ngx_string("http"),
97
+ NULL,
98
+ NULL
99
+ };
100
+
101
+
102
+ ngx_module_t ngx_http_module = {
103
+ NGX_MODULE_V1,
104
+ &ngx_http_module_ctx, /* module context */
105
+ ngx_http_commands, /* module directives */
106
+ NGX_CORE_MODULE, /* module type */
107
+ NULL, /* init master */
108
+ NULL, /* init module */
109
+ NULL, /* init process */
110
+ NULL, /* init thread */
111
+ NULL, /* exit thread */
112
+ NULL, /* exit process */
113
+ NULL, /* exit master */
114
+ NGX_MODULE_V1_PADDING
115
+ };
116
+
117
+
118
+ static char *
119
+ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
120
+ {
121
+ char *rv;
122
+ ngx_uint_t mi, m, s;
123
+ ngx_conf_t pcf;
124
+ ngx_http_module_t *module;
125
+ ngx_http_conf_ctx_t *ctx;
126
+ ngx_http_core_loc_conf_t *clcf;
127
+ ngx_http_core_srv_conf_t **cscfp;
128
+ ngx_http_core_main_conf_t *cmcf;
129
+
130
+ /* the main http context */
131
+
132
+ ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));
133
+ if (ctx == NULL) {
134
+ return NGX_CONF_ERROR;
135
+ }
136
+
137
+ *(ngx_http_conf_ctx_t **) conf = ctx;
138
+
139
+
140
+ /* count the number of the http modules and set up their indices */
141
+
142
+ ngx_http_max_module = 0;
143
+ for (m = 0; ngx_modules[m]; m++) {
144
+ if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
145
+ continue;
146
+ }
147
+
148
+ ngx_modules[m]->ctx_index = ngx_http_max_module++;
149
+ }
150
+
151
+
152
+ /* the http main_conf context, it is the same in the all http contexts */
153
+
154
+ ctx->main_conf = ngx_pcalloc(cf->pool,
155
+ sizeof(void *) * ngx_http_max_module);
156
+ if (ctx->main_conf == NULL) {
157
+ return NGX_CONF_ERROR;
158
+ }
159
+
160
+
161
+ /*
162
+ * the http null srv_conf context, it is used to merge
163
+ * the server{}s' srv_conf's
164
+ */
165
+
166
+ ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
167
+ if (ctx->srv_conf == NULL) {
168
+ return NGX_CONF_ERROR;
169
+ }
170
+
171
+
172
+ /*
173
+ * the http null loc_conf context, it is used to merge
174
+ * the server{}s' loc_conf's
175
+ */
176
+
177
+ ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
178
+ if (ctx->loc_conf == NULL) {
179
+ return NGX_CONF_ERROR;
180
+ }
181
+
182
+
183
+ /*
184
+ * create the main_conf's, the null srv_conf's, and the null loc_conf's
185
+ * of the all http modules
186
+ */
187
+
188
+ for (m = 0; ngx_modules[m]; m++) {
189
+ if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
190
+ continue;
191
+ }
192
+
193
+ module = ngx_modules[m]->ctx;
194
+ mi = ngx_modules[m]->ctx_index;
195
+
196
+ if (module->create_main_conf) {
197
+ ctx->main_conf[mi] = module->create_main_conf(cf);
198
+ if (ctx->main_conf[mi] == NULL) {
199
+ return NGX_CONF_ERROR;
200
+ }
201
+ }
202
+
203
+ if (module->create_srv_conf) {
204
+ ctx->srv_conf[mi] = module->create_srv_conf(cf);
205
+ if (ctx->srv_conf[mi] == NULL) {
206
+ return NGX_CONF_ERROR;
207
+ }
208
+ }
209
+
210
+ if (module->create_loc_conf) {
211
+ ctx->loc_conf[mi] = module->create_loc_conf(cf);
212
+ if (ctx->loc_conf[mi] == NULL) {
213
+ return NGX_CONF_ERROR;
214
+ }
215
+ }
216
+ }
217
+
218
+ pcf = *cf;
219
+ cf->ctx = ctx;
220
+
221
+ for (m = 0; ngx_modules[m]; m++) {
222
+ if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
223
+ continue;
224
+ }
225
+
226
+ module = ngx_modules[m]->ctx;
227
+
228
+ if (module->preconfiguration) {
229
+ if (module->preconfiguration(cf) != NGX_OK) {
230
+ return NGX_CONF_ERROR;
231
+ }
232
+ }
233
+ }
234
+
235
+ /* parse inside the http{} block */
236
+
237
+ cf->module_type = NGX_HTTP_MODULE;
238
+ cf->cmd_type = NGX_HTTP_MAIN_CONF;
239
+ rv = ngx_conf_parse(cf, NULL);
240
+
241
+ if (rv != NGX_CONF_OK) {
242
+ goto failed;
243
+ }
244
+
245
+ /*
246
+ * init http{} main_conf's, merge the server{}s' srv_conf's
247
+ * and its location{}s' loc_conf's
248
+ */
249
+
250
+ cmcf = ctx->main_conf[ngx_http_core_module.ctx_index];
251
+ cscfp = cmcf->servers.elts;
252
+
253
+ for (m = 0; ngx_modules[m]; m++) {
254
+ if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
255
+ continue;
256
+ }
257
+
258
+ module = ngx_modules[m]->ctx;
259
+ mi = ngx_modules[m]->ctx_index;
260
+
261
+ /* init http{} main_conf's */
262
+
263
+ if (module->init_main_conf) {
264
+ rv = module->init_main_conf(cf, ctx->main_conf[mi]);
265
+ if (rv != NGX_CONF_OK) {
266
+ goto failed;
267
+ }
268
+ }
269
+
270
+ rv = ngx_http_merge_servers(cf, cmcf, module, mi);
271
+ if (rv != NGX_CONF_OK) {
272
+ goto failed;
273
+ }
274
+ }
275
+
276
+
277
+ /* create location trees */
278
+
279
+ for (s = 0; s < cmcf->servers.nelts; s++) {
280
+
281
+ clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];
282
+
283
+ if (ngx_http_init_locations(cf, cscfp[s], clcf) != NGX_OK) {
284
+ return NGX_CONF_ERROR;
285
+ }
286
+
287
+ if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {
288
+ return NGX_CONF_ERROR;
289
+ }
290
+ }
291
+
292
+
293
+ if (ngx_http_init_phases(cf, cmcf) != NGX_OK) {
294
+ return NGX_CONF_ERROR;
295
+ }
296
+
297
+ if (ngx_http_init_headers_in_hash(cf, cmcf) != NGX_OK) {
298
+ return NGX_CONF_ERROR;
299
+ }
300
+
301
+
302
+ for (m = 0; ngx_modules[m]; m++) {
303
+ if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
304
+ continue;
305
+ }
306
+
307
+ module = ngx_modules[m]->ctx;
308
+
309
+ if (module->postconfiguration) {
310
+ if (module->postconfiguration(cf) != NGX_OK) {
311
+ return NGX_CONF_ERROR;
312
+ }
313
+ }
314
+ }
315
+
316
+ if (ngx_http_variables_init_vars(cf) != NGX_OK) {
317
+ return NGX_CONF_ERROR;
318
+ }
319
+
320
+ /*
321
+ * http{}'s cf->ctx was needed while the configuration merging
322
+ * and in postconfiguration process
323
+ */
324
+
325
+ *cf = pcf;
326
+
327
+
328
+ if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) {
329
+ return NGX_CONF_ERROR;
330
+ }
331
+
332
+
333
+ /* optimize the lists of ports, addresses and server names */
334
+
335
+ if (ngx_http_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) {
336
+ return NGX_CONF_ERROR;
337
+ }
338
+
339
+ return NGX_CONF_OK;
340
+
341
+ failed:
342
+
343
+ *cf = pcf;
344
+
345
+ return rv;
346
+ }
347
+
348
+
349
+ static ngx_int_t
350
+ ngx_http_init_phases(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
351
+ {
352
+ if (ngx_array_init(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers,
353
+ cf->pool, 1, sizeof(ngx_http_handler_pt))
354
+ != NGX_OK)
355
+ {
356
+ return NGX_ERROR;
357
+ }
358
+
359
+ if (ngx_array_init(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers,
360
+ cf->pool, 1, sizeof(ngx_http_handler_pt))
361
+ != NGX_OK)
362
+ {
363
+ return NGX_ERROR;
364
+ }
365
+
366
+ if (ngx_array_init(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers,
367
+ cf->pool, 1, sizeof(ngx_http_handler_pt))
368
+ != NGX_OK)
369
+ {
370
+ return NGX_ERROR;
371
+ }
372
+
373
+ if (ngx_array_init(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers,
374
+ cf->pool, 1, sizeof(ngx_http_handler_pt))
375
+ != NGX_OK)
376
+ {
377
+ return NGX_ERROR;
378
+ }
379
+
380
+ if (ngx_array_init(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers,
381
+ cf->pool, 2, sizeof(ngx_http_handler_pt))
382
+ != NGX_OK)
383
+ {
384
+ return NGX_ERROR;
385
+ }
386
+
387
+ if (ngx_array_init(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers,
388
+ cf->pool, 4, sizeof(ngx_http_handler_pt))
389
+ != NGX_OK)
390
+ {
391
+ return NGX_ERROR;
392
+ }
393
+
394
+ if (ngx_array_init(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers,
395
+ cf->pool, 1, sizeof(ngx_http_handler_pt))
396
+ != NGX_OK)
397
+ {
398
+ return NGX_ERROR;
399
+ }
400
+
401
+ return NGX_OK;
402
+ }
403
+
404
+
405
+ static ngx_int_t
406
+ ngx_http_init_headers_in_hash(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
407
+ {
408
+ ngx_array_t headers_in;
409
+ ngx_hash_key_t *hk;
410
+ ngx_hash_init_t hash;
411
+ ngx_http_header_t *header;
412
+
413
+ if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))
414
+ != NGX_OK)
415
+ {
416
+ return NGX_ERROR;
417
+ }
418
+
419
+ for (header = ngx_http_headers_in; header->name.len; header++) {
420
+ hk = ngx_array_push(&headers_in);
421
+ if (hk == NULL) {
422
+ return NGX_ERROR;
423
+ }
424
+
425
+ hk->key = header->name;
426
+ hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);
427
+ hk->value = header;
428
+ }
429
+
430
+ hash.hash = &cmcf->headers_in_hash;
431
+ hash.key = ngx_hash_key_lc;
432
+ hash.max_size = 512;
433
+ hash.bucket_size = ngx_align(64, ngx_cacheline_size);
434
+ hash.name = "headers_in_hash";
435
+ hash.pool = cf->pool;
436
+ hash.temp_pool = NULL;
437
+
438
+ if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {
439
+ return NGX_ERROR;
440
+ }
441
+
442
+ return NGX_OK;
443
+ }
444
+
445
+
446
+ static ngx_int_t
447
+ ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
448
+ {
449
+ ngx_int_t j;
450
+ ngx_uint_t i, n;
451
+ ngx_uint_t find_config_index, use_rewrite, use_access;
452
+ ngx_http_handler_pt *h;
453
+ ngx_http_phase_handler_t *ph;
454
+ ngx_http_phase_handler_pt checker;
455
+
456
+ cmcf->phase_engine.server_rewrite_index = (ngx_uint_t) -1;
457
+ cmcf->phase_engine.location_rewrite_index = (ngx_uint_t) -1;
458
+ find_config_index = 0;
459
+ use_rewrite = cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers.nelts ? 1 : 0;
460
+ use_access = cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers.nelts ? 1 : 0;
461
+
462
+ n = use_rewrite + use_access + cmcf->try_files + 1 /* find config phase */;
463
+
464
+ for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {
465
+ n += cmcf->phases[i].handlers.nelts;
466
+ }
467
+
468
+ ph = ngx_pcalloc(cf->pool,
469
+ n * sizeof(ngx_http_phase_handler_t) + sizeof(void *));
470
+ if (ph == NULL) {
471
+ return NGX_ERROR;
472
+ }
473
+
474
+ cmcf->phase_engine.handlers = ph;
475
+ n = 0;
476
+
477
+ for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {
478
+ h = cmcf->phases[i].handlers.elts;
479
+
480
+ switch (i) {
481
+
482
+ case NGX_HTTP_SERVER_REWRITE_PHASE:
483
+ if (cmcf->phase_engine.server_rewrite_index == (ngx_uint_t) -1) {
484
+ cmcf->phase_engine.server_rewrite_index = n;
485
+ }
486
+ checker = ngx_http_core_rewrite_phase;
487
+
488
+ break;
489
+
490
+ case NGX_HTTP_FIND_CONFIG_PHASE:
491
+ find_config_index = n;
492
+
493
+ ph->checker = ngx_http_core_find_config_phase;
494
+ n++;
495
+ ph++;
496
+
497
+ continue;
498
+
499
+ case NGX_HTTP_REWRITE_PHASE:
500
+ if (cmcf->phase_engine.location_rewrite_index == (ngx_uint_t) -1) {
501
+ cmcf->phase_engine.location_rewrite_index = n;
502
+ }
503
+ checker = ngx_http_core_rewrite_phase;
504
+
505
+ break;
506
+
507
+ case NGX_HTTP_POST_REWRITE_PHASE:
508
+ if (use_rewrite) {
509
+ ph->checker = ngx_http_core_post_rewrite_phase;
510
+ ph->next = find_config_index;
511
+ n++;
512
+ ph++;
513
+ }
514
+
515
+ continue;
516
+
517
+ case NGX_HTTP_ACCESS_PHASE:
518
+ checker = ngx_http_core_access_phase;
519
+ n++;
520
+ break;
521
+
522
+ case NGX_HTTP_POST_ACCESS_PHASE:
523
+ if (use_access) {
524
+ ph->checker = ngx_http_core_post_access_phase;
525
+ ph->next = n;
526
+ ph++;
527
+ }
528
+
529
+ continue;
530
+
531
+ case NGX_HTTP_TRY_FILES_PHASE:
532
+ if (cmcf->try_files) {
533
+ ph->checker = ngx_http_core_try_files_phase;
534
+ n++;
535
+ ph++;
536
+ }
537
+
538
+ continue;
539
+
540
+ case NGX_HTTP_CONTENT_PHASE:
541
+ checker = ngx_http_core_content_phase;
542
+ break;
543
+
544
+ default:
545
+ checker = ngx_http_core_generic_phase;
546
+ }
547
+
548
+ n += cmcf->phases[i].handlers.nelts;
549
+
550
+ for (j = cmcf->phases[i].handlers.nelts - 1; j >=0; j--) {
551
+ ph->checker = checker;
552
+ ph->handler = h[j];
553
+ ph->next = n;
554
+ ph++;
555
+ }
556
+ }
557
+
558
+ return NGX_OK;
559
+ }
560
+
561
+
562
+ static char *
563
+ ngx_http_merge_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,
564
+ ngx_http_module_t *module, ngx_uint_t ctx_index)
565
+ {
566
+ char *rv;
567
+ ngx_uint_t s;
568
+ ngx_http_conf_ctx_t *ctx, saved;
569
+ ngx_http_core_loc_conf_t *clcf;
570
+ ngx_http_core_srv_conf_t **cscfp;
571
+
572
+ cscfp = cmcf->servers.elts;
573
+ ctx = (ngx_http_conf_ctx_t *) cf->ctx;
574
+ saved = *ctx;
575
+ rv = NGX_CONF_OK;
576
+
577
+ for (s = 0; s < cmcf->servers.nelts; s++) {
578
+
579
+ /* merge the server{}s' srv_conf's */
580
+
581
+ ctx->srv_conf = cscfp[s]->ctx->srv_conf;
582
+
583
+ if (module->merge_srv_conf) {
584
+ rv = module->merge_srv_conf(cf, saved.srv_conf[ctx_index],
585
+ cscfp[s]->ctx->srv_conf[ctx_index]);
586
+ if (rv != NGX_CONF_OK) {
587
+ goto failed;
588
+ }
589
+ }
590
+
591
+ if (module->merge_loc_conf) {
592
+
593
+ /* merge the server{}'s loc_conf */
594
+
595
+ ctx->loc_conf = cscfp[s]->ctx->loc_conf;
596
+
597
+ rv = module->merge_loc_conf(cf, saved.loc_conf[ctx_index],
598
+ cscfp[s]->ctx->loc_conf[ctx_index]);
599
+ if (rv != NGX_CONF_OK) {
600
+ goto failed;
601
+ }
602
+
603
+ /* merge the locations{}' loc_conf's */
604
+
605
+ clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];
606
+
607
+ rv = ngx_http_merge_locations(cf, clcf->locations,
608
+ cscfp[s]->ctx->loc_conf,
609
+ module, ctx_index);
610
+ if (rv != NGX_CONF_OK) {
611
+ goto failed;
612
+ }
613
+ }
614
+ }
615
+
616
+ failed:
617
+
618
+ *ctx = saved;
619
+
620
+ return rv;
621
+ }
622
+
623
+
624
+ static char *
625
+ ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations,
626
+ void **loc_conf, ngx_http_module_t *module, ngx_uint_t ctx_index)
627
+ {
628
+ char *rv;
629
+ ngx_queue_t *q;
630
+ ngx_http_conf_ctx_t *ctx, saved;
631
+ ngx_http_core_loc_conf_t *clcf;
632
+ ngx_http_location_queue_t *lq;
633
+
634
+ if (locations == NULL) {
635
+ return NGX_CONF_OK;
636
+ }
637
+
638
+ ctx = (ngx_http_conf_ctx_t *) cf->ctx;
639
+ saved = *ctx;
640
+
641
+ for (q = ngx_queue_head(locations);
642
+ q != ngx_queue_sentinel(locations);
643
+ q = ngx_queue_next(q))
644
+ {
645
+ lq = (ngx_http_location_queue_t *) q;
646
+
647
+ clcf = lq->exact ? lq->exact : lq->inclusive;
648
+ ctx->loc_conf = clcf->loc_conf;
649
+
650
+ rv = module->merge_loc_conf(cf, loc_conf[ctx_index],
651
+ clcf->loc_conf[ctx_index]);
652
+ if (rv != NGX_CONF_OK) {
653
+ return rv;
654
+ }
655
+
656
+ rv = ngx_http_merge_locations(cf, clcf->locations, clcf->loc_conf,
657
+ module, ctx_index);
658
+ if (rv != NGX_CONF_OK) {
659
+ return rv;
660
+ }
661
+ }
662
+
663
+ *ctx = saved;
664
+
665
+ return NGX_CONF_OK;
666
+ }
667
+
668
+
669
+ static ngx_int_t
670
+ ngx_http_init_locations(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
671
+ ngx_http_core_loc_conf_t *pclcf)
672
+ {
673
+ ngx_uint_t n;
674
+ ngx_queue_t *q, *locations, *named, tail;
675
+ ngx_http_core_loc_conf_t *clcf;
676
+ ngx_http_location_queue_t *lq;
677
+ ngx_http_core_loc_conf_t **clcfp;
678
+ #if (NGX_PCRE)
679
+ ngx_uint_t r;
680
+ ngx_queue_t *regex;
681
+ #endif
682
+
683
+ locations = pclcf->locations;
684
+
685
+ if (locations == NULL) {
686
+ return NGX_OK;
687
+ }
688
+
689
+ ngx_queue_sort(locations, ngx_http_cmp_locations);
690
+
691
+ named = NULL;
692
+ n = 0;
693
+ #if (NGX_PCRE)
694
+ regex = NULL;
695
+ r = 0;
696
+ #endif
697
+
698
+ for (q = ngx_queue_head(locations);
699
+ q != ngx_queue_sentinel(locations);
700
+ q = ngx_queue_next(q))
701
+ {
702
+ lq = (ngx_http_location_queue_t *) q;
703
+
704
+ clcf = lq->exact ? lq->exact : lq->inclusive;
705
+
706
+ if (ngx_http_init_locations(cf, NULL, clcf) != NGX_OK) {
707
+ return NGX_ERROR;
708
+ }
709
+
710
+ #if (NGX_PCRE)
711
+
712
+ if (clcf->regex) {
713
+ r++;
714
+
715
+ if (regex == NULL) {
716
+ regex = q;
717
+ }
718
+
719
+ continue;
720
+ }
721
+
722
+ #endif
723
+
724
+ if (clcf->named) {
725
+ n++;
726
+
727
+ if (named == NULL) {
728
+ named = q;
729
+ }
730
+
731
+ continue;
732
+ }
733
+
734
+ if (clcf->noname) {
735
+ break;
736
+ }
737
+ }
738
+
739
+ if (q != ngx_queue_sentinel(locations)) {
740
+ ngx_queue_split(locations, q, &tail);
741
+ }
742
+
743
+ if (named) {
744
+ clcfp = ngx_palloc(cf->pool,
745
+ (n + 1) * sizeof(ngx_http_core_loc_conf_t **));
746
+ if (clcfp == NULL) {
747
+ return NGX_ERROR;
748
+ }
749
+
750
+ cscf->named_locations = clcfp;
751
+
752
+ for (q = named;
753
+ q != ngx_queue_sentinel(locations);
754
+ q = ngx_queue_next(q))
755
+ {
756
+ lq = (ngx_http_location_queue_t *) q;
757
+
758
+ *(clcfp++) = lq->exact;
759
+ }
760
+
761
+ *clcfp = NULL;
762
+
763
+ ngx_queue_split(locations, named, &tail);
764
+ }
765
+
766
+ #if (NGX_PCRE)
767
+
768
+ if (regex) {
769
+
770
+ clcfp = ngx_palloc(cf->pool,
771
+ (r + 1) * sizeof(ngx_http_core_loc_conf_t **));
772
+ if (clcfp == NULL) {
773
+ return NGX_ERROR;
774
+ }
775
+
776
+ pclcf->regex_locations = clcfp;
777
+
778
+ for (q = regex;
779
+ q != ngx_queue_sentinel(locations);
780
+ q = ngx_queue_next(q))
781
+ {
782
+ lq = (ngx_http_location_queue_t *) q;
783
+
784
+ *(clcfp++) = lq->exact;
785
+ }
786
+
787
+ *clcfp = NULL;
788
+
789
+ ngx_queue_split(locations, regex, &tail);
790
+ }
791
+
792
+ #endif
793
+
794
+ return NGX_OK;
795
+ }
796
+
797
+
798
+ static ngx_int_t
799
+ ngx_http_init_static_location_trees(ngx_conf_t *cf,
800
+ ngx_http_core_loc_conf_t *pclcf)
801
+ {
802
+ ngx_queue_t *q, *locations;
803
+ ngx_http_core_loc_conf_t *clcf;
804
+ ngx_http_location_queue_t *lq;
805
+
806
+ locations = pclcf->locations;
807
+
808
+ if (locations == NULL) {
809
+ return NGX_OK;
810
+ }
811
+
812
+ if (ngx_queue_empty(locations)) {
813
+ return NGX_OK;
814
+ }
815
+
816
+ for (q = ngx_queue_head(locations);
817
+ q != ngx_queue_sentinel(locations);
818
+ q = ngx_queue_next(q))
819
+ {
820
+ lq = (ngx_http_location_queue_t *) q;
821
+
822
+ clcf = lq->exact ? lq->exact : lq->inclusive;
823
+
824
+ if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {
825
+ return NGX_ERROR;
826
+ }
827
+ }
828
+
829
+ if (ngx_http_join_exact_locations(cf, locations) != NGX_OK) {
830
+ return NGX_ERROR;
831
+ }
832
+
833
+ ngx_http_create_locations_list(locations, ngx_queue_head(locations));
834
+
835
+ pclcf->static_locations = ngx_http_create_locations_tree(cf, locations, 0);
836
+ if (pclcf->static_locations == NULL) {
837
+ return NGX_ERROR;
838
+ }
839
+
840
+ return NGX_OK;
841
+ }
842
+
843
+
844
+ ngx_int_t
845
+ ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,
846
+ ngx_http_core_loc_conf_t *clcf)
847
+ {
848
+ ngx_http_location_queue_t *lq;
849
+
850
+ if (*locations == NULL) {
851
+ *locations = ngx_palloc(cf->temp_pool,
852
+ sizeof(ngx_http_location_queue_t));
853
+ if (*locations == NULL) {
854
+ return NGX_ERROR;
855
+ }
856
+
857
+ ngx_queue_init(*locations);
858
+ }
859
+
860
+ lq = ngx_palloc(cf->temp_pool, sizeof(ngx_http_location_queue_t));
861
+ if (lq == NULL) {
862
+ return NGX_ERROR;
863
+ }
864
+
865
+ if (clcf->exact_match
866
+ #if (NGX_PCRE)
867
+ || clcf->regex
868
+ #endif
869
+ || clcf->named || clcf->noname)
870
+ {
871
+ lq->exact = clcf;
872
+ lq->inclusive = NULL;
873
+
874
+ } else {
875
+ lq->exact = NULL;
876
+ lq->inclusive = clcf;
877
+ }
878
+
879
+ lq->name = &clcf->name;
880
+ lq->file_name = cf->conf_file->file.name.data;
881
+ lq->line = cf->conf_file->line;
882
+
883
+ ngx_queue_init(&lq->list);
884
+
885
+ ngx_queue_insert_tail(*locations, &lq->queue);
886
+
887
+ return NGX_OK;
888
+ }
889
+
890
+
891
+ static ngx_int_t
892
+ ngx_http_cmp_locations(const ngx_queue_t *one, const ngx_queue_t *two)
893
+ {
894
+ ngx_int_t rc;
895
+ ngx_http_core_loc_conf_t *first, *second;
896
+ ngx_http_location_queue_t *lq1, *lq2;
897
+
898
+ lq1 = (ngx_http_location_queue_t *) one;
899
+ lq2 = (ngx_http_location_queue_t *) two;
900
+
901
+ first = lq1->exact ? lq1->exact : lq1->inclusive;
902
+ second = lq2->exact ? lq2->exact : lq2->inclusive;
903
+
904
+ if (first->noname && !second->noname) {
905
+ /* shift no named locations to the end */
906
+ return 1;
907
+ }
908
+
909
+ if (!first->noname && second->noname) {
910
+ /* shift no named locations to the end */
911
+ return -1;
912
+ }
913
+
914
+ if (first->noname || second->noname) {
915
+ /* do not sort no named locations */
916
+ return 0;
917
+ }
918
+
919
+ if (first->named && !second->named) {
920
+ /* shift named locations to the end */
921
+ return 1;
922
+ }
923
+
924
+ if (!first->named && second->named) {
925
+ /* shift named locations to the end */
926
+ return -1;
927
+ }
928
+
929
+ if (first->named && second->named) {
930
+ return ngx_strcmp(first->name.data, second->name.data);
931
+ }
932
+
933
+ #if (NGX_PCRE)
934
+
935
+ if (first->regex && !second->regex) {
936
+ /* shift the regex matches to the end */
937
+ return 1;
938
+ }
939
+
940
+ if (!first->regex && second->regex) {
941
+ /* shift the regex matches to the end */
942
+ return -1;
943
+ }
944
+
945
+ if (first->regex || second->regex) {
946
+ /* do not sort the regex matches */
947
+ return 0;
948
+ }
949
+
950
+ #endif
951
+
952
+ rc = ngx_strcmp(first->name.data, second->name.data);
953
+
954
+ if (rc == 0 && !first->exact_match && second->exact_match) {
955
+ /* an exact match must be before the same inclusive one */
956
+ return 1;
957
+ }
958
+
959
+ return rc;
960
+ }
961
+
962
+
963
+ static ngx_int_t
964
+ ngx_http_join_exact_locations(ngx_conf_t *cf, ngx_queue_t *locations)
965
+ {
966
+ ngx_queue_t *q, *x;
967
+ ngx_http_location_queue_t *lq, *lx;
968
+
969
+ q = ngx_queue_head(locations);
970
+
971
+ while (q != ngx_queue_last(locations)) {
972
+
973
+ x = ngx_queue_next(q);
974
+
975
+ lq = (ngx_http_location_queue_t *) q;
976
+ lx = (ngx_http_location_queue_t *) x;
977
+
978
+ if (ngx_strcmp(lq->name->data, lx->name->data) == 0) {
979
+
980
+ if ((lq->exact && lx->exact) || (lq->inclusive && lx->inclusive)) {
981
+ ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
982
+ "duplicate location \"%V\" in %s:%ui",
983
+ lx->name, lx->file_name, lx->line);
984
+
985
+ return NGX_ERROR;
986
+ }
987
+
988
+ lq->inclusive = lx->inclusive;
989
+
990
+ ngx_queue_remove(x);
991
+
992
+ continue;
993
+ }
994
+
995
+ q = ngx_queue_next(q);
996
+ }
997
+
998
+ return NGX_OK;
999
+ }
1000
+
1001
+
1002
+ static void
1003
+ ngx_http_create_locations_list(ngx_queue_t *locations, ngx_queue_t *q)
1004
+ {
1005
+ u_char *name;
1006
+ size_t len;
1007
+ ngx_queue_t *x, tail;
1008
+ ngx_http_location_queue_t *lq, *lx;
1009
+
1010
+ if (q == ngx_queue_last(locations)) {
1011
+ return;
1012
+ }
1013
+
1014
+ lq = (ngx_http_location_queue_t *) q;
1015
+
1016
+ if (lq->inclusive == NULL) {
1017
+ ngx_http_create_locations_list(locations, ngx_queue_next(q));
1018
+ return;
1019
+ }
1020
+
1021
+ len = lq->name->len;
1022
+ name = lq->name->data;
1023
+
1024
+ for (x = ngx_queue_next(q);
1025
+ x != ngx_queue_sentinel(locations);
1026
+ x = ngx_queue_next(x))
1027
+ {
1028
+ lx = (ngx_http_location_queue_t *) x;
1029
+
1030
+ if (len > lx->name->len
1031
+ || (ngx_strncmp(name, lx->name->data, len) != 0))
1032
+ {
1033
+ break;
1034
+ }
1035
+ }
1036
+
1037
+ q = ngx_queue_next(q);
1038
+
1039
+ if (q == x) {
1040
+ ngx_http_create_locations_list(locations, x);
1041
+ return;
1042
+ }
1043
+
1044
+ ngx_queue_split(locations, q, &tail);
1045
+ ngx_queue_add(&lq->list, &tail);
1046
+
1047
+ if (x == ngx_queue_sentinel(locations)) {
1048
+ ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list));
1049
+ return;
1050
+ }
1051
+
1052
+ ngx_queue_split(&lq->list, x, &tail);
1053
+ ngx_queue_add(locations, &tail);
1054
+
1055
+ ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list));
1056
+
1057
+ ngx_http_create_locations_list(locations, x);
1058
+ }
1059
+
1060
+
1061
+ /*
1062
+ * to keep cache locality for left leaf nodes, allocate nodes in following
1063
+ * order: node, left subtree, right subtree, inclusive subtree
1064
+ */
1065
+
1066
+ static ngx_http_location_tree_node_t *
1067
+ ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations,
1068
+ size_t prefix)
1069
+ {
1070
+ size_t len;
1071
+ ngx_queue_t *q, tail;
1072
+ ngx_http_location_queue_t *lq;
1073
+ ngx_http_location_tree_node_t *node;
1074
+
1075
+ q = ngx_queue_middle(locations);
1076
+
1077
+ lq = (ngx_http_location_queue_t *) q;
1078
+ len = lq->name->len - prefix;
1079
+
1080
+ node = ngx_palloc(cf->pool,
1081
+ offsetof(ngx_http_location_tree_node_t, name) + len);
1082
+ if (node == NULL) {
1083
+ return NULL;
1084
+ }
1085
+
1086
+ node->left = NULL;
1087
+ node->right = NULL;
1088
+ node->tree = NULL;
1089
+ node->exact = lq->exact;
1090
+ node->inclusive = lq->inclusive;
1091
+
1092
+ node->auto_redirect = (u_char) ((lq->exact && lq->exact->auto_redirect)
1093
+ || (lq->inclusive && lq->inclusive->auto_redirect));
1094
+
1095
+ node->len = (u_char) len;
1096
+ ngx_memcpy(node->name, &lq->name->data[prefix], len);
1097
+
1098
+ ngx_queue_split(locations, q, &tail);
1099
+
1100
+ if (ngx_queue_empty(locations)) {
1101
+ /*
1102
+ * ngx_queue_split() insures that if left part is empty,
1103
+ * then right one is empty too
1104
+ */
1105
+ goto inclusive;
1106
+ }
1107
+
1108
+ node->left = ngx_http_create_locations_tree(cf, locations, prefix);
1109
+ if (node->left == NULL) {
1110
+ return NULL;
1111
+ }
1112
+
1113
+ ngx_queue_remove(q);
1114
+
1115
+ if (ngx_queue_empty(&tail)) {
1116
+ goto inclusive;
1117
+ }
1118
+
1119
+ node->right = ngx_http_create_locations_tree(cf, &tail, prefix);
1120
+ if (node->right == NULL) {
1121
+ return NULL;
1122
+ }
1123
+
1124
+ inclusive:
1125
+
1126
+ if (ngx_queue_empty(&lq->list)) {
1127
+ return node;
1128
+ }
1129
+
1130
+ node->tree = ngx_http_create_locations_tree(cf, &lq->list, prefix + len);
1131
+ if (node->tree == NULL) {
1132
+ return NULL;
1133
+ }
1134
+
1135
+ return node;
1136
+ }
1137
+
1138
+
1139
+ ngx_int_t
1140
+ ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
1141
+ ngx_http_listen_opt_t *lsopt)
1142
+ {
1143
+ in_port_t p;
1144
+ ngx_uint_t i;
1145
+ struct sockaddr *sa;
1146
+ struct sockaddr_in *sin;
1147
+ ngx_http_conf_port_t *port;
1148
+ ngx_http_core_main_conf_t *cmcf;
1149
+ #if (NGX_HAVE_INET6)
1150
+ struct sockaddr_in6 *sin6;
1151
+ #endif
1152
+
1153
+ cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
1154
+
1155
+ if (cmcf->ports == NULL) {
1156
+ cmcf->ports = ngx_array_create(cf->temp_pool, 2,
1157
+ sizeof(ngx_http_conf_port_t));
1158
+ if (cmcf->ports == NULL) {
1159
+ return NGX_ERROR;
1160
+ }
1161
+ }
1162
+
1163
+ sa = &lsopt->u.sockaddr;
1164
+
1165
+ switch (sa->sa_family) {
1166
+
1167
+ #if (NGX_HAVE_INET6)
1168
+ case AF_INET6:
1169
+ sin6 = &lsopt->u.sockaddr_in6;
1170
+ p = sin6->sin6_port;
1171
+ break;
1172
+ #endif
1173
+
1174
+ #if (NGX_HAVE_UNIX_DOMAIN)
1175
+ case AF_UNIX:
1176
+ p = 0;
1177
+ break;
1178
+ #endif
1179
+
1180
+ default: /* AF_INET */
1181
+ sin = &lsopt->u.sockaddr_in;
1182
+ p = sin->sin_port;
1183
+ break;
1184
+ }
1185
+
1186
+ port = cmcf->ports->elts;
1187
+ for (i = 0; i < cmcf->ports->nelts; i++) {
1188
+
1189
+ if (p != port[i].port || sa->sa_family != port[i].family) {
1190
+ continue;
1191
+ }
1192
+
1193
+ /* a port is already in the port list */
1194
+
1195
+ return ngx_http_add_addresses(cf, cscf, &port[i], lsopt);
1196
+ }
1197
+
1198
+ /* add a port to the port list */
1199
+
1200
+ port = ngx_array_push(cmcf->ports);
1201
+ if (port == NULL) {
1202
+ return NGX_ERROR;
1203
+ }
1204
+
1205
+ port->family = sa->sa_family;
1206
+ port->port = p;
1207
+ port->addrs.elts = NULL;
1208
+
1209
+ return ngx_http_add_address(cf, cscf, port, lsopt);
1210
+ }
1211
+
1212
+
1213
+ static ngx_int_t
1214
+ ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
1215
+ ngx_http_conf_port_t *port, ngx_http_listen_opt_t *lsopt)
1216
+ {
1217
+ u_char *p;
1218
+ size_t len, off;
1219
+ ngx_uint_t i, default_server;
1220
+ struct sockaddr *sa;
1221
+ ngx_http_conf_addr_t *addr;
1222
+ #if (NGX_HAVE_UNIX_DOMAIN)
1223
+ struct sockaddr_un *saun;
1224
+ #endif
1225
+ #if (NGX_HTTP_SSL)
1226
+ ngx_uint_t ssl;
1227
+ #endif
1228
+
1229
+ /*
1230
+ * we cannot compare whole sockaddr struct's as kernel
1231
+ * may fill some fields in inherited sockaddr struct's
1232
+ */
1233
+
1234
+ sa = &lsopt->u.sockaddr;
1235
+
1236
+ switch (sa->sa_family) {
1237
+
1238
+ #if (NGX_HAVE_INET6)
1239
+ case AF_INET6:
1240
+ off = offsetof(struct sockaddr_in6, sin6_addr);
1241
+ len = 16;
1242
+ break;
1243
+ #endif
1244
+
1245
+ #if (NGX_HAVE_UNIX_DOMAIN)
1246
+ case AF_UNIX:
1247
+ off = offsetof(struct sockaddr_un, sun_path);
1248
+ len = sizeof(saun->sun_path);
1249
+ break;
1250
+ #endif
1251
+
1252
+ default: /* AF_INET */
1253
+ off = offsetof(struct sockaddr_in, sin_addr);
1254
+ len = 4;
1255
+ break;
1256
+ }
1257
+
1258
+ p = lsopt->u.sockaddr_data + off;
1259
+
1260
+ addr = port->addrs.elts;
1261
+
1262
+ for (i = 0; i < port->addrs.nelts; i++) {
1263
+
1264
+ if (ngx_memcmp(p, addr[i].opt.u.sockaddr_data + off, len) != 0) {
1265
+ continue;
1266
+ }
1267
+
1268
+ /* the address is already in the address list */
1269
+
1270
+ if (ngx_http_add_server(cf, cscf, &addr[i]) != NGX_OK) {
1271
+ return NGX_ERROR;
1272
+ }
1273
+
1274
+ /* preserve default_server bit during listen options overwriting */
1275
+ default_server = addr[i].opt.default_server;
1276
+
1277
+ #if (NGX_HTTP_SSL)
1278
+ ssl = lsopt->ssl || addr[i].opt.ssl;
1279
+ #endif
1280
+
1281
+ if (lsopt->set) {
1282
+
1283
+ if (addr[i].opt.set) {
1284
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1285
+ "duplicate listen options for %s", addr[i].opt.addr);
1286
+ return NGX_ERROR;
1287
+ }
1288
+
1289
+ addr[i].opt = *lsopt;
1290
+ }
1291
+
1292
+ /* check the duplicate "default" server for this address:port */
1293
+
1294
+ if (lsopt->default_server) {
1295
+
1296
+ if (default_server) {
1297
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1298
+ "a duplicate default server for %s", addr[i].opt.addr);
1299
+ return NGX_ERROR;
1300
+ }
1301
+
1302
+ default_server = 1;
1303
+ addr[i].default_server = cscf;
1304
+ }
1305
+
1306
+ addr[i].opt.default_server = default_server;
1307
+ #if (NGX_HTTP_SSL)
1308
+ addr[i].opt.ssl = ssl;
1309
+ #endif
1310
+
1311
+ return NGX_OK;
1312
+ }
1313
+
1314
+ /* add the address to the addresses list that bound to this port */
1315
+
1316
+ return ngx_http_add_address(cf, cscf, port, lsopt);
1317
+ }
1318
+
1319
+
1320
+ /*
1321
+ * add the server address, the server names and the server core module
1322
+ * configurations to the port list
1323
+ */
1324
+
1325
+ static ngx_int_t
1326
+ ngx_http_add_address(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
1327
+ ngx_http_conf_port_t *port, ngx_http_listen_opt_t *lsopt)
1328
+ {
1329
+ ngx_http_conf_addr_t *addr;
1330
+
1331
+ if (port->addrs.elts == NULL) {
1332
+ if (ngx_array_init(&port->addrs, cf->temp_pool, 4,
1333
+ sizeof(ngx_http_conf_addr_t))
1334
+ != NGX_OK)
1335
+ {
1336
+ return NGX_ERROR;
1337
+ }
1338
+ }
1339
+
1340
+ addr = ngx_array_push(&port->addrs);
1341
+ if (addr == NULL) {
1342
+ return NGX_ERROR;
1343
+ }
1344
+
1345
+ addr->opt = *lsopt;
1346
+ addr->hash.buckets = NULL;
1347
+ addr->hash.size = 0;
1348
+ addr->wc_head = NULL;
1349
+ addr->wc_tail = NULL;
1350
+ #if (NGX_PCRE)
1351
+ addr->nregex = 0;
1352
+ addr->regex = NULL;
1353
+ #endif
1354
+ addr->default_server = cscf;
1355
+ addr->servers.elts = NULL;
1356
+
1357
+ return ngx_http_add_server(cf, cscf, addr);
1358
+ }
1359
+
1360
+
1361
+ /* add the server core module configuration to the address:port */
1362
+
1363
+ static ngx_int_t
1364
+ ngx_http_add_server(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
1365
+ ngx_http_conf_addr_t *addr)
1366
+ {
1367
+ ngx_uint_t i;
1368
+ ngx_http_core_srv_conf_t **server;
1369
+
1370
+ if (addr->servers.elts == NULL) {
1371
+ if (ngx_array_init(&addr->servers, cf->temp_pool, 4,
1372
+ sizeof(ngx_http_core_srv_conf_t *))
1373
+ != NGX_OK)
1374
+ {
1375
+ return NGX_ERROR;
1376
+ }
1377
+
1378
+ } else {
1379
+ server = addr->servers.elts;
1380
+ for (i = 0; i < addr->servers.nelts; i++) {
1381
+ if (server[i] == cscf) {
1382
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1383
+ "a duplicate listen %s", addr->opt.addr);
1384
+ return NGX_ERROR;
1385
+ }
1386
+ }
1387
+ }
1388
+
1389
+ server = ngx_array_push(&addr->servers);
1390
+ if (server == NULL) {
1391
+ return NGX_ERROR;
1392
+ }
1393
+
1394
+ *server = cscf;
1395
+
1396
+ return NGX_OK;
1397
+ }
1398
+
1399
+
1400
+ static ngx_int_t
1401
+ ngx_http_optimize_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,
1402
+ ngx_array_t *ports)
1403
+ {
1404
+ ngx_uint_t p, a;
1405
+ ngx_http_conf_port_t *port;
1406
+ ngx_http_conf_addr_t *addr;
1407
+
1408
+ if (ports == NULL) {
1409
+ return NGX_OK;
1410
+ }
1411
+
1412
+ port = ports->elts;
1413
+ for (p = 0; p < ports->nelts; p++) {
1414
+
1415
+ ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,
1416
+ sizeof(ngx_http_conf_addr_t), ngx_http_cmp_conf_addrs);
1417
+
1418
+ /*
1419
+ * check whether all name-based servers have the same
1420
+ * configuraiton as a default server for given address:port
1421
+ */
1422
+
1423
+ addr = port[p].addrs.elts;
1424
+ for (a = 0; a < port[p].addrs.nelts; a++) {
1425
+
1426
+ if (addr[a].servers.nelts > 1
1427
+ #if (NGX_PCRE)
1428
+ || addr[a].default_server->captures
1429
+ #endif
1430
+ )
1431
+ {
1432
+ if (ngx_http_server_names(cf, cmcf, &addr[a]) != NGX_OK) {
1433
+ return NGX_ERROR;
1434
+ }
1435
+ }
1436
+ }
1437
+
1438
+ if (ngx_http_init_listening(cf, &port[p]) != NGX_OK) {
1439
+ return NGX_ERROR;
1440
+ }
1441
+ }
1442
+
1443
+ return NGX_OK;
1444
+ }
1445
+
1446
+
1447
+ static ngx_int_t
1448
+ ngx_http_server_names(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,
1449
+ ngx_http_conf_addr_t *addr)
1450
+ {
1451
+ ngx_int_t rc;
1452
+ ngx_uint_t n, s;
1453
+ ngx_hash_init_t hash;
1454
+ ngx_hash_keys_arrays_t ha;
1455
+ ngx_http_server_name_t *name;
1456
+ ngx_http_core_srv_conf_t **cscfp;
1457
+ #if (NGX_PCRE)
1458
+ ngx_uint_t regex, i;
1459
+
1460
+ regex = 0;
1461
+ #endif
1462
+
1463
+ ngx_memzero(&ha, sizeof(ngx_hash_keys_arrays_t));
1464
+
1465
+ ha.temp_pool = ngx_create_pool(16384, cf->log);
1466
+ if (ha.temp_pool == NULL) {
1467
+ return NGX_ERROR;
1468
+ }
1469
+
1470
+ ha.pool = cf->pool;
1471
+
1472
+ if (ngx_hash_keys_array_init(&ha, NGX_HASH_LARGE) != NGX_OK) {
1473
+ goto failed;
1474
+ }
1475
+
1476
+ cscfp = addr->servers.elts;
1477
+
1478
+ for (s = 0; s < addr->servers.nelts; s++) {
1479
+
1480
+ name = cscfp[s]->server_names.elts;
1481
+
1482
+ for (n = 0; n < cscfp[s]->server_names.nelts; n++) {
1483
+
1484
+ #if (NGX_PCRE)
1485
+ if (name[n].regex) {
1486
+ regex++;
1487
+ continue;
1488
+ }
1489
+ #endif
1490
+
1491
+ rc = ngx_hash_add_key(&ha, &name[n].name, name[n].server,
1492
+ NGX_HASH_WILDCARD_KEY);
1493
+
1494
+ if (rc == NGX_ERROR) {
1495
+ return NGX_ERROR;
1496
+ }
1497
+
1498
+ if (rc == NGX_DECLINED) {
1499
+ ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
1500
+ "invalid server name or wildcard \"%V\" on %s",
1501
+ &name[n].name, addr->opt.addr);
1502
+ return NGX_ERROR;
1503
+ }
1504
+
1505
+ if (rc == NGX_BUSY) {
1506
+ ngx_log_error(NGX_LOG_WARN, cf->log, 0,
1507
+ "conflicting server name \"%V\" on %s, ignored",
1508
+ &name[n].name, addr->opt.addr);
1509
+ }
1510
+ }
1511
+ }
1512
+
1513
+ hash.key = ngx_hash_key_lc;
1514
+ hash.max_size = cmcf->server_names_hash_max_size;
1515
+ hash.bucket_size = cmcf->server_names_hash_bucket_size;
1516
+ hash.name = "server_names_hash";
1517
+ hash.pool = cf->pool;
1518
+
1519
+ if (ha.keys.nelts) {
1520
+ hash.hash = &addr->hash;
1521
+ hash.temp_pool = NULL;
1522
+
1523
+ if (ngx_hash_init(&hash, ha.keys.elts, ha.keys.nelts) != NGX_OK) {
1524
+ goto failed;
1525
+ }
1526
+ }
1527
+
1528
+ if (ha.dns_wc_head.nelts) {
1529
+
1530
+ ngx_qsort(ha.dns_wc_head.elts, (size_t) ha.dns_wc_head.nelts,
1531
+ sizeof(ngx_hash_key_t), ngx_http_cmp_dns_wildcards);
1532
+
1533
+ hash.hash = NULL;
1534
+ hash.temp_pool = ha.temp_pool;
1535
+
1536
+ if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts,
1537
+ ha.dns_wc_head.nelts)
1538
+ != NGX_OK)
1539
+ {
1540
+ goto failed;
1541
+ }
1542
+
1543
+ addr->wc_head = (ngx_hash_wildcard_t *) hash.hash;
1544
+ }
1545
+
1546
+ if (ha.dns_wc_tail.nelts) {
1547
+
1548
+ ngx_qsort(ha.dns_wc_tail.elts, (size_t) ha.dns_wc_tail.nelts,
1549
+ sizeof(ngx_hash_key_t), ngx_http_cmp_dns_wildcards);
1550
+
1551
+ hash.hash = NULL;
1552
+ hash.temp_pool = ha.temp_pool;
1553
+
1554
+ if (ngx_hash_wildcard_init(&hash, ha.dns_wc_tail.elts,
1555
+ ha.dns_wc_tail.nelts)
1556
+ != NGX_OK)
1557
+ {
1558
+ goto failed;
1559
+ }
1560
+
1561
+ addr->wc_tail = (ngx_hash_wildcard_t *) hash.hash;
1562
+ }
1563
+
1564
+ ngx_destroy_pool(ha.temp_pool);
1565
+
1566
+ #if (NGX_PCRE)
1567
+
1568
+ if (regex == 0) {
1569
+ return NGX_OK;
1570
+ }
1571
+
1572
+ addr->nregex = regex;
1573
+ addr->regex = ngx_palloc(cf->pool, regex * sizeof(ngx_http_server_name_t));
1574
+ if (addr->regex == NULL) {
1575
+ return NGX_ERROR;
1576
+ }
1577
+
1578
+ i = 0;
1579
+
1580
+ for (s = 0; s < addr->servers.nelts; s++) {
1581
+
1582
+ name = cscfp[s]->server_names.elts;
1583
+
1584
+ for (n = 0; n < cscfp[s]->server_names.nelts; n++) {
1585
+ if (name[n].regex) {
1586
+ addr->regex[i++] = name[n];
1587
+ }
1588
+ }
1589
+ }
1590
+
1591
+ #endif
1592
+
1593
+ return NGX_OK;
1594
+
1595
+ failed:
1596
+
1597
+ ngx_destroy_pool(ha.temp_pool);
1598
+
1599
+ return NGX_ERROR;
1600
+ }
1601
+
1602
+
1603
+ static ngx_int_t
1604
+ ngx_http_cmp_conf_addrs(const void *one, const void *two)
1605
+ {
1606
+ ngx_http_conf_addr_t *first, *second;
1607
+
1608
+ first = (ngx_http_conf_addr_t *) one;
1609
+ second = (ngx_http_conf_addr_t *) two;
1610
+
1611
+ if (first->opt.wildcard) {
1612
+ /* a wildcard address must be the last resort, shift it to the end */
1613
+ return 1;
1614
+ }
1615
+
1616
+ if (first->opt.bind && !second->opt.bind) {
1617
+ /* shift explicit bind()ed addresses to the start */
1618
+ return -1;
1619
+ }
1620
+
1621
+ if (!first->opt.bind && second->opt.bind) {
1622
+ /* shift explicit bind()ed addresses to the start */
1623
+ return 1;
1624
+ }
1625
+
1626
+ /* do not sort by default */
1627
+
1628
+ return 0;
1629
+ }
1630
+
1631
+
1632
+ static int ngx_libc_cdecl
1633
+ ngx_http_cmp_dns_wildcards(const void *one, const void *two)
1634
+ {
1635
+ ngx_hash_key_t *first, *second;
1636
+
1637
+ first = (ngx_hash_key_t *) one;
1638
+ second = (ngx_hash_key_t *) two;
1639
+
1640
+ return ngx_dns_strcmp(first->key.data, second->key.data);
1641
+ }
1642
+
1643
+
1644
+ static ngx_int_t
1645
+ ngx_http_init_listening(ngx_conf_t *cf, ngx_http_conf_port_t *port)
1646
+ {
1647
+ ngx_uint_t i, last, bind_wildcard;
1648
+ ngx_listening_t *ls;
1649
+ ngx_http_port_t *hport;
1650
+ ngx_http_conf_addr_t *addr;
1651
+
1652
+ addr = port->addrs.elts;
1653
+ last = port->addrs.nelts;
1654
+
1655
+ /*
1656
+ * If there is a binding to an "*:port" then we need to bind() to
1657
+ * the "*:port" only and ignore other implicit bindings. The bindings
1658
+ * have been already sorted: explicit bindings are on the start, then
1659
+ * implicit bindings go, and wildcard binding is in the end.
1660
+ */
1661
+
1662
+ if (addr[last - 1].opt.wildcard) {
1663
+ addr[last - 1].opt.bind = 1;
1664
+ bind_wildcard = 1;
1665
+
1666
+ } else {
1667
+ bind_wildcard = 0;
1668
+ }
1669
+
1670
+ i = 0;
1671
+
1672
+ while (i < last) {
1673
+
1674
+ if (bind_wildcard && !addr[i].opt.bind) {
1675
+ i++;
1676
+ continue;
1677
+ }
1678
+
1679
+ ls = ngx_http_add_listening(cf, &addr[i]);
1680
+ if (ls == NULL) {
1681
+ return NGX_ERROR;
1682
+ }
1683
+
1684
+ hport = ngx_pcalloc(cf->pool, sizeof(ngx_http_port_t));
1685
+ if (hport == NULL) {
1686
+ return NGX_ERROR;
1687
+ }
1688
+
1689
+ ls->servers = hport;
1690
+
1691
+ if (i == last - 1) {
1692
+ hport->naddrs = last;
1693
+
1694
+ } else {
1695
+ hport->naddrs = 1;
1696
+ i = 0;
1697
+ }
1698
+
1699
+ switch (ls->sockaddr->sa_family) {
1700
+
1701
+ #if (NGX_HAVE_INET6)
1702
+ case AF_INET6:
1703
+ if (ngx_http_add_addrs6(cf, hport, addr) != NGX_OK) {
1704
+ return NGX_ERROR;
1705
+ }
1706
+ break;
1707
+ #endif
1708
+ default: /* AF_INET */
1709
+ if (ngx_http_add_addrs(cf, hport, addr) != NGX_OK) {
1710
+ return NGX_ERROR;
1711
+ }
1712
+ break;
1713
+ }
1714
+
1715
+ addr++;
1716
+ last--;
1717
+ }
1718
+
1719
+ return NGX_OK;
1720
+ }
1721
+
1722
+
1723
+ static ngx_listening_t *
1724
+ ngx_http_add_listening(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)
1725
+ {
1726
+ ngx_listening_t *ls;
1727
+ ngx_http_core_loc_conf_t *clcf;
1728
+ ngx_http_core_srv_conf_t *cscf;
1729
+
1730
+ ls = ngx_create_listening(cf, &addr->opt.u.sockaddr, addr->opt.socklen);
1731
+ if (ls == NULL) {
1732
+ return NULL;
1733
+ }
1734
+
1735
+ ls->addr_ntop = 1;
1736
+
1737
+ ls->handler = ngx_http_init_connection;
1738
+
1739
+ cscf = addr->default_server;
1740
+ ls->pool_size = cscf->connection_pool_size;
1741
+ ls->post_accept_timeout = cscf->client_header_timeout;
1742
+
1743
+ clcf = cscf->ctx->loc_conf[ngx_http_core_module.ctx_index];
1744
+
1745
+ ls->logp = clcf->error_log;
1746
+ ls->log.data = &ls->addr_text;
1747
+ ls->log.handler = ngx_accept_log_error;
1748
+
1749
+ #if (NGX_WIN32)
1750
+ {
1751
+ ngx_iocp_conf_t *iocpcf = NULL;
1752
+
1753
+ if (ngx_get_conf(cf->cycle->conf_ctx, ngx_events_module)) {
1754
+ iocpcf = ngx_event_get_conf(cf->cycle->conf_ctx, ngx_iocp_module);
1755
+ }
1756
+ if (iocpcf && iocpcf->acceptex_read) {
1757
+ ls->post_accept_buffer_size = cscf->client_header_buffer_size;
1758
+ }
1759
+ }
1760
+ #endif
1761
+
1762
+ ls->backlog = addr->opt.backlog;
1763
+ ls->rcvbuf = addr->opt.rcvbuf;
1764
+ ls->sndbuf = addr->opt.sndbuf;
1765
+
1766
+ #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
1767
+ ls->accept_filter = addr->opt.accept_filter;
1768
+ #endif
1769
+
1770
+ #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
1771
+ ls->deferred_accept = addr->opt.deferred_accept;
1772
+ #endif
1773
+
1774
+ #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
1775
+ ls->ipv6only = addr->opt.ipv6only;
1776
+ #endif
1777
+
1778
+ #if (NGX_HAVE_SETFIB)
1779
+ ls->setfib = addr->opt.setfib;
1780
+ #endif
1781
+
1782
+ return ls;
1783
+ }
1784
+
1785
+
1786
+ static ngx_int_t
1787
+ ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,
1788
+ ngx_http_conf_addr_t *addr)
1789
+ {
1790
+ ngx_uint_t i;
1791
+ ngx_http_in_addr_t *addrs;
1792
+ struct sockaddr_in *sin;
1793
+ ngx_http_virtual_names_t *vn;
1794
+
1795
+ hport->addrs = ngx_pcalloc(cf->pool,
1796
+ hport->naddrs * sizeof(ngx_http_in_addr_t));
1797
+ if (hport->addrs == NULL) {
1798
+ return NGX_ERROR;
1799
+ }
1800
+
1801
+ addrs = hport->addrs;
1802
+
1803
+ for (i = 0; i < hport->naddrs; i++) {
1804
+
1805
+ sin = &addr[i].opt.u.sockaddr_in;
1806
+ addrs[i].addr = sin->sin_addr.s_addr;
1807
+ addrs[i].conf.default_server = addr[i].default_server;
1808
+ #if (NGX_HTTP_SSL)
1809
+ addrs[i].conf.ssl = addr[i].opt.ssl;
1810
+ #endif
1811
+
1812
+ if (addr[i].hash.buckets == NULL
1813
+ && (addr[i].wc_head == NULL
1814
+ || addr[i].wc_head->hash.buckets == NULL)
1815
+ && (addr[i].wc_tail == NULL
1816
+ || addr[i].wc_tail->hash.buckets == NULL)
1817
+ #if (NGX_PCRE)
1818
+ && addr[i].nregex == 0
1819
+ #endif
1820
+ )
1821
+ {
1822
+ continue;
1823
+ }
1824
+
1825
+ vn = ngx_palloc(cf->pool, sizeof(ngx_http_virtual_names_t));
1826
+ if (vn == NULL) {
1827
+ return NGX_ERROR;
1828
+ }
1829
+
1830
+ addrs[i].conf.virtual_names = vn;
1831
+
1832
+ vn->names.hash = addr[i].hash;
1833
+ vn->names.wc_head = addr[i].wc_head;
1834
+ vn->names.wc_tail = addr[i].wc_tail;
1835
+ #if (NGX_PCRE)
1836
+ vn->nregex = addr[i].nregex;
1837
+ vn->regex = addr[i].regex;
1838
+ #endif
1839
+ }
1840
+
1841
+ return NGX_OK;
1842
+ }
1843
+
1844
+
1845
+ #if (NGX_HAVE_INET6)
1846
+
1847
+ static ngx_int_t
1848
+ ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,
1849
+ ngx_http_conf_addr_t *addr)
1850
+ {
1851
+ ngx_uint_t i;
1852
+ ngx_http_in6_addr_t *addrs6;
1853
+ struct sockaddr_in6 *sin6;
1854
+ ngx_http_virtual_names_t *vn;
1855
+
1856
+ hport->addrs = ngx_pcalloc(cf->pool,
1857
+ hport->naddrs * sizeof(ngx_http_in6_addr_t));
1858
+ if (hport->addrs == NULL) {
1859
+ return NGX_ERROR;
1860
+ }
1861
+
1862
+ addrs6 = hport->addrs;
1863
+
1864
+ for (i = 0; i < hport->naddrs; i++) {
1865
+
1866
+ sin6 = &addr[i].opt.u.sockaddr_in6;
1867
+ addrs6[i].addr6 = sin6->sin6_addr;
1868
+ addrs6[i].conf.default_server = addr[i].default_server;
1869
+ #if (NGX_HTTP_SSL)
1870
+ addrs6[i].conf.ssl = addr[i].opt.ssl;
1871
+ #endif
1872
+
1873
+ if (addr[i].hash.buckets == NULL
1874
+ && (addr[i].wc_head == NULL
1875
+ || addr[i].wc_head->hash.buckets == NULL)
1876
+ && (addr[i].wc_tail == NULL
1877
+ || addr[i].wc_tail->hash.buckets == NULL)
1878
+ #if (NGX_PCRE)
1879
+ && addr[i].nregex == 0
1880
+ #endif
1881
+ )
1882
+ {
1883
+ continue;
1884
+ }
1885
+
1886
+ vn = ngx_palloc(cf->pool, sizeof(ngx_http_virtual_names_t));
1887
+ if (vn == NULL) {
1888
+ return NGX_ERROR;
1889
+ }
1890
+
1891
+ addrs6[i].conf.virtual_names = vn;
1892
+
1893
+ vn->names.hash = addr[i].hash;
1894
+ vn->names.wc_head = addr[i].wc_head;
1895
+ vn->names.wc_tail = addr[i].wc_tail;
1896
+ #if (NGX_PCRE)
1897
+ vn->nregex = addr[i].nregex;
1898
+ vn->regex = addr[i].regex;
1899
+ #endif
1900
+ }
1901
+
1902
+ return NGX_OK;
1903
+ }
1904
+
1905
+ #endif
1906
+
1907
+
1908
+ char *
1909
+ ngx_http_types_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
1910
+ {
1911
+ char *p = conf;
1912
+
1913
+ ngx_array_t **types;
1914
+ ngx_str_t *value, *default_type;
1915
+ ngx_uint_t i, n, hash;
1916
+ ngx_hash_key_t *type;
1917
+
1918
+ types = (ngx_array_t **) (p + cmd->offset);
1919
+
1920
+ if (*types == (void *) -1) {
1921
+ return NGX_CONF_OK;
1922
+ }
1923
+
1924
+ default_type = cmd->post;
1925
+
1926
+ if (*types == NULL) {
1927
+ *types = ngx_array_create(cf->temp_pool, 1, sizeof(ngx_hash_key_t));
1928
+ if (*types == NULL) {
1929
+ return NGX_CONF_ERROR;
1930
+ }
1931
+
1932
+ if (default_type) {
1933
+ type = ngx_array_push(*types);
1934
+ if (type == NULL) {
1935
+ return NGX_CONF_ERROR;
1936
+ }
1937
+
1938
+ type->key = *default_type;
1939
+ type->key_hash = ngx_hash_key(default_type->data,
1940
+ default_type->len);
1941
+ type->value = (void *) 4;
1942
+ }
1943
+ }
1944
+
1945
+ value = cf->args->elts;
1946
+
1947
+ for (i = 1; i < cf->args->nelts; i++) {
1948
+
1949
+ if (value[i].len == 1 && value[i].data[0] == '*') {
1950
+ *types = (void *) -1;
1951
+ return NGX_CONF_OK;
1952
+ }
1953
+
1954
+ hash = ngx_hash_strlow(value[i].data, value[i].data, value[i].len);
1955
+ value[i].data[value[i].len] = '\0';
1956
+
1957
+ type = (*types)->elts;
1958
+ for (n = 0; n < (*types)->nelts; n++) {
1959
+
1960
+ if (ngx_strcmp(value[i].data, type[n].key.data) == 0) {
1961
+ ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
1962
+ "duplicate MIME type \"%V\"", &value[i]);
1963
+ continue;
1964
+ }
1965
+ }
1966
+
1967
+ type = ngx_array_push(*types);
1968
+ if (type == NULL) {
1969
+ return NGX_CONF_ERROR;
1970
+ }
1971
+
1972
+ type->key = value[i];
1973
+ type->key_hash = hash;
1974
+ type->value = (void *) 4;
1975
+ }
1976
+
1977
+ return NGX_CONF_OK;
1978
+ }
1979
+
1980
+
1981
+ char *
1982
+ ngx_http_merge_types(ngx_conf_t *cf, ngx_array_t **keys, ngx_hash_t *types_hash,
1983
+ ngx_array_t **prev_keys, ngx_hash_t *prev_types_hash,
1984
+ ngx_str_t *default_types)
1985
+ {
1986
+ ngx_hash_init_t hash;
1987
+
1988
+ if (*keys) {
1989
+
1990
+ if (*keys == (void *) -1) {
1991
+ return NGX_CONF_OK;
1992
+ }
1993
+
1994
+ hash.hash = types_hash;
1995
+ hash.key = NULL;
1996
+ hash.max_size = 2048;
1997
+ hash.bucket_size = 64;
1998
+ hash.name = "test_types_hash";
1999
+ hash.pool = cf->pool;
2000
+ hash.temp_pool = NULL;
2001
+
2002
+ if (ngx_hash_init(&hash, (*keys)->elts, (*keys)->nelts) != NGX_OK) {
2003
+ return NGX_CONF_ERROR;
2004
+ }
2005
+
2006
+ return NGX_CONF_OK;
2007
+ }
2008
+
2009
+ if (prev_types_hash->buckets == NULL) {
2010
+
2011
+ if (*prev_keys == NULL) {
2012
+
2013
+ if (ngx_http_set_default_types(cf, prev_keys, default_types)
2014
+ != NGX_OK)
2015
+ {
2016
+ return NGX_CONF_ERROR;
2017
+ }
2018
+
2019
+ } else if (*prev_keys == (void *) -1) {
2020
+ *keys = *prev_keys;
2021
+ return NGX_CONF_OK;
2022
+ }
2023
+
2024
+ hash.hash = prev_types_hash;
2025
+ hash.key = NULL;
2026
+ hash.max_size = 2048;
2027
+ hash.bucket_size = 64;
2028
+ hash.name = "test_types_hash";
2029
+ hash.pool = cf->pool;
2030
+ hash.temp_pool = NULL;
2031
+
2032
+ if (ngx_hash_init(&hash, (*prev_keys)->elts, (*prev_keys)->nelts)
2033
+ != NGX_OK)
2034
+ {
2035
+ return NGX_CONF_ERROR;
2036
+ }
2037
+ }
2038
+
2039
+ *types_hash = *prev_types_hash;
2040
+
2041
+ return NGX_CONF_OK;
2042
+
2043
+ }
2044
+
2045
+
2046
+ ngx_int_t
2047
+ ngx_http_set_default_types(ngx_conf_t *cf, ngx_array_t **types,
2048
+ ngx_str_t *default_type)
2049
+ {
2050
+ ngx_hash_key_t *type;
2051
+
2052
+ *types = ngx_array_create(cf->temp_pool, 1, sizeof(ngx_hash_key_t));
2053
+ if (*types == NULL) {
2054
+ return NGX_ERROR;
2055
+ }
2056
+
2057
+ while (default_type->len) {
2058
+
2059
+ type = ngx_array_push(*types);
2060
+ if (type == NULL) {
2061
+ return NGX_ERROR;
2062
+ }
2063
+
2064
+ type->key = *default_type;
2065
+ type->key_hash = ngx_hash_key(default_type->data,
2066
+ default_type->len);
2067
+ type->value = (void *) 4;
2068
+
2069
+ default_type++;
2070
+ }
2071
+
2072
+ return NGX_OK;
2073
+ }