passenger 5.0.4 → 5.0.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (550) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +10 -0
  5. data/CHANGELOG +21 -0
  6. data/build/agents.rb +2 -2
  7. data/build/apache2.rb +6 -5
  8. data/build/common_library.rb +22 -7
  9. data/build/cxx_tests.rb +0 -3
  10. data/build/misc.rb +1 -1
  11. data/dev/parse_file_descriptor_log +119 -0
  12. data/doc/CloudLicensingConfiguration.html +387 -0
  13. data/doc/Design and Architecture.html +2430 -0
  14. data/doc/Packaging.html +488 -0
  15. data/doc/Security of user switching support.html +1833 -0
  16. data/doc/ServerOptimizationGuide.html +659 -0
  17. data/doc/ServerOptimizationGuide.txt.md +8 -0
  18. data/doc/Users guide Apache.html +9116 -0
  19. data/doc/Users guide Apache.idmap.txt +6 -2
  20. data/doc/Users guide Apache.txt +26 -7
  21. data/doc/Users guide Nginx.html +9025 -0
  22. data/doc/Users guide Nginx.idmap.txt +7 -3
  23. data/doc/Users guide Nginx.txt +29 -6
  24. data/doc/Users guide Standalone.html +3983 -0
  25. data/doc/Users guide.html +1748 -0
  26. data/doc/users_guide_snippets/installation.txt +4 -4
  27. data/ext/apache2/Configuration.cpp +16 -5
  28. data/ext/apache2/Configuration.hpp +4 -2
  29. data/ext/apache2/Hooks.cpp +44 -19
  30. data/ext/boost/libs/thread/src/pthread/once.cpp +2 -0
  31. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +6 -0
  32. data/ext/common/AgentsStarter.h +3 -2
  33. data/ext/common/ApplicationPool2/DirectSpawner.h +14 -4
  34. data/ext/common/ApplicationPool2/DummySpawner.h +12 -7
  35. data/ext/common/ApplicationPool2/Implementation.cpp +1 -1
  36. data/ext/common/ApplicationPool2/Process.h +2 -1
  37. data/ext/common/ApplicationPool2/Session.h +6 -6
  38. data/ext/common/ApplicationPool2/SmartSpawner.h +19 -4
  39. data/ext/common/ApplicationPool2/Socket.h +59 -27
  40. data/ext/common/ApplicationPool2/Spawner.h +2 -2
  41. data/ext/common/BackgroundEventLoop.cpp +6 -1
  42. data/ext/common/Constants.h +1 -1
  43. data/ext/common/EventedClient.h +1 -1
  44. data/ext/common/EventedServer.h +2 -2
  45. data/ext/common/FileDescriptor.h +25 -6
  46. data/ext/common/Logging.cpp +107 -52
  47. data/ext/common/Logging.h +146 -19
  48. data/ext/common/MessageClient.h +2 -2
  49. data/ext/common/MessageServer.h +3 -2
  50. data/ext/common/RandomGenerator.h +8 -7
  51. data/ext/common/SafeLibev.h +5 -1
  52. data/ext/common/ServerKit/AcceptLoadBalancer.h +9 -4
  53. data/ext/common/ServerKit/FdSinkChannel.h +5 -2
  54. data/ext/common/ServerKit/FdSourceChannel.h +5 -2
  55. data/ext/common/ServerKit/FileBufferedChannel.h +2 -0
  56. data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +7 -2
  57. data/ext/common/ServerKit/HttpServer.h +6 -0
  58. data/ext/common/ServerKit/Server.h +40 -3
  59. data/ext/common/StaticString.h +20 -0
  60. data/ext/common/UnionStation/Connection.h +3 -1
  61. data/ext/common/UnionStation/Core.h +6 -4
  62. data/ext/common/Utils.cpp +4 -3
  63. data/ext/common/Utils/DateParsing.h +19 -5
  64. data/ext/common/Utils/FastStringStream.h +183 -0
  65. data/ext/common/Utils/IOUtils.cpp +47 -28
  66. data/ext/common/Utils/IOUtils.h +56 -12
  67. data/ext/common/Utils/MessagePassing.h +3 -3
  68. data/ext/common/Utils/ProcessMetricsCollector.h +2 -2
  69. data/ext/common/Utils/ScopeGuard.h +16 -5
  70. data/ext/common/Utils/SpeedMeter.h +2 -2
  71. data/ext/common/Utils/StrIntUtils.cpp +6 -6
  72. data/ext/common/Utils/StrIntUtils.h +2 -1
  73. data/ext/common/agents/Base.cpp +56 -4
  74. data/ext/common/agents/Base.h +2 -1
  75. data/ext/common/agents/HelperAgent/AdminServer.h +122 -11
  76. data/ext/common/agents/HelperAgent/Main.cpp +16 -5
  77. data/ext/common/agents/HelperAgent/OptionParser.h +7 -1
  78. data/ext/common/agents/HelperAgent/RequestHandler.h +1 -1
  79. data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +10 -1
  80. data/ext/common/agents/HelperAgent/RequestHandler/Request.h +8 -0
  81. data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +4 -3
  82. data/ext/common/agents/LoggingAgent/AdminServer.h +57 -11
  83. data/ext/common/agents/LoggingAgent/LoggingServer.h +3 -3
  84. data/ext/common/agents/LoggingAgent/Main.cpp +11 -3
  85. data/ext/common/agents/Watchdog/AdminServer.h +53 -11
  86. data/ext/common/agents/Watchdog/AgentWatcher.cpp +3 -3
  87. data/ext/common/agents/Watchdog/Main.cpp +13 -6
  88. data/ext/libeio/ecb.h +1 -1
  89. data/ext/libev/ev.c +13 -1
  90. data/ext/libev/ev.h +3 -0
  91. data/ext/nginx/Configuration.c +28 -6
  92. data/ext/nginx/Configuration.h +2 -1
  93. data/ext/nginx/ngx_http_passenger_module.c +5 -4
  94. data/ext/oxt/dynamic_thread_group.hpp +38 -5
  95. data/lib/phusion_passenger.rb +1 -1
  96. data/lib/phusion_passenger/common_library.rb +9 -5
  97. data/lib/phusion_passenger/config/reopen_logs_command.rb +2 -2
  98. data/lib/phusion_passenger/packaging.rb +23 -37
  99. data/passenger.gemspec +21 -21
  100. metadata +4 -453
  101. metadata.gz.asc +7 -7
  102. data/.gitignore +0 -68
  103. data/.travis.yml +0 -16
  104. data/Gemfile +0 -17
  105. data/Gemfile.lock +0 -39
  106. data/Vagrantfile +0 -54
  107. data/debian.template/README.Debian +0 -15
  108. data/debian.template/changelog +0 -316
  109. data/debian.template/compat +0 -1
  110. data/debian.template/control.erb +0 -91
  111. data/debian.template/copyright +0 -385
  112. data/debian.template/libapache2-mod-passenger.install +0 -3
  113. data/debian.template/libapache2-mod-passenger.postinst +0 -36
  114. data/debian.template/libapache2-mod-passenger.prerm +0 -15
  115. data/debian.template/locations.ini.erb +0 -14
  116. data/debian.template/passenger-dev.install.erb +0 -3
  117. data/debian.template/passenger-doc.install.erb +0 -2
  118. data/debian.template/passenger.conf +0 -6
  119. data/debian.template/passenger.docs +0 -4
  120. data/debian.template/passenger.install.erb +0 -14
  121. data/debian.template/passenger.load +0 -3
  122. data/debian.template/passenger.manpages +0 -3
  123. data/debian.template/patches/series +0 -0
  124. data/debian.template/rules.erb +0 -76
  125. data/debian.template/source/format +0 -1
  126. data/ext/common/EventedBufferedInput.h +0 -458
  127. data/packaging/rpm/LICENSE.txt +0 -19
  128. data/packaging/rpm/Makefile +0 -13
  129. data/packaging/rpm/README.md +0 -41
  130. data/packaging/rpm/Vagrantfile +0 -38
  131. data/packaging/rpm/Vagrantfile.centos +0 -30
  132. data/packaging/rpm/build +0 -170
  133. data/packaging/rpm/create_project +0 -41
  134. data/packaging/rpm/git_update +0 -88
  135. data/packaging/rpm/image/Dockerfile +0 -37
  136. data/packaging/rpm/image/Gemfile +0 -3
  137. data/packaging/rpm/image/Gemfile.lock +0 -12
  138. data/packaging/rpm/image/RPM-GPG-KEY-amazon-ga +0 -19
  139. data/packaging/rpm/image/amazon2014-i386.cfg +0 -96
  140. data/packaging/rpm/image/amazon2014-x86_64.cfg +0 -96
  141. data/packaging/rpm/image/site-defaults.cfg +0 -168
  142. data/packaging/rpm/internal/build_tasks.rb +0 -238
  143. data/packaging/rpm/internal/dummygpg +0 -11
  144. data/packaging/rpm/internal/exec_build +0 -42
  145. data/packaging/rpm/internal/get_distro_arch +0 -14
  146. data/packaging/rpm/internal/get_distro_id +0 -10
  147. data/packaging/rpm/internal/git_update +0 -27
  148. data/packaging/rpm/internal/inituidgid +0 -17
  149. data/packaging/rpm/internal/my_init +0 -344
  150. data/packaging/rpm/internal/python27 +0 -3
  151. data/packaging/rpm/internal/repo_update +0 -46
  152. data/packaging/rpm/internal/setuser +0 -26
  153. data/packaging/rpm/internal/tracking_helper +0 -40
  154. data/packaging/rpm/jenkins_release +0 -99
  155. data/packaging/rpm/lib/build_tasks_support.rb +0 -402
  156. data/packaging/rpm/lib/preprocessor.rb +0 -341
  157. data/packaging/rpm/nginx_spec/404.html +0 -119
  158. data/packaging/rpm/nginx_spec/50x.html +0 -119
  159. data/packaging/rpm/nginx_spec/index.html +0 -116
  160. data/packaging/rpm/nginx_spec/nginx-auto-cc-gcc.patch +0 -13
  161. data/packaging/rpm/nginx_spec/nginx-logo.png +0 -0
  162. data/packaging/rpm/nginx_spec/nginx-upgrade +0 -13
  163. data/packaging/rpm/nginx_spec/nginx-upgrade.8 +0 -151
  164. data/packaging/rpm/nginx_spec/nginx.conf +0 -131
  165. data/packaging/rpm/nginx_spec/nginx.init +0 -144
  166. data/packaging/rpm/nginx_spec/nginx.logrotate +0 -13
  167. data/packaging/rpm/nginx_spec/nginx.service +0 -15
  168. data/packaging/rpm/nginx_spec/nginx.spec.template +0 -560
  169. data/packaging/rpm/nginx_spec/nginx.sysconfig +0 -4
  170. data/packaging/rpm/nginx_spec/passenger.conf +0 -9
  171. data/packaging/rpm/nginx_spec/poweredby.png +0 -0
  172. data/packaging/rpm/passenger_spec/apache-passenger.conf.in +0 -26
  173. data/packaging/rpm/passenger_spec/config.json +0 -30
  174. data/packaging/rpm/passenger_spec/passenger.logrotate +0 -7
  175. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -478
  176. data/packaging/rpm/passenger_spec/passenger_dynamic_thread_group.patch +0 -16
  177. data/packaging/rpm/passenger_spec/passenger_tests_default_config_example.patch +0 -44
  178. data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-GLIBC_HAVE_LONG_LONG.patch +0 -21
  179. data/packaging/rpm/repo_update +0 -114
  180. data/packaging/rpm/setup-system +0 -61
  181. data/packaging/rpm/shell +0 -10
  182. data/test/.rspec +0 -4
  183. data/test/config.json.example +0 -42
  184. data/test/config.json.rpm-automation +0 -15
  185. data/test/config.json.travis +0 -15
  186. data/test/config.json.vagrant +0 -30
  187. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +0 -124
  188. data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -30
  189. data/test/cxx/ApplicationPool2/PoolTest.cpp +0 -2062
  190. data/test/cxx/ApplicationPool2/ProcessTest.cpp +0 -130
  191. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +0 -243
  192. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +0 -823
  193. data/test/cxx/BufferedIOTest.cpp +0 -364
  194. data/test/cxx/CachedFileStatTest.cpp +0 -402
  195. data/test/cxx/CxxTestMain.cpp +0 -181
  196. data/test/cxx/DataStructures/LStringTest.cpp +0 -275
  197. data/test/cxx/DataStructures/StringKeyTableTest.cpp +0 -199
  198. data/test/cxx/DateParsingTest.cpp +0 -75
  199. data/test/cxx/DechunkerTest.cpp +0 -250
  200. data/test/cxx/EventedBufferedInputTest.cpp +0 -758
  201. data/test/cxx/EventedClientTest.cpp +0 -523
  202. data/test/cxx/FileChangeCheckerTest.cpp +0 -331
  203. data/test/cxx/FileDescriptorTest.cpp +0 -69
  204. data/test/cxx/FilterSupportTest.cpp +0 -433
  205. data/test/cxx/IOUtilsTest.cpp +0 -861
  206. data/test/cxx/MemoryKit/MbufTest.cpp +0 -213
  207. data/test/cxx/MessageIOTest.cpp +0 -360
  208. data/test/cxx/MessagePassingTest.cpp +0 -81
  209. data/test/cxx/MessageReadersWritersTest.cpp +0 -576
  210. data/test/cxx/MessageServerTest.cpp +0 -393
  211. data/test/cxx/ProcessMetricsCollectorTest.cpp +0 -123
  212. data/test/cxx/RequestHandlerTest.cpp +0 -1463
  213. data/test/cxx/ResponseCacheTest.cpp +0 -322
  214. data/test/cxx/ServerKit/ChannelTest.cpp +0 -1467
  215. data/test/cxx/ServerKit/CookieUtilsTest.cpp +0 -274
  216. data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +0 -992
  217. data/test/cxx/ServerKit/HeaderTableTest.cpp +0 -177
  218. data/test/cxx/ServerKit/HttpServerTest.cpp +0 -1580
  219. data/test/cxx/ServerKit/ServerTest.cpp +0 -408
  220. data/test/cxx/StaticStringTest.cpp +0 -220
  221. data/test/cxx/StringMapTest.cpp +0 -131
  222. data/test/cxx/SystemTimeTest.cpp +0 -37
  223. data/test/cxx/TemplateTest.cpp +0 -118
  224. data/test/cxx/TestSupport.cpp +0 -207
  225. data/test/cxx/TestSupport.h +0 -333
  226. data/test/cxx/UnionStationTest.cpp +0 -741
  227. data/test/cxx/Utils/StrIntUtilsTest.cpp +0 -39
  228. data/test/cxx/UtilsTest.cpp +0 -672
  229. data/test/cxx/VariantMapTest.cpp +0 -191
  230. data/test/gdbinit.example +0 -34
  231. data/test/integration_tests/apache2_tests.rb +0 -585
  232. data/test/integration_tests/downloaded_binaries_tests.rb +0 -185
  233. data/test/integration_tests/native_packaging_spec.rb +0 -368
  234. data/test/integration_tests/nginx_tests.rb +0 -402
  235. data/test/integration_tests/shared/example_webapp_tests.rb +0 -289
  236. data/test/integration_tests/source_packaging_test.rb +0 -201
  237. data/test/integration_tests/spec_helper.rb +0 -22
  238. data/test/integration_tests/standalone_tests.rb +0 -392
  239. data/test/node/line_reader_spec.js +0 -338
  240. data/test/node/spec_helper.js +0 -65
  241. data/test/oxt/backtrace_test.cpp +0 -88
  242. data/test/oxt/counter.hpp +0 -55
  243. data/test/oxt/dynamic_thread_group_test.cpp +0 -131
  244. data/test/oxt/oxt_test_main.cpp +0 -27
  245. data/test/oxt/spin_lock_test.cpp +0 -59
  246. data/test/oxt/syscall_interruption_test.cpp +0 -39
  247. data/test/ruby/debug_logging_spec.rb +0 -145
  248. data/test/ruby/message_channel_spec.rb +0 -196
  249. data/test/ruby/rack/loader_spec.rb +0 -42
  250. data/test/ruby/rack/preloader_spec.rb +0 -48
  251. data/test/ruby/rails3.0/loader_spec.rb +0 -26
  252. data/test/ruby/rails3.0/preloader_spec.rb +0 -32
  253. data/test/ruby/rails3.1/loader_spec.rb +0 -26
  254. data/test/ruby/rails3.1/preloader_spec.rb +0 -32
  255. data/test/ruby/rails3.2/loader_spec.rb +0 -26
  256. data/test/ruby/rails3.2/preloader_spec.rb +0 -32
  257. data/test/ruby/rails4.0/loader_spec.rb +0 -28
  258. data/test/ruby/rails4.0/preloader_spec.rb +0 -34
  259. data/test/ruby/rails4.1/loader_spec.rb +0 -28
  260. data/test/ruby/rails4.1/preloader_spec.rb +0 -34
  261. data/test/ruby/request_handler_spec.rb +0 -747
  262. data/test/ruby/shared/loader_sharedspec.rb +0 -247
  263. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +0 -357
  264. data/test/ruby/shared/ruby_loader_sharedspec.rb +0 -55
  265. data/test/ruby/spec_helper.rb +0 -114
  266. data/test/ruby/standalone/runtime_installer_spec.rb +0 -402
  267. data/test/ruby/union_station_spec.rb +0 -288
  268. data/test/ruby/utils/file_system_watcher_spec.rb +0 -229
  269. data/test/ruby/utils/hosts_file_parser.rb +0 -258
  270. data/test/ruby/utils/tee_input_spec.rb +0 -235
  271. data/test/ruby/utils/unseekable_socket_spec.rb +0 -66
  272. data/test/ruby/utils_spec.rb +0 -41
  273. data/test/stub/apache2/httpd.conf.erb +0 -122
  274. data/test/stub/apache2/mime.types +0 -748
  275. data/test/stub/garbage1.dat +0 -0
  276. data/test/stub/garbage2.dat +0 -0
  277. data/test/stub/garbage3.dat +0 -0
  278. data/test/stub/http_request.yml +0 -23
  279. data/test/stub/index.html +0 -1
  280. data/test/stub/nginx/koi-utf +0 -109
  281. data/test/stub/nginx/koi-win +0 -103
  282. data/test/stub/nginx/mime.types +0 -70
  283. data/test/stub/nginx/nginx.conf.erb +0 -70
  284. data/test/stub/nginx/win-utf +0 -126
  285. data/test/stub/node/app.js +0 -133
  286. data/test/stub/node/public/.gitignore +0 -0
  287. data/test/stub/node/tmp/.gitignore +0 -0
  288. data/test/stub/rack/config.ru +0 -95
  289. data/test/stub/rack/library.rb +0 -16
  290. data/test/stub/rack/public/.gitignore +0 -0
  291. data/test/stub/rack/start.rb +0 -52
  292. data/test/stub/rack/tmp/.gitignore +0 -0
  293. data/test/stub/rails3.0/.gitignore +0 -4
  294. data/test/stub/rails3.0/Gemfile +0 -22
  295. data/test/stub/rails3.0/Gemfile.lock +0 -80
  296. data/test/stub/rails3.0/Rakefile +0 -10
  297. data/test/stub/rails3.0/app/controllers/application_controller.rb +0 -4
  298. data/test/stub/rails3.0/app/helpers/application_helper.rb +0 -2
  299. data/test/stub/rails3.0/app/views/layouts/application.html.erb +0 -14
  300. data/test/stub/rails3.0/config.ru +0 -4
  301. data/test/stub/rails3.0/config/application.rb +0 -48
  302. data/test/stub/rails3.0/config/boot.rb +0 -13
  303. data/test/stub/rails3.0/config/database.yml +0 -22
  304. data/test/stub/rails3.0/config/environment.rb +0 -5
  305. data/test/stub/rails3.0/config/environments/development.rb +0 -19
  306. data/test/stub/rails3.0/config/environments/production.rb +0 -48
  307. data/test/stub/rails3.0/config/environments/test.rb +0 -32
  308. data/test/stub/rails3.0/config/initializers/backtrace_silencers.rb +0 -7
  309. data/test/stub/rails3.0/config/initializers/inflections.rb +0 -10
  310. data/test/stub/rails3.0/config/initializers/mime_types.rb +0 -5
  311. data/test/stub/rails3.0/config/initializers/passenger.rb +0 -2
  312. data/test/stub/rails3.0/config/initializers/secret_token.rb +0 -7
  313. data/test/stub/rails3.0/config/initializers/session_store.rb +0 -8
  314. data/test/stub/rails3.0/config/locales/en.yml +0 -5
  315. data/test/stub/rails3.0/config/routes.rb +0 -58
  316. data/test/stub/rails3.0/db/seeds.rb +0 -7
  317. data/test/stub/rails3.0/doc/README_FOR_APP +0 -2
  318. data/test/stub/rails3.0/lib/tasks/.gitkeep +0 -0
  319. data/test/stub/rails3.0/log/.gitignore +0 -0
  320. data/test/stub/rails3.0/public/404.html +0 -26
  321. data/test/stub/rails3.0/public/422.html +0 -26
  322. data/test/stub/rails3.0/public/500.html +0 -26
  323. data/test/stub/rails3.0/public/favicon.ico +0 -0
  324. data/test/stub/rails3.0/public/index.html +0 -279
  325. data/test/stub/rails3.0/public/robots.txt +0 -5
  326. data/test/stub/rails3.0/public/stylesheets/.gitkeep +0 -0
  327. data/test/stub/rails3.0/script/rails +0 -9
  328. data/test/stub/rails3.0/test/performance/browsing_test.rb +0 -9
  329. data/test/stub/rails3.0/test/test_helper.rb +0 -13
  330. data/test/stub/rails3.0/vendor/plugins/.gitkeep +0 -0
  331. data/test/stub/rails3.1/.gitignore +0 -15
  332. data/test/stub/rails3.1/Gemfile +0 -37
  333. data/test/stub/rails3.1/Gemfile.lock +0 -115
  334. data/test/stub/rails3.1/README +0 -261
  335. data/test/stub/rails3.1/Rakefile +0 -7
  336. data/test/stub/rails3.1/app/assets/images/rails.png +0 -0
  337. data/test/stub/rails3.1/app/assets/stylesheets/application.css +0 -7
  338. data/test/stub/rails3.1/app/controllers/application_controller.rb +0 -3
  339. data/test/stub/rails3.1/app/helpers/application_helper.rb +0 -2
  340. data/test/stub/rails3.1/app/mailers/.gitkeep +0 -0
  341. data/test/stub/rails3.1/app/models/.gitkeep +0 -0
  342. data/test/stub/rails3.1/app/views/layouts/application.html.erb +0 -14
  343. data/test/stub/rails3.1/config.ru +0 -4
  344. data/test/stub/rails3.1/config/application.rb +0 -48
  345. data/test/stub/rails3.1/config/boot.rb +0 -6
  346. data/test/stub/rails3.1/config/database.yml +0 -25
  347. data/test/stub/rails3.1/config/environment.rb +0 -5
  348. data/test/stub/rails3.1/config/environments/development.rb +0 -30
  349. data/test/stub/rails3.1/config/environments/production.rb +0 -60
  350. data/test/stub/rails3.1/config/environments/test.rb +0 -39
  351. data/test/stub/rails3.1/config/initializers/backtrace_silencers.rb +0 -7
  352. data/test/stub/rails3.1/config/initializers/inflections.rb +0 -10
  353. data/test/stub/rails3.1/config/initializers/mime_types.rb +0 -5
  354. data/test/stub/rails3.1/config/initializers/passenger.rb +0 -2
  355. data/test/stub/rails3.1/config/initializers/secret_token.rb +0 -7
  356. data/test/stub/rails3.1/config/initializers/session_store.rb +0 -8
  357. data/test/stub/rails3.1/config/initializers/wrap_parameters.rb +0 -14
  358. data/test/stub/rails3.1/config/locales/en.yml +0 -5
  359. data/test/stub/rails3.1/config/routes.rb +0 -58
  360. data/test/stub/rails3.1/db/seeds.rb +0 -7
  361. data/test/stub/rails3.1/doc/README_FOR_APP +0 -2
  362. data/test/stub/rails3.1/lib/assets/.gitkeep +0 -0
  363. data/test/stub/rails3.1/lib/tasks/.gitkeep +0 -0
  364. data/test/stub/rails3.1/log/.gitkeep +0 -0
  365. data/test/stub/rails3.1/public/404.html +0 -26
  366. data/test/stub/rails3.1/public/422.html +0 -26
  367. data/test/stub/rails3.1/public/500.html +0 -26
  368. data/test/stub/rails3.1/public/favicon.ico +0 -0
  369. data/test/stub/rails3.1/public/index.html +0 -241
  370. data/test/stub/rails3.1/public/robots.txt +0 -5
  371. data/test/stub/rails3.1/script/rails +0 -6
  372. data/test/stub/rails3.1/test/fixtures/.gitkeep +0 -0
  373. data/test/stub/rails3.1/test/functional/.gitkeep +0 -0
  374. data/test/stub/rails3.1/test/integration/.gitkeep +0 -0
  375. data/test/stub/rails3.1/test/performance/browsing_test.rb +0 -12
  376. data/test/stub/rails3.1/test/test_helper.rb +0 -13
  377. data/test/stub/rails3.1/test/unit/.gitkeep +0 -0
  378. data/test/stub/rails3.1/vendor/assets/stylesheets/.gitkeep +0 -0
  379. data/test/stub/rails3.1/vendor/plugins/.gitkeep +0 -0
  380. data/test/stub/rails3.2/.gitignore +0 -15
  381. data/test/stub/rails3.2/Gemfile +0 -39
  382. data/test/stub/rails3.2/Gemfile.lock +0 -113
  383. data/test/stub/rails3.2/Rakefile +0 -7
  384. data/test/stub/rails3.2/app/assets/images/rails.png +0 -0
  385. data/test/stub/rails3.2/app/assets/stylesheets/application.css +0 -13
  386. data/test/stub/rails3.2/app/controllers/application_controller.rb +0 -3
  387. data/test/stub/rails3.2/app/helpers/application_helper.rb +0 -2
  388. data/test/stub/rails3.2/app/mailers/.gitkeep +0 -0
  389. data/test/stub/rails3.2/app/models/.gitkeep +0 -0
  390. data/test/stub/rails3.2/app/views/layouts/application.html.erb +0 -14
  391. data/test/stub/rails3.2/config.ru +0 -4
  392. data/test/stub/rails3.2/config/application.rb +0 -62
  393. data/test/stub/rails3.2/config/boot.rb +0 -6
  394. data/test/stub/rails3.2/config/database.yml +0 -25
  395. data/test/stub/rails3.2/config/environment.rb +0 -5
  396. data/test/stub/rails3.2/config/environments/development.rb +0 -37
  397. data/test/stub/rails3.2/config/environments/production.rb +0 -67
  398. data/test/stub/rails3.2/config/environments/test.rb +0 -37
  399. data/test/stub/rails3.2/config/initializers/backtrace_silencers.rb +0 -7
  400. data/test/stub/rails3.2/config/initializers/inflections.rb +0 -15
  401. data/test/stub/rails3.2/config/initializers/mime_types.rb +0 -5
  402. data/test/stub/rails3.2/config/initializers/passenger.rb +0 -2
  403. data/test/stub/rails3.2/config/initializers/secret_token.rb +0 -7
  404. data/test/stub/rails3.2/config/initializers/session_store.rb +0 -8
  405. data/test/stub/rails3.2/config/initializers/wrap_parameters.rb +0 -14
  406. data/test/stub/rails3.2/config/locales/en.yml +0 -5
  407. data/test/stub/rails3.2/config/routes.rb +0 -58
  408. data/test/stub/rails3.2/db/seeds.rb +0 -7
  409. data/test/stub/rails3.2/doc/README_FOR_APP +0 -2
  410. data/test/stub/rails3.2/lib/assets/.gitkeep +0 -0
  411. data/test/stub/rails3.2/lib/tasks/.gitkeep +0 -0
  412. data/test/stub/rails3.2/log/.gitkeep +0 -0
  413. data/test/stub/rails3.2/public/404.html +0 -26
  414. data/test/stub/rails3.2/public/422.html +0 -26
  415. data/test/stub/rails3.2/public/500.html +0 -25
  416. data/test/stub/rails3.2/public/favicon.ico +0 -0
  417. data/test/stub/rails3.2/public/index.html +0 -241
  418. data/test/stub/rails3.2/public/robots.txt +0 -5
  419. data/test/stub/rails3.2/script/rails +0 -6
  420. data/test/stub/rails3.2/test/fixtures/.gitkeep +0 -0
  421. data/test/stub/rails3.2/test/functional/.gitkeep +0 -0
  422. data/test/stub/rails3.2/test/integration/.gitkeep +0 -0
  423. data/test/stub/rails3.2/test/performance/browsing_test.rb +0 -12
  424. data/test/stub/rails3.2/test/test_helper.rb +0 -13
  425. data/test/stub/rails3.2/test/unit/.gitkeep +0 -0
  426. data/test/stub/rails3.2/vendor/assets/stylesheets/.gitkeep +0 -0
  427. data/test/stub/rails3.2/vendor/plugins/.gitkeep +0 -0
  428. data/test/stub/rails4.0/.gitignore +0 -16
  429. data/test/stub/rails4.0/Gemfile +0 -45
  430. data/test/stub/rails4.0/Gemfile.lock +0 -126
  431. data/test/stub/rails4.0/README.rdoc +0 -28
  432. data/test/stub/rails4.0/Rakefile +0 -6
  433. data/test/stub/rails4.0/app/assets/images/.keep +0 -0
  434. data/test/stub/rails4.0/app/assets/javascripts/application.js +0 -16
  435. data/test/stub/rails4.0/app/assets/stylesheets/application.css +0 -13
  436. data/test/stub/rails4.0/app/controllers/application_controller.rb +0 -5
  437. data/test/stub/rails4.0/app/controllers/concerns/.keep +0 -0
  438. data/test/stub/rails4.0/app/helpers/application_helper.rb +0 -2
  439. data/test/stub/rails4.0/app/mailers/.keep +0 -0
  440. data/test/stub/rails4.0/app/models/.keep +0 -0
  441. data/test/stub/rails4.0/app/models/concerns/.keep +0 -0
  442. data/test/stub/rails4.0/app/views/layouts/application.html.erb +0 -14
  443. data/test/stub/rails4.0/bin/bundle +0 -3
  444. data/test/stub/rails4.0/bin/rails +0 -4
  445. data/test/stub/rails4.0/bin/rake +0 -4
  446. data/test/stub/rails4.0/config.ru +0 -4
  447. data/test/stub/rails4.0/config/application.rb +0 -23
  448. data/test/stub/rails4.0/config/boot.rb +0 -4
  449. data/test/stub/rails4.0/config/database.yml +0 -25
  450. data/test/stub/rails4.0/config/environment.rb +0 -5
  451. data/test/stub/rails4.0/config/environments/development.rb +0 -29
  452. data/test/stub/rails4.0/config/environments/production.rb +0 -80
  453. data/test/stub/rails4.0/config/environments/test.rb +0 -36
  454. data/test/stub/rails4.0/config/initializers/backtrace_silencers.rb +0 -7
  455. data/test/stub/rails4.0/config/initializers/filter_parameter_logging.rb +0 -4
  456. data/test/stub/rails4.0/config/initializers/inflections.rb +0 -16
  457. data/test/stub/rails4.0/config/initializers/mime_types.rb +0 -5
  458. data/test/stub/rails4.0/config/initializers/passenger.rb +0 -2
  459. data/test/stub/rails4.0/config/initializers/secret_token.rb +0 -12
  460. data/test/stub/rails4.0/config/initializers/session_store.rb +0 -3
  461. data/test/stub/rails4.0/config/initializers/wrap_parameters.rb +0 -14
  462. data/test/stub/rails4.0/config/locales/en.yml +0 -23
  463. data/test/stub/rails4.0/config/routes.rb +0 -57
  464. data/test/stub/rails4.0/db/seeds.rb +0 -7
  465. data/test/stub/rails4.0/lib/assets/.keep +0 -0
  466. data/test/stub/rails4.0/lib/tasks/.keep +0 -0
  467. data/test/stub/rails4.0/log/.keep +0 -0
  468. data/test/stub/rails4.0/public/404.html +0 -58
  469. data/test/stub/rails4.0/public/422.html +0 -58
  470. data/test/stub/rails4.0/public/500.html +0 -57
  471. data/test/stub/rails4.0/public/favicon.ico +0 -0
  472. data/test/stub/rails4.0/public/robots.txt +0 -5
  473. data/test/stub/rails4.0/test/controllers/.keep +0 -0
  474. data/test/stub/rails4.0/test/fixtures/.keep +0 -0
  475. data/test/stub/rails4.0/test/helpers/.keep +0 -0
  476. data/test/stub/rails4.0/test/integration/.keep +0 -0
  477. data/test/stub/rails4.0/test/mailers/.keep +0 -0
  478. data/test/stub/rails4.0/test/models/.keep +0 -0
  479. data/test/stub/rails4.0/test/test_helper.rb +0 -15
  480. data/test/stub/rails4.0/vendor/assets/javascripts/.keep +0 -0
  481. data/test/stub/rails4.0/vendor/assets/stylesheets/.keep +0 -0
  482. data/test/stub/rails4.1/.gitignore +0 -16
  483. data/test/stub/rails4.1/Gemfile +0 -45
  484. data/test/stub/rails4.1/Gemfile.lock +0 -129
  485. data/test/stub/rails4.1/README.rdoc +0 -28
  486. data/test/stub/rails4.1/Rakefile +0 -6
  487. data/test/stub/rails4.1/app/assets/images/.keep +0 -0
  488. data/test/stub/rails4.1/app/assets/javascripts/application.js +0 -16
  489. data/test/stub/rails4.1/app/assets/stylesheets/application.css +0 -13
  490. data/test/stub/rails4.1/app/controllers/application_controller.rb +0 -5
  491. data/test/stub/rails4.1/app/controllers/concerns/.keep +0 -0
  492. data/test/stub/rails4.1/app/helpers/application_helper.rb +0 -2
  493. data/test/stub/rails4.1/app/mailers/.keep +0 -0
  494. data/test/stub/rails4.1/app/models/.keep +0 -0
  495. data/test/stub/rails4.1/app/models/concerns/.keep +0 -0
  496. data/test/stub/rails4.1/app/views/layouts/application.html.erb +0 -14
  497. data/test/stub/rails4.1/bin/bundle +0 -3
  498. data/test/stub/rails4.1/bin/rails +0 -4
  499. data/test/stub/rails4.1/bin/rake +0 -4
  500. data/test/stub/rails4.1/config.ru +0 -4
  501. data/test/stub/rails4.1/config/application.rb +0 -23
  502. data/test/stub/rails4.1/config/boot.rb +0 -4
  503. data/test/stub/rails4.1/config/database.yml +0 -25
  504. data/test/stub/rails4.1/config/environment.rb +0 -5
  505. data/test/stub/rails4.1/config/environments/development.rb +0 -29
  506. data/test/stub/rails4.1/config/environments/production.rb +0 -80
  507. data/test/stub/rails4.1/config/environments/test.rb +0 -36
  508. data/test/stub/rails4.1/config/initializers/backtrace_silencers.rb +0 -7
  509. data/test/stub/rails4.1/config/initializers/filter_parameter_logging.rb +0 -4
  510. data/test/stub/rails4.1/config/initializers/inflections.rb +0 -16
  511. data/test/stub/rails4.1/config/initializers/mime_types.rb +0 -5
  512. data/test/stub/rails4.1/config/initializers/passenger.rb +0 -5
  513. data/test/stub/rails4.1/config/initializers/secret_token.rb +0 -12
  514. data/test/stub/rails4.1/config/initializers/session_store.rb +0 -3
  515. data/test/stub/rails4.1/config/initializers/wrap_parameters.rb +0 -14
  516. data/test/stub/rails4.1/config/locales/en.yml +0 -23
  517. data/test/stub/rails4.1/config/routes.rb +0 -57
  518. data/test/stub/rails4.1/db/seeds.rb +0 -7
  519. data/test/stub/rails4.1/lib/assets/.keep +0 -0
  520. data/test/stub/rails4.1/lib/tasks/.keep +0 -0
  521. data/test/stub/rails4.1/log/.keep +0 -0
  522. data/test/stub/rails4.1/public/404.html +0 -58
  523. data/test/stub/rails4.1/public/422.html +0 -58
  524. data/test/stub/rails4.1/public/500.html +0 -57
  525. data/test/stub/rails4.1/public/favicon.ico +0 -0
  526. data/test/stub/rails4.1/public/robots.txt +0 -5
  527. data/test/stub/rails4.1/test/controllers/.keep +0 -0
  528. data/test/stub/rails4.1/test/fixtures/.keep +0 -0
  529. data/test/stub/rails4.1/test/helpers/.keep +0 -0
  530. data/test/stub/rails4.1/test/integration/.keep +0 -0
  531. data/test/stub/rails4.1/test/mailers/.keep +0 -0
  532. data/test/stub/rails4.1/test/models/.keep +0 -0
  533. data/test/stub/rails4.1/test/test_helper.rb +0 -15
  534. data/test/stub/rails4.1/vendor/assets/javascripts/.keep +0 -0
  535. data/test/stub/rails4.1/vendor/assets/stylesheets/.keep +0 -0
  536. data/test/stub/start_error.pl +0 -24
  537. data/test/stub/upload_data.txt +0 -494
  538. data/test/stub/wsgi/passenger_wsgi.py +0 -212
  539. data/test/stub/wsgi/public/.gitignore +0 -0
  540. data/test/stub/wsgi/tmp/.gitignore +0 -0
  541. data/test/support/allocate_memory.c +0 -14
  542. data/test/support/apache2_controller.rb +0 -258
  543. data/test/support/multipart.rb +0 -62
  544. data/test/support/nginx_controller.rb +0 -97
  545. data/test/support/placebo-preloader.rb +0 -88
  546. data/test/support/test_helper.rb +0 -455
  547. data/test/support/valgrind.h +0 -2539
  548. data/test/tut/tut.h +0 -1310
  549. data/test/tut/tut_reporter.h +0 -256
  550. data/test/valgrind-osx.supp +0 -7
