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,317 @@
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
+ typedef struct {
14
+ ngx_flag_t enable;
15
+ } ngx_http_random_index_loc_conf_t;
16
+
17
+
18
+ #define NGX_HTTP_RANDOM_INDEX_PREALLOCATE 50
19
+
20
+
21
+ static ngx_int_t ngx_http_random_index_error(ngx_http_request_t *r,
22
+ ngx_dir_t *dir, ngx_str_t *name);
23
+ static ngx_int_t ngx_http_random_index_init(ngx_conf_t *cf);
24
+ static void *ngx_http_random_index_create_loc_conf(ngx_conf_t *cf);
25
+ static char *ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf,
26
+ void *parent, void *child);
27
+
28
+
29
+ static ngx_command_t ngx_http_random_index_commands[] = {
30
+
31
+ { ngx_string("random_index"),
32
+ NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
33
+ ngx_conf_set_flag_slot,
34
+ NGX_HTTP_LOC_CONF_OFFSET,
35
+ offsetof(ngx_http_random_index_loc_conf_t, enable),
36
+ NULL },
37
+
38
+ ngx_null_command
39
+ };
40
+
41
+
42
+ static ngx_http_module_t ngx_http_random_index_module_ctx = {
43
+ NULL, /* preconfiguration */
44
+ ngx_http_random_index_init, /* postconfiguration */
45
+
46
+ NULL, /* create main configuration */
47
+ NULL, /* init main configuration */
48
+
49
+ NULL, /* create server configuration */
50
+ NULL, /* merge server configuration */
51
+
52
+ ngx_http_random_index_create_loc_conf, /* create location configuration */
53
+ ngx_http_random_index_merge_loc_conf /* merge location configuration */
54
+ };
55
+
56
+
57
+ ngx_module_t ngx_http_random_index_module = {
58
+ NGX_MODULE_V1,
59
+ &ngx_http_random_index_module_ctx, /* module context */
60
+ ngx_http_random_index_commands, /* module directives */
61
+ NGX_HTTP_MODULE, /* module type */
62
+ NULL, /* init master */
63
+ NULL, /* init module */
64
+ NULL, /* init process */
65
+ NULL, /* init thread */
66
+ NULL, /* exit thread */
67
+ NULL, /* exit process */
68
+ NULL, /* exit master */
69
+ NGX_MODULE_V1_PADDING
70
+ };
71
+
72
+
73
+ static ngx_int_t
74
+ ngx_http_random_index_handler(ngx_http_request_t *r)
75
+ {
76
+ u_char *last, *filename;
77
+ size_t len, allocated, root;
78
+ ngx_err_t err;
79
+ ngx_int_t rc;
80
+ ngx_str_t path, uri, *name;
81
+ ngx_dir_t dir;
82
+ ngx_uint_t n, level;
83
+ ngx_array_t names;
84
+ ngx_http_random_index_loc_conf_t *rlcf;
85
+
86
+ if (r->uri.data[r->uri.len - 1] != '/') {
87
+ return NGX_DECLINED;
88
+ }
89
+
90
+ if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {
91
+ return NGX_DECLINED;
92
+ }
93
+
94
+ rlcf = ngx_http_get_module_loc_conf(r, ngx_http_random_index_module);
95
+
96
+ if (!rlcf->enable) {
97
+ return NGX_DECLINED;
98
+ }
99
+
100
+ #if (NGX_HAVE_D_TYPE)
101
+ len = NGX_DIR_MASK_LEN;
102
+ #else
103
+ len = NGX_HTTP_RANDOM_INDEX_PREALLOCATE;
104
+ #endif
105
+
106
+ last = ngx_http_map_uri_to_path(r, &path, &root, len);
107
+ if (last == NULL) {
108
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
109
+ }
110
+
111
+ allocated = path.len;
112
+
113
+ path.len = last - path.data - 1;
114
+ path.data[path.len] = '\0';
115
+
116
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
117
+ "http random index: \"%s\"", path.data);
118
+
119
+ if (ngx_open_dir(&path, &dir) == NGX_ERROR) {
120
+ err = ngx_errno;
121
+
122
+ if (err == NGX_ENOENT
123
+ || err == NGX_ENOTDIR
124
+ || err == NGX_ENAMETOOLONG)
125
+ {
126
+ level = NGX_LOG_ERR;
127
+ rc = NGX_HTTP_NOT_FOUND;
128
+
129
+ } else if (err == NGX_EACCES) {
130
+ level = NGX_LOG_ERR;
131
+ rc = NGX_HTTP_FORBIDDEN;
132
+
133
+ } else {
134
+ level = NGX_LOG_CRIT;
135
+ rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
136
+ }
137
+
138
+ ngx_log_error(level, r->connection->log, err,
139
+ ngx_open_dir_n " \"%s\" failed", path.data);
140
+
141
+ return rc;
142
+ }
143
+
144
+ if (ngx_array_init(&names, r->pool, 32, sizeof(ngx_str_t)) != NGX_OK) {
145
+ return ngx_http_random_index_error(r, &dir, &path);
146
+ }
147
+
148
+ filename = path.data;
149
+ filename[path.len] = '/';
150
+
151
+ for ( ;; ) {
152
+ ngx_set_errno(0);
153
+
154
+ if (ngx_read_dir(&dir) == NGX_ERROR) {
155
+ err = ngx_errno;
156
+
157
+ if (err != NGX_ENOMOREFILES) {
158
+ ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
159
+ ngx_read_dir_n " \"%V\" failed", &path);
160
+ return ngx_http_random_index_error(r, &dir, &path);
161
+ }
162
+
163
+ break;
164
+ }
165
+
166
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
167
+ "http random index file: \"%s\"", ngx_de_name(&dir));
168
+
169
+ if (ngx_de_name(&dir)[0] == '.') {
170
+ continue;
171
+ }
172
+
173
+ len = ngx_de_namelen(&dir);
174
+
175
+ if (dir.type == 0 || ngx_de_is_link(&dir)) {
176
+
177
+ /* 1 byte for '/' and 1 byte for terminating '\0' */
178
+
179
+ if (path.len + 1 + len + 1 > allocated) {
180
+ allocated = path.len + 1 + len + 1
181
+ + NGX_HTTP_RANDOM_INDEX_PREALLOCATE;
182
+
183
+ filename = ngx_pnalloc(r->pool, allocated);
184
+ if (filename == NULL) {
185
+ return ngx_http_random_index_error(r, &dir, &path);
186
+ }
187
+
188
+ last = ngx_cpystrn(filename, path.data, path.len + 1);
189
+ *last++ = '/';
190
+ }
191
+
192
+ ngx_cpystrn(last, ngx_de_name(&dir), len + 1);
193
+
194
+ if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) {
195
+ err = ngx_errno;
196
+
197
+ if (err != NGX_ENOENT) {
198
+ ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
199
+ ngx_de_info_n " \"%s\" failed", filename);
200
+ return ngx_http_random_index_error(r, &dir, &path);
201
+ }
202
+
203
+ if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) {
204
+ ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
205
+ ngx_de_link_info_n " \"%s\" failed",
206
+ filename);
207
+ return ngx_http_random_index_error(r, &dir, &path);
208
+ }
209
+ }
210
+ }
211
+
212
+ if (!ngx_de_is_file(&dir)) {
213
+ continue;
214
+ }
215
+
216
+ name = ngx_array_push(&names);
217
+ if (name == NULL) {
218
+ return ngx_http_random_index_error(r, &dir, &path);
219
+ }
220
+
221
+ name->len = len;
222
+
223
+ name->data = ngx_pnalloc(r->pool, len);
224
+ if (name->data == NULL) {
225
+ return ngx_http_random_index_error(r, &dir, &path);
226
+ }
227
+
228
+ ngx_memcpy(name->data, ngx_de_name(&dir), len);
229
+ }
230
+
231
+ if (ngx_close_dir(&dir) == NGX_ERROR) {
232
+ ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
233
+ ngx_close_dir_n " \"%s\" failed", &path);
234
+ }
235
+
236
+ n = names.nelts;
237
+
238
+ if (n == 0) {
239
+ return NGX_DECLINED;
240
+ }
241
+
242
+ name = names.elts;
243
+
244
+ n = (ngx_uint_t) (((uint64_t) ngx_random() * n) / 0x80000000);
245
+
246
+ uri.len = r->uri.len + name[n].len;
247
+
248
+ uri.data = ngx_pnalloc(r->pool, uri.len);
249
+ if (uri.data == NULL) {
250
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
251
+ }
252
+
253
+ last = ngx_copy(uri.data, r->uri.data, r->uri.len);
254
+ ngx_memcpy(last, name[n].data, name[n].len);
255
+
256
+ return ngx_http_internal_redirect(r, &uri, &r->args);
257
+ }
258
+
259
+
260
+ static ngx_int_t
261
+ ngx_http_random_index_error(ngx_http_request_t *r, ngx_dir_t *dir,
262
+ ngx_str_t *name)
263
+ {
264
+ if (ngx_close_dir(dir) == NGX_ERROR) {
265
+ ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
266
+ ngx_close_dir_n " \"%V\" failed", name);
267
+ }
268
+
269
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
270
+ }
271
+
272
+
273
+ static void *
274
+ ngx_http_random_index_create_loc_conf(ngx_conf_t *cf)
275
+ {
276
+ ngx_http_random_index_loc_conf_t *conf;
277
+
278
+ conf = ngx_palloc(cf->pool, sizeof(ngx_http_random_index_loc_conf_t));
279
+ if (conf == NULL) {
280
+ return NULL;
281
+ }
282
+
283
+ conf->enable = NGX_CONF_UNSET;
284
+
285
+ return conf;
286
+ }
287
+
288
+
289
+ static char *
290
+ ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
291
+ {
292
+ ngx_http_random_index_loc_conf_t *prev = parent;
293
+ ngx_http_random_index_loc_conf_t *conf = child;
294
+
295
+ ngx_conf_merge_value(conf->enable, prev->enable, 0);
296
+
297
+ return NGX_CONF_OK;
298
+ }
299
+
300
+
301
+ static ngx_int_t
302
+ ngx_http_random_index_init(ngx_conf_t *cf)
303
+ {
304
+ ngx_http_handler_pt *h;
305
+ ngx_http_core_main_conf_t *cmcf;
306
+
307
+ cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
308
+
309
+ h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
310
+ if (h == NULL) {
311
+ return NGX_ERROR;
312
+ }
313
+
314
+ *h = ngx_http_random_index_handler;
315
+
316
+ return NGX_OK;
317
+ }
@@ -0,0 +1,855 @@
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
+ /*
14
+ * the single part format:
15
+ *
16
+ * "HTTP/1.0 206 Partial Content" CRLF
17
+ * ... header ...
18
+ * "Content-Type: image/jpeg" CRLF
19
+ * "Content-Length: SIZE" CRLF
20
+ * "Content-Range: bytes START-END/SIZE" CRLF
21
+ * CRLF
22
+ * ... data ...
23
+ *
24
+ *
25
+ * the mutlipart format:
26
+ *
27
+ * "HTTP/1.0 206 Partial Content" CRLF
28
+ * ... header ...
29
+ * "Content-Type: multipart/byteranges; boundary=0123456789" CRLF
30
+ * CRLF
31
+ * CRLF
32
+ * "--0123456789" CRLF
33
+ * "Content-Type: image/jpeg" CRLF
34
+ * "Content-Range: bytes START0-END0/SIZE" CRLF
35
+ * CRLF
36
+ * ... data ...
37
+ * CRLF
38
+ * "--0123456789" CRLF
39
+ * "Content-Type: image/jpeg" CRLF
40
+ * "Content-Range: bytes START1-END1/SIZE" CRLF
41
+ * CRLF
42
+ * ... data ...
43
+ * CRLF
44
+ * "--0123456789--" CRLF
45
+ */
46
+
47
+
48
+ typedef struct {
49
+ off_t start;
50
+ off_t end;
51
+ ngx_str_t content_range;
52
+ } ngx_http_range_t;
53
+
54
+
55
+ typedef struct {
56
+ off_t offset;
57
+ ngx_str_t boundary_header;
58
+ ngx_array_t ranges;
59
+ } ngx_http_range_filter_ctx_t;
60
+
61
+
62
+ static ngx_int_t ngx_http_range_parse(ngx_http_request_t *r,
63
+ ngx_http_range_filter_ctx_t *ctx, ngx_uint_t ranges);
64
+ static ngx_int_t ngx_http_range_singlepart_header(ngx_http_request_t *r,
65
+ ngx_http_range_filter_ctx_t *ctx);
66
+ static ngx_int_t ngx_http_range_multipart_header(ngx_http_request_t *r,
67
+ ngx_http_range_filter_ctx_t *ctx);
68
+ static ngx_int_t ngx_http_range_not_satisfiable(ngx_http_request_t *r);
69
+ static ngx_int_t ngx_http_range_test_overlapped(ngx_http_request_t *r,
70
+ ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in);
71
+ static ngx_int_t ngx_http_range_singlepart_body(ngx_http_request_t *r,
72
+ ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in);
73
+ static ngx_int_t ngx_http_range_multipart_body(ngx_http_request_t *r,
74
+ ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in);
75
+
76
+ static ngx_int_t ngx_http_range_header_filter_init(ngx_conf_t *cf);
77
+ static ngx_int_t ngx_http_range_body_filter_init(ngx_conf_t *cf);
78
+
79
+
80
+ static ngx_http_module_t ngx_http_range_header_filter_module_ctx = {
81
+ NULL, /* preconfiguration */
82
+ ngx_http_range_header_filter_init, /* postconfiguration */
83
+
84
+ NULL, /* create main configuration */
85
+ NULL, /* init main configuration */
86
+
87
+ NULL, /* create server configuration */
88
+ NULL, /* merge server configuration */
89
+
90
+ NULL, /* create location configuration */
91
+ NULL, /* merge location configuration */
92
+ };
93
+
94
+
95
+ ngx_module_t ngx_http_range_header_filter_module = {
96
+ NGX_MODULE_V1,
97
+ &ngx_http_range_header_filter_module_ctx, /* module context */
98
+ NULL, /* module directives */
99
+ NGX_HTTP_MODULE, /* module type */
100
+ NULL, /* init master */
101
+ NULL, /* init module */
102
+ NULL, /* init process */
103
+ NULL, /* init thread */
104
+ NULL, /* exit thread */
105
+ NULL, /* exit process */
106
+ NULL, /* exit master */
107
+ NGX_MODULE_V1_PADDING
108
+ };
109
+
110
+
111
+ static ngx_http_module_t ngx_http_range_body_filter_module_ctx = {
112
+ NULL, /* preconfiguration */
113
+ ngx_http_range_body_filter_init, /* postconfiguration */
114
+
115
+ NULL, /* create main configuration */
116
+ NULL, /* init main configuration */
117
+
118
+ NULL, /* create server configuration */
119
+ NULL, /* merge server configuration */
120
+
121
+ NULL, /* create location configuration */
122
+ NULL, /* merge location configuration */
123
+ };
124
+
125
+
126
+ ngx_module_t ngx_http_range_body_filter_module = {
127
+ NGX_MODULE_V1,
128
+ &ngx_http_range_body_filter_module_ctx, /* module context */
129
+ NULL, /* module directives */
130
+ NGX_HTTP_MODULE, /* module type */
131
+ NULL, /* init master */
132
+ NULL, /* init module */
133
+ NULL, /* init process */
134
+ NULL, /* init thread */
135
+ NULL, /* exit thread */
136
+ NULL, /* exit process */
137
+ NULL, /* exit master */
138
+ NGX_MODULE_V1_PADDING
139
+ };
140
+
141
+
142
+ static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
143
+ static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
144
+
145
+
146
+ static ngx_int_t
147
+ ngx_http_range_header_filter(ngx_http_request_t *r)
148
+ {
149
+ time_t if_range;
150
+ ngx_http_core_loc_conf_t *clcf;
151
+ ngx_http_range_filter_ctx_t *ctx;
152
+
153
+ if (r->http_version < NGX_HTTP_VERSION_10
154
+ || r->headers_out.status != NGX_HTTP_OK
155
+ || r != r->main
156
+ || r->headers_out.content_length_n == -1
157
+ || !r->allow_ranges)
158
+ {
159
+ return ngx_http_next_header_filter(r);
160
+ }
161
+
162
+ clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
163
+
164
+ if (clcf->max_ranges == 0) {
165
+ return ngx_http_next_header_filter(r);
166
+ }
167
+
168
+ if (r->headers_in.range == NULL
169
+ || r->headers_in.range->value.len < 7
170
+ || ngx_strncasecmp(r->headers_in.range->value.data,
171
+ (u_char *) "bytes=", 6)
172
+ != 0)
173
+ {
174
+ goto next_filter;
175
+ }
176
+
177
+ if (r->headers_in.if_range && r->headers_out.last_modified_time != -1) {
178
+
179
+ if_range = ngx_http_parse_time(r->headers_in.if_range->value.data,
180
+ r->headers_in.if_range->value.len);
181
+
182
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
183
+ "http ir:%d lm:%d",
184
+ if_range, r->headers_out.last_modified_time);
185
+
186
+ if (if_range != r->headers_out.last_modified_time) {
187
+ goto next_filter;
188
+ }
189
+ }
190
+
191
+ ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_range_filter_ctx_t));
192
+ if (ctx == NULL) {
193
+ return NGX_ERROR;
194
+ }
195
+
196
+ if (ngx_array_init(&ctx->ranges, r->pool, 1, sizeof(ngx_http_range_t))
197
+ != NGX_OK)
198
+ {
199
+ return NGX_ERROR;
200
+ }
201
+
202
+ switch (ngx_http_range_parse(r, ctx, clcf->max_ranges)) {
203
+
204
+ case NGX_OK:
205
+ ngx_http_set_ctx(r, ctx, ngx_http_range_body_filter_module);
206
+
207
+ r->headers_out.status = NGX_HTTP_PARTIAL_CONTENT;
208
+ r->headers_out.status_line.len = 0;
209
+
210
+ if (ctx->ranges.nelts == 1) {
211
+ return ngx_http_range_singlepart_header(r, ctx);
212
+ }
213
+
214
+ return ngx_http_range_multipart_header(r, ctx);
215
+
216
+ case NGX_HTTP_RANGE_NOT_SATISFIABLE:
217
+ return ngx_http_range_not_satisfiable(r);
218
+
219
+ case NGX_ERROR:
220
+ return NGX_ERROR;
221
+
222
+ default: /* NGX_DECLINED */
223
+ break;
224
+ }
225
+
226
+ next_filter:
227
+
228
+ r->headers_out.accept_ranges = ngx_list_push(&r->headers_out.headers);
229
+ if (r->headers_out.accept_ranges == NULL) {
230
+ return NGX_ERROR;
231
+ }
232
+
233
+ r->headers_out.accept_ranges->hash = 1;
234
+ ngx_str_set(&r->headers_out.accept_ranges->key, "Accept-Ranges");
235
+ ngx_str_set(&r->headers_out.accept_ranges->value, "bytes");
236
+
237
+ return ngx_http_next_header_filter(r);
238
+ }
239
+
240
+
241
+ static ngx_int_t
242
+ ngx_http_range_parse(ngx_http_request_t *r, ngx_http_range_filter_ctx_t *ctx,
243
+ ngx_uint_t ranges)
244
+ {
245
+ u_char *p;
246
+ off_t start, end, size, content_length;
247
+ ngx_uint_t suffix;
248
+ ngx_http_range_t *range;
249
+
250
+ p = r->headers_in.range->value.data + 6;
251
+ size = 0;
252
+ content_length = r->headers_out.content_length_n;
253
+
254
+ for ( ;; ) {
255
+ start = 0;
256
+ end = 0;
257
+ suffix = 0;
258
+
259
+ while (*p == ' ') { p++; }
260
+
261
+ if (*p != '-') {
262
+ if (*p < '0' || *p > '9') {
263
+ return NGX_HTTP_RANGE_NOT_SATISFIABLE;
264
+ }
265
+
266
+ while (*p >= '0' && *p <= '9') {
267
+ start = start * 10 + *p++ - '0';
268
+ }
269
+
270
+ while (*p == ' ') { p++; }
271
+
272
+ if (*p++ != '-') {
273
+ return NGX_HTTP_RANGE_NOT_SATISFIABLE;
274
+ }
275
+
276
+ while (*p == ' ') { p++; }
277
+
278
+ if (*p == ',' || *p == '\0') {
279
+ end = content_length;
280
+ goto found;
281
+ }
282
+
283
+ } else {
284
+ suffix = 1;
285
+ p++;
286
+ }
287
+
288
+ if (*p < '0' || *p > '9') {
289
+ return NGX_HTTP_RANGE_NOT_SATISFIABLE;
290
+ }
291
+
292
+ while (*p >= '0' && *p <= '9') {
293
+ end = end * 10 + *p++ - '0';
294
+ }
295
+
296
+ while (*p == ' ') { p++; }
297
+
298
+ if (*p != ',' && *p != '\0') {
299
+ return NGX_HTTP_RANGE_NOT_SATISFIABLE;
300
+ }
301
+
302
+ if (suffix) {
303
+ start = content_length - end;
304
+ end = content_length - 1;
305
+ }
306
+
307
+ if (end >= content_length) {
308
+ end = content_length;
309
+
310
+ } else {
311
+ end++;
312
+ }
313
+
314
+ found:
315
+
316
+ if (start < end) {
317
+ range = ngx_array_push(&ctx->ranges);
318
+ if (range == NULL) {
319
+ return NGX_ERROR;
320
+ }
321
+
322
+ range->start = start;
323
+ range->end = end;
324
+
325
+ size += end - start;
326
+
327
+ if (ranges-- == 0) {
328
+ return NGX_DECLINED;
329
+ }
330
+ }
331
+
332
+ if (*p++ != ',') {
333
+ break;
334
+ }
335
+ }
336
+
337
+ if (ctx->ranges.nelts == 0) {
338
+ return NGX_HTTP_RANGE_NOT_SATISFIABLE;
339
+ }
340
+
341
+ if (size > content_length) {
342
+ return NGX_DECLINED;
343
+ }
344
+
345
+ return NGX_OK;
346
+ }
347
+
348
+
349
+ static ngx_int_t
350
+ ngx_http_range_singlepart_header(ngx_http_request_t *r,
351
+ ngx_http_range_filter_ctx_t *ctx)
352
+ {
353
+ ngx_table_elt_t *content_range;
354
+ ngx_http_range_t *range;
355
+
356
+ content_range = ngx_list_push(&r->headers_out.headers);
357
+ if (content_range == NULL) {
358
+ return NGX_ERROR;
359
+ }
360
+
361
+ r->headers_out.content_range = content_range;
362
+
363
+ content_range->hash = 1;
364
+ ngx_str_set(&content_range->key, "Content-Range");
365
+
366
+ content_range->value.data = ngx_pnalloc(r->pool,
367
+ sizeof("bytes -/") - 1 + 3 * NGX_OFF_T_LEN);
368
+ if (content_range->value.data == NULL) {
369
+ return NGX_ERROR;
370
+ }
371
+
372
+ /* "Content-Range: bytes SSSS-EEEE/TTTT" header */
373
+
374
+ range = ctx->ranges.elts;
375
+
376
+ content_range->value.len = ngx_sprintf(content_range->value.data,
377
+ "bytes %O-%O/%O",
378
+ range->start, range->end - 1,
379
+ r->headers_out.content_length_n)
380
+ - content_range->value.data;
381
+
382
+ r->headers_out.content_length_n = range->end - range->start;
383
+
384
+ if (r->headers_out.content_length) {
385
+ r->headers_out.content_length->hash = 0;
386
+ r->headers_out.content_length = NULL;
387
+ }
388
+
389
+ return ngx_http_next_header_filter(r);
390
+ }
391
+
392
+
393
+ static ngx_int_t
394
+ ngx_http_range_multipart_header(ngx_http_request_t *r,
395
+ ngx_http_range_filter_ctx_t *ctx)
396
+ {
397
+ size_t len;
398
+ ngx_uint_t i;
399
+ ngx_http_range_t *range;
400
+ ngx_atomic_uint_t boundary;
401
+
402
+ len = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN
403
+ + sizeof(CRLF "Content-Type: ") - 1
404
+ + r->headers_out.content_type.len
405
+ + sizeof(CRLF "Content-Range: bytes ") - 1;
406
+
407
+ if (r->headers_out.charset.len) {
408
+ len += sizeof("; charset=") - 1 + r->headers_out.charset.len;
409
+ }
410
+
411
+ ctx->boundary_header.data = ngx_pnalloc(r->pool, len);
412
+ if (ctx->boundary_header.data == NULL) {
413
+ return NGX_ERROR;
414
+ }
415
+
416
+ boundary = ngx_next_temp_number(0);
417
+
418
+ /*
419
+ * The boundary header of the range:
420
+ * CRLF
421
+ * "--0123456789" CRLF
422
+ * "Content-Type: image/jpeg" CRLF
423
+ * "Content-Range: bytes "
424
+ */
425
+
426
+ if (r->headers_out.charset.len) {
427
+ ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,
428
+ CRLF "--%0muA" CRLF
429
+ "Content-Type: %V; charset=%V" CRLF
430
+ "Content-Range: bytes ",
431
+ boundary,
432
+ &r->headers_out.content_type,
433
+ &r->headers_out.charset)
434
+ - ctx->boundary_header.data;
435
+
436
+ r->headers_out.charset.len = 0;
437
+
438
+ } else if (r->headers_out.content_type.len) {
439
+ ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,
440
+ CRLF "--%0muA" CRLF
441
+ "Content-Type: %V" CRLF
442
+ "Content-Range: bytes ",
443
+ boundary,
444
+ &r->headers_out.content_type)
445
+ - ctx->boundary_header.data;
446
+
447
+ } else {
448
+ ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,
449
+ CRLF "--%0muA" CRLF
450
+ "Content-Range: bytes ",
451
+ boundary)
452
+ - ctx->boundary_header.data;
453
+ }
454
+
455
+ r->headers_out.content_type.data =
456
+ ngx_pnalloc(r->pool,
457
+ sizeof("Content-Type: multipart/byteranges; boundary=") - 1
458
+ + NGX_ATOMIC_T_LEN);
459
+
460
+ if (r->headers_out.content_type.data == NULL) {
461
+ return NGX_ERROR;
462
+ }
463
+
464
+ r->headers_out.content_type_lowcase = NULL;
465
+
466
+ /* "Content-Type: multipart/byteranges; boundary=0123456789" */
467
+
468
+ r->headers_out.content_type.len =
469
+ ngx_sprintf(r->headers_out.content_type.data,
470
+ "multipart/byteranges; boundary=%0muA",
471
+ boundary)
472
+ - r->headers_out.content_type.data;
473
+
474
+ r->headers_out.content_type_len = r->headers_out.content_type.len;
475
+
476
+ /* the size of the last boundary CRLF "--0123456789--" CRLF */
477
+
478
+ len = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN + sizeof("--" CRLF) - 1;
479
+
480
+ range = ctx->ranges.elts;
481
+ for (i = 0; i < ctx->ranges.nelts; i++) {
482
+
483
+ /* the size of the range: "SSSS-EEEE/TTTT" CRLF CRLF */
484
+
485
+ range[i].content_range.data =
486
+ ngx_pnalloc(r->pool, 3 * NGX_OFF_T_LEN + 2 + 4);
487
+
488
+ if (range[i].content_range.data == NULL) {
489
+ return NGX_ERROR;
490
+ }
491
+
492
+ range[i].content_range.len = ngx_sprintf(range[i].content_range.data,
493
+ "%O-%O/%O" CRLF CRLF,
494
+ range[i].start, range[i].end - 1,
495
+ r->headers_out.content_length_n)
496
+ - range[i].content_range.data;
497
+
498
+ len += ctx->boundary_header.len + range[i].content_range.len
499
+ + (size_t) (range[i].end - range[i].start);
500
+ }
501
+
502
+ r->headers_out.content_length_n = len;
503
+
504
+ if (r->headers_out.content_length) {
505
+ r->headers_out.content_length->hash = 0;
506
+ r->headers_out.content_length = NULL;
507
+ }
508
+
509
+ return ngx_http_next_header_filter(r);
510
+ }
511
+
512
+
513
+ static ngx_int_t
514
+ ngx_http_range_not_satisfiable(ngx_http_request_t *r)
515
+ {
516
+ ngx_table_elt_t *content_range;
517
+
518
+ r->headers_out.status = NGX_HTTP_RANGE_NOT_SATISFIABLE;
519
+
520
+ content_range = ngx_list_push(&r->headers_out.headers);
521
+ if (content_range == NULL) {
522
+ return NGX_ERROR;
523
+ }
524
+
525
+ r->headers_out.content_range = content_range;
526
+
527
+ content_range->hash = 1;
528
+ ngx_str_set(&content_range->key, "Content-Range");
529
+
530
+ content_range->value.data = ngx_pnalloc(r->pool,
531
+ sizeof("bytes */") - 1 + NGX_OFF_T_LEN);
532
+ if (content_range->value.data == NULL) {
533
+ return NGX_ERROR;
534
+ }
535
+
536
+ content_range->value.len = ngx_sprintf(content_range->value.data,
537
+ "bytes */%O",
538
+ r->headers_out.content_length_n)
539
+ - content_range->value.data;
540
+
541
+ ngx_http_clear_content_length(r);
542
+
543
+ return NGX_HTTP_RANGE_NOT_SATISFIABLE;
544
+ }
545
+
546
+
547
+ static ngx_int_t
548
+ ngx_http_range_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
549
+ {
550
+ ngx_http_range_filter_ctx_t *ctx;
551
+
552
+ if (in == NULL) {
553
+ return ngx_http_next_body_filter(r, in);
554
+ }
555
+
556
+ ctx = ngx_http_get_module_ctx(r, ngx_http_range_body_filter_module);
557
+
558
+ if (ctx == NULL) {
559
+ return ngx_http_next_body_filter(r, in);
560
+ }
561
+
562
+ if (ctx->ranges.nelts == 1) {
563
+ return ngx_http_range_singlepart_body(r, ctx, in);
564
+ }
565
+
566
+ /*
567
+ * multipart ranges are supported only if whole body is in a single buffer
568
+ */
569
+
570
+ if (ngx_buf_special(in->buf)) {
571
+ return ngx_http_next_body_filter(r, in);
572
+ }
573
+
574
+ if (ngx_http_range_test_overlapped(r, ctx, in) != NGX_OK) {
575
+ return NGX_ERROR;
576
+ }
577
+
578
+ return ngx_http_range_multipart_body(r, ctx, in);
579
+ }
580
+
581
+
582
+ static ngx_int_t
583
+ ngx_http_range_test_overlapped(ngx_http_request_t *r,
584
+ ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in)
585
+ {
586
+ off_t start, last;
587
+ ngx_buf_t *buf;
588
+ ngx_uint_t i;
589
+ ngx_http_range_t *range;
590
+
591
+ if (ctx->offset) {
592
+ goto overlapped;
593
+ }
594
+
595
+ buf = in->buf;
596
+
597
+ if (!buf->last_buf) {
598
+ start = ctx->offset;
599
+ last = ctx->offset + ngx_buf_size(buf);
600
+
601
+ range = ctx->ranges.elts;
602
+ for (i = 0; i < ctx->ranges.nelts; i++) {
603
+ if (start > range[i].start || last < range[i].end) {
604
+ goto overlapped;
605
+ }
606
+ }
607
+ }
608
+
609
+ ctx->offset = ngx_buf_size(buf);
610
+
611
+ return NGX_OK;
612
+
613
+ overlapped:
614
+
615
+ ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
616
+ "range in overlapped buffers");
617
+
618
+ return NGX_ERROR;
619
+ }
620
+
621
+
622
+ static ngx_int_t
623
+ ngx_http_range_singlepart_body(ngx_http_request_t *r,
624
+ ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in)
625
+ {
626
+ off_t start, last;
627
+ ngx_buf_t *buf;
628
+ ngx_chain_t *out, *cl, **ll;
629
+ ngx_http_range_t *range;
630
+
631
+ out = NULL;
632
+ ll = &out;
633
+ range = ctx->ranges.elts;
634
+
635
+ for (cl = in; cl; cl = cl->next) {
636
+
637
+ buf = cl->buf;
638
+
639
+ start = ctx->offset;
640
+ last = ctx->offset + ngx_buf_size(buf);
641
+
642
+ ctx->offset = last;
643
+
644
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
645
+ "http range body buf: %O-%O", start, last);
646
+
647
+ if (ngx_buf_special(buf)) {
648
+ *ll = cl;
649
+ ll = &cl->next;
650
+ continue;
651
+ }
652
+
653
+ if (range->end <= start || range->start >= last) {
654
+
655
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
656
+ "http range body skip");
657
+
658
+ if (buf->in_file) {
659
+ buf->file_pos = buf->file_last;
660
+ }
661
+
662
+ buf->pos = buf->last;
663
+ buf->sync = 1;
664
+
665
+ continue;
666
+ }
667
+
668
+ if (range->start > start) {
669
+
670
+ if (buf->in_file) {
671
+ buf->file_pos += range->start - start;
672
+ }
673
+
674
+ if (ngx_buf_in_memory(buf)) {
675
+ buf->pos += (size_t) (range->start - start);
676
+ }
677
+ }
678
+
679
+ if (range->end <= last) {
680
+
681
+ if (buf->in_file) {
682
+ buf->file_last -= last - range->end;
683
+ }
684
+
685
+ if (ngx_buf_in_memory(buf)) {
686
+ buf->last -= (size_t) (last - range->end);
687
+ }
688
+
689
+ buf->last_buf = 1;
690
+ *ll = cl;
691
+ cl->next = NULL;
692
+
693
+ break;
694
+ }
695
+
696
+ *ll = cl;
697
+ ll = &cl->next;
698
+ }
699
+
700
+ if (out == NULL) {
701
+ return NGX_OK;
702
+ }
703
+
704
+ return ngx_http_next_body_filter(r, out);
705
+ }
706
+
707
+
708
+ static ngx_int_t
709
+ ngx_http_range_multipart_body(ngx_http_request_t *r,
710
+ ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in)
711
+ {
712
+ ngx_buf_t *b, *buf;
713
+ ngx_uint_t i;
714
+ ngx_chain_t *out, *hcl, *rcl, *dcl, **ll;
715
+ ngx_http_range_t *range;
716
+
717
+ ll = &out;
718
+ buf = in->buf;
719
+ range = ctx->ranges.elts;
720
+
721
+ for (i = 0; i < ctx->ranges.nelts; i++) {
722
+
723
+ /*
724
+ * The boundary header of the range:
725
+ * CRLF
726
+ * "--0123456789" CRLF
727
+ * "Content-Type: image/jpeg" CRLF
728
+ * "Content-Range: bytes "
729
+ */
730
+
731
+ b = ngx_calloc_buf(r->pool);
732
+ if (b == NULL) {
733
+ return NGX_ERROR;
734
+ }
735
+
736
+ b->memory = 1;
737
+ b->pos = ctx->boundary_header.data;
738
+ b->last = ctx->boundary_header.data + ctx->boundary_header.len;
739
+
740
+ hcl = ngx_alloc_chain_link(r->pool);
741
+ if (hcl == NULL) {
742
+ return NGX_ERROR;
743
+ }
744
+
745
+ hcl->buf = b;
746
+
747
+
748
+ /* "SSSS-EEEE/TTTT" CRLF CRLF */
749
+
750
+ b = ngx_calloc_buf(r->pool);
751
+ if (b == NULL) {
752
+ return NGX_ERROR;
753
+ }
754
+
755
+ b->temporary = 1;
756
+ b->pos = range[i].content_range.data;
757
+ b->last = range[i].content_range.data + range[i].content_range.len;
758
+
759
+ rcl = ngx_alloc_chain_link(r->pool);
760
+ if (rcl == NULL) {
761
+ return NGX_ERROR;
762
+ }
763
+
764
+ rcl->buf = b;
765
+
766
+
767
+ /* the range data */
768
+
769
+ b = ngx_calloc_buf(r->pool);
770
+ if (b == NULL) {
771
+ return NGX_ERROR;
772
+ }
773
+
774
+ b->in_file = buf->in_file;
775
+ b->temporary = buf->temporary;
776
+ b->memory = buf->memory;
777
+ b->mmap = buf->mmap;
778
+ b->file = buf->file;
779
+
780
+ if (buf->in_file) {
781
+ b->file_pos = buf->file_pos + range[i].start;
782
+ b->file_last = buf->file_pos + range[i].end;
783
+ }
784
+
785
+ if (ngx_buf_in_memory(buf)) {
786
+ b->pos = buf->pos + (size_t) range[i].start;
787
+ b->last = buf->pos + (size_t) range[i].end;
788
+ }
789
+
790
+ dcl = ngx_alloc_chain_link(r->pool);
791
+ if (dcl == NULL) {
792
+ return NGX_ERROR;
793
+ }
794
+
795
+ dcl->buf = b;
796
+
797
+ *ll = hcl;
798
+ hcl->next = rcl;
799
+ rcl->next = dcl;
800
+ ll = &dcl->next;
801
+ }
802
+
803
+ /* the last boundary CRLF "--0123456789--" CRLF */
804
+
805
+ b = ngx_calloc_buf(r->pool);
806
+ if (b == NULL) {
807
+ return NGX_ERROR;
808
+ }
809
+
810
+ b->temporary = 1;
811
+ b->last_buf = 1;
812
+
813
+ b->pos = ngx_pnalloc(r->pool, sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN
814
+ + sizeof("--" CRLF) - 1);
815
+ if (b->pos == NULL) {
816
+ return NGX_ERROR;
817
+ }
818
+
819
+ b->last = ngx_cpymem(b->pos, ctx->boundary_header.data,
820
+ sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN);
821
+ *b->last++ = '-'; *b->last++ = '-';
822
+ *b->last++ = CR; *b->last++ = LF;
823
+
824
+ hcl = ngx_alloc_chain_link(r->pool);
825
+ if (hcl == NULL) {
826
+ return NGX_ERROR;
827
+ }
828
+
829
+ hcl->buf = b;
830
+ hcl->next = NULL;
831
+
832
+ *ll = hcl;
833
+
834
+ return ngx_http_next_body_filter(r, out);
835
+ }
836
+
837
+
838
+ static ngx_int_t
839
+ ngx_http_range_header_filter_init(ngx_conf_t *cf)
840
+ {
841
+ ngx_http_next_header_filter = ngx_http_top_header_filter;
842
+ ngx_http_top_header_filter = ngx_http_range_header_filter;
843
+
844
+ return NGX_OK;
845
+ }
846
+
847
+
848
+ static ngx_int_t
849
+ ngx_http_range_body_filter_init(ngx_conf_t *cf)
850
+ {
851
+ ngx_http_next_body_filter = ngx_http_top_body_filter;
852
+ ngx_http_top_body_filter = ngx_http_range_body_filter;
853
+
854
+ return NGX_OK;
855
+ }