passenger 4.0.59 → 4.0.60
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/CHANGELOG +15 -0
- data/bin/passenger-install-apache2-module +2 -1
- data/bin/passenger-install-nginx-module +8 -2
- data/ext/apache2/Hooks.cpp +21 -2
- data/ext/apache2/MergeDirConfig.cpp +40 -40
- data/ext/common/ApplicationPool2/Group.h +14 -10
- data/ext/common/ApplicationPool2/Implementation.cpp +13 -7
- data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
- data/ext/common/Constants.h +1 -1
- data/ext/nginx/ContentHandler.c +17 -1
- data/lib/phusion_passenger.rb +4 -5
- data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +4 -3
- data/lib/phusion_passenger/platform_info/openssl.rb +61 -0
- data/lib/phusion_passenger/standalone/runtime_installer.rb +27 -22
- data/packaging/debian/LICENSE.md +19 -0
- data/packaging/debian/README.md +320 -0
- data/packaging/debian/Vagrantfile +25 -0
- data/packaging/debian/build +210 -0
- data/packaging/debian/debian_specs/nginx/changelog +1989 -0
- data/packaging/debian/debian_specs/nginx/compat.erb +5 -0
- data/packaging/debian/debian_specs/nginx/conf/fastcgi.conf +25 -0
- data/packaging/debian/debian_specs/nginx/conf/fastcgi_params +24 -0
- data/packaging/debian/debian_specs/nginx/conf/koi-utf +109 -0
- data/packaging/debian/debian_specs/nginx/conf/koi-win +103 -0
- data/packaging/debian/debian_specs/nginx/conf/mime.types +89 -0
- data/packaging/debian/debian_specs/nginx/conf/nginx.conf.erb +97 -0
- data/packaging/debian/debian_specs/nginx/conf/proxy_params +4 -0
- data/packaging/debian/debian_specs/nginx/conf/scgi_params +16 -0
- data/packaging/debian/debian_specs/nginx/conf/sites-available/default.erb +93 -0
- data/packaging/debian/debian_specs/nginx/conf/snippets/fastcgi-php.conf +13 -0
- data/packaging/debian/debian_specs/nginx/conf/snippets/snakeoil.conf +5 -0
- data/packaging/debian/debian_specs/nginx/conf/uwsgi_params +16 -0
- data/packaging/debian/debian_specs/nginx/conf/win-utf +125 -0
- data/packaging/debian/debian_specs/nginx/control.erb +226 -0
- data/packaging/debian/debian_specs/nginx/copyright +196 -0
- data/packaging/debian/debian_specs/nginx/debian-full.lintian-overrides +1 -0
- data/packaging/debian/debian_specs/nginx/gbp.conf +2 -0
- data/packaging/debian/debian_specs/nginx/help/docs/fcgiwrap +14 -0
- data/packaging/debian/debian_specs/nginx/help/docs/php +119 -0
- data/packaging/debian/debian_specs/nginx/help/docs/support-irc +28 -0
- data/packaging/debian/debian_specs/nginx/help/docs/upstream +51 -0
- data/packaging/debian/debian_specs/nginx/help/examples/drupal +114 -0
- data/packaging/debian/debian_specs/nginx/help/examples/http +59 -0
- data/packaging/debian/debian_specs/nginx/help/examples/mail +30 -0
- data/packaging/debian/debian_specs/nginx/help/examples/mailman +59 -0
- data/packaging/debian/debian_specs/nginx/help/examples/nginx.conf +34 -0
- data/packaging/debian/debian_specs/nginx/help/examples/nginx_modsite +162 -0
- data/packaging/debian/debian_specs/nginx/help/examples/virtual_hosts +155 -0
- data/packaging/debian/debian_specs/nginx/help/examples/wordpress +74 -0
- data/packaging/debian/debian_specs/nginx/helpers.rb +41 -0
- data/packaging/debian/debian_specs/nginx/index-debian.html.in +32 -0
- data/packaging/debian/debian_specs/nginx/index-ubuntu.html.in +32 -0
- data/packaging/debian/debian_specs/nginx/index.html.erb +10 -0
- data/packaging/debian/debian_specs/nginx/modules/README.Modules-versions +65 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/README.markdown +510 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/config +5 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki +395 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ddebug.h +119 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.c +348 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.h +80 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c +826 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.h +26 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.c +716 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.h +26 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.c +380 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h +52 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/util/build.sh +32 -0
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/valgrind.suppress +215 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ChangeLog +35 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/LICENSE +25 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/README.md +93 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/config +4 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ngx_http_auth_pam_module.c +462 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/CHANGES +66 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/LICENSE +26 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/README.md +171 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/TODO.md +7 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/config +21 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/ngx_cache_purge_module.c +1803 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/README +29 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/config +9 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/ngx_http_dav_ext_module.c +824 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README +139 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README_AUTO_LIB +395 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/TODO +1 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/array +10 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/palloc +8 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/build +597 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_replacements +5 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_types +12 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_args +22 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_locs +25 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_macros +35 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/contexts +22 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/header_files +3 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/headers +4 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/module_dependencies +5 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/modules_optional +15 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/prefixes +2 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/array.h +7 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_cmd_basic.h +43 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_merge.h +78 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/palloc.h +6 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/text/autogen +12 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/config +49 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/action_macros +63 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/conf_cmds +62 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/modules/set_var +124 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/patches/more_logging_info +48 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/upstream/list +45 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/README +12 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/config +4 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/ngx_http_set_var_examples_module.c +136 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/ngx_auto_lib_core +797 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/CHANGES +17 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/LICENSE +24 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_array.h +113 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_basic.h +2203 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_extra.h +5423 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_merge.h +227 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.c +72 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.h +98 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_includes.h +66 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_palloc.h +112 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/auto_config +16 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/expose_rewrite_functions +291 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/rewrite_phase_handler +19 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/md5.h +117 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/murmurhash2.c +77 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/sha.h +200 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.c +155 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.h +58 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.c +43 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.h +5 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.c +129 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.h +30 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.c +192 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.h +21 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.c +396 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.h +44 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.c +72 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.h +171 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.c +57 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.h +12 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.c +82 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.h +45 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.c +138 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.h +3 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http_headers.h +35 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.c +3 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.h +165 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_parse.h +67 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.c +583 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.h +22 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.c +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.h +12 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.c +215 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.h +7 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.c +103 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.h +26 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.c +602 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.h +44 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.c +434 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.h +37 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string_util.h +14 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.c +205 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.h +27 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.c +45 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.h +6 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/LICENSE +25 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/README.markdown +1850 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/config +5 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/doc/HttpEchoModule.wiki +1558 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ddebug.h +109 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.c +344 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.h +25 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.c +282 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.h +15 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.c +183 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.h +16 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.c +429 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.h +18 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.c +178 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.h +13 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.c +667 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.h +137 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.c +452 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.h +31 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.c +208 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.h +16 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.c +788 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.h +19 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.c +96 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.h +13 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.c +298 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.h +58 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.c +110 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.h +9 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/build.sh +45 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/releng +8 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/wiki2pod.pl +131 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/valgrind.suppress +38 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/LICENCE +24 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/README +206 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/changelog.txt +54 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/config +26 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/protocol.txt +191 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.c +59 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.h +73 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.c +783 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.h +31 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module_setup.c +361 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_types.h +120 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.c +1180 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.h +1 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.c +146 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.h +5 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_store.h +51 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.c +178 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.h +5 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.c +246 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.h +9 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/Changes +51 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/README.markdown +6954 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/config +363 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/doc/HttpLuaModule.wiki +5898 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/dtrace/ngx_lua_provider.d +61 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/Makefile +3 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/lib/RecvUntil.pm +138 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/t/sanity.t +140 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/api/ngx_http_lua_api.h +52 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ddebug.h +82 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.c +377 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.h +22 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_api.c +77 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.c +537 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.c +632 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.h +31 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.c +296 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.h +24 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.c +175 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.c +887 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.h +22 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_common.h +478 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.c +67 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.h +19 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.c +148 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.c +369 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.h +26 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.c +483 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.c +379 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.h +23 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.c +216 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.h +23 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.c +1081 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.h +56 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.c +58 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.h +33 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.c +302 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.h +29 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.c +1370 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.h +22 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.c +782 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.h +22 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.c +625 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.h +23 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.c +42 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.h +23 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.c +320 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.h +25 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.c +300 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.c +227 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.h +22 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.c +252 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_module.c +924 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.c +184 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.h +21 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.c +794 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.h +28 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.c +106 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.h +23 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.c +94 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.h +13 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_probe.h +85 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.c +2468 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.h +22 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.c +1169 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.c +252 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.h +19 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.c +351 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.h +22 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.c +538 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.h +86 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.c +216 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.h +15 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.c +1844 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.h +52 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.c +191 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.c +5314 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.h +156 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.c +1624 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.h +56 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.c +704 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.c +1741 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.h +46 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.c +278 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.h +21 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.c +661 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.c +110 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.c +283 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.h +36 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.c +3972 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.h +423 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.c +499 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.h +20 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.c +64 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.h +17 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/tapset/ngx_lua.stp +5 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build.sh +39 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build2.sh +55 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/fix-comments +27 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/gdbinit +415 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/ngx-links +62 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/reindex +64 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/releng +8 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/retab +8 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/revim +102 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/run_test.sh +10 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/update-readme.sh +4 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/valgrind.suppress +144 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/CHANGES +107 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/LICENSE +25 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/Makefile +8 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/README +329 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/config +3 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/ngx_http_uploadprogress_module.c +1774 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/README +53 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/config +3 -0
- data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/ngx_http_upstream_fair_module.c +1356 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/CHANGELOG.md +37 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/HACKING.md +24 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/LICENSE +20 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/README.rst +182 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/config +8 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/nginx-0.6-support.patch +23 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/ngx_http_fancyindex_module.c +1305 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.awk +52 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.h +103 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.html +102 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/CHANGES +37 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/README +141 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/config +3 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.google_code_home_page.wiki +120 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.html +199 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.wiki +123 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/ngx_http_subs_filter_module.c +1298 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/README +275 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/AutoInstall.pm +820 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install.pm +470 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/AutoInstall.pm +82 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Base.pm +83 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Can.pm +81 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Fetch.pm +93 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Include.pm +34 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Makefile.pm +415 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Metadata.pm +716 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/TestBase.pm +29 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Win32.pm +64 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/WriteAll.pm +63 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Spiffy.pm +539 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base.pm +682 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base/Filter.pm +341 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder.pm +1413 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder/Module.pm +81 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/More.pm +735 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx.pm +315 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/LWP.pm +524 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Socket.pm +1749 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Util.pm +874 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs.t +136 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_capture.t +32 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_fix_string.t +32 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_regex.t +108 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_types.t +59 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/test.sh +5 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/update-readme.sh +7 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2google_code_homepage.pl +29 -0
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2pod.pl +129 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.NEWS +135 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.README.Debian +45 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.dirs.erb +32 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.install +3 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.lintian-overrides +2 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.manpages +1 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.nginx.default +10 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.nginx.init.erb +214 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.nginx.logrotate +18 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.nginx.service.erb +37 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.postinst.erb +66 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.postrm.erb +46 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.preinst +47 -0
- data/packaging/debian/debian_specs/nginx/nginx-common.prerm.erb +28 -0
- data/packaging/debian/debian_specs/nginx/nginx-doc.docs +2 -0
- data/packaging/debian/debian_specs/nginx/nginx-doc.examples +1 -0
- data/packaging/debian/debian_specs/nginx/nginx-extras.install.erb +17 -0
- data/packaging/debian/debian_specs/nginx/nginx-extras.lintian-overrides +1 -0
- data/packaging/debian/debian_specs/nginx/nginx-extras.postinst.erb +44 -0
- data/packaging/debian/debian_specs/nginx/nginx-extras.prerm +22 -0
- data/packaging/debian/debian_specs/nginx/nginx.1 +47 -0
- data/packaging/debian/debian_specs/nginx/patches/perl-use-dpkg-buildflags.patch +23 -0
- data/packaging/debian/debian_specs/nginx/patches/series +1 -0
- data/packaging/debian/debian_specs/nginx/rules.erb +185 -0
- data/packaging/debian/debian_specs/nginx/source/format +1 -0
- data/packaging/debian/debian_specs/nginx/tests/control +4 -0
- data/packaging/debian/debian_specs/nginx/ufw/nginx +14 -0
- data/packaging/debian/debian_specs/nginx/upstream/signing-key.asc +34 -0
- data/packaging/debian/debian_specs/nginx/watch +3 -0
- data/packaging/debian/debian_specs/passenger/README.Debian +12 -0
- data/packaging/debian/debian_specs/passenger/changelog +316 -0
- data/packaging/debian/debian_specs/passenger/compat +1 -0
- data/packaging/debian/debian_specs/passenger/control.erb +123 -0
- data/packaging/debian/debian_specs/passenger/copyright +385 -0
- data/packaging/debian/debian_specs/passenger/helpers.rb +24 -0
- data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.install +3 -0
- data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.postinst +36 -0
- data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.prerm +15 -0
- data/packaging/debian/debian_specs/passenger/locations.ini.erb +14 -0
- data/packaging/debian/debian_specs/passenger/passenger-dev.install.erb +3 -0
- data/packaging/debian/debian_specs/passenger/passenger-doc.install.erb +2 -0
- data/packaging/debian/debian_specs/passenger/passenger.conf +6 -0
- data/packaging/debian/debian_specs/passenger/passenger.docs +4 -0
- data/packaging/debian/debian_specs/passenger/passenger.install.erb +16 -0
- data/packaging/debian/debian_specs/passenger/passenger.load +3 -0
- data/packaging/debian/debian_specs/passenger/passenger.manpages +3 -0
- data/packaging/debian/debian_specs/passenger/passenger_free_ruby.c +29 -0
- data/packaging/debian/debian_specs/passenger/passenger_ruby_utils.c +54 -0
- data/packaging/debian/debian_specs/passenger/passenger_system_ruby.c.erb +37 -0
- data/packaging/debian/debian_specs/passenger/patches/series +0 -0
- data/packaging/debian/debian_specs/passenger/rules.erb +84 -0
- data/packaging/debian/debian_specs/passenger/source/format +1 -0
- data/packaging/debian/debian_specs/passenger_enterprise/README.Debian +12 -0
- data/packaging/debian/debian_specs/passenger_enterprise/changelog +316 -0
- data/packaging/debian/debian_specs/passenger_enterprise/compat +1 -0
- data/packaging/debian/debian_specs/passenger_enterprise/control.erb +123 -0
- data/packaging/debian/debian_specs/passenger_enterprise/copyright +385 -0
- data/packaging/debian/debian_specs/passenger_enterprise/helpers.rb +2 -0
- data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.install +3 -0
- data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.postinst +36 -0
- data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.prerm +15 -0
- data/packaging/debian/debian_specs/passenger_enterprise/locations.ini.erb +14 -0
- data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-dev.install.erb +3 -0
- data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-doc.install.erb +2 -0
- data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.docs +4 -0
- data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.install.erb +14 -0
- data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.manpages +3 -0
- data/packaging/debian/debian_specs/passenger_enterprise/passenger.conf +6 -0
- data/packaging/debian/debian_specs/passenger_enterprise/passenger.load +3 -0
- data/packaging/debian/debian_specs/passenger_enterprise/passenger_free_ruby.c.erb +1 -0
- data/packaging/debian/debian_specs/passenger_enterprise/passenger_ruby_utils.c.erb +1 -0
- data/packaging/debian/debian_specs/passenger_enterprise/passenger_system_ruby.c.erb +1 -0
- data/packaging/debian/debian_specs/passenger_enterprise/patches/series +0 -0
- data/packaging/debian/debian_specs/passenger_enterprise/rules.erb +84 -0
- data/packaging/debian/debian_specs/passenger_enterprise/source/format +1 -0
- data/packaging/debian/docker_images/Makefile +38 -0
- data/packaging/debian/docker_images/buildbox/CONTAINER_VERSION.txt +0 -0
- data/packaging/debian/docker_images/buildbox/Dockerfile +3 -0
- data/packaging/debian/docker_images/buildbox/Gemfile +9 -0
- data/packaging/debian/docker_images/buildbox/Gemfile.lock +42 -0
- data/packaging/debian/docker_images/buildbox/install.sh +85 -0
- data/packaging/debian/docker_images/buildbox/pbuilderrc +4 -0
- data/packaging/debian/docker_images/buildbox/sudoers.conf +6 -0
- data/packaging/debian/docker_images/setup-buildbox-docker-image +7 -0
- data/packaging/debian/docker_images/setup-testbox-docker-image-debian-6 +7 -0
- data/packaging/debian/docker_images/setup-testbox-docker-image-debian-7 +7 -0
- data/packaging/debian/docker_images/setup-testbox-docker-image-debian-8 +7 -0
- data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-12.04 +7 -0
- data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-14.04 +7 -0
- data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.04 +7 -0
- data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.10 +7 -0
- data/packaging/debian/docker_images/testbox-debian-6/Dockerfile +3 -0
- data/packaging/debian/docker_images/testbox-debian-6/Gemfile +2 -0
- data/packaging/debian/docker_images/testbox-debian-6/Gemfile.lock +23 -0
- data/packaging/debian/docker_images/testbox-debian-6/argparse.py +2374 -0
- data/packaging/debian/docker_images/testbox-debian-6/install.sh +78 -0
- data/packaging/debian/docker_images/testbox-debian-7/Dockerfile +3 -0
- data/packaging/debian/docker_images/testbox-debian-7/Gemfile +2 -0
- data/packaging/debian/docker_images/testbox-debian-7/Gemfile.lock +23 -0
- data/packaging/debian/docker_images/testbox-debian-7/install.sh +71 -0
- data/packaging/debian/docker_images/testbox-debian-8/Dockerfile +3 -0
- data/packaging/debian/docker_images/testbox-debian-8/Gemfile +2 -0
- data/packaging/debian/docker_images/testbox-debian-8/Gemfile.lock +23 -0
- data/packaging/debian/docker_images/testbox-debian-8/install.sh +70 -0
- data/packaging/debian/docker_images/testbox-ubuntu-12.04/Dockerfile +3 -0
- data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile +2 -0
- data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile.lock +23 -0
- data/packaging/debian/docker_images/testbox-ubuntu-12.04/install.sh +69 -0
- data/packaging/debian/docker_images/testbox-ubuntu-14.04/Dockerfile +3 -0
- data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile +2 -0
- data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile.lock +23 -0
- data/packaging/debian/docker_images/testbox-ubuntu-14.04/install.sh +69 -0
- data/packaging/debian/docker_images/testbox-ubuntu-15.04/Dockerfile +3 -0
- data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile +2 -0
- data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile.lock +23 -0
- data/packaging/debian/docker_images/testbox-ubuntu-15.04/install.sh +69 -0
- data/packaging/debian/docker_images/testbox-ubuntu-15.10/Dockerfile +3 -0
- data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile +2 -0
- data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile.lock +23 -0
- data/packaging/debian/docker_images/testbox-ubuntu-15.10/install.sh +69 -0
- data/packaging/debian/internal/build/Rakefile +235 -0
- data/packaging/debian/internal/build/build-passenger-orig-tarball.sh +76 -0
- data/packaging/debian/internal/build/build-source-package.rb +121 -0
- data/packaging/debian/internal/build/download-nginx-orig-tarball.sh +17 -0
- data/packaging/debian/internal/build/rakefile_support.rb +96 -0
- data/packaging/debian/internal/build/setup-environment-essentials.sh +15 -0
- data/packaging/debian/internal/build/setup-environment.sh +29 -0
- data/packaging/debian/internal/lib/distro_info.rb +82 -0
- data/packaging/debian/internal/lib/distro_info.sh +303 -0
- data/packaging/debian/internal/lib/distro_info.sh.erb +65 -0
- data/packaging/debian/internal/lib/library.sh +83 -0
- data/packaging/debian/internal/lib/preprocessor.rb +173 -0
- data/packaging/debian/internal/lib/tracking.rb +95 -0
- data/packaging/debian/internal/lib/tracking_category.rb +45 -0
- data/packaging/debian/internal/lib/tracking_database.rb +132 -0
- data/packaging/debian/internal/lib/tracking_task.rb +148 -0
- data/packaging/debian/internal/lib/utils.rb +78 -0
- data/packaging/debian/internal/publish/Rakefile +97 -0
- data/packaging/debian/internal/publish/oss-binaries.phusionpassenger.com-fingerprint.txt +1 -0
- data/packaging/debian/internal/publish/packagecloud_fingerprint.txt +1 -0
- data/packaging/debian/internal/publish/passenger_website_fingerprint.txt +1 -0
- data/packaging/debian/internal/publish/preinit.sh +7 -0
- data/packaging/debian/internal/publish/rakefile_support.rb +183 -0
- data/packaging/debian/internal/scripts/gpg_noninteractive/gpg +11 -0
- data/packaging/debian/internal/scripts/initccache.sh +35 -0
- data/packaging/debian/internal/scripts/inituidgid.sh +19 -0
- data/packaging/debian/internal/scripts/my_init +340 -0
- data/packaging/debian/internal/scripts/pin_certificates +34 -0
- data/packaging/debian/internal/scripts/regen_distro_info_script.sh +3 -0
- data/packaging/debian/internal/scripts/setup-vagrant.sh +12 -0
- data/packaging/debian/internal/scripts/setuser +31 -0
- data/packaging/debian/internal/shell/initpbuilder.sh +3 -0
- data/packaging/debian/internal/shell/preinit.sh +28 -0
- data/packaging/debian/internal/shell/sudoers.conf +1 -0
- data/packaging/debian/internal/test/apache/apache-24.conf +5 -0
- data/packaging/debian/internal/test/apache/apache-pre-24.conf +4 -0
- data/packaging/debian/internal/test/apache/vhost.conf +17 -0
- data/packaging/debian/internal/test/misc/config.json +15 -0
- data/packaging/debian/internal/test/misc/hosts.conf +4 -0
- data/packaging/debian/internal/test/misc/init.sh +25 -0
- data/packaging/debian/internal/test/misc/nodejs_test_app.js +6 -0
- data/packaging/debian/internal/test/misc/python_test_app.py +3 -0
- data/packaging/debian/internal/test/misc/ruby_test_app.rb +5 -0
- data/packaging/debian/internal/test/misc/test_support.rb +61 -0
- data/packaging/debian/internal/test/nginx/vhost.conf +23 -0
- data/packaging/debian/internal/test/system_web_server_test.rb +126 -0
- data/packaging/debian/internal/test/test.sh +141 -0
- data/packaging/debian/jenkins/publish/clear_caches.rb +48 -0
- data/packaging/debian/jenkins/publish/publish.sh +69 -0
- data/packaging/debian/jenkins/test/test.sh +63 -0
- data/packaging/debian/passenger_apt_automation.sublime-project +14 -0
- data/packaging/debian/publish +172 -0
- data/packaging/debian/shell +116 -0
- data/packaging/debian/test +142 -0
- metadata +563 -3
- metadata.gz.asc +7 -7
- data/resources/oss-binaries.phusionpassenger.com.crt +0 -208
@@ -0,0 +1,1749 @@
|
|
1
|
+
package Test::Nginx::Socket;
|
2
|
+
|
3
|
+
use lib 'lib';
|
4
|
+
use lib 'inc';
|
5
|
+
|
6
|
+
use Test::Base -Base;
|
7
|
+
|
8
|
+
our $VERSION = '0.17';
|
9
|
+
|
10
|
+
use Encode;
|
11
|
+
use Data::Dumper;
|
12
|
+
use Time::HiRes qw(sleep time);
|
13
|
+
use Test::LongString;
|
14
|
+
use List::MoreUtils qw( any );
|
15
|
+
use IO::Select ();
|
16
|
+
|
17
|
+
our $ServerAddr = 'localhost';
|
18
|
+
our $Timeout = $ENV{TEST_NGINX_TIMEOUT} || 2;
|
19
|
+
|
20
|
+
use Test::Nginx::Util qw(
|
21
|
+
setup_server_root
|
22
|
+
write_config_file
|
23
|
+
get_canon_version
|
24
|
+
get_nginx_version
|
25
|
+
trim
|
26
|
+
show_all_chars
|
27
|
+
parse_headers
|
28
|
+
run_tests
|
29
|
+
$ServerPortForClient
|
30
|
+
$ServerPort
|
31
|
+
$PidFile
|
32
|
+
$ServRoot
|
33
|
+
$ConfFile
|
34
|
+
$RunTestHelper
|
35
|
+
$RepeatEach
|
36
|
+
worker_connections
|
37
|
+
master_process_enabled
|
38
|
+
config_preamble
|
39
|
+
repeat_each
|
40
|
+
workers
|
41
|
+
master_on
|
42
|
+
log_level
|
43
|
+
no_shuffle
|
44
|
+
no_root_location
|
45
|
+
server_root
|
46
|
+
html_dir
|
47
|
+
server_port
|
48
|
+
no_nginx_manager
|
49
|
+
);
|
50
|
+
|
51
|
+
#use Smart::Comments::JSON '###';
|
52
|
+
use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
|
53
|
+
use POSIX qw(EAGAIN);
|
54
|
+
use IO::Socket;
|
55
|
+
|
56
|
+
#our ($PrevRequest, $PrevConfig);
|
57
|
+
|
58
|
+
our $NoLongString = undef;
|
59
|
+
|
60
|
+
our @EXPORT = qw( plan run_tests run_test
|
61
|
+
repeat_each config_preamble worker_connections
|
62
|
+
master_process_enabled
|
63
|
+
no_long_string workers master_on
|
64
|
+
log_level no_shuffle no_root_location
|
65
|
+
server_addr server_root html_dir server_port
|
66
|
+
timeout no_nginx_manager
|
67
|
+
);
|
68
|
+
|
69
|
+
sub send_request ($$$$@);
|
70
|
+
|
71
|
+
sub run_test_helper ($$);
|
72
|
+
|
73
|
+
sub error_event_handler ($);
|
74
|
+
sub read_event_handler ($);
|
75
|
+
sub write_event_handler ($);
|
76
|
+
|
77
|
+
sub no_long_string () {
|
78
|
+
$NoLongString = 1;
|
79
|
+
}
|
80
|
+
|
81
|
+
sub server_addr (@) {
|
82
|
+
if (@_) {
|
83
|
+
|
84
|
+
#warn "setting server addr to $_[0]\n";
|
85
|
+
$ServerAddr = shift;
|
86
|
+
}
|
87
|
+
else {
|
88
|
+
return $ServerAddr;
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
sub timeout (@) {
|
93
|
+
if (@_) {
|
94
|
+
$Timeout = shift;
|
95
|
+
}
|
96
|
+
else {
|
97
|
+
$Timeout;
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
$RunTestHelper = \&run_test_helper;
|
102
|
+
|
103
|
+
# This will parse a "request"" string. The expected format is:
|
104
|
+
# - One line for the HTTP verb (POST, GET, etc.) plus optional relative URL
|
105
|
+
# (default is /) plus optional HTTP version (default is HTTP/1.1).
|
106
|
+
# - More lines considered as the body of the request.
|
107
|
+
# Most people don't care about headers and this is enough.
|
108
|
+
#
|
109
|
+
# This function will return a reference to a hash with the parsed elements
|
110
|
+
# plus information on the parsing itself like "how many white spaces were
|
111
|
+
# skipped before the VERB" (skipped_before_method), "was the version provided"
|
112
|
+
# (http_ver_size = 0).
|
113
|
+
sub parse_request ($$) {
|
114
|
+
my ( $name, $rrequest ) = @_;
|
115
|
+
open my $in, '<', $rrequest;
|
116
|
+
my $first = <$in>;
|
117
|
+
if ( !$first ) {
|
118
|
+
Test::More::BAIL_OUT("$name - Request line should be non-empty");
|
119
|
+
die;
|
120
|
+
}
|
121
|
+
#$first =~ s/^\s+|\s+$//gs;
|
122
|
+
my ($before_meth, $meth, $after_meth);
|
123
|
+
my ($rel_url, $rel_url_size, $after_rel_url);
|
124
|
+
my ($http_ver, $http_ver_size, $after_http_ver);
|
125
|
+
my $end_line_size;
|
126
|
+
if ($first =~ /^(\s*)(\S+)( *)((\S+)( *))?((\S+)( *))?(\s*)/) {
|
127
|
+
$before_meth = defined $1 ? length($1) : undef;
|
128
|
+
$meth = $2;
|
129
|
+
$after_meth = defined $3 ? length($3) : undef;
|
130
|
+
$rel_url = $5;
|
131
|
+
$rel_url_size = defined $5 ? length($5) : undef;
|
132
|
+
$after_rel_url = defined $6 ? length($6) : undef;
|
133
|
+
$http_ver = $8;
|
134
|
+
if (!defined $8) {
|
135
|
+
$http_ver_size = undef;
|
136
|
+
} else {
|
137
|
+
$http_ver_size = defined $8 ? length($8) : undef;
|
138
|
+
}
|
139
|
+
if (!defined $9) {
|
140
|
+
$after_http_ver = undef;
|
141
|
+
} else {
|
142
|
+
$after_http_ver = defined $9 ? length($9) : undef;
|
143
|
+
}
|
144
|
+
$end_line_size = defined $10 ? length($10) : undef;
|
145
|
+
} else {
|
146
|
+
Test::More::BAIL_OUT("$name - Request line is not valid. Should be 'meth [url [version]]'");
|
147
|
+
die;
|
148
|
+
}
|
149
|
+
if ( !defined $rel_url ) {
|
150
|
+
$rel_url = '/';
|
151
|
+
$rel_url_size = 0;
|
152
|
+
$after_rel_url = 0;
|
153
|
+
}
|
154
|
+
if ( !defined $http_ver ) {
|
155
|
+
$http_ver = 'HTTP/1.1';
|
156
|
+
$http_ver_size = 0;
|
157
|
+
$after_http_ver = 0;
|
158
|
+
}
|
159
|
+
|
160
|
+
#my $url = "http://localhost:$ServerPortForClient" . $rel_url;
|
161
|
+
|
162
|
+
my $content = do { local $/; <$in> };
|
163
|
+
my $content_size;
|
164
|
+
if ( !defined $content ) {
|
165
|
+
$content = "";
|
166
|
+
$content_size = 0;
|
167
|
+
} else {
|
168
|
+
$content_size = length($content);
|
169
|
+
}
|
170
|
+
|
171
|
+
#warn Dumper($content);
|
172
|
+
|
173
|
+
close $in;
|
174
|
+
|
175
|
+
return {
|
176
|
+
method => $meth,
|
177
|
+
url => $rel_url,
|
178
|
+
content => $content,
|
179
|
+
http_ver => $http_ver,
|
180
|
+
skipped_before_method => $before_meth,
|
181
|
+
method_size => length($meth),
|
182
|
+
skipped_after_method => $after_meth,
|
183
|
+
url_size => $rel_url_size,
|
184
|
+
skipped_after_url => $after_rel_url,
|
185
|
+
http_ver_size => $http_ver_size,
|
186
|
+
skipped_after_http_ver => $after_http_ver + $end_line_size,
|
187
|
+
content_size => $content_size,
|
188
|
+
};
|
189
|
+
}
|
190
|
+
|
191
|
+
# From a parsed request, builds the "moves" to apply to the original request
|
192
|
+
# to transform it (e.g. add missing version). Elements of the returned array
|
193
|
+
# are of 2 types:
|
194
|
+
# - d : number of characters to remove.
|
195
|
+
# - s_* : number of characters (s_s) to replace by value (s_v).
|
196
|
+
sub get_moves($) {
|
197
|
+
my ($parsed_req) = @_;
|
198
|
+
return ({d => $parsed_req->{skipped_before_method}},
|
199
|
+
{s_s => $parsed_req->{method_size},
|
200
|
+
s_v => $parsed_req->{method}},
|
201
|
+
{d => $parsed_req->{skipped_after_method}},
|
202
|
+
{s_s => $parsed_req->{url_size},
|
203
|
+
s_v => $parsed_req->{url}},
|
204
|
+
{d => $parsed_req->{skipped_after_url}},
|
205
|
+
{s_s => $parsed_req->{http_ver_size},
|
206
|
+
s_v => $parsed_req->{http_ver}},
|
207
|
+
{d => $parsed_req->{skipped_after_http_ver}},
|
208
|
+
{s_s => 0,
|
209
|
+
s_v => $parsed_req->{headers}},
|
210
|
+
{s_s => $parsed_req->{content_size},
|
211
|
+
s_v => $parsed_req->{content}}
|
212
|
+
);
|
213
|
+
}
|
214
|
+
|
215
|
+
# Apply moves (see above) to an array of packets that correspond to a request.
|
216
|
+
# The use of this function is explained in the build_request_from_packets
|
217
|
+
# function.
|
218
|
+
sub apply_moves($$) {
|
219
|
+
my ($r_packet, $r_move) = @_;
|
220
|
+
my $current_packet = shift @$r_packet;
|
221
|
+
my $current_move = shift @$r_move;
|
222
|
+
my $in_packet_cursor = 0;
|
223
|
+
my @result = ();
|
224
|
+
while (defined $current_packet) {
|
225
|
+
if (!defined $current_move) {
|
226
|
+
push @result, $current_packet;
|
227
|
+
$current_packet = shift @$r_packet;
|
228
|
+
$in_packet_cursor = 0;
|
229
|
+
} elsif (defined $current_move->{d}) {
|
230
|
+
# Remove stuff from packet
|
231
|
+
if ($current_move->{d} > length($current_packet) - $in_packet_cursor) {
|
232
|
+
# Eat up what is left of packet.
|
233
|
+
$current_move->{d} -= length($current_packet) - $in_packet_cursor;
|
234
|
+
if ($in_packet_cursor > 0) {
|
235
|
+
# Something in packet from previous iteration.
|
236
|
+
push @result, $current_packet;
|
237
|
+
}
|
238
|
+
$current_packet = shift @$r_packet;
|
239
|
+
$in_packet_cursor = 0;
|
240
|
+
} else {
|
241
|
+
# Remove from current point in current packet
|
242
|
+
substr($current_packet, $in_packet_cursor, $current_move->{d}) = '';
|
243
|
+
$current_move = shift @$r_move;
|
244
|
+
}
|
245
|
+
} else {
|
246
|
+
# Substitute stuff
|
247
|
+
if ($current_move->{s_s} > length($current_packet) - $in_packet_cursor) {
|
248
|
+
# {s_s=>3, s_v=>GET} on ['GE', 'T /foo']
|
249
|
+
$current_move->{s_s} -= length($current_packet) - $in_packet_cursor;
|
250
|
+
substr($current_packet, $in_packet_cursor) = substr($current_move->{s_v}, 0, length($current_packet) - $in_packet_cursor);
|
251
|
+
push @result, $current_packet;
|
252
|
+
$current_move->{s_v} = substr($current_move->{s_v}, length($current_packet) - $in_packet_cursor);
|
253
|
+
$current_packet = shift @$r_packet;
|
254
|
+
$in_packet_cursor = 0;
|
255
|
+
} else {
|
256
|
+
substr($current_packet, $in_packet_cursor, $current_move->{s_s}) = $current_move->{s_v};
|
257
|
+
$in_packet_cursor += length($current_move->{s_v});
|
258
|
+
$current_move = shift @$r_move;
|
259
|
+
}
|
260
|
+
}
|
261
|
+
}
|
262
|
+
return \@result;
|
263
|
+
}
|
264
|
+
# Given a request as an array of packets, will parse it, append the appropriate
|
265
|
+
# headers and return another array of packets.
|
266
|
+
# The function implemented here can be high-level summarized as:
|
267
|
+
# 1 - Concatenate all packets to obtain a string representation of request.
|
268
|
+
# 2 - Parse the string representation
|
269
|
+
# 3 - Get the "moves" from the parsing
|
270
|
+
# 4 - Apply the "moves" to the packets.
|
271
|
+
sub build_request_from_packets($$$$$) {
|
272
|
+
my ( $name, $more_headers, $is_chunked, $conn_header, $request_packets ) = @_;
|
273
|
+
# Concatenate packets as a string
|
274
|
+
my $parsable_request = '';
|
275
|
+
my @packet_length;
|
276
|
+
for my $one_packet (@$request_packets) {
|
277
|
+
$parsable_request .= $one_packet;
|
278
|
+
push @packet_length, length($one_packet);
|
279
|
+
}
|
280
|
+
# Parse the string representation.
|
281
|
+
my $parsed_req = parse_request( $name, \$parsable_request );
|
282
|
+
|
283
|
+
# Append headers
|
284
|
+
my $len_header = '';
|
285
|
+
if ( !$is_chunked
|
286
|
+
&& defined $parsed_req->{content}
|
287
|
+
&& $parsed_req->{content} ne ''
|
288
|
+
&& $more_headers !~ /\bContent-Length:/ )
|
289
|
+
{
|
290
|
+
$parsed_req->{content} =~ s/^\s+|\s+$//gs;
|
291
|
+
|
292
|
+
$len_header .=
|
293
|
+
"Content-Length: " . length( $parsed_req->{content} ) . "\r\n";
|
294
|
+
}
|
295
|
+
$parsed_req->{method} .= ' ';
|
296
|
+
$parsed_req->{url} .= ' ';
|
297
|
+
$parsed_req->{http_ver} .= "\r\n";
|
298
|
+
$parsed_req->{headers} = "Host: localhost\r\nConnection: $conn_header\r\n$more_headers$len_header\r\n";
|
299
|
+
|
300
|
+
# Get the moves from parsing
|
301
|
+
my @elements_moves = get_moves($parsed_req);
|
302
|
+
# Apply them to the packets.
|
303
|
+
return apply_moves($request_packets, \@elements_moves);
|
304
|
+
}
|
305
|
+
|
306
|
+
# Returns an array of array of hashes from the block. Each element of
|
307
|
+
# the first-level array is a request.
|
308
|
+
# Each request is an array of the "packets" to be sent. Each packet is a
|
309
|
+
# string to send, with an (optionnal) delay before sending it.
|
310
|
+
# This function parses (and therefore defines the syntax) of "request*"
|
311
|
+
# sections. See documentation for supported syntax.
|
312
|
+
sub get_req_from_block ($) {
|
313
|
+
my ($block) = @_;
|
314
|
+
my $name = $block->name;
|
315
|
+
|
316
|
+
my @req_list = ();
|
317
|
+
|
318
|
+
if ( defined $block->raw_request ) {
|
319
|
+
|
320
|
+
# Should be deprecated.
|
321
|
+
if ( ref $block->raw_request && ref $block->raw_request eq 'ARRAY' ) {
|
322
|
+
|
323
|
+
# User already provided an array. So, he/she specified where the
|
324
|
+
# data should be split. This allows for backward compatibility but
|
325
|
+
# should use request with arrays as it provides the same functionnality.
|
326
|
+
my @rr_list = ();
|
327
|
+
for my $elt ( @{ $block->raw_request } ) {
|
328
|
+
push @rr_list, {value => $elt};
|
329
|
+
}
|
330
|
+
push @req_list, \@rr_list;
|
331
|
+
}
|
332
|
+
else {
|
333
|
+
push @req_list, [{value => $block->raw_request}];
|
334
|
+
}
|
335
|
+
}
|
336
|
+
else {
|
337
|
+
my $request;
|
338
|
+
if ( defined $block->request_eval ) {
|
339
|
+
|
340
|
+
diag "$name - request_eval DEPRECATED. Use request eval instead.";
|
341
|
+
$request = eval $block->request_eval;
|
342
|
+
if ($@) {
|
343
|
+
warn $@;
|
344
|
+
}
|
345
|
+
}
|
346
|
+
else {
|
347
|
+
$request = $block->request;
|
348
|
+
}
|
349
|
+
|
350
|
+
my $is_chunked = 0;
|
351
|
+
my $more_headers = '';
|
352
|
+
if ( $block->more_headers ) {
|
353
|
+
my @headers = split /\n+/, $block->more_headers;
|
354
|
+
for my $header (@headers) {
|
355
|
+
next if $header =~ /^\s*\#/;
|
356
|
+
my ( $key, $val ) = split /:\s*/, $header, 2;
|
357
|
+
if ( lc($key) eq 'transfer-encoding' and $val eq 'chunked' ) {
|
358
|
+
$is_chunked = 1;
|
359
|
+
}
|
360
|
+
|
361
|
+
#warn "[$key, $val]\n";
|
362
|
+
$more_headers .= "$key: $val\r\n";
|
363
|
+
}
|
364
|
+
}
|
365
|
+
|
366
|
+
if ( $block->pipelined_requests ) {
|
367
|
+
my $reqs = $block->pipelined_requests;
|
368
|
+
if ( !ref $reqs || ref $reqs ne 'ARRAY' ) {
|
369
|
+
Test::More::BAIL_OUT(
|
370
|
+
"$name - invalid entries in --- pipelined_requests");
|
371
|
+
}
|
372
|
+
my $i = 0;
|
373
|
+
my $prq = "";
|
374
|
+
for my $request (@$reqs) {
|
375
|
+
my $conn_type;
|
376
|
+
if ( $i++ == @$reqs - 1 ) {
|
377
|
+
$conn_type = 'close';
|
378
|
+
}
|
379
|
+
else {
|
380
|
+
$conn_type = 'keep-alive';
|
381
|
+
}
|
382
|
+
my $r_br = build_request_from_packets($name, $more_headers,
|
383
|
+
$is_chunked, $conn_type,
|
384
|
+
[$request] );
|
385
|
+
$prq .= $$r_br[0];
|
386
|
+
}
|
387
|
+
push @req_list, [{value =>$prq}];
|
388
|
+
}
|
389
|
+
else {
|
390
|
+
# request section.
|
391
|
+
if (!ref $request) {
|
392
|
+
# One request and it is a good old string.
|
393
|
+
my $r_br = build_request_from_packets($name, $more_headers,
|
394
|
+
$is_chunked, 'Close',
|
395
|
+
[$request] );
|
396
|
+
push @req_list, [{value => $$r_br[0]}];
|
397
|
+
} elsif (ref $request eq 'ARRAY') {
|
398
|
+
# A bunch of requests...
|
399
|
+
for my $one_req (@$request) {
|
400
|
+
if (!ref $one_req) {
|
401
|
+
# This request is a good old string.
|
402
|
+
my $r_br = build_request_from_packets($name, $more_headers,
|
403
|
+
$is_chunked, 'Close',
|
404
|
+
[$one_req] );
|
405
|
+
push @req_list, [{value => $$r_br[0]}];
|
406
|
+
} elsif (ref $one_req eq 'ARRAY') {
|
407
|
+
# Request expressed as a serie of packets
|
408
|
+
my @packet_array = ();
|
409
|
+
for my $one_packet (@$one_req) {
|
410
|
+
if (!ref $one_packet) {
|
411
|
+
# Packet is a string.
|
412
|
+
push @packet_array, $one_packet;
|
413
|
+
} elsif (ref $one_packet eq 'HASH'){
|
414
|
+
# Packet is a hash with a value...
|
415
|
+
push @packet_array, $one_packet->{value};
|
416
|
+
} else {
|
417
|
+
Test::More::BAIL_OUT "$name - Invalid syntax. $one_packet should be a string or hash with value.";
|
418
|
+
}
|
419
|
+
}
|
420
|
+
my $transformed_packet_array = build_request_from_packets($name, $more_headers,
|
421
|
+
$is_chunked, 'Close',
|
422
|
+
\@packet_array);
|
423
|
+
my @transformed_req = ();
|
424
|
+
my $idx = 0;
|
425
|
+
for my $one_transformed_packet (@$transformed_packet_array) {
|
426
|
+
if (!ref $$one_req[$idx]) {
|
427
|
+
push @transformed_req, {value => $one_transformed_packet};
|
428
|
+
} else {
|
429
|
+
# Is a HASH (checked above as $one_packet)
|
430
|
+
$$one_req[$idx]->{value} = $one_transformed_packet;
|
431
|
+
push @transformed_req, $$one_req[$idx];
|
432
|
+
}
|
433
|
+
$idx++;
|
434
|
+
}
|
435
|
+
push @req_list, \@transformed_req;
|
436
|
+
} else {
|
437
|
+
Test::More::BAIL_OUT "$name - Invalid syntax. $one_req should be a string or an array of packets.";
|
438
|
+
}
|
439
|
+
}
|
440
|
+
} else {
|
441
|
+
Test::More::BAIL_OUT(
|
442
|
+
"$name - invalid ---request : MUST be string or array of requests");
|
443
|
+
}
|
444
|
+
}
|
445
|
+
|
446
|
+
}
|
447
|
+
return \@req_list;
|
448
|
+
}
|
449
|
+
|
450
|
+
sub run_test_helper ($$) {
|
451
|
+
my ( $block, $dry_run ) = @_;
|
452
|
+
|
453
|
+
my $name = $block->name;
|
454
|
+
|
455
|
+
my $r_req_list = get_req_from_block($block);
|
456
|
+
|
457
|
+
if ( $#$r_req_list < 0 ) {
|
458
|
+
Test::More::BAIL_OUT("$name - request empty");
|
459
|
+
}
|
460
|
+
|
461
|
+
#warn "request: $req\n";
|
462
|
+
|
463
|
+
my $timeout = $block->timeout;
|
464
|
+
if ( !defined $timeout ) {
|
465
|
+
$timeout = $Timeout;
|
466
|
+
}
|
467
|
+
|
468
|
+
my $req_idx = 0;
|
469
|
+
for my $one_req (@$r_req_list) {
|
470
|
+
my $raw_resp;
|
471
|
+
|
472
|
+
if ($dry_run) {
|
473
|
+
$raw_resp = "200 OK HTTP/1.0\r\nContent-Length: 0\r\n\r\n";
|
474
|
+
}
|
475
|
+
else {
|
476
|
+
$raw_resp = send_request( $one_req, $block->raw_request_middle_delay,
|
477
|
+
$timeout, $block->name );
|
478
|
+
}
|
479
|
+
|
480
|
+
#warn "raw resonse: [$raw_resp]\n";
|
481
|
+
|
482
|
+
my ($n, $need_array);
|
483
|
+
|
484
|
+
if ($block->pipelined_requests) {
|
485
|
+
$n = @{ $block->pipelined_requests };
|
486
|
+
$need_array = 1;
|
487
|
+
|
488
|
+
} else {
|
489
|
+
$need_array = $#$r_req_list > 0;
|
490
|
+
}
|
491
|
+
|
492
|
+
again:
|
493
|
+
#warn "!!! resp: [$raw_resp]";
|
494
|
+
if (!defined $raw_resp) {
|
495
|
+
$raw_resp = '';
|
496
|
+
}
|
497
|
+
|
498
|
+
my ( $res, $raw_headers, $left ) = parse_response( $name, $raw_resp );
|
499
|
+
|
500
|
+
if (!$n) {
|
501
|
+
if ($left) {
|
502
|
+
my $name = $block->name;
|
503
|
+
$left =~ s/([\0-\037\200-\377])/sprintf('\x{%02x}',ord $1)/eg;
|
504
|
+
warn "WARNING: $name - unexpected extra bytes after last chunk in ",
|
505
|
+
"response: \"$left\"\n";
|
506
|
+
}
|
507
|
+
|
508
|
+
} else {
|
509
|
+
$raw_resp = $left;
|
510
|
+
$n--;
|
511
|
+
}
|
512
|
+
|
513
|
+
check_error_code($block, $res, $dry_run, $req_idx, $need_array);
|
514
|
+
check_raw_response_headers($block, $raw_headers, $dry_run, $req_idx, $need_array);
|
515
|
+
check_response_headers($block, $res, $raw_headers, $dry_run, $req_idx, $need_array);
|
516
|
+
check_response_body($block, $res, $dry_run, $req_idx, $need_array);
|
517
|
+
$req_idx++;
|
518
|
+
|
519
|
+
if ($n) {
|
520
|
+
goto again;
|
521
|
+
}
|
522
|
+
}
|
523
|
+
}
|
524
|
+
|
525
|
+
# Helper function to retrieve a "check" (e.g. error_code) section. This also
|
526
|
+
# checks that tests with arrays of requests are arrays themselves.
|
527
|
+
sub get_indexed_value($$$$) {
|
528
|
+
my ($name, $value, $req_idx, $need_array) = @_;
|
529
|
+
if ($need_array) {
|
530
|
+
if (ref $value && ref $value eq 'ARRAY') {
|
531
|
+
return $$value[$req_idx];
|
532
|
+
} else {
|
533
|
+
Test::More::BAIL_OUT("$name - You asked for many requests, the expected results should be arrays as well.");
|
534
|
+
}
|
535
|
+
} else {
|
536
|
+
# One element but still provided as an array.
|
537
|
+
if (ref $value && ref $value eq 'ARRAY') {
|
538
|
+
if ($req_idx != 0) {
|
539
|
+
Test::More::BAIL_OUT("$name - SHOULD NOT HAPPEN: idx != 0 and don't need array.");
|
540
|
+
} else {
|
541
|
+
return $$value[0];
|
542
|
+
}
|
543
|
+
} else {
|
544
|
+
return $value;
|
545
|
+
}
|
546
|
+
}
|
547
|
+
}
|
548
|
+
sub check_error_code($$$$$) {
|
549
|
+
my ($block, $res, $dry_run, $req_idx, $need_array) = @_;
|
550
|
+
my $name = $block->name;
|
551
|
+
SKIP: {
|
552
|
+
skip "$name - tests skipped due to the lack of directive $dry_run", 1 if $dry_run;
|
553
|
+
if ( defined $block->error_code ) {
|
554
|
+
is( $res->code || '',
|
555
|
+
get_indexed_value($name, $block->error_code, $req_idx, $need_array),
|
556
|
+
"$name - status code ok" );
|
557
|
+
} else {
|
558
|
+
is( $res->code || '', 200, "$name - status code ok" );
|
559
|
+
}
|
560
|
+
}
|
561
|
+
}
|
562
|
+
sub check_raw_response_headers($$$$$) {
|
563
|
+
my ($block, $raw_headers, $dry_run, $req_idx, $need_array) = @_;
|
564
|
+
my $name = $block->name;
|
565
|
+
if ( defined $block->raw_response_headers_like ) {
|
566
|
+
SKIP: {
|
567
|
+
skip "$name - tests skipped due to the lack of directive $dry_run", 1 if $dry_run;
|
568
|
+
my $expected = get_indexed_value($name,
|
569
|
+
$block->raw_response_headers_like,
|
570
|
+
$req_idx,
|
571
|
+
$need_array);
|
572
|
+
like $raw_headers, qr/$expected/s, "$name - raw resp headers like";
|
573
|
+
}
|
574
|
+
}
|
575
|
+
}
|
576
|
+
sub check_response_headers($$$$$) {
|
577
|
+
my ($block, $res, $raw_headers, $dry_run, $req_idx, $need_array) = @_;
|
578
|
+
my $name = $block->name;
|
579
|
+
if ( defined $block->response_headers ) {
|
580
|
+
my $headers = parse_headers( get_indexed_value($name,
|
581
|
+
$block->response_headers,
|
582
|
+
$req_idx,
|
583
|
+
$need_array));
|
584
|
+
while ( my ( $key, $val ) = each %$headers ) {
|
585
|
+
if ( !defined $val ) {
|
586
|
+
|
587
|
+
#warn "HIT";
|
588
|
+
SKIP: {
|
589
|
+
skip "$name - tests skipped due to the lack of directive $dry_run", 1 if $dry_run;
|
590
|
+
unlike $raw_headers, qr/^\s*\Q$key\E\s*:/ms,
|
591
|
+
"$name - header $key not present in the raw headers";
|
592
|
+
}
|
593
|
+
next;
|
594
|
+
}
|
595
|
+
|
596
|
+
my $actual_val = $res->header($key);
|
597
|
+
if ( !defined $actual_val ) {
|
598
|
+
$actual_val = '';
|
599
|
+
}
|
600
|
+
|
601
|
+
SKIP: {
|
602
|
+
skip "$name - tests skipped due to the lack of directive $dry_run", 1 if $dry_run;
|
603
|
+
is $actual_val, $val, "$name - header $key ok";
|
604
|
+
}
|
605
|
+
}
|
606
|
+
}
|
607
|
+
elsif ( defined $block->response_headers_like ) {
|
608
|
+
my $headers = parse_headers( get_indexed_value($name,
|
609
|
+
$block->response_headers_like,
|
610
|
+
$req_idx,
|
611
|
+
$need_array) );
|
612
|
+
while ( my ( $key, $val ) = each %$headers ) {
|
613
|
+
my $expected_val = $res->header($key);
|
614
|
+
if ( !defined $expected_val ) {
|
615
|
+
$expected_val = '';
|
616
|
+
}
|
617
|
+
SKIP: {
|
618
|
+
skip "$name - tests skipped due to the lack of directive $dry_run", 1 if $dry_run;
|
619
|
+
like $expected_val, qr/^$val$/, "$name - header $key like ok";
|
620
|
+
}
|
621
|
+
}
|
622
|
+
}
|
623
|
+
}
|
624
|
+
|
625
|
+
sub check_response_body() {
|
626
|
+
my ($block, $res, $dry_run, $req_idx, $need_array) = @_;
|
627
|
+
my $name = $block->name;
|
628
|
+
if ( defined $block->response_body
|
629
|
+
|| defined $block->response_body_eval )
|
630
|
+
{
|
631
|
+
my $content = $res->content;
|
632
|
+
if ( defined $content ) {
|
633
|
+
$content =~ s/^TE: deflate,gzip;q=0\.3\r\n//gms;
|
634
|
+
$content =~ s/^Connection: TE, close\r\n//gms;
|
635
|
+
}
|
636
|
+
|
637
|
+
my $expected;
|
638
|
+
if ( $block->response_body_eval ) {
|
639
|
+
diag "$name - response_body_eval is DEPRECATED. Use response_body eval instead.";
|
640
|
+
$expected = eval get_indexed_value($name,
|
641
|
+
$block->response_body_eval,
|
642
|
+
$req_idx,
|
643
|
+
$need_array);
|
644
|
+
if ($@) {
|
645
|
+
warn $@;
|
646
|
+
}
|
647
|
+
}
|
648
|
+
else {
|
649
|
+
$expected = get_indexed_value($name,
|
650
|
+
$block->response_body,
|
651
|
+
$req_idx,
|
652
|
+
$need_array);
|
653
|
+
}
|
654
|
+
|
655
|
+
if ( $block->charset ) {
|
656
|
+
Encode::from_to( $expected, 'UTF-8', $block->charset );
|
657
|
+
}
|
658
|
+
|
659
|
+
unless (ref $expected) {
|
660
|
+
$expected =~ s/\$ServerPort\b/$ServerPort/g;
|
661
|
+
$expected =~ s/\$ServerPortForClient\b/$ServerPortForClient/g;
|
662
|
+
}
|
663
|
+
|
664
|
+
#warn show_all_chars($content);
|
665
|
+
|
666
|
+
#warn "no long string: $NoLongString";
|
667
|
+
SKIP: {
|
668
|
+
skip "$name - tests skipped due to the lack of directive $dry_run", 1 if $dry_run;
|
669
|
+
if (ref $expected) {
|
670
|
+
like $content, $expected, "$name - response_body - like";
|
671
|
+
|
672
|
+
} else {
|
673
|
+
if ($NoLongString) {
|
674
|
+
is( $content, $expected,
|
675
|
+
"$name - response_body - response is expected" );
|
676
|
+
}
|
677
|
+
else {
|
678
|
+
is_string( $content, $expected,
|
679
|
+
"$name - response_body - response is expected" );
|
680
|
+
}
|
681
|
+
}
|
682
|
+
}
|
683
|
+
|
684
|
+
}
|
685
|
+
elsif ( defined $block->response_body_like ) {
|
686
|
+
my $content = $res->content;
|
687
|
+
if ( defined $content ) {
|
688
|
+
$content =~ s/^TE: deflate,gzip;q=0\.3\r\n//gms;
|
689
|
+
}
|
690
|
+
$content =~ s/^Connection: TE, close\r\n//gms;
|
691
|
+
my $expected_pat = get_indexed_value($name,
|
692
|
+
$block->response_body_like,
|
693
|
+
$req_idx,
|
694
|
+
$need_array);
|
695
|
+
$expected_pat =~ s/\$ServerPort\b/$ServerPort/g;
|
696
|
+
$expected_pat =~ s/\$ServerPortForClient\b/$ServerPortForClient/g;
|
697
|
+
my $summary = trim($content);
|
698
|
+
|
699
|
+
SKIP: {
|
700
|
+
skip "$name - tests skipped due to the lack of directive $dry_run", 1 if $dry_run;
|
701
|
+
like( $content, qr/$expected_pat/s,
|
702
|
+
"$name - response_body_like - response is expected ($summary)"
|
703
|
+
);
|
704
|
+
}
|
705
|
+
} elsif ( defined $block->response_body_unlike ) {
|
706
|
+
my $content = $res->content;
|
707
|
+
if ( defined $content ) {
|
708
|
+
$content =~ s/^TE: deflate,gzip;q=0\.3\r\n//gms;
|
709
|
+
}
|
710
|
+
$content =~ s/^Connection: TE, close\r\n//gms;
|
711
|
+
my $expected_pat = get_indexed_value($name,
|
712
|
+
$block->response_body_unlike,
|
713
|
+
$req_idx,
|
714
|
+
$need_array);
|
715
|
+
$expected_pat =~ s/\$ServerPort\b/$ServerPort/g;
|
716
|
+
$expected_pat =~ s/\$ServerPortForClient\b/$ServerPortForClient/g;
|
717
|
+
my $summary = trim($content);
|
718
|
+
|
719
|
+
SKIP: {
|
720
|
+
skip "$name - tests skipped due to the lack of directive $dry_run", 1 if $dry_run;
|
721
|
+
unlike( $content, qr/$expected_pat/s,
|
722
|
+
"$name - response_body_like - response is expected ($summary)"
|
723
|
+
);
|
724
|
+
}
|
725
|
+
}
|
726
|
+
|
727
|
+
sub parse_response($$) {
|
728
|
+
my ( $name, $raw_resp ) = @_;
|
729
|
+
|
730
|
+
my $left;
|
731
|
+
|
732
|
+
my $raw_headers = '';
|
733
|
+
if ( $raw_resp =~ /(.*?\r\n)\r\n/s ) {
|
734
|
+
|
735
|
+
#warn "\$1: $1";
|
736
|
+
$raw_headers = $1;
|
737
|
+
}
|
738
|
+
|
739
|
+
#warn "raw headers: $raw_headers\n";
|
740
|
+
|
741
|
+
my $res = HTTP::Response->parse($raw_resp);
|
742
|
+
my $enc = $res->header('Transfer-Encoding');
|
743
|
+
|
744
|
+
my $len = $res->header('Content-Length');
|
745
|
+
|
746
|
+
if ( defined $enc && $enc eq 'chunked' ) {
|
747
|
+
|
748
|
+
#warn "Found chunked!";
|
749
|
+
my $raw = $res->content;
|
750
|
+
if ( !defined $raw ) {
|
751
|
+
$raw = '';
|
752
|
+
}
|
753
|
+
|
754
|
+
my $decoded = '';
|
755
|
+
while (1) {
|
756
|
+
if ( $raw =~ /\G 0 [\ \t]* \r\n \r\n /gcsx ) {
|
757
|
+
if ( $raw =~ /\G (.+) /gcsx ) {
|
758
|
+
$left = $1;
|
759
|
+
}
|
760
|
+
|
761
|
+
last;
|
762
|
+
}
|
763
|
+
if ( $raw =~ m{ \G [\ \t]* ( [A-Fa-f0-9]+ ) [\ \t]* \r\n }gcsx ) {
|
764
|
+
my $rest = hex($1);
|
765
|
+
|
766
|
+
#warn "chunk size: $rest\n";
|
767
|
+
my $bit_sz = 32765;
|
768
|
+
while ( $rest > 0 ) {
|
769
|
+
my $bit = $rest < $bit_sz ? $rest : $bit_sz;
|
770
|
+
|
771
|
+
#warn "bit: $bit\n";
|
772
|
+
if ( $raw =~ /\G(.{$bit})/gcs ) {
|
773
|
+
$decoded .= $1;
|
774
|
+
|
775
|
+
#warn "decoded: [$1]\n";
|
776
|
+
}
|
777
|
+
else {
|
778
|
+
fail(
|
779
|
+
"$name - invalid chunked data received (not enought octets for the data section)"
|
780
|
+
);
|
781
|
+
return;
|
782
|
+
}
|
783
|
+
|
784
|
+
$rest -= $bit;
|
785
|
+
}
|
786
|
+
if ( $raw !~ /\G\r\n/gcs ) {
|
787
|
+
fail(
|
788
|
+
"$name - invalid chunked data received (expected CRLF)."
|
789
|
+
);
|
790
|
+
return;
|
791
|
+
}
|
792
|
+
}
|
793
|
+
elsif ( $raw =~ /\G.+/gcs ) {
|
794
|
+
fail "$name - invalid chunked body received: $&";
|
795
|
+
return;
|
796
|
+
}
|
797
|
+
else {
|
798
|
+
fail "$name - no last chunk found - $raw";
|
799
|
+
return;
|
800
|
+
}
|
801
|
+
}
|
802
|
+
|
803
|
+
#warn "decoded: $decoded\n";
|
804
|
+
$res->content($decoded);
|
805
|
+
|
806
|
+
} elsif (defined $len && $len ne '' && $len >= 0) {
|
807
|
+
my $raw = $res->content;
|
808
|
+
if (length $raw < $len) {
|
809
|
+
warn "WARNING: $name - response body truncated: ",
|
810
|
+
"$len expected, but got ", length $raw, "\n";
|
811
|
+
|
812
|
+
} elsif (length $raw > $len) {
|
813
|
+
my $content = substr $raw, 0, $len;
|
814
|
+
$left = substr $raw, $len;
|
815
|
+
$res->content($content);
|
816
|
+
#warn "parsed body: [", $res->content, "]\n";
|
817
|
+
}
|
818
|
+
}
|
819
|
+
|
820
|
+
return ( $res, $raw_headers, $left );
|
821
|
+
}
|
822
|
+
|
823
|
+
sub send_request ($$$$@) {
|
824
|
+
my ( $req, $middle_delay, $timeout, $name, $tries ) = @_;
|
825
|
+
|
826
|
+
my $sock = IO::Socket::INET->new(
|
827
|
+
PeerAddr => $ServerAddr,
|
828
|
+
PeerPort => $ServerPortForClient,
|
829
|
+
Proto => 'tcp'
|
830
|
+
);
|
831
|
+
|
832
|
+
if (! defined $sock) {
|
833
|
+
$tries ||= 0;
|
834
|
+
if ($tries < 3) {
|
835
|
+
warn "Can't connect to $ServerAddr:$ServerPortForClient: $!\n";
|
836
|
+
sleep 1;
|
837
|
+
return send_request($req, $middle_delay, $timeout, $name, $tries + 1);
|
838
|
+
} else {
|
839
|
+
die "Can't connect to $ServerAddr:$ServerPortForClient: $!\n";
|
840
|
+
}
|
841
|
+
}
|
842
|
+
|
843
|
+
my @req_bits = ref $req ? @$req : ($req);
|
844
|
+
|
845
|
+
my $flags = fcntl $sock, F_GETFL, 0
|
846
|
+
or die "Failed to get flags: $!\n";
|
847
|
+
|
848
|
+
fcntl $sock, F_SETFL, $flags | O_NONBLOCK
|
849
|
+
or die "Failed to set flags: $!\n";
|
850
|
+
|
851
|
+
my $ctx = {
|
852
|
+
resp => '',
|
853
|
+
write_offset => 0,
|
854
|
+
buf_size => 1024,
|
855
|
+
req_bits => \@req_bits,
|
856
|
+
write_buf => (shift @req_bits)->{"value"},
|
857
|
+
middle_delay => $middle_delay,
|
858
|
+
sock => $sock,
|
859
|
+
name => $name,
|
860
|
+
};
|
861
|
+
|
862
|
+
my $readable_hdls = IO::Select->new($sock);
|
863
|
+
my $writable_hdls = IO::Select->new($sock);
|
864
|
+
my $err_hdls = IO::Select->new($sock);
|
865
|
+
|
866
|
+
while (1) {
|
867
|
+
if ( $readable_hdls->count == 0
|
868
|
+
&& $writable_hdls->count == 0
|
869
|
+
&& $err_hdls->count == 0 )
|
870
|
+
{
|
871
|
+
last;
|
872
|
+
}
|
873
|
+
|
874
|
+
my ( $new_readable, $new_writable, $new_err ) =
|
875
|
+
IO::Select->select( $readable_hdls, $writable_hdls, $err_hdls,
|
876
|
+
$timeout );
|
877
|
+
|
878
|
+
if ( !defined $new_err
|
879
|
+
&& !defined $new_readable
|
880
|
+
&& !defined $new_writable )
|
881
|
+
{
|
882
|
+
|
883
|
+
# timed out
|
884
|
+
timeout_event_handler($ctx);
|
885
|
+
last;
|
886
|
+
}
|
887
|
+
|
888
|
+
for my $hdl (@$new_err) {
|
889
|
+
next if !defined $hdl;
|
890
|
+
|
891
|
+
error_event_handler($ctx);
|
892
|
+
|
893
|
+
if ( $err_hdls->exists($hdl) ) {
|
894
|
+
$err_hdls->remove($hdl);
|
895
|
+
}
|
896
|
+
|
897
|
+
if ( $readable_hdls->exists($hdl) ) {
|
898
|
+
$readable_hdls->remove($hdl);
|
899
|
+
}
|
900
|
+
|
901
|
+
if ( $writable_hdls->exists($hdl) ) {
|
902
|
+
$writable_hdls->remove($hdl);
|
903
|
+
}
|
904
|
+
|
905
|
+
for my $h (@$readable_hdls) {
|
906
|
+
next if !defined $h;
|
907
|
+
if ( $h eq $hdl ) {
|
908
|
+
undef $h;
|
909
|
+
last;
|
910
|
+
}
|
911
|
+
}
|
912
|
+
|
913
|
+
for my $h (@$writable_hdls) {
|
914
|
+
next if !defined $h;
|
915
|
+
if ( $h eq $hdl ) {
|
916
|
+
undef $h;
|
917
|
+
last;
|
918
|
+
}
|
919
|
+
}
|
920
|
+
|
921
|
+
close $hdl;
|
922
|
+
}
|
923
|
+
|
924
|
+
for my $hdl (@$new_readable) {
|
925
|
+
next if !defined $hdl;
|
926
|
+
|
927
|
+
my $res = read_event_handler($ctx);
|
928
|
+
if ( !$res ) {
|
929
|
+
|
930
|
+
# error occured
|
931
|
+
if ( $err_hdls->exists($hdl) ) {
|
932
|
+
$err_hdls->remove($hdl);
|
933
|
+
}
|
934
|
+
|
935
|
+
if ( $readable_hdls->exists($hdl) ) {
|
936
|
+
$readable_hdls->remove($hdl);
|
937
|
+
}
|
938
|
+
|
939
|
+
if ( $writable_hdls->exists($hdl) ) {
|
940
|
+
$writable_hdls->remove($hdl);
|
941
|
+
}
|
942
|
+
|
943
|
+
for my $h (@$writable_hdls) {
|
944
|
+
next if !defined $h;
|
945
|
+
if ( $h eq $hdl ) {
|
946
|
+
undef $h;
|
947
|
+
last;
|
948
|
+
}
|
949
|
+
}
|
950
|
+
|
951
|
+
close $hdl;
|
952
|
+
}
|
953
|
+
}
|
954
|
+
|
955
|
+
for my $hdl (@$new_writable) {
|
956
|
+
next if !defined $hdl;
|
957
|
+
|
958
|
+
my $res = write_event_handler($ctx);
|
959
|
+
if ( !$res ) {
|
960
|
+
|
961
|
+
# error occured
|
962
|
+
if ( $err_hdls->exists($hdl) ) {
|
963
|
+
$err_hdls->remove($hdl);
|
964
|
+
}
|
965
|
+
|
966
|
+
if ( $readable_hdls->exists($hdl) ) {
|
967
|
+
$readable_hdls->remove($hdl);
|
968
|
+
}
|
969
|
+
|
970
|
+
if ( $writable_hdls->exists($hdl) ) {
|
971
|
+
$writable_hdls->remove($hdl);
|
972
|
+
}
|
973
|
+
|
974
|
+
close $hdl;
|
975
|
+
|
976
|
+
} elsif ( $res == 2 ) {
|
977
|
+
if ( $writable_hdls->exists($hdl) ) {
|
978
|
+
$writable_hdls->remove($hdl);
|
979
|
+
}
|
980
|
+
}
|
981
|
+
}
|
982
|
+
}
|
983
|
+
|
984
|
+
return $ctx->{resp};
|
985
|
+
}
|
986
|
+
|
987
|
+
sub timeout_event_handler ($) {
|
988
|
+
my $ctx = shift;
|
989
|
+
warn "ERROR: socket client: timed out - $ctx->{name}\n";
|
990
|
+
}
|
991
|
+
|
992
|
+
sub error_event_handler ($) {
|
993
|
+
warn "exception occurs on the socket: $!\n";
|
994
|
+
}
|
995
|
+
|
996
|
+
sub write_event_handler ($) {
|
997
|
+
my ($ctx) = @_;
|
998
|
+
|
999
|
+
while (1) {
|
1000
|
+
return undef if !defined $ctx->{write_buf};
|
1001
|
+
|
1002
|
+
my $rest = length( $ctx->{write_buf} ) - $ctx->{write_offset};
|
1003
|
+
|
1004
|
+
#warn "offset: $write_offset, rest: $rest, length ", length($write_buf), "\n";
|
1005
|
+
#die;
|
1006
|
+
|
1007
|
+
if ( $rest > 0 ) {
|
1008
|
+
my $bytes;
|
1009
|
+
eval {
|
1010
|
+
$bytes = syswrite(
|
1011
|
+
$ctx->{sock}, $ctx->{write_buf},
|
1012
|
+
$rest, $ctx->{write_offset}
|
1013
|
+
);
|
1014
|
+
};
|
1015
|
+
|
1016
|
+
if ($@) {
|
1017
|
+
my $errmsg = "write failed: $@";
|
1018
|
+
warn "$errmsg\n";
|
1019
|
+
$ctx->{resp} = $errmsg;
|
1020
|
+
return undef;
|
1021
|
+
}
|
1022
|
+
|
1023
|
+
if ( !defined $bytes ) {
|
1024
|
+
if ( $! == EAGAIN ) {
|
1025
|
+
|
1026
|
+
#warn "write again...";
|
1027
|
+
#sleep 0.002;
|
1028
|
+
return 1;
|
1029
|
+
}
|
1030
|
+
my $errmsg = "write failed: $!";
|
1031
|
+
warn "$errmsg\n";
|
1032
|
+
if ( !$ctx->{resp} ) {
|
1033
|
+
$ctx->{resp} = "$errmsg";
|
1034
|
+
}
|
1035
|
+
return undef;
|
1036
|
+
}
|
1037
|
+
|
1038
|
+
#warn "wrote $bytes bytes.\n";
|
1039
|
+
$ctx->{write_offset} += $bytes;
|
1040
|
+
}
|
1041
|
+
else {
|
1042
|
+
my $next_send = shift @{ $ctx->{req_bits} } or return 2;
|
1043
|
+
$ctx->{write_buf} = $next_send->{'value'};
|
1044
|
+
$ctx->{write_offset} = 0;
|
1045
|
+
my $wait_time;
|
1046
|
+
if (!defined $next_send->{'delay_before'}) {
|
1047
|
+
if (defined $ctx->{middle_delay}) {
|
1048
|
+
$wait_time = $ctx->{middle_delay};
|
1049
|
+
}
|
1050
|
+
} else {
|
1051
|
+
$wait_time = $next_send->{'delay_before'};
|
1052
|
+
}
|
1053
|
+
if ($wait_time) {
|
1054
|
+
#warn "sleeping..";
|
1055
|
+
sleep $wait_time;
|
1056
|
+
}
|
1057
|
+
}
|
1058
|
+
}
|
1059
|
+
|
1060
|
+
# impossible to reach here...
|
1061
|
+
return undef;
|
1062
|
+
}
|
1063
|
+
|
1064
|
+
sub read_event_handler ($) {
|
1065
|
+
my ($ctx) = @_;
|
1066
|
+
while (1) {
|
1067
|
+
my $read_buf;
|
1068
|
+
my $bytes = sysread( $ctx->{sock}, $read_buf, $ctx->{buf_size} );
|
1069
|
+
|
1070
|
+
if ( !defined $bytes ) {
|
1071
|
+
if ( $! == EAGAIN ) {
|
1072
|
+
|
1073
|
+
#warn "read again...";
|
1074
|
+
#sleep 0.002;
|
1075
|
+
return 1;
|
1076
|
+
}
|
1077
|
+
$ctx->{resp} = "500 read failed: $!";
|
1078
|
+
return undef;
|
1079
|
+
}
|
1080
|
+
|
1081
|
+
if ( $bytes == 0 ) {
|
1082
|
+
return undef; # connection closed
|
1083
|
+
}
|
1084
|
+
|
1085
|
+
$ctx->{resp} .= $read_buf;
|
1086
|
+
|
1087
|
+
#warn "read $bytes ($read_buf) bytes.\n";
|
1088
|
+
}
|
1089
|
+
|
1090
|
+
# impossible to reach here...
|
1091
|
+
return undef;
|
1092
|
+
}
|
1093
|
+
|
1094
|
+
1;
|
1095
|
+
__END__
|
1096
|
+
|
1097
|
+
=encoding utf-8
|
1098
|
+
|
1099
|
+
=head1 NAME
|
1100
|
+
|
1101
|
+
Test::Nginx::Socket - Socket-backed test scaffold for the Nginx C modules
|
1102
|
+
|
1103
|
+
=head1 SYNOPSIS
|
1104
|
+
|
1105
|
+
use Test::Nginx::Socket;
|
1106
|
+
|
1107
|
+
plan tests => $Test::Nginx::Socket::RepeatEach * 2 * blocks();
|
1108
|
+
|
1109
|
+
run_tests();
|
1110
|
+
|
1111
|
+
__DATA__
|
1112
|
+
|
1113
|
+
=== TEST 1: sanity
|
1114
|
+
--- config
|
1115
|
+
location /echo {
|
1116
|
+
echo_before_body hello;
|
1117
|
+
echo world;
|
1118
|
+
}
|
1119
|
+
--- request
|
1120
|
+
GET /echo
|
1121
|
+
--- response_body
|
1122
|
+
hello
|
1123
|
+
world
|
1124
|
+
--- error_code: 200
|
1125
|
+
|
1126
|
+
|
1127
|
+
=== TEST 2: set Server
|
1128
|
+
--- config
|
1129
|
+
location /foo {
|
1130
|
+
echo hi;
|
1131
|
+
more_set_headers 'Server: Foo';
|
1132
|
+
}
|
1133
|
+
--- request
|
1134
|
+
GET /foo
|
1135
|
+
--- response_headers
|
1136
|
+
Server: Foo
|
1137
|
+
--- response_body
|
1138
|
+
hi
|
1139
|
+
|
1140
|
+
|
1141
|
+
=== TEST 3: clear Server
|
1142
|
+
--- config
|
1143
|
+
location /foo {
|
1144
|
+
echo hi;
|
1145
|
+
more_clear_headers 'Server: ';
|
1146
|
+
}
|
1147
|
+
--- request
|
1148
|
+
GET /foo
|
1149
|
+
--- response_headers_like
|
1150
|
+
Server: nginx.*
|
1151
|
+
--- response_body
|
1152
|
+
hi
|
1153
|
+
|
1154
|
+
|
1155
|
+
=== TEST 3: chunk size too small
|
1156
|
+
--- config
|
1157
|
+
chunkin on;
|
1158
|
+
location /main {
|
1159
|
+
echo_request_body;
|
1160
|
+
}
|
1161
|
+
--- more_headers
|
1162
|
+
Transfer-Encoding: chunked
|
1163
|
+
--- request eval
|
1164
|
+
"POST /main
|
1165
|
+
4\r
|
1166
|
+
hello\r
|
1167
|
+
0\r
|
1168
|
+
\r
|
1169
|
+
"
|
1170
|
+
--- error_code: 400
|
1171
|
+
--- response_body_like: 400 Bad Request
|
1172
|
+
|
1173
|
+
=head1 DESCRIPTION
|
1174
|
+
|
1175
|
+
This module provides a test scaffold based on non-blocking L<IO::Socket> for automated testing in Nginx C module development.
|
1176
|
+
|
1177
|
+
This class inherits from L<Test::Base>, thus bringing all its
|
1178
|
+
declarative power to the Nginx C module testing practices.
|
1179
|
+
|
1180
|
+
You need to terminate or kill any Nginx processes before running the test suite if you have changed the Nginx server binary. Normally it's as simple as
|
1181
|
+
|
1182
|
+
killall nginx
|
1183
|
+
PATH=/path/to/your/nginx-with-memc-module:$PATH prove -r t
|
1184
|
+
|
1185
|
+
This module will create a temporary server root under t/servroot/ of the current working directory and starts and uses the nginx executable in the PATH environment.
|
1186
|
+
|
1187
|
+
You will often want to look into F<t/servroot/logs/error.log>
|
1188
|
+
when things go wrong ;)
|
1189
|
+
|
1190
|
+
=head1 Sections supported
|
1191
|
+
|
1192
|
+
The following sections are supported:
|
1193
|
+
|
1194
|
+
=head2 config
|
1195
|
+
|
1196
|
+
Content of this section will be included in the "server" part of the generated
|
1197
|
+
config file. This is the place where you want to put the "location" directive
|
1198
|
+
enabling the module you want to test. Example:
|
1199
|
+
|
1200
|
+
location /echo {
|
1201
|
+
echo_before_body hello;
|
1202
|
+
echo world;
|
1203
|
+
}
|
1204
|
+
|
1205
|
+
Sometimes you simply don't want to bother copying ten times the same
|
1206
|
+
configuration for the ten tests you want to run against your module. One way
|
1207
|
+
to do this is to write a config section only for the first test in your C<.t>
|
1208
|
+
file. All subsequent tests will re-use the same config. Please note that this
|
1209
|
+
depends on the order of test, so you should run C<prove> with variable
|
1210
|
+
C<TEST_NGINX_NO_SHUFFLE=1> (see below for more on this variable).
|
1211
|
+
|
1212
|
+
Please note that config section goes through environment variable expansion
|
1213
|
+
provided the variables to expand start with TEST_NGINX.
|
1214
|
+
So, the following is a perfectly legal (provided C<TEST_NGINX_HTML_DIR> is
|
1215
|
+
set correctly):
|
1216
|
+
|
1217
|
+
location /main {
|
1218
|
+
echo_subrequest POST /sub -f $TEST_NGINX_HTML_DIR/blah.txt;
|
1219
|
+
}
|
1220
|
+
|
1221
|
+
=head2 http_config
|
1222
|
+
|
1223
|
+
Content of this section will be included in the "http" part of the generated
|
1224
|
+
config file. This is the place where you want to put the "upstream" directive
|
1225
|
+
you might want to test. Example:
|
1226
|
+
|
1227
|
+
upstream database {
|
1228
|
+
postgres_server 127.0.0.1:$TEST_NGINX_POSTGRESQL_PORT
|
1229
|
+
dbname=ngx_test user=ngx_test
|
1230
|
+
password=wrong_pass;
|
1231
|
+
}
|
1232
|
+
|
1233
|
+
As you guessed from the example above, this section goes through environment
|
1234
|
+
variable expansion (variables have to start with TEST_NGINX).
|
1235
|
+
|
1236
|
+
=head2 main_config
|
1237
|
+
|
1238
|
+
Content of this section will be included in the "main" part of the generated
|
1239
|
+
config file. This is very rarely used, except if you are testing nginx core
|
1240
|
+
itself.
|
1241
|
+
|
1242
|
+
This section goes through environment
|
1243
|
+
variable expansion (variables have to start with TEST_NGINX).
|
1244
|
+
|
1245
|
+
=head2 request
|
1246
|
+
|
1247
|
+
This is probably the most important section. It defines the request(s) you
|
1248
|
+
are going to send to the nginx server. It offers a pretty powerful grammar
|
1249
|
+
which we are going to walk through one example at a time.
|
1250
|
+
|
1251
|
+
In its most basic form, this section looks like that:
|
1252
|
+
|
1253
|
+
--- request
|
1254
|
+
GET
|
1255
|
+
|
1256
|
+
This will just do a GET request on the root (i.e. /) of the server using
|
1257
|
+
HTTP/1.1.
|
1258
|
+
|
1259
|
+
Of course, you might want to test something else than the root of your
|
1260
|
+
web server and even use a different version of HTTP. This is possible:
|
1261
|
+
|
1262
|
+
--- request
|
1263
|
+
GET /foo HTTP/1.0
|
1264
|
+
|
1265
|
+
Please note that specifying HTTP/1.0 will not prevent Test::Nginx from
|
1266
|
+
sending the C<Host> header. Actually Test::Nginx always sends 2 headers:
|
1267
|
+
C<Host> (with value localhost) and C<Connection> (with value Close for
|
1268
|
+
simple requests and keep-alive for all but the last pipelined_requests).
|
1269
|
+
|
1270
|
+
You can also add a content to your request:
|
1271
|
+
|
1272
|
+
--- request
|
1273
|
+
POST /foo
|
1274
|
+
Hello world
|
1275
|
+
|
1276
|
+
Test::Nginx will automatically calculate the content length and add the
|
1277
|
+
corresponding header for you.
|
1278
|
+
|
1279
|
+
This being said, as soon as you want to POST real data, you will be interested
|
1280
|
+
in using the more_headers section and using the power of Test::Base filters
|
1281
|
+
to urlencode the content you are sending. Which gives us a
|
1282
|
+
slightly more realistic example:
|
1283
|
+
|
1284
|
+
--- more_headers
|
1285
|
+
Content-type: application/x-www-form-urlencoded
|
1286
|
+
--- request eval
|
1287
|
+
use URI::Escape;
|
1288
|
+
"POST /rrd/foo
|
1289
|
+
value=".uri_escape("N:12345")
|
1290
|
+
|
1291
|
+
Sometimes a test is more than one request. Typically you want to POST some
|
1292
|
+
data and make sure the data has been taken into account with a GET. You can
|
1293
|
+
do it using arrays:
|
1294
|
+
|
1295
|
+
--- request eval
|
1296
|
+
["POST /users
|
1297
|
+
name=foo", "GET /users/foo"]
|
1298
|
+
|
1299
|
+
This way, REST-like interfaces are pretty easy to test.
|
1300
|
+
|
1301
|
+
When you develop nifty nginx modules you will eventually want to test things
|
1302
|
+
with buffers and "weird" network conditions. This is where you split
|
1303
|
+
your request into network packets:
|
1304
|
+
|
1305
|
+
--- request eval
|
1306
|
+
[["POST /users\nna", "me=foo"]]
|
1307
|
+
|
1308
|
+
Here, Test::Nginx will first send the request line, the headers it
|
1309
|
+
automatically added for you and the first two letters of the body ("na" in
|
1310
|
+
our example) in ONE network packet. Then, it will send the next packet (here
|
1311
|
+
it's "me=foo"). When we talk about packets here, this is nto exactly correct
|
1312
|
+
as there is no way to guarantee the behavior of the TCP/IP stack. What
|
1313
|
+
Test::Nginx can guarantee is that this will result in two calls to
|
1314
|
+
C<syswrite>.
|
1315
|
+
|
1316
|
+
A good way to make I<almost> sure the two calls result in two packets is to
|
1317
|
+
introduce a delay (let's say 2 seconds)before sending the second packet:
|
1318
|
+
|
1319
|
+
--- request eval
|
1320
|
+
[["POST /users\nna", {value => "me=foo", delay_before => 2}]]
|
1321
|
+
|
1322
|
+
Of course, everything can be combined till your brain starts boiling ;) :
|
1323
|
+
|
1324
|
+
--- request eval
|
1325
|
+
use URI::Escape;
|
1326
|
+
my $val="value=".uri_escape("N:12346");
|
1327
|
+
[["POST /rrd/foo
|
1328
|
+
".substr($val, 0, 6),
|
1329
|
+
{value => substr($val, 6, 5), delay_before=>5},
|
1330
|
+
substr($val, 11)], "GET /rrd/foo"]
|
1331
|
+
|
1332
|
+
=head2 request_eval
|
1333
|
+
|
1334
|
+
Use of this section is deprecated and tests using it should replace it with
|
1335
|
+
a C<request> section with an C<eval> filter. More explicitly:
|
1336
|
+
|
1337
|
+
--- request_eval
|
1338
|
+
"POST /echo_body
|
1339
|
+
hello\x00\x01\x02
|
1340
|
+
world\x03\x04\xff"
|
1341
|
+
|
1342
|
+
should be replaced by:
|
1343
|
+
|
1344
|
+
--- request eval
|
1345
|
+
"POST /echo_body
|
1346
|
+
hello\x00\x01\x02
|
1347
|
+
world\x03\x04\xff"
|
1348
|
+
|
1349
|
+
=head2 pipelined_requests
|
1350
|
+
|
1351
|
+
Specify pipelined requests that use a single keep-alive connection to the server.
|
1352
|
+
|
1353
|
+
Here is an example from ngx_lua's test suite:
|
1354
|
+
|
1355
|
+
=== TEST 7: discard body
|
1356
|
+
--- config
|
1357
|
+
location = /foo {
|
1358
|
+
content_by_lua '
|
1359
|
+
ngx.req.discard_body()
|
1360
|
+
ngx.say("body: ", ngx.var.request_body)
|
1361
|
+
';
|
1362
|
+
}
|
1363
|
+
location = /bar {
|
1364
|
+
content_by_lua '
|
1365
|
+
ngx.req.read_body()
|
1366
|
+
ngx.say("body: ", ngx.var.request_body)
|
1367
|
+
';
|
1368
|
+
}
|
1369
|
+
--- pipelined_requests eval
|
1370
|
+
["POST /foo
|
1371
|
+
hello, world",
|
1372
|
+
"POST /bar
|
1373
|
+
hiya, world"]
|
1374
|
+
--- response_body eval
|
1375
|
+
["body: nil\n",
|
1376
|
+
"body: hiya, world\n"]
|
1377
|
+
|
1378
|
+
=head2 more_headers
|
1379
|
+
|
1380
|
+
Adds the content of this section as headers to the request being sent. Example:
|
1381
|
+
|
1382
|
+
--- more_headers
|
1383
|
+
X-Foo: blah
|
1384
|
+
|
1385
|
+
This will add C<X-Foo: blah> to the request (on top of the automatically
|
1386
|
+
generated headers like C<Host>, C<Connection> and potentially
|
1387
|
+
C<Content-Length>).
|
1388
|
+
|
1389
|
+
=head2 response_body
|
1390
|
+
|
1391
|
+
The expected value for the body of the submitted request.
|
1392
|
+
|
1393
|
+
--- response_body
|
1394
|
+
hello
|
1395
|
+
|
1396
|
+
If the test is made of multiple requests, then the response_body B<MUST>
|
1397
|
+
be an array and each request B<MUST> return the corresponding expected
|
1398
|
+
body:
|
1399
|
+
|
1400
|
+
--- request eval
|
1401
|
+
["GET /hello", "GET /world"]
|
1402
|
+
--- response_body eval
|
1403
|
+
["hello", "world"]
|
1404
|
+
|
1405
|
+
=head2 response_body_eval
|
1406
|
+
|
1407
|
+
Use of this section is deprecated and tests using it should replace it
|
1408
|
+
with a C<request> section with an C<eval> filter. Therefore:
|
1409
|
+
|
1410
|
+
--- response_body_eval
|
1411
|
+
"hello\x00\x01\x02
|
1412
|
+
world\x03\x04\xff"
|
1413
|
+
|
1414
|
+
should be replaced by:
|
1415
|
+
|
1416
|
+
--- response_body eval
|
1417
|
+
"hello\x00\x01\x02
|
1418
|
+
world\x03\x04\xff"
|
1419
|
+
|
1420
|
+
=head2 response_body_like
|
1421
|
+
|
1422
|
+
The body returned by the request MUST match the pattern provided by this
|
1423
|
+
section. Example:
|
1424
|
+
|
1425
|
+
--- response_body_like
|
1426
|
+
^elapsed 0\.00[0-5] sec\.$
|
1427
|
+
|
1428
|
+
If the test is made of multiple requests, then response_body_like B<MUST>
|
1429
|
+
be an array and each request B<MUST> match the corresponding pattern.
|
1430
|
+
|
1431
|
+
=head2 response_headers
|
1432
|
+
|
1433
|
+
The headers specified in this section are in the response sent by nginx.
|
1434
|
+
|
1435
|
+
--- response_headers
|
1436
|
+
Content-Type: application/x-resty-dbd-stream
|
1437
|
+
|
1438
|
+
Of course, you can specify many headers in this section:
|
1439
|
+
|
1440
|
+
--- response_headers
|
1441
|
+
X-Resty-DBD-Module:
|
1442
|
+
Content-Type: application/x-resty-dbd-stream
|
1443
|
+
|
1444
|
+
The test will be successful only if all headers are found in the response with
|
1445
|
+
the appropriate values.
|
1446
|
+
|
1447
|
+
If the test is made of multiple requests, then response_headers B<MUST>
|
1448
|
+
be an array and each element of the array is checked against the
|
1449
|
+
response to the corresponding request.
|
1450
|
+
|
1451
|
+
=head2 response_headers_like
|
1452
|
+
|
1453
|
+
The value of the headers returned by nginx match the patterns.
|
1454
|
+
|
1455
|
+
--- response_headers_like
|
1456
|
+
X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+
|
1457
|
+
Content-Type: application/x-resty-dbd-stream
|
1458
|
+
|
1459
|
+
This will check that the response's C<Content-Type> is
|
1460
|
+
application/x-resty-dbd-stream and that the C<X-Resty-DBD-Module> matches
|
1461
|
+
C<ngx_drizzle \d+\.\d+\.\d+>.
|
1462
|
+
|
1463
|
+
The test will be successful only if all headers are found in the response and
|
1464
|
+
if the values match the patterns.
|
1465
|
+
|
1466
|
+
If the test is made of multiple requests, then response_headers_like B<MUST>
|
1467
|
+
be an array and each element of the array is checked against the
|
1468
|
+
response to the corresponding request.
|
1469
|
+
|
1470
|
+
=head2 raw_response_headers_like
|
1471
|
+
|
1472
|
+
Checks the headers part of the response against this pattern. This is
|
1473
|
+
particularly useful when you want to write tests of redirect functions
|
1474
|
+
that are not bound to the value of the port your nginx server (under
|
1475
|
+
test) is listening to:
|
1476
|
+
|
1477
|
+
--- raw_response_headers_like: Location: http://localhost(?::\d+)?/foo\r\n
|
1478
|
+
|
1479
|
+
As usual, if the test is made of multiple requests, then
|
1480
|
+
raw_response_headers_like B<MUST> be an array.
|
1481
|
+
|
1482
|
+
=head2 error_code
|
1483
|
+
|
1484
|
+
The expected value of the HTTP response code. If not set, this is assumed
|
1485
|
+
to be 200. But you can expect other things such as a redirect:
|
1486
|
+
|
1487
|
+
--- error_code: 302
|
1488
|
+
|
1489
|
+
If the test is made of multiple requests, then
|
1490
|
+
error_code B<MUST> be an array with the expected value for the response status
|
1491
|
+
of each request in the test.
|
1492
|
+
|
1493
|
+
=head2 raw_request
|
1494
|
+
|
1495
|
+
The exact request to send to nginx. This is useful when you want to test
|
1496
|
+
soem behaviors that are not available with "request" such as an erroneous
|
1497
|
+
C<Content-Length> header or splitting packets right in the middle of headers:
|
1498
|
+
|
1499
|
+
--- raw_request eval
|
1500
|
+
["POST /rrd/taratata HTTP/1.1\r
|
1501
|
+
Host: localhost\r
|
1502
|
+
Connection: Close\r
|
1503
|
+
Content-Type: application/",
|
1504
|
+
"x-www-form-urlencoded\r
|
1505
|
+
Content-Length:15\r\n\r\nvalue=N%3A12345"]
|
1506
|
+
|
1507
|
+
This can also be useful to tests "invalid" request lines:
|
1508
|
+
|
1509
|
+
--- raw_request
|
1510
|
+
GET /foo HTTP/2.0 THE_FUTURE_IS_NOW
|
1511
|
+
|
1512
|
+
=head2 user_files
|
1513
|
+
|
1514
|
+
With this section you can create a file that will be copied in the
|
1515
|
+
html directory of the nginx server under test. For example:
|
1516
|
+
|
1517
|
+
--- user_files
|
1518
|
+
>>> blah.txt
|
1519
|
+
Hello, world
|
1520
|
+
|
1521
|
+
will create a file named C<blah.txt> in the html directory of the nginx
|
1522
|
+
server tested. The file will contain the text "Hello, world".
|
1523
|
+
|
1524
|
+
=head2 skip_nginx
|
1525
|
+
|
1526
|
+
=head2 skip_nginx2
|
1527
|
+
|
1528
|
+
Both string scalar and string arrays are supported as values.
|
1529
|
+
|
1530
|
+
=head2 raw_request_middle_delay
|
1531
|
+
|
1532
|
+
Delay in sec between sending successive packets in the "raw_request" array
|
1533
|
+
value. Also used when a request is split in packets.
|
1534
|
+
|
1535
|
+
=head1 Environment variables
|
1536
|
+
|
1537
|
+
All environment variables starting with C<TEST_NGINX_> are expanded in the
|
1538
|
+
sections used to build the configuration of the server that tests automatically
|
1539
|
+
starts. The following environment variables are supported by this module:
|
1540
|
+
|
1541
|
+
=head2 TEST_NGINX_NO_NGINX_MANAGER
|
1542
|
+
|
1543
|
+
Defaults to 0. If set to 1, Test::Nginx module will not manage
|
1544
|
+
(configure/start/stop) the C<nginx> process. Can be useful to run tests
|
1545
|
+
against an already configured (and running) nginx server.
|
1546
|
+
|
1547
|
+
=head2 TEST_NGINX_NO_SHUFFLE
|
1548
|
+
|
1549
|
+
Dafaults to 0. If set to 1, will make sure the tests are run in the order
|
1550
|
+
they appear in the test file (and not in random order).
|
1551
|
+
|
1552
|
+
=head2 TEST_NGINX_USE_VALGRIND
|
1553
|
+
|
1554
|
+
If set to 1, will start nginx with valgrind. nginx is actually started with
|
1555
|
+
C<valgrind -q --leak-check=full --gen-suppressions=all --suppressions=valgrind.suppress>,
|
1556
|
+
the suppressions option being used only if there is actually
|
1557
|
+
a valgrind.suppress file.
|
1558
|
+
|
1559
|
+
=head2 TEST_NGINX_BINARY
|
1560
|
+
|
1561
|
+
The command to start nginx. Defaults to C<nginx>. Can be used as an alternative
|
1562
|
+
to setting C<PATH> to run a specific nginx instance.
|
1563
|
+
|
1564
|
+
=head2 TEST_NGINX_LOG_LEVEL
|
1565
|
+
|
1566
|
+
Value of the last argument of the C<error_log> configuration directive.
|
1567
|
+
Defaults to C<debug>.
|
1568
|
+
|
1569
|
+
=head2 TEST_NGINX_MASTER_PROCESS
|
1570
|
+
|
1571
|
+
Value of the C<master_process> configuration directive. Defaults to C<off>.
|
1572
|
+
|
1573
|
+
=head2 TEST_NGINX_SERVER_PORT
|
1574
|
+
|
1575
|
+
Value of the port the server started by Test::Nginx will listen to. If not
|
1576
|
+
set, C<TEST_NGINX_PORT> is used. If C<TEST_NGINX_PORT> is not set,
|
1577
|
+
then C<1984> is used. See below for typical use.
|
1578
|
+
|
1579
|
+
=head2 TEST_NGINX_CLIENT_PORT
|
1580
|
+
|
1581
|
+
Value of the port Test::Nginx will diirect requests to. If not
|
1582
|
+
set, C<TEST_NGINX_PORT> is used. If C<TEST_NGINX_PORT> is not set,
|
1583
|
+
then C<1984> is used. A typical use of this feature is to test extreme
|
1584
|
+
network conditions by adding a "proxy" between Test::Nginx and nginx
|
1585
|
+
itself. This is described in the C<etcproxy integration> section of this
|
1586
|
+
module README.
|
1587
|
+
|
1588
|
+
=head2 TEST_NGINX_PORT
|
1589
|
+
|
1590
|
+
A shortcut for setting both C<TEST_NGINX_CLIENT_PORT> and
|
1591
|
+
C<TEST_NGINX_SERVER_PORT>.
|
1592
|
+
|
1593
|
+
=head2 TEST_NGINX_SLEEP
|
1594
|
+
|
1595
|
+
How much time (in seconds) should Test::Nginx sleep between two calls to C<syswrite> when
|
1596
|
+
sending request data. Defaults to 0.
|
1597
|
+
|
1598
|
+
=head2 TEST_NGINX_FORCE_RESTART_ON_TEST
|
1599
|
+
|
1600
|
+
Defaults to 1. If set to 0, Test::Nginx will not restart the nginx
|
1601
|
+
server when the config does not change between two tests.
|
1602
|
+
|
1603
|
+
=head2 TEST_NGINX_SERVROOT
|
1604
|
+
|
1605
|
+
The root of the nginx "hierarchy" (where you find the conf, *_tmp and logs
|
1606
|
+
directories). This value will be used with the C<-p> option of C<nginx>.
|
1607
|
+
Defaults to appending C<t/servroot> to the current directory.
|
1608
|
+
|
1609
|
+
=head2 TEST_NGINX_IGNORE_MISSING_DIRECTIVES
|
1610
|
+
|
1611
|
+
If set to 1 will SKIP all tests which C<config> sections resulted in a
|
1612
|
+
C<unknown directive> when trying to start C<nginx>. Useful when you want to
|
1613
|
+
run tests on a build of nginx that does not include all modules it should.
|
1614
|
+
By default, these tests will FAIL.
|
1615
|
+
|
1616
|
+
=head2 TEST_NGINX_EVENT_TYPE
|
1617
|
+
|
1618
|
+
This environment can be used to specify a event API type to be used by Nginx. Possible values are C<epoll>, C<kqueue>, C<select>, C<rtsig>, C<poll>, and others.
|
1619
|
+
|
1620
|
+
For example,
|
1621
|
+
|
1622
|
+
$ TEST_NGINX_EVENT_TYPE=select prove -r t
|
1623
|
+
|
1624
|
+
=head2 TEST_NGINX_ERROR_LOG
|
1625
|
+
|
1626
|
+
Error log files from all tests will be appended to the file specified with
|
1627
|
+
this variable. There is no default value which disables the feature. This
|
1628
|
+
is very useful when debugging. By default, each test triggers a start/stop
|
1629
|
+
cycle for C<nginx>. All logs are removed before each restart, so you can
|
1630
|
+
only see the logs for the last test run (which you usually do not control
|
1631
|
+
except if you set C<TEST_NGINX_NO_SHUFFLE=1>). With this, you accumulate
|
1632
|
+
all logs into a single file that is never cleaned up by Test::Nginx.
|
1633
|
+
|
1634
|
+
=head1 Samples
|
1635
|
+
|
1636
|
+
You'll find live samples in the following Nginx 3rd-party modules:
|
1637
|
+
|
1638
|
+
=over
|
1639
|
+
|
1640
|
+
=item ngx_echo
|
1641
|
+
|
1642
|
+
L<http://github.com/agentzh/echo-nginx-module>
|
1643
|
+
|
1644
|
+
=item ngx_chunkin
|
1645
|
+
|
1646
|
+
L<http://wiki.nginx.org/NginxHttpChunkinModule>
|
1647
|
+
|
1648
|
+
=item ngx_memc
|
1649
|
+
|
1650
|
+
L<http://wiki.nginx.org/NginxHttpMemcModule>
|
1651
|
+
|
1652
|
+
=item ngx_drizzle
|
1653
|
+
|
1654
|
+
L<http://github.com/chaoslawful/drizzle-nginx-module>
|
1655
|
+
|
1656
|
+
=item ngx_rds_json
|
1657
|
+
|
1658
|
+
L<http://github.com/agentzh/rds-json-nginx-module>
|
1659
|
+
|
1660
|
+
=item ngx_xss
|
1661
|
+
|
1662
|
+
L<http://github.com/agentzh/xss-nginx-module>
|
1663
|
+
|
1664
|
+
=item ngx_srcache
|
1665
|
+
|
1666
|
+
L<http://github.com/agentzh/srcache-nginx-module>
|
1667
|
+
|
1668
|
+
=item ngx_lua
|
1669
|
+
|
1670
|
+
L<http://github.com/chaoslawful/lua-nginx-module>
|
1671
|
+
|
1672
|
+
=item ngx_set_misc
|
1673
|
+
|
1674
|
+
L<http://github.com/agentzh/set-misc-nginx-module>
|
1675
|
+
|
1676
|
+
=item ngx_array_var
|
1677
|
+
|
1678
|
+
L<http://github.com/agentzh/array-var-nginx-module>
|
1679
|
+
|
1680
|
+
=item ngx_form_input
|
1681
|
+
|
1682
|
+
L<http://github.com/calio/form-input-nginx-module>
|
1683
|
+
|
1684
|
+
=item ngx_iconv
|
1685
|
+
|
1686
|
+
L<http://github.com/calio/iconv-nginx-module>
|
1687
|
+
|
1688
|
+
=item ngx_set_cconv
|
1689
|
+
|
1690
|
+
L<http://github.com/liseen/set-cconv-nginx-module>
|
1691
|
+
|
1692
|
+
=item ngx_postgres
|
1693
|
+
|
1694
|
+
L<http://github.com/FRiCKLE/ngx_postgres>
|
1695
|
+
|
1696
|
+
=item ngx_coolkit
|
1697
|
+
|
1698
|
+
L<http://github.com/FRiCKLE/ngx_coolkit>
|
1699
|
+
|
1700
|
+
=back
|
1701
|
+
|
1702
|
+
=head1 SOURCE REPOSITORY
|
1703
|
+
|
1704
|
+
This module has a Git repository on Github, which has access for all.
|
1705
|
+
|
1706
|
+
http://github.com/agentzh/test-nginx
|
1707
|
+
|
1708
|
+
If you want a commit bit, feel free to drop me a line.
|
1709
|
+
|
1710
|
+
=head1 AUTHORS
|
1711
|
+
|
1712
|
+
agentzh (章亦春) C<< <agentzh@gmail.com> >>
|
1713
|
+
|
1714
|
+
Antoine BONAVITA C<< <antoine.bonavita@gmail.com> >>
|
1715
|
+
|
1716
|
+
=head1 COPYRIGHT & LICENSE
|
1717
|
+
|
1718
|
+
Copyright (c) 2009-2011, Taobao Inc., Alibaba Group (L<http://www.taobao.com>).
|
1719
|
+
|
1720
|
+
Copyright (c) 2009-2011, agentzh C<< <agentzh@gmail.com> >>.
|
1721
|
+
|
1722
|
+
Copyright (c) 2011, Antoine BONAVITA C<< <antoine.bonavita@gmail.com> >>.
|
1723
|
+
|
1724
|
+
This module is licensed under the terms of the BSD license.
|
1725
|
+
|
1726
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
1727
|
+
|
1728
|
+
=over
|
1729
|
+
|
1730
|
+
=item *
|
1731
|
+
|
1732
|
+
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
1733
|
+
|
1734
|
+
=item *
|
1735
|
+
|
1736
|
+
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
1737
|
+
|
1738
|
+
=item *
|
1739
|
+
|
1740
|
+
Neither the name of the Taobao Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
1741
|
+
|
1742
|
+
=back
|
1743
|
+
|
1744
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
1745
|
+
|
1746
|
+
=head1 SEE ALSO
|
1747
|
+
|
1748
|
+
L<Test::Nginx::LWP>, L<Test::Base>.
|
1749
|
+
|