@@ -1,28 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- require 'ruby/shared/loader_sharedspec'
3
- require 'ruby/shared/rails/union_station_extensions_sharedspec'
4
-
5
- if RUBY_VERSION_INT >= 190
6
- module PhusionPassenger
7
-
8
- describe "Rack loader with Rails 4.0" do
9
- include LoaderSpecHelper
10
-
11
- before :each do
12
- @stub = register_stub(RackStub.new("rails4.0"))
13
- end
14
-
15
- def start(options = {})
16
- @loader = Loader.new(["ruby", "#{PhusionPassenger.helper_scripts_dir}/rack-loader.rb"], @stub.app_root)
17
- return @loader.start(options)
18
- end
19
-
20
- def rails_version
21
- return "4.0"
22
- end
23
-
24
- include_examples "Union Station extensions for Rails"
25
- end
26
-
27
- end # module PhusionPassenger
28
- end
@@ -1,34 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- require 'ruby/shared/loader_sharedspec'
3
- require 'ruby/shared/rails/union_station_extensions_sharedspec'
4
-
5
- if RUBY_VERSION_INT >= 190
6
- module PhusionPassenger
7
-
8
- describe "Rack preloader with Rails 4.0" do
9
- include LoaderSpecHelper
10
-
11
- before :each do
12
- @stub = register_stub(RackStub.new("rails4.0"))
13
- end
14
-
15
- def start(options = {})
16
- @preloader = Preloader.new(["ruby", "#{PhusionPassenger.helper_scripts_dir}/rack-preloader.rb"], @stub.app_root)
17
- result = @preloader.start(options)
18
- if result[:status] == "Ready"
19
- @loader = @preloader.spawn(options)
20
- return @loader.start(options)
21
- else
22
- return result
23
- end
24
- end
25
-
26
- def rails_version
27
- return "4.0"
28
- end
29
-
30
- include_examples "Union Station extensions for Rails"
31
- end
32
-
33
- end # module PhusionPassenger
34
- end
@@ -1,28 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- require 'ruby/shared/loader_sharedspec'
3
- require 'ruby/shared/rails/union_station_extensions_sharedspec'
4
-
5
- if RUBY_VERSION_INT >= 190
6
- module PhusionPassenger
7
-
8
- describe "Rack loader with Rails 4.1" do
9
- include LoaderSpecHelper
10
-
11
- before :each do
12
- @stub = register_stub(RackStub.new("rails4.1"))
13
- end
14
-
15
- def start(options = {})
16
- @loader = Loader.new(["ruby", "#{PhusionPassenger.helper_scripts_dir}/rack-loader.rb"], @stub.app_root)
17
- return @loader.start(options)
18
- end
19
-
20
- def rails_version
21
- return "4.1"
22
- end
23
-
24
- include_examples "Union Station extensions for Rails"
25
- end
26
-
27
- end # module PhusionPassenger
28
- end
@@ -1,34 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- require 'ruby/shared/loader_sharedspec'
3
- require 'ruby/shared/rails/union_station_extensions_sharedspec'
4
-
5
- if RUBY_VERSION_INT >= 190
6
- module PhusionPassenger
7
-
8
- describe "Rack preloader with Rails 4.1" do
9
- include LoaderSpecHelper
10
-
11
- before :each do
12
- @stub = register_stub(RackStub.new("rails4.1"))
13
- end
14
-
15
- def start(options = {})
16
- @preloader = Preloader.new(["ruby", "#{PhusionPassenger.helper_scripts_dir}/rack-preloader.rb"], @stub.app_root)
17
- result = @preloader.start(options)
18
- if result[:status] == "Ready"
19
- @loader = @preloader.spawn(options)
20
- return @loader.start(options)
21
- else
22
- return result
23
- end
24
- end
25
-
26
- def rails_version
27
- return "4.1"
28
- end
29
-
30
- include_examples "Union Station extensions for Rails"
31
- end
32
-
33
- end # module PhusionPassenger
34
- end
@@ -1,747 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
- PhusionPassenger.require_passenger_lib 'request_handler'
3
- PhusionPassenger.require_passenger_lib 'request_handler/thread_handler'
4
- PhusionPassenger.require_passenger_lib 'rack/thread_handler_extension'
5
- PhusionPassenger.require_passenger_lib 'union_station/core'
6
- PhusionPassenger.require_passenger_lib 'constants'
7
- PhusionPassenger.require_passenger_lib 'utils'
8
-
9
- require 'fileutils'
10
- require 'tmpdir'
11
-
12
- module PhusionPassenger
13
-
14
- describe RequestHandler do
15
- class DummyThreadHandler < RequestHandler::ThreadHandler
16
- def process_request(*args)
17
- # Do nothing.
18
- end
19
- end
20
-
21
- before :each do
22
- @temp_dir = Dir.mktmpdir
23
- preinitialize if respond_to?(:preinitialize)
24
- @owner_pipe = IO.pipe
25
- @options ||= {}
26
- @thread_handler = Class.new(DummyThreadHandler)
27
- @options = {
28
- "app_group_name" => "foobar",
29
- "thread_handler" => @thread_handler,
30
- "socket_dir" => @temp_dir,
31
- "keepalive" => false
32
- }.merge(@options)
33
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
34
- end
35
-
36
- after :each do
37
- stop_request_handler
38
- if @temp_dir
39
- FileUtils.chmod_R(0777, @temp_dir)
40
- FileUtils.rm_rf(@temp_dir)
41
- end
42
- end
43
-
44
- def stop_request_handler
45
- if @request_handler
46
- @request_handler.cleanup
47
- @owner_pipe[0].close rescue nil
48
- @request_handler = nil
49
- end
50
- end
51
-
52
- def connect(socket_name = :main)
53
- address = @request_handler.server_sockets[socket_name][:address]
54
- return Utils.connect_to_server(address)
55
- end
56
-
57
- def send_binary_request(socket, env)
58
- channel = MessageChannel.new(socket)
59
- data = ""
60
- env.each_pair do |key, value|
61
- data << key << "\0"
62
- data << value << "\0"
63
- end
64
- channel.write_scalar(data)
65
- end
66
-
67
- it "exits if the owner pipe is closed" do
68
- @request_handler.start_main_loop_thread
69
- @owner_pipe[0].close
70
- eventually do
71
- !@request_handler.main_loop_running?
72
- end
73
- end
74
-
75
- it "creates a socket file in the Phusion Passenger temp folder, unless when using TCP sockets" do
76
- if @request_handler.server_sockets[:main][1] == "unix"
77
- File.chmod(0700, "#{@temp_dir}/backends")
78
- Dir["#{@temp_dir}/backends/*"].should_not be_empty
79
- end
80
- end
81
-
82
- specify "the main socket rejects headers that are too large" do
83
- stderr = StringIO.new
84
- DebugLogging.log_level = DEFAULT_LOG_LEVEL
85
- DebugLogging.stderr_evaluator = lambda { stderr }
86
- @request_handler.start_main_loop_thread
87
- begin
88
- client = connect
89
- client.sync = true
90
- block = lambda do
91
- data = "REQUEST_METHOD\0/"
92
- data << "x" * (RequestHandler::ThreadHandler::MAX_HEADER_SIZE * 2)
93
- data << "\0"
94
- MessageChannel.new(client).write_scalar(data)
95
- end
96
- block.should raise_error(Errno::EPIPE)
97
- stderr.string.should_not be_empty
98
- ensure
99
- client.close rescue nil
100
- end
101
- end
102
-
103
- specify "the main socket rejects unauthenticated connections, if a connect password is supplied" do
104
- @request_handler.connect_password = "1234"
105
- @request_handler.start_main_loop_thread
106
- begin
107
- client = connect
108
- channel = MessageChannel.new(client)
109
- channel.write_scalar("REQUEST_METHOD\0PING\0")
110
- client.read.should == ""
111
- ensure
112
- client.close rescue nil
113
- end
114
- begin
115
- client = connect
116
- channel = MessageChannel.new(client)
117
- channel.write_scalar("REQUEST_METHOD\0PING\0PASSENGER_CONNECT_PASSWORD\0001234\0")
118
- client.read.should == "pong"
119
- ensure
120
- client.close rescue nil
121
- end
122
- end
123
-
124
- it "accepts pings on the main server socket" do
125
- @request_handler.start_main_loop_thread
126
- client = connect
127
- begin
128
- channel = MessageChannel.new(client)
129
- channel.write_scalar("REQUEST_METHOD\0PING\0")
130
- client.read.should == "pong"
131
- ensure
132
- client.close
133
- end
134
- end
135
-
136
- it "accepts pings on the HTTP server socket" do
137
- @request_handler.start_main_loop_thread
138
- client = connect(:http)
139
- begin
140
- client.write("PING / HTTP/1.1\r\n")
141
- client.write("Host: foo.com\r\n\r\n")
142
- client.close_write
143
- client.read.should == "pong"
144
- ensure
145
- client.close
146
- end
147
- end
148
-
149
- specify "the HTTP socket rejects headers that are too large" do
150
- stderr = StringIO.new
151
- DebugLogging.log_level = DEFAULT_LOG_LEVEL
152
- DebugLogging.stderr_evaluator = lambda { stderr }
153
- @request_handler.start_main_loop_thread
154
- begin
155
- client = connect(:http)
156
- client.sync = true
157
- block = lambda do
158
- client.write("GET /")
159
- client.write("x" * RequestHandler::ThreadHandler::MAX_HEADER_SIZE)
160
- sleep 0.01 # Context switch
161
- client.write("x" * RequestHandler::ThreadHandler::MAX_HEADER_SIZE)
162
- sleep 0.01 # Context switch
163
- client.write(" HTTP/1.1\r\n")
164
- end
165
- block.should raise_error(SystemCallError)
166
- stderr.string.should_not be_empty
167
- ensure
168
- client.close rescue nil
169
- end
170
- end
171
-
172
- specify "the HTTP socket rejects unauthenticated connections, if a connect password is supplied" do
173
- DebugLogging.log_level = LVL_ERROR
174
- @request_handler.connect_password = "1234"
175
- @request_handler.start_main_loop_thread
176
- begin
177
- client = connect(:http)
178
- client.write("PING / HTTP/1.1\r\n")
179
- client.write("\r\n")
180
- client.read.should == ""
181
- ensure
182
- client.close rescue nil
183
- end
184
- begin
185
- client = connect(:http)
186
- client.write("PING / HTTP/1.1\r\n")
187
- client.write("X-Passenger-Connect-Password: 1234\r\n")
188
- client.write("\r\n")
189
- client.read.should == "pong"
190
- ensure
191
- client.close rescue nil
192
- end
193
- end
194
-
195
- it "catches exceptions generated by the Rack application object" do
196
- @options["thread_handler"] = Class.new(RequestHandler::ThreadHandler) do
197
- include Rack::ThreadHandlerExtension
198
- end
199
-
200
- lambda_called = false
201
-
202
- # Here we test that the exception is not propagated to outside the request handler.
203
- @options["app"] = lambda do |env|
204
- lambda_called = true
205
- raise "an error"
206
- end
207
-
208
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
209
- @request_handler.start_main_loop_thread
210
- client = connect
211
- begin
212
- send_binary_request(client,
213
- "REQUEST_METHOD" => "GET",
214
- "PATH_INFO" => "/")
215
- client.read
216
- ensure
217
- client.close
218
- end
219
-
220
- lambda_called.should == true
221
- end
222
-
223
- it "catches exceptions generated by the Rack body object" do
224
- @options["thread_handler"] = Class.new(RequestHandler::ThreadHandler) do
225
- include Rack::ThreadHandlerExtension
226
- end
227
-
228
- lambda_called = false
229
-
230
- # Here we test that the exception is not propagated to outside the request handler.
231
- @options["app"] = lambda do |env|
232
- lambda_called = true
233
- body = Object.new
234
- def body.each
235
- raise "an error"
236
- end
237
- [200, { "Content-Type" => "text/plain" }, body]
238
- end
239
-
240
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
241
- @request_handler.start_main_loop_thread
242
- client = connect
243
- begin
244
- send_binary_request(client,
245
- "REQUEST_METHOD" => "GET",
246
- "PATH_INFO" => "/")
247
- client.read
248
- ensure
249
- client.close
250
- end
251
-
252
- lambda_called.should == true
253
- end
254
-
255
- it "allows the application to take over the socket completely through the full hijack API" do
256
- @options["thread_handler"] = Class.new(RequestHandler::ThreadHandler) do
257
- include Rack::ThreadHandlerExtension
258
- end
259
-
260
- lambda_called = false
261
-
262
- @options["app"] = lambda do |env|
263
- lambda_called = true
264
- env['rack.hijack?'].should be_true
265
- env['rack.hijack_io'].should be_nil
266
- env['rack.hijack'].call
267
- Thread.new do
268
- Thread.current.abort_on_exception = true
269
- sleep 0.1
270
- env['rack.hijack_io'].write("Hijacked response!")
271
- env['rack.hijack_io'].close
272
- end
273
- end
274
-
275
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
276
- @request_handler.start_main_loop_thread
277
- client = connect
278
- begin
279
- send_binary_request(client,
280
- "REQUEST_METHOD" => "GET",
281
- "PATH_INFO" => "/")
282
- sleep 0.1 # Give it some time to handle the request.
283
- stop_request_handler
284
- client.read.should == "Hijacked response!"
285
- ensure
286
- client.close
287
- end
288
-
289
- lambda_called.should == true
290
- end
291
-
292
- it "allows the application to take over the socket after sending headers through the partial hijack API" do
293
- @options["thread_handler"] = Class.new(RequestHandler::ThreadHandler) do
294
- include Rack::ThreadHandlerExtension
295
- end
296
-
297
- lambda_called = false
298
- hijack_callback_called = false
299
-
300
- @options["app"] = lambda do |env|
301
- lambda_called = true
302
- env['rack.hijack?'].should be_true
303
- env['rack.hijack_io'].should be_nil
304
- hijack_callback = lambda do |socket|
305
- hijack_callback_called = true
306
- env['rack.hijack_io'].should_not be_nil
307
- env['rack.hijack_io'].should == socket
308
- socket.write("Hijacked partial response!")
309
- socket.close
310
- end
311
- [200, { 'Content-Type' => 'text/html', 'rack.hijack' => hijack_callback }]
312
- end
313
-
314
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
315
- @request_handler.start_main_loop_thread
316
- client = connect
317
- begin
318
- send_binary_request(client,
319
- "REQUEST_METHOD" => "GET",
320
- "PATH_INFO" => "/")
321
- client.read.should ==
322
- "HTTP/1.1 200 Whatever\r\n" +
323
- "Content-Type: text/html\r\n" +
324
- "Connection: close\r\n" +
325
- "\r\n" +
326
- "Hijacked partial response!"
327
- ensure
328
- client.close
329
- end
330
-
331
- lambda_called.should == true
332
- hijack_callback_called.should == true
333
- end
334
-
335
- specify "requests with Content-Length are assumed to have a request body" do
336
- @options["thread_handler"] = Class.new(RequestHandler::ThreadHandler) do
337
- include Rack::ThreadHandlerExtension
338
- end
339
-
340
- lambda_called = false
341
-
342
- @options["app"] = lambda do |env|
343
- lambda_called = true
344
- env['rack.input'].read(3).should == "abc"
345
- [200, {}, ["ok"]]
346
- end
347
-
348
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
349
- @request_handler.start_main_loop_thread
350
- client = connect
351
- begin
352
- send_binary_request(client,
353
- "REQUEST_METHOD" => "GET",
354
- "PATH_INFO" => "/",
355
- "CONTENT_LENGTH" => "3")
356
- client.write("abc")
357
- client.close_write
358
- client.read.should ==
359
- "HTTP/1.1 200 Whatever\r\n" +
360
- "Connection: close\r\n" +
361
- "Content-Length: 2\r\n" +
362
- "\r\n" +
363
- "ok"
364
- ensure
365
- client.close
366
- end
367
-
368
- lambda_called.should be_true
369
- end
370
-
371
- specify "requests with Transfer-Encoding chunked are assumed to have a request body" do
372
- @options["thread_handler"] = Class.new(RequestHandler::ThreadHandler) do
373
- include Rack::ThreadHandlerExtension
374
- end
375
-
376
- lambda_called = false
377
-
378
- @options["app"] = lambda do |env|
379
- lambda_called = true
380
- env['rack.input'].read(13).should ==
381
- "3\r\n" +
382
- "abc\r\n" +
383
- "0\r\n\r\n"
384
- [200, {}, ["ok"]]
385
- end
386
-
387
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
388
- @request_handler.start_main_loop_thread
389
- client = connect
390
- begin
391
- send_binary_request(client,
392
- "REQUEST_METHOD" => "GET",
393
- "PATH_INFO" => "/",
394
- "TRANSFER_ENCODING" => "chunked")
395
- client.write(
396
- "3\r\n" +
397
- "abc\r\n" +
398
- "0\r\n\r\n")
399
- client.close_write
400
- client.read.should ==
401
- "HTTP/1.1 200 Whatever\r\n" +
402
- "Connection: close\r\n" +
403
- "Content-Length: 2\r\n" +
404
- "\r\n" +
405
- "ok"
406
- ensure
407
- client.close
408
- end
409
-
410
- lambda_called.should be_true
411
- end
412
-
413
- specify "requests with neither Content-Length nor Transfer-Encoding are assumed to have no request body" do
414
- @options["thread_handler"] = Class.new(RequestHandler::ThreadHandler) do
415
- include Rack::ThreadHandlerExtension
416
- end
417
-
418
- lambda_called = false
419
-
420
- @options["app"] = lambda do |env|
421
- lambda_called = true
422
- env['rack.input'].read(1).should be_nil
423
- env['rack.input'].gets.should be_nil
424
- [200, {}, ["ok"]]
425
- end
426
-
427
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
428
- @request_handler.start_main_loop_thread
429
- client = connect
430
- begin
431
- send_binary_request(client,
432
- "REQUEST_METHOD" => "POST",
433
- "PATH_INFO" => "/")
434
- client.close_write
435
- client.read.should ==
436
- "HTTP/1.1 200 Whatever\r\n" +
437
- "Connection: close\r\n" +
438
- "Content-Length: 2\r\n" +
439
- "\r\n" +
440
- "ok"
441
- ensure
442
- client.close
443
- end
444
-
445
- lambda_called.should be_true
446
- end
447
-
448
- describe "on requests that are not supposed to have a body" do
449
- before :each do
450
- @options["thread_handler"] = Class.new(RequestHandler::ThreadHandler) do
451
- include Rack::ThreadHandlerExtension
452
- end
453
- end
454
-
455
- it "doesn't allow reading from rack.input" do
456
- lambda_called = false
457
-
458
- @options["app"] = lambda do |env|
459
- lambda_called = true
460
- body = env['rack.input'].read.inspect
461
- [200, { "Content-Type" => "text/plain" }, [body]]
462
- end
463
-
464
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
465
- @request_handler.start_main_loop_thread
466
- client = connect
467
- begin
468
- send_binary_request(client,
469
- "REQUEST_METHOD" => "GET",
470
- "PATH_INFO" => "/")
471
- client.read.should ==
472
- "HTTP/1.1 200 Whatever\r\n" +
473
- "Content-Type: text/plain\r\n" +
474
- "Connection: close\r\n" +
475
- "Content-Length: 2\r\n" +
476
- "\r\n" +
477
- "\"\""
478
- ensure
479
- client.close
480
- end
481
-
482
- lambda_called.should be_true
483
- end
484
-
485
- it "allows reading from the client socket once the socket has been fully hijacked" do
486
- lambda_called = false
487
-
488
- @options["app"] = lambda do |env|
489
- lambda_called = true
490
- env['rack.hijack'].call
491
- io = env['rack.hijack_io']
492
- begin
493
- io.read.should == "hi"
494
- io.write("ok")
495
- ensure
496
- io.close
497
- end
498
- end
499
-
500
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
501
- @request_handler.start_main_loop_thread
502
- client = connect
503
- begin
504
- send_binary_request(client,
505
- "REQUEST_METHOD" => "GET",
506
- "PATH_INFO" => "/")
507
- client.write("hi")
508
- client.close_write
509
- client.read.should == "ok"
510
- ensure
511
- client.close
512
- end
513
-
514
- lambda_called.should be_true
515
- end
516
-
517
- it "allows reading from the client socket once the socket has been partially hijacked" do
518
- lambda_called = false
519
-
520
- @options["app"] = lambda do |env|
521
- block = lambda do |io|
522
- lambda_called = true
523
- begin
524
- io.read.should == "hi"
525
- io.write("ok")
526
- ensure
527
- io.close
528
- end
529
- end
530
- headers = { 'rack.hijack' => block }
531
- [200, headers, []]
532
- end
533
-
534
- @request_handler = RequestHandler.new(@owner_pipe[1], @options)
535
- @request_handler.start_main_loop_thread
536
- client = connect
537
- begin
538
- send_binary_request(client,
539
- "REQUEST_METHOD" => "GET",
540
- "PATH_INFO" => "/")
541
- client.write("hi")
542
- client.close_write
543
- client.read.should ==
544
- "HTTP/1.1 200 Whatever\r\n" +
545
- "Connection: close\r\n" +
546
- "\r\n" +
547
- "ok"
548
- ensure
549
- client.close
550
- end
551
-
552
- lambda_called.should be_true
553
- end
554
- end
555
-
556
- describe "if Union Station core is given" do
557
- def preinitialize
558
- if @agent_pid
559
- Process.kill('KILL', @agent_pid)
560
- Process.waitpid(@agent_pid)
561
- end
562
- @dump_file = "#{@temp_dir}/log.txt"
563
- @logging_agent_password = "1234"
564
- @agent_pid, @socket_filename, @socket_address = spawn_logging_agent(
565
- @temp_dir, @dump_file, @logging_agent_password)
566
-
567
- @union_station_core = UnionStation::Core.new(@socket_address, "logging",
568
- "1234", "localhost")
569
- @options = { "union_station_core" => @union_station_core }
570
- end
571
-
572
- after :each do
573
- if @agent_pid
574
- Process.kill('KILL', @agent_pid)
575
- Process.waitpid(@agent_pid)
576
- end
577
- end
578
-
579
- def base64(data)
580
- return [data].pack('m').gsub("\n", "")
581
- end
582
-
583
- it "makes the analytics log object available through the request env and a thread-local variable" do
584
- header_value = nil
585
- thread_value = nil
586
- @thread_handler.any_instance.should_receive(:process_request).and_return do |headers, connection, full_http_response|
587
- header_value = headers[UNION_STATION_REQUEST_TRANSACTION]
588
- thread_value = Thread.current[UNION_STATION_REQUEST_TRANSACTION]
589
- end
590
- @request_handler.start_main_loop_thread
591
- client = connect
592
- begin
593
- send_binary_request(client,
594
- "REQUEST_METHOD" => "GET",
595
- "PASSENGER_TXN_ID" => "1234-abcd",
596
- "PASSENGER_GROUP_NAME" => "foobar")
597
- client.read
598
- ensure
599
- client.close
600
- end
601
- header_value.should be_kind_of(UnionStation::Transaction)
602
- thread_value.should be_kind_of(UnionStation::Transaction)
603
- header_value.should == thread_value
604
- end
605
-
606
- it "logs uncaught exceptions for requests that have a transaction ID" do
607
- reraised = false
608
- @thread_handler.any_instance.should_receive(:process_request).and_return do |headers, connection, full_http_response|
609
- raise "something went wrong"
610
- end
611
- @thread_handler.any_instance.stub(:should_reraise_error?).and_return do |e|
612
- reraised = true
613
- e.message != "something went wrong"
614
- end
615
- @request_handler.start_main_loop_thread
616
- client = connect
617
- begin
618
- send_binary_request(client,
619
- "REQUEST_METHOD" => "GET",
620
- "PASSENGER_TXN_ID" => "1234-abcd")
621
- ensure
622
- client.close
623
- end
624
- eventually(5) do
625
- flush_logging_agent(@logging_agent_password, @socket_address)
626
- if File.exist?(@dump_file)
627
- log_data = File.read(@dump_file)
628
- else
629
- log_data = ""
630
- end
631
- log_data.include?("Request transaction ID: 1234-abcd\n") &&
632
- log_data.include?("Message: " + base64("something went wrong")) &&
633
- log_data.include?("Class: RuntimeError") &&
634
- log_data.include?("Backtrace: ")
635
- end
636
- reraised.should be_true
637
- end
638
- end
639
-
640
- describe "HTTP parsing" do
641
- before :each do
642
- @request_handler.start_main_loop_thread
643
- @client = connect(:http)
644
- @client.sync = true
645
- end
646
-
647
- after :each do
648
- @client.close if @client
649
- end
650
-
651
- it "correctly parses HTTP requests without query string" do
652
- @thread_handler.any_instance.should_receive(:process_request).and_return do |headers, connection, full_http_response|
653
- headers["REQUEST_METHOD"].should == "POST"
654
- headers["SERVER_PROTOCOL"].should == "HTTP/1.1"
655
- headers["HTTP_HOST"].should == "foo.com"
656
- headers["HTTP_X_FOO_BAR"].should == "baz"
657
- headers["PATH_INFO"].should == "/foo/bar"
658
- headers["SCRIPT_NAME"].should == ""
659
- headers["QUERY_STRING"].should == ""
660
- headers["REQUEST_URI"].should == "/foo/bar"
661
- headers["HTTP_CONTENT_LENGTH"].should be_nil
662
- headers["HTTP_CONTENT_TYPE"].should be_nil
663
- headers["CONTENT_LENGTH"].should == "10"
664
- headers["CONTENT_TYPE"].should == "text/plain"
665
- end
666
-
667
- @client.write("POST /foo/bar HTTP/1.1\r\n")
668
- @client.write("Host: foo.com\r\n")
669
- @client.write("X-Foo-Bar: baz\r\n")
670
- @client.write("Content-Length: 10\r\n")
671
- @client.write("Content-Type: text/plain\r\n")
672
- @client.write("\r\n")
673
- @client.close_write
674
- @client.read
675
- end
676
-
677
- it "correctly parses HTTP requests with query string" do
678
- @thread_handler.any_instance.should_receive(:process_request).and_return do |headers, connection, full_http_response|
679
- headers["REQUEST_METHOD"].should == "POST"
680
- headers["SERVER_PROTOCOL"].should == "HTTP/1.1"
681
- headers["HTTP_HOST"].should == "foo.com"
682
- headers["HTTP_X_FOO_BAR"].should == "baz"
683
- headers["PATH_INFO"].should == "/foo/bar"
684
- headers["SCRIPT_NAME"].should == ""
685
- headers["QUERY_STRING"].should == "hello=world&a=b+c"
686
- headers["REQUEST_URI"].should == "/foo/bar?hello=world&a=b+c"
687
- headers["HTTP_CONTENT_LENGTH"].should be_nil
688
- headers["HTTP_CONTENT_TYPE"].should be_nil
689
- headers["CONTENT_LENGTH"].should == "10"
690
- headers["CONTENT_TYPE"].should == "text/plain"
691
- end
692
-
693
- @client.write("POST /foo/bar?hello=world&a=b+c HTTP/1.1\r\n")
694
- @client.write("Host: foo.com\r\n")
695
- @client.write("X-Foo-Bar: baz\r\n")
696
- @client.write("Content-Length: 10\r\n")
697
- @client.write("Content-Type: text/plain\r\n")
698
- @client.write("\r\n")
699
- @client.close_write
700
- @client.read
701
- end
702
-
703
- it "correct parses HTTP requests that come in arbitrary chunks" do
704
- @thread_handler.any_instance.should_receive(:process_request).and_return do |headers, connection, full_http_response|
705
- headers["REQUEST_METHOD"].should == "POST"
706
- headers["SERVER_PROTOCOL"].should == "HTTP/1.1"
707
- headers["HTTP_HOST"].should == "foo.com"
708
- headers["HTTP_X_FOO_BAR"].should == "baz"
709
- headers["PATH_INFO"].should == "/foo/bar"
710
- headers["SCRIPT_NAME"].should == ""
711
- headers["QUERY_STRING"].should == "hello=world&a=b+c"
712
- headers["REQUEST_URI"].should == "/foo/bar?hello=world&a=b+c"
713
- headers["HTTP_CONTENT_LENGTH"].should be_nil
714
- headers["HTTP_CONTENT_TYPE"].should be_nil
715
- headers["CONTENT_LENGTH"].should == "10"
716
- headers["CONTENT_TYPE"].should == "text/plain"
717
- headers["HTTP_PLUS_SOME"].should be_nil
718
- end
719
-
720
- @client.write("POST /fo")
721
- sleep 0.001
722
- @client.write("o/bar?hello=world&a=b+c HT")
723
- sleep 0.001
724
- @client.write("TP/1.1\r")
725
- sleep 0.001
726
- @client.write("\nHost: foo.com")
727
- sleep 0.001
728
- @client.write("\r\n")
729
- sleep 0.001
730
- @client.write("X-Foo-Bar: baz\r\n")
731
- sleep 0.001
732
- @client.write("Content-Len")
733
- sleep 0.001
734
- @client.write("gth: 10\r\nContent-Type: text/pla")
735
- sleep 0.001
736
- @client.write("in\r\n\r")
737
- sleep 0.001
738
- @client.write("\nPlus-Some: garbage data that should be ignored.")
739
- @client.close_write
740
- @client.read
741
- end
742
- end
743
-
744
- ############################
745
- end
746
-
747
- end # module PhusionPassenger