passenger 2.0.6 → 2.1.2

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 (497) hide show
  1. data/DEVELOPERS.TXT +10 -4
  2. data/LICENSE +1 -1
  3. data/NEWS +0 -0
  4. data/Rakefile +183 -117
  5. data/benchmark/dispatcher.rb +5 -9
  6. data/bin/passenger-install-apache2-module +52 -18
  7. data/bin/passenger-memory-stats +67 -13
  8. data/bin/passenger-spawn-server +8 -4
  9. data/bin/passenger-status +21 -46
  10. data/bin/passenger-stress-test +5 -5
  11. data/debian/postinst +1 -1
  12. data/doc/ApplicationPool algorithm.txt +180 -128
  13. data/doc/Architectural overview.html +1 -778
  14. data/doc/Security of user switching support.html +1 -643
  15. data/doc/Users guide Apache.html +3127 -0
  16. data/doc/Users guide Nginx.html +1458 -0
  17. data/doc/Users guide.html +1404 -467
  18. data/doc/Users guide.txt +843 -105
  19. data/doc/cxxapi/ApplicationPoolServer_8h-source.html +751 -641
  20. data/doc/cxxapi/ApplicationPool_8h-source.html +168 -171
  21. data/doc/cxxapi/Application_8h-source.html +494 -394
  22. data/doc/cxxapi/Bucket_8h-source.html +21 -15
  23. data/doc/cxxapi/CachedFileStat_8h-source.html +191 -0
  24. data/doc/cxxapi/Configuration_8h-source.html +311 -149
  25. data/doc/cxxapi/DirectoryMapper_8h-source.html +309 -0
  26. data/doc/cxxapi/DummySpawnManager_8h-source.html +3 -4
  27. data/doc/cxxapi/Exceptions_8h-source.html +182 -165
  28. data/doc/cxxapi/FileChecker_8h-source.html +130 -0
  29. data/doc/cxxapi/Hooks_8h-source.html +2 -3
  30. data/doc/cxxapi/Logging_8h-source.html +92 -89
  31. data/doc/cxxapi/MessageChannel_8h-source.html +585 -477
  32. data/doc/cxxapi/PoolOptions_8h-source.html +305 -0
  33. data/doc/cxxapi/SpawnManager_8h-source.html +515 -540
  34. data/doc/cxxapi/StandardApplicationPool_8h-source.html +779 -679
  35. data/doc/cxxapi/SystemTime_8h-source.html +104 -0
  36. data/doc/cxxapi/Utils_8h-source.html +331 -227
  37. data/doc/cxxapi/annotated.html +6 -7
  38. data/doc/cxxapi/classClient-members.html +1 -2
  39. data/doc/cxxapi/classClient.html +1 -2
  40. data/doc/cxxapi/classHooks-members.html +5 -2
  41. data/doc/cxxapi/classHooks.html +112 -2
  42. data/doc/cxxapi/classPassenger_1_1Application-members.html +2 -3
  43. data/doc/cxxapi/classPassenger_1_1Application.html +8 -9
  44. data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +4 -4
  45. data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +42 -81
  46. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer-members.html +1 -2
  47. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +3 -4
  48. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
  49. data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +3 -2
  50. data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +74 -3
  51. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -2
  52. data/doc/cxxapi/classPassenger_1_1BusyException.html +2 -3
  53. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -2
  54. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +2 -3
  55. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +38 -0
  56. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +256 -0
  57. data/doc/cxxapi/classPassenger_1_1DummySpawnManager-members.html +1 -2
  58. data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +2 -3
  59. data/doc/cxxapi/{classPassenger_1_1Thread-members.html → classPassenger_1_1FileChecker-members.html} +4 -5
  60. data/doc/cxxapi/classPassenger_1_1FileChecker.html +121 -0
  61. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -2
  62. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +2 -3
  63. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  64. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +2 -3
  65. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +2 -3
  66. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  67. data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -2
  68. data/doc/cxxapi/classPassenger_1_1IOException.html +2 -3
  69. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  70. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +5 -2
  71. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +155 -5
  72. data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption-members.html → classPassenger_1_1RuntimeException-members.html} +2 -3
  73. data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption.html → classPassenger_1_1RuntimeException.html} +10 -8
  74. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -2
  75. data/doc/cxxapi/classPassenger_1_1SpawnException.html +2 -3
  76. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -3
  77. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +15 -56
  78. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +5 -4
  79. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +20 -81
  80. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
  81. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +2 -3
  82. data/doc/cxxapi/classPassenger_1_1SystemException.html +9 -10
  83. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  84. data/doc/cxxapi/{classboost_1_1this__thread_1_1disable__syscall__interruption-members.html → classPassenger_1_1SystemTime-members.html} +5 -3
  85. data/doc/cxxapi/classPassenger_1_1SystemTime.html +86 -0
  86. data/doc/cxxapi/classPassenger_1_1TempFile-members.html +2 -3
  87. data/doc/cxxapi/classPassenger_1_1TempFile.html +17 -9
  88. data/doc/cxxapi/definitions_8h-source.html +1 -2
  89. data/doc/cxxapi/files.html +6 -3
  90. data/doc/cxxapi/functions.html +98 -35
  91. data/doc/cxxapi/functions_func.html +60 -32
  92. data/doc/cxxapi/functions_type.html +1 -2
  93. data/doc/cxxapi/functions_vars.html +27 -2
  94. data/doc/cxxapi/graph_legend.html +1 -2
  95. data/doc/cxxapi/graph_legend.png +0 -0
  96. data/doc/cxxapi/group__Configuration.html +3 -4
  97. data/doc/cxxapi/group__Configuration.png +0 -0
  98. data/doc/cxxapi/group__Core.html +3 -4
  99. data/doc/cxxapi/group__Core.png +0 -0
  100. data/doc/cxxapi/group__Exceptions.html +4 -2
  101. data/doc/cxxapi/group__Hooks.html +1 -6
  102. data/doc/cxxapi/group__Hooks.png +0 -0
  103. data/doc/cxxapi/group__Support.html +259 -36
  104. data/doc/cxxapi/hierarchy.html +6 -7
  105. data/doc/cxxapi/inherit__graph__0.map +1 -1
  106. data/doc/cxxapi/inherit__graph__0.md5 +1 -1
  107. data/doc/cxxapi/inherit__graph__0.png +0 -0
  108. data/doc/cxxapi/inherit__graph__1.map +1 -1
  109. data/doc/cxxapi/inherit__graph__1.md5 +1 -1
  110. data/doc/cxxapi/inherit__graph__1.png +0 -0
  111. data/doc/cxxapi/inherit__graph__10.map +1 -1
  112. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  113. data/doc/cxxapi/inherit__graph__10.png +0 -0
  114. data/doc/cxxapi/inherit__graph__11.map +1 -1
  115. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  116. data/doc/cxxapi/inherit__graph__11.png +0 -0
  117. data/doc/cxxapi/inherit__graph__12.map +2 -1
  118. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  119. data/doc/cxxapi/inherit__graph__12.png +0 -0
  120. data/doc/cxxapi/inherit__graph__13.map +1 -1
  121. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  122. data/doc/cxxapi/inherit__graph__13.png +0 -0
  123. data/doc/cxxapi/inherit__graph__14.map +1 -2
  124. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  125. data/doc/cxxapi/inherit__graph__14.png +0 -0
  126. data/doc/cxxapi/inherit__graph__15.map +1 -1
  127. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  128. data/doc/cxxapi/inherit__graph__15.png +0 -0
  129. data/doc/cxxapi/inherit__graph__16.map +1 -1
  130. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  131. data/doc/cxxapi/inherit__graph__16.png +0 -0
  132. data/doc/cxxapi/inherit__graph__17.png +0 -0
  133. data/doc/cxxapi/inherit__graph__18.png +0 -0
  134. data/doc/cxxapi/inherit__graph__19.png +0 -0
  135. data/doc/cxxapi/inherit__graph__2.map +1 -1
  136. data/doc/cxxapi/inherit__graph__2.md5 +1 -1
  137. data/doc/cxxapi/inherit__graph__2.png +0 -0
  138. data/doc/cxxapi/inherit__graph__20.map +1 -1
  139. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  140. data/doc/cxxapi/inherit__graph__20.png +0 -0
  141. data/doc/cxxapi/inherit__graph__21.map +1 -1
  142. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  143. data/doc/cxxapi/inherit__graph__21.png +0 -0
  144. data/doc/cxxapi/inherit__graph__3.map +1 -1
  145. data/doc/cxxapi/inherit__graph__3.md5 +1 -1
  146. data/doc/cxxapi/inherit__graph__3.png +0 -0
  147. data/doc/cxxapi/inherit__graph__4.map +1 -1
  148. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  149. data/doc/cxxapi/inherit__graph__4.png +0 -0
  150. data/doc/cxxapi/inherit__graph__5.map +2 -1
  151. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  152. data/doc/cxxapi/inherit__graph__5.png +0 -0
  153. data/doc/cxxapi/inherit__graph__6.map +1 -1
  154. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  155. data/doc/cxxapi/inherit__graph__6.png +0 -0
  156. data/doc/cxxapi/inherit__graph__7.map +1 -1
  157. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  158. data/doc/cxxapi/inherit__graph__7.png +0 -0
  159. data/doc/cxxapi/inherit__graph__8.map +1 -1
  160. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  161. data/doc/cxxapi/inherit__graph__8.png +0 -0
  162. data/doc/cxxapi/inherit__graph__9.map +1 -2
  163. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  164. data/doc/cxxapi/inherit__graph__9.png +0 -0
  165. data/doc/cxxapi/inherits.html +30 -31
  166. data/doc/cxxapi/main.html +1 -2
  167. data/doc/cxxapi/modules.html +1 -2
  168. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -2
  169. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +2 -3
  170. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -2
  171. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +2 -3
  172. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +49 -0
  173. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +404 -0
  174. data/doc/cxxapi/tree.html +18 -20
  175. data/doc/images/conservative_spawning.png +0 -0
  176. data/doc/images/conservative_spawning.svg +248 -0
  177. data/doc/images/smart-lv2.png +0 -0
  178. data/doc/images/smart-lv2.svg +320 -0
  179. data/doc/rdoc/classes/ConditionVariable.html +68 -34
  180. data/doc/rdoc/classes/Exception.html +16 -16
  181. data/doc/rdoc/classes/GC.html +9 -9
  182. data/doc/rdoc/classes/IO.html +36 -17
  183. data/doc/rdoc/classes/PhusionPassenger.html +183 -0
  184. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +511 -0
  185. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer.html +285 -242
  186. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerAlreadyStarted.html +3 -3
  187. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerError.html +3 -3
  188. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerNotStarted.html +3 -3
  189. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/UnknownMessage.html +3 -3
  190. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +598 -0
  191. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +140 -0
  192. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +247 -0
  193. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +138 -0
  194. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AppInitError.html +36 -19
  195. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/Application.html +81 -96
  196. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/ConsoleTextTemplate.html +18 -18
  197. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/FrameworkInitError.html +20 -18
  198. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/HTMLTemplate.html +18 -18
  199. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/InitializationError.html +9 -9
  200. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
  201. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/MessageChannel.html +93 -92
  202. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/NativeSupport.html +55 -25
  203. data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
  204. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +185 -0
  205. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +182 -0
  206. data/doc/rdoc/classes/PhusionPassenger/Railz.html +95 -0
  207. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +424 -0
  208. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +98 -0
  209. data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +200 -0
  210. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +444 -0
  211. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +98 -0
  212. data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +154 -0
  213. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +408 -0
  214. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/UnknownError.html +13 -13
  215. data/doc/rdoc/classes/PhusionPassenger/Utils.html +687 -0
  216. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/VersionNotFound.html +8 -8
  217. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
  218. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +188 -0
  219. data/doc/rdoc/classes/PlatformInfo.html +663 -159
  220. data/doc/rdoc/classes/RakeExtensions.html +4 -4
  221. data/doc/rdoc/classes/Signal.html +134 -0
  222. data/doc/rdoc/created.rid +1 -1
  223. data/doc/rdoc/files/DEVELOPERS_TXT.html +15 -10
  224. data/doc/rdoc/files/README.html +5 -7
  225. data/doc/rdoc/files/ext/{passenger → phusion_passenger}/native_support_c.html +2 -2
  226. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_request_handler_rb.html +7 -9
  227. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +120 -0
  228. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_server_rb.html +7 -10
  229. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +99 -0
  230. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +92 -0
  231. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/application_rb.html +6 -8
  232. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/console_text_template_rb.html +5 -7
  233. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/constants_rb.html +4 -5
  234. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/dependencies_rb.html +6 -8
  235. data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +116 -0
  236. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/exceptions_rb.html +5 -7
  237. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/html_template_rb.html +5 -7
  238. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/message_channel_rb.html +5 -7
  239. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/platform_info_rb.html +6 -7
  240. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +123 -0
  241. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +117 -0
  242. data/doc/rdoc/files/lib/{passenger/utils_rb.html → phusion_passenger/railz/application_spawner_rb.html} +24 -17
  243. data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +126 -0
  244. data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +139 -0
  245. data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +118 -0
  246. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/simple_benchmarking_rb.html +5 -7
  247. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/spawn_manager_rb.html +40 -24
  248. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +169 -0
  249. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +120 -0
  250. data/doc/rdoc/files/lib/rake/extensions_rb.html +3 -4
  251. data/doc/rdoc/fr_class_index.html +37 -19
  252. data/doc/rdoc/fr_file_index.html +25 -14
  253. data/doc/rdoc/fr_method_index.html +145 -74
  254. data/ext/apache2/Application.h +145 -44
  255. data/ext/apache2/ApplicationPool.h +27 -29
  256. data/ext/apache2/ApplicationPoolServer.h +183 -72
  257. data/ext/apache2/ApplicationPoolServerExecutable.cpp +249 -42
  258. data/ext/apache2/Bucket.cpp +61 -9
  259. data/ext/apache2/Bucket.h +15 -8
  260. data/ext/apache2/CachedFileStat.cpp +114 -0
  261. data/ext/apache2/CachedFileStat.h +169 -0
  262. data/ext/apache2/Configuration.cpp +213 -22
  263. data/ext/apache2/Configuration.h +176 -13
  264. data/ext/apache2/DirectoryMapper.h +287 -0
  265. data/ext/apache2/Exceptions.h +30 -12
  266. data/ext/apache2/FileChecker.h +108 -0
  267. data/ext/apache2/Hooks.cpp +709 -493
  268. data/ext/apache2/LICENSE-CNRI.TXT +15 -0
  269. data/ext/apache2/Logging.h +26 -22
  270. data/ext/apache2/MessageChannel.h +124 -15
  271. data/ext/apache2/PoolOptions.h +283 -0
  272. data/ext/apache2/SpawnManager.h +75 -99
  273. data/ext/apache2/StandardApplicationPool.h +296 -195
  274. data/ext/apache2/SystemTime.cpp +28 -0
  275. data/ext/apache2/SystemTime.h +82 -0
  276. data/ext/apache2/Utils.cpp +172 -18
  277. data/ext/apache2/Utils.h +124 -19
  278. data/ext/boost/cstdint.hpp +4 -2
  279. data/ext/boost/current_function.hpp +67 -0
  280. data/ext/boost/detail/sp_counted_base.hpp +4 -4
  281. data/ext/boost/thread/exceptions.hpp +2 -1
  282. data/ext/boost/thread/pthread/thread.hpp +11 -3
  283. data/ext/boost/thread/pthread/thread_data.hpp +2 -1
  284. data/ext/oxt/backtrace.cpp +172 -0
  285. data/ext/oxt/backtrace.hpp +135 -0
  286. data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
  287. data/ext/oxt/detail/backtrace_enabled.hpp +155 -0
  288. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +82 -0
  289. data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
  290. data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
  291. data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
  292. data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
  293. data/ext/oxt/macros.hpp +58 -0
  294. data/ext/oxt/spin_lock.hpp +55 -0
  295. data/ext/{apache2/System.cpp → oxt/system_calls.cpp} +87 -52
  296. data/ext/oxt/system_calls.hpp +234 -0
  297. data/ext/oxt/thread.cpp +32 -0
  298. data/ext/oxt/thread.hpp +223 -0
  299. data/ext/oxt/tracable_exception.cpp +87 -0
  300. data/ext/oxt/tracable_exception.hpp +35 -0
  301. data/{lib/passenger/constants.rb → ext/phusion_passenger/extconf.rb} +14 -9
  302. data/ext/{passenger → phusion_passenger}/native_support.c +33 -6
  303. data/lib/{passenger → phusion_passenger}/abstract_request_handler.rb +209 -93
  304. data/lib/{passenger → phusion_passenger}/abstract_server.rb +23 -8
  305. data/lib/phusion_passenger/abstract_server_collection.rb +301 -0
  306. data/lib/phusion_passenger/admin_tools.rb +25 -0
  307. data/lib/phusion_passenger/admin_tools/control_process.rb +107 -0
  308. data/lib/{passenger → phusion_passenger}/application.rb +13 -16
  309. data/lib/{passenger → phusion_passenger}/console_text_template.rb +2 -2
  310. data/{ext/passenger/extconf.rb → lib/phusion_passenger/constants.rb} +5 -5
  311. data/lib/{passenger → phusion_passenger}/dependencies.rb +38 -32
  312. data/lib/phusion_passenger/events.rb +45 -0
  313. data/lib/{passenger → phusion_passenger}/exceptions.rb +12 -5
  314. data/lib/{passenger → phusion_passenger}/html_template.rb +2 -2
  315. data/lib/{passenger → phusion_passenger}/message_channel.rb +3 -2
  316. data/lib/phusion_passenger/platform_info.rb +500 -0
  317. data/lib/{passenger → phusion_passenger}/rack/application_spawner.rb +29 -22
  318. data/lib/{passenger → phusion_passenger}/rack/request_handler.rb +14 -9
  319. data/lib/{passenger → phusion_passenger}/railz/application_spawner.rb +94 -74
  320. data/lib/{passenger → phusion_passenger}/railz/cgi_fixed.rb +2 -2
  321. data/lib/{passenger → phusion_passenger}/railz/framework_spawner.rb +86 -98
  322. data/lib/{passenger → phusion_passenger}/railz/request_handler.rb +6 -6
  323. data/lib/{passenger → phusion_passenger}/simple_benchmarking.rb +0 -0
  324. data/lib/{passenger → phusion_passenger}/spawn_manager.rb +136 -128
  325. data/lib/{passenger → phusion_passenger}/templates/apache2_config_snippets.txt.erb +0 -0
  326. data/lib/{passenger → phusion_passenger}/templates/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
  327. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +38 -0
  328. data/lib/{passenger → phusion_passenger}/templates/app_init_error.html.erb +0 -0
  329. data/lib/{passenger → phusion_passenger}/templates/database_error.html.erb +0 -0
  330. data/lib/{passenger → phusion_passenger}/templates/deployment_example.txt.erb +1 -1
  331. data/lib/{passenger → phusion_passenger}/templates/error_layout.css +0 -0
  332. data/lib/{passenger → phusion_passenger}/templates/error_layout.html.erb +0 -0
  333. data/lib/{passenger → phusion_passenger}/templates/framework_init_error.html.erb +0 -0
  334. data/lib/{passenger → phusion_passenger}/templates/general_error.html.erb +0 -0
  335. data/lib/{passenger → phusion_passenger}/templates/invalid_app_root.html.erb +1 -1
  336. data/lib/{passenger → phusion_passenger}/templates/load_error.html.erb +0 -0
  337. data/lib/{passenger → phusion_passenger}/templates/no_write_permission_to_passenger_root.txt.erb +0 -0
  338. data/lib/{passenger → phusion_passenger}/templates/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  339. data/lib/{passenger → phusion_passenger}/templates/run_installer_as_root.txt.erb +0 -0
  340. data/lib/{passenger → phusion_passenger}/templates/version_not_found.html.erb +0 -0
  341. data/lib/{passenger → phusion_passenger}/templates/welcome.txt.erb +0 -0
  342. data/lib/{passenger → phusion_passenger}/utils.rb +210 -44
  343. data/lib/{passenger → phusion_passenger}/wsgi/application_spawner.rb +18 -15
  344. data/lib/{passenger → phusion_passenger}/wsgi/request_handler.py +7 -1
  345. data/man/passenger-memory-stats.8 +1 -1
  346. data/misc/render_error_pages.rb +1 -1
  347. data/test/ApplicationPoolServerTest.cpp +0 -28
  348. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +4 -0
  349. data/test/ApplicationPoolTest.cpp +307 -69
  350. data/test/CachedFileStatTest.cpp +262 -0
  351. data/test/FileCheckerTest.cpp +79 -0
  352. data/test/MessageChannelTest.cpp +3 -3
  353. data/test/PoolOptionsTest.cpp +37 -0
  354. data/test/SpawnManagerTest.cpp +4 -4
  355. data/test/StandardApplicationPoolTest.cpp +4 -0
  356. data/test/SystemTimeTest.cpp +37 -0
  357. data/test/UtilsTest.cpp +137 -0
  358. data/test/integration_tests.rb +270 -23
  359. data/test/oxt/backtrace_test.cpp +128 -0
  360. data/test/oxt/oxt_test_main.cpp +25 -0
  361. data/test/oxt/syscall_interruption_test.cpp +50 -0
  362. data/test/ruby/abstract_request_handler_spec.rb +83 -0
  363. data/test/ruby/abstract_server_collection_spec.rb +246 -0
  364. data/test/ruby/application_spec.rb +3 -3
  365. data/test/ruby/message_channel_spec.rb +2 -2
  366. data/test/ruby/rack/application_spawner_spec.rb +3 -5
  367. data/test/ruby/rails/application_spawner_spec.rb +54 -15
  368. data/test/ruby/rails/framework_spawner_spec.rb +6 -8
  369. data/test/ruby/rails/minimal_spawner_spec.rb +29 -0
  370. data/test/ruby/rails/spawner_error_handling_spec.rb +1 -1
  371. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +3 -3
  372. data/test/ruby/spawn_manager_spec.rb +23 -12
  373. data/test/ruby/utils_spec.rb +36 -2
  374. data/test/ruby/wsgi/application_spawner_spec.rb +47 -0
  375. data/test/stub/apache2/httpd.conf.erb +3 -5
  376. data/test/stub/message_channel.rb +2 -2
  377. data/test/stub/message_channel_2.rb +2 -2
  378. data/test/stub/message_channel_3.rb +3 -3
  379. data/test/stub/minimal-railsapp/README +0 -0
  380. data/test/stub/minimal-railsapp/config/application.rb +0 -0
  381. data/test/stub/minimal-railsapp/config/environment.rb +0 -0
  382. data/test/stub/minimal-railsapp/vendor/rails/actionmailer/lib/action_mailer.rb +0 -0
  383. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_controller.rb +0 -0
  384. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_pack.rb +0 -0
  385. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_view.rb +0 -0
  386. data/test/stub/minimal-railsapp/vendor/rails/activerecord/lib/active_record.rb +0 -0
  387. data/test/stub/minimal-railsapp/vendor/rails/activeresource/lib/active_resource.rb +0 -0
  388. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support.rb +0 -0
  389. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +0 -0
  390. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/dispatcher.rb +0 -0
  391. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/initializer.rb +0 -0
  392. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/ruby_version_check.rb +0 -0
  393. data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +8 -0
  394. data/test/stub/rails_apps/foobar/config/environments/development.rb +1 -2
  395. data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +21 -1
  396. data/test/stub/rails_apps/mycook/sites/some.site/public/uploads.html +26 -0
  397. data/test/stub/rails_apps/mycook/sites/some.site/public/welcome/cached.html +26 -0
  398. data/test/stub/railsapp/app/controllers/application.rb +0 -0
  399. data/test/stub/railsapp/app/controllers/bar_controller_1.rb +0 -0
  400. data/test/stub/railsapp/app/controllers/bar_controller_2.rb +1 -1
  401. data/test/stub/railsapp/app/controllers/foo_controller.rb +4 -0
  402. data/test/stub/railsapp/app/helpers/application_helper.rb +0 -0
  403. data/test/stub/railsapp/config/boot.rb +0 -0
  404. data/test/stub/railsapp/config/database.yml +0 -0
  405. data/test/stub/railsapp/config/environment.rb +0 -0
  406. data/test/stub/railsapp/config/environments/development.rb +0 -0
  407. data/test/stub/railsapp/config/environments/production.rb +0 -0
  408. data/test/stub/railsapp/config/initializers/inflections.rb +0 -0
  409. data/test/stub/railsapp/config/initializers/mime_types.rb +0 -0
  410. data/test/stub/railsapp/config/routes.rb +0 -0
  411. data/test/stub/railsapp/public/useless.txt +0 -0
  412. data/test/stub/spawn_server.rb +3 -4
  413. data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
  414. data/test/support/apache2_controller.rb +57 -7
  415. data/test/support/tut.h +15 -0
  416. data/vendor/README +12 -0
  417. data/vendor/README_FOR_PACKAGERS +1 -0
  418. data/vendor/rack-0.9.1/AUTHORS +8 -0
  419. data/vendor/rack-0.9.1/COPYING +18 -0
  420. data/vendor/rack-0.9.1/ChangeLog +1423 -0
  421. data/vendor/rack-0.9.1/KNOWN-ISSUES +18 -0
  422. data/vendor/rack-0.9.1/README +306 -0
  423. data/vendor/rack-0.9.1/Rakefile +188 -0
  424. data/vendor/rack-0.9.1/SPEC +129 -0
  425. data/vendor/rack-0.9.1/lib/rack.rb +86 -0
  426. data/vendor/rack-0.9.1/lib/rack/adapter/camping.rb +22 -0
  427. data/vendor/rack-0.9.1/lib/rack/auth/abstract/handler.rb +28 -0
  428. data/vendor/rack-0.9.1/lib/rack/auth/abstract/request.rb +37 -0
  429. data/vendor/rack-0.9.1/lib/rack/auth/basic.rb +58 -0
  430. data/vendor/rack-0.9.1/lib/rack/auth/digest/md5.rb +124 -0
  431. data/vendor/rack-0.9.1/lib/rack/auth/digest/nonce.rb +51 -0
  432. data/vendor/rack-0.9.1/lib/rack/auth/digest/params.rb +55 -0
  433. data/vendor/rack-0.9.1/lib/rack/auth/digest/request.rb +40 -0
  434. data/vendor/rack-0.9.1/lib/rack/auth/openid.rb +438 -0
  435. data/vendor/rack-0.9.1/lib/rack/builder.rb +67 -0
  436. data/vendor/rack-0.9.1/lib/rack/cascade.rb +36 -0
  437. data/vendor/rack-0.9.1/lib/rack/commonlogger.rb +61 -0
  438. data/vendor/rack-0.9.1/lib/rack/conditionalget.rb +43 -0
  439. data/vendor/rack-0.9.1/lib/rack/content_length.rb +25 -0
  440. data/vendor/rack-0.9.1/lib/rack/deflater.rb +87 -0
  441. data/vendor/rack-0.9.1/lib/rack/directory.rb +150 -0
  442. data/vendor/rack-0.9.1/lib/rack/file.rb +85 -0
  443. data/vendor/rack-0.9.1/lib/rack/handler.rb +48 -0
  444. data/vendor/rack-0.9.1/lib/rack/handler/cgi.rb +57 -0
  445. data/vendor/rack-0.9.1/lib/rack/handler/evented_mongrel.rb +8 -0
  446. data/vendor/rack-0.9.1/lib/rack/handler/fastcgi.rb +86 -0
  447. data/vendor/rack-0.9.1/lib/rack/handler/lsws.rb +52 -0
  448. data/vendor/rack-0.9.1/lib/rack/handler/mongrel.rb +82 -0
  449. data/vendor/rack-0.9.1/lib/rack/handler/scgi.rb +57 -0
  450. data/vendor/rack-0.9.1/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
  451. data/vendor/rack-0.9.1/lib/rack/handler/thin.rb +15 -0
  452. data/vendor/rack-0.9.1/lib/rack/handler/webrick.rb +61 -0
  453. data/vendor/rack-0.9.1/lib/rack/head.rb +19 -0
  454. data/vendor/rack-0.9.1/lib/rack/lint.rb +465 -0
  455. data/vendor/rack-0.9.1/lib/rack/lobster.rb +65 -0
  456. data/vendor/rack-0.9.1/lib/rack/methodoverride.rb +27 -0
  457. data/vendor/rack-0.9.1/lib/rack/mime.rb +204 -0
  458. data/vendor/rack-0.9.1/lib/rack/mock.rb +160 -0
  459. data/vendor/rack-0.9.1/lib/rack/recursive.rb +57 -0
  460. data/vendor/rack-0.9.1/lib/rack/reloader.rb +64 -0
  461. data/vendor/rack-0.9.1/lib/rack/request.rb +218 -0
  462. data/vendor/rack-0.9.1/lib/rack/response.rb +171 -0
  463. data/vendor/rack-0.9.1/lib/rack/session/abstract/id.rb +153 -0
  464. data/vendor/rack-0.9.1/lib/rack/session/cookie.rb +89 -0
  465. data/vendor/rack-0.9.1/lib/rack/session/memcache.rb +97 -0
  466. data/vendor/rack-0.9.1/lib/rack/session/pool.rb +73 -0
  467. data/vendor/rack-0.9.1/lib/rack/showexceptions.rb +348 -0
  468. data/vendor/rack-0.9.1/lib/rack/showstatus.rb +106 -0
  469. data/vendor/rack-0.9.1/lib/rack/static.rb +38 -0
  470. data/vendor/rack-0.9.1/lib/rack/urlmap.rb +48 -0
  471. data/vendor/rack-0.9.1/lib/rack/utils.rb +347 -0
  472. metadata +1197 -1055
  473. data/doc/cxxapi/System_8h-source.html +0 -251
  474. data/doc/cxxapi/classDirectoryMapper-members.html +0 -38
  475. data/doc/cxxapi/classDirectoryMapper.html +0 -203
  476. data/doc/cxxapi/classPassenger_1_1Thread.html +0 -100
  477. data/doc/cxxapi/classboost_1_1this__thread_1_1disable__syscall__interruption.html +0 -46
  478. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption-members.html +0 -33
  479. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption.html +0 -44
  480. data/doc/cxxapi/namespacePassenger.html +0 -208
  481. data/doc/cxxapi/namespacePassenger_1_1InterruptableCalls.html +0 -43
  482. data/doc/cxxapi/namespacemembers.html +0 -70
  483. data/doc/cxxapi/namespacemembers_func.html +0 -66
  484. data/doc/cxxapi/namespacemembers_type.html +0 -46
  485. data/doc/cxxapi/namespaces.html +0 -35
  486. data/doc/rdoc/classes/Passenger.html +0 -136
  487. data/doc/rdoc/classes/Passenger/AbstractRequestHandler.html +0 -402
  488. data/doc/rdoc/classes/Passenger/SpawnManager.html +0 -379
  489. data/doc/rdoc/classes/Passenger/Utils.html +0 -578
  490. data/ext/apache2/System.h +0 -228
  491. data/lib/passenger/platform_info.rb +0 -302
  492. data/lib/passenger/templates/app_exited_during_initialization.html.erb +0 -19
  493. data/test/stub/apache2/httpd.conf +0 -75
  494. data/test/stub/rails_apps/foobar/config/environments/test.rb +0 -22
  495. data/test/stub/rails_apps/mycook/config/environments/test.rb +0 -22
  496. data/test/stub/railsapp/config/environments/test.rb +0 -22
  497. data/test/stub/railsapp2/config/environments/test.rb +0 -22
@@ -1,7 +1,7 @@
1
1
  require 'support/config'
2
2
  require 'support/test_helper'
3
- require 'passenger/application'
4
- include Passenger
3
+ require 'phusion_passenger/application'
4
+ include PhusionPassenger
5
5
 
6
6
  describe Application do
7
7
  include TestHelper
@@ -38,6 +38,6 @@ describe Application do
38
38
  content.sub(/^RAILS_GEM_VERSION = .*$/, "RAILS_GEM_VERSION = '1.9.1972'")
39
39
  end
40
40
  detector = lambda { Application.detect_framework_version(@stub.app_root) }
41
- detector.should raise_error(::Passenger::VersionNotFound)
41
+ detector.should raise_error(::PhusionPassenger::VersionNotFound)
42
42
  end
43
43
  end
@@ -1,7 +1,7 @@
1
1
  require 'socket'
2
2
  require 'support/config'
3
- require 'passenger/message_channel'
4
- include Passenger
3
+ require 'phusion_passenger/message_channel'
4
+ include PhusionPassenger
5
5
 
6
6
  describe MessageChannel do
7
7
  describe "scenarios with a single channel" do
@@ -1,10 +1,8 @@
1
1
  require 'support/config'
2
2
  require 'support/test_helper'
3
- require 'passenger/rack/application_spawner'
3
+ require 'phusion_passenger/rack/application_spawner'
4
4
 
5
- include Passenger
6
-
7
- describe Passenger::Rack::ApplicationSpawner do
5
+ describe PhusionPassenger::Rack::ApplicationSpawner do
8
6
  include TestHelper
9
7
 
10
8
  before :each do
@@ -37,7 +35,7 @@ describe Passenger::Rack::ApplicationSpawner do
37
35
  end if Process.euid == 0
38
36
 
39
37
  def spawn(*args)
40
- Passenger::Rack::ApplicationSpawner.spawn_application(*args)
38
+ PhusionPassenger::Rack::ApplicationSpawner.spawn_application(*args)
41
39
  end
42
40
  end
43
41
 
@@ -1,14 +1,14 @@
1
1
  require 'support/config'
2
2
  require 'support/test_helper'
3
- require 'passenger/railz/application_spawner'
3
+ require 'phusion_passenger/railz/application_spawner'
4
4
 
5
5
  require 'ruby/rails/minimal_spawner_spec'
6
6
  require 'ruby/spawn_server_spec'
7
7
  require 'ruby/rails/spawner_privilege_lowering_spec'
8
8
  require 'ruby/rails/spawner_error_handling_spec'
9
9
 
10
- include Passenger
11
- include Passenger::Railz
10
+ include PhusionPassenger
11
+ include PhusionPassenger::Railz
12
12
 
13
13
  describe ApplicationSpawner do
14
14
  include TestHelper
@@ -35,10 +35,35 @@ end
35
35
  describe ApplicationSpawner do
36
36
  include TestHelper
37
37
 
38
- describe "regular spawning" do
38
+ describe "smart spawning" do
39
39
  it_should_behave_like "a minimal spawner"
40
40
  it_should_behave_like "handling errors in application initialization"
41
41
 
42
+ it "calls the starting_worker_process event, with forked=true, after a new worker process has been forked off" do
43
+ use_rails_stub('foobar') do |stub|
44
+ File.append(stub.environment_rb, %q{
45
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
46
+ File.append("result.txt", "forked = #{forked}\n")
47
+ end
48
+ File.append("result.txt", "end of environment.rb\n");
49
+ })
50
+
51
+ spawner = ApplicationSpawner.new(stub.app_root)
52
+ spawner.start
53
+ begin
54
+ spawner.spawn_application.close
55
+ spawner.spawn_application.close
56
+ ensure
57
+ spawner.stop
58
+ end
59
+
60
+ contents = File.read("#{stub.app_root}/result.txt")
61
+ contents.should == "end of environment.rb\n" +
62
+ "forked = true\n" +
63
+ "forked = true\n"
64
+ end
65
+ end
66
+
42
67
  def spawn_stub_application(stub)
43
68
  @spawner = ApplicationSpawner.new(stub.app_root)
44
69
  begin
@@ -53,7 +78,25 @@ describe ApplicationSpawner do
53
78
  describe "conservative spawning" do
54
79
  it_should_behave_like "a minimal spawner"
55
80
  it_should_behave_like "handling errors in application initialization"
56
-
81
+
82
+ it "calls the starting_worker_process event, with forked=true, after environment.rb has been loaded" do
83
+ use_rails_stub('foobar') do |stub|
84
+ File.append(stub.environment_rb, %q{
85
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
86
+ File.append("result.txt", "forked = #{forked}\n")
87
+ end
88
+ File.append("result.txt", "end of environment.rb\n");
89
+ })
90
+ spawn_stub_application(stub).close
91
+ spawn_stub_application(stub).close
92
+ contents = File.read("#{stub.app_root}/result.txt")
93
+ contents.should == "end of environment.rb\n" +
94
+ "forked = false\n" +
95
+ "end of environment.rb\n" +
96
+ "forked = false\n"
97
+ end
98
+ end
99
+
57
100
  def spawn_stub_application(stub)
58
101
  @spawner = ApplicationSpawner.new(stub.app_root)
59
102
  return @spawner.spawn_application!
@@ -70,12 +113,10 @@ describe("ApplicationSpawner privilege lowering support") do
70
113
 
71
114
  def spawn_stub_application(options = {})
72
115
  options = {
73
- :lower_privilege => true,
74
- :lowest_user => CONFIG['lowest_user']
116
+ "lower_privilege" => true,
117
+ "lowest_user" => CONFIG['lowest_user']
75
118
  }.merge(options)
76
- @spawner = ApplicationSpawner.new(@stub.app_root,
77
- options[:lower_privilege],
78
- options[:lowest_user])
119
+ @spawner = ApplicationSpawner.new(@stub.app_root, options)
79
120
  @spawner.start
80
121
  begin
81
122
  app = @spawner.spawn_application
@@ -92,12 +133,10 @@ describe("ApplicationSpawner privilege lowering support") do
92
133
 
93
134
  def spawn_stub_application(options = {})
94
135
  options = {
95
- :lower_privilege => true,
96
- :lowest_user => CONFIG['lowest_user']
136
+ "lower_privilege" => true,
137
+ "lowest_user" => CONFIG['lowest_user']
97
138
  }.merge(options)
98
- @spawner = ApplicationSpawner.new(@stub.app_root,
99
- options[:lower_privilege],
100
- options[:lowest_user])
139
+ @spawner = ApplicationSpawner.new(@stub.app_root, options)
101
140
  begin
102
141
  app = @spawner.spawn_application!
103
142
  yield app
@@ -1,13 +1,13 @@
1
1
  require 'support/config'
2
2
  require 'support/test_helper'
3
- require 'passenger/railz/framework_spawner'
3
+ require 'phusion_passenger/railz/framework_spawner'
4
4
 
5
5
  require 'ruby/rails/minimal_spawner_spec'
6
6
  require 'ruby/spawn_server_spec'
7
7
  require 'ruby/rails/spawner_privilege_lowering_spec'
8
8
  require 'ruby/rails/spawner_error_handling_spec'
9
- include Passenger
10
- include Passenger::Railz
9
+ include PhusionPassenger
10
+ include PhusionPassenger::Railz
11
11
 
12
12
  # TODO: test whether FrameworkSpawner restarts ApplicationSpawner if it crashed
13
13
 
@@ -112,17 +112,15 @@ describe("FrameworkSpawner privilege lowering support") do
112
112
 
113
113
  def spawn_stub_application(options = {})
114
114
  options = {
115
- :lower_privilege => true,
116
- :lowest_user => CONFIG['lowest_user']
115
+ "lower_privilege" => true,
116
+ "lowest_user" => CONFIG['lowest_user']
117
117
  }.merge(options)
118
118
  @stub.use_vendor_rails('minimal')
119
119
  @spawner = FrameworkSpawner.new(:vendor =>
120
120
  "#{@stub.app_root}/vendor/rails")
121
121
  @spawner.start
122
122
  begin
123
- app = @spawner.spawn_application(@stub.app_root,
124
- options[:lower_privilege],
125
- options[:lowest_user])
123
+ app = @spawner.spawn_application(@stub.app_root, options)
126
124
  yield app
127
125
  ensure
128
126
  app.close if app
@@ -35,6 +35,35 @@ shared_examples_for "a minimal spawner" do
35
35
  end
36
36
  end
37
37
 
38
+ it "does not conflict with models in the application that are named 'Passenger'" do
39
+ use_rails_stub('foobar') do |stub|
40
+ if !File.directory?("#{stub.app_root}/app/models")
41
+ Dir.mkdir("#{stub.app_root}/app/models")
42
+ end
43
+ File.open("#{stub.app_root}/app/models/passenger.rb", 'w') do |f|
44
+ f.write(%q{
45
+ class Passenger
46
+ def name
47
+ return "Gourry Gabriev"
48
+ end
49
+ end
50
+ })
51
+ end
52
+ File.append(stub.environment_rb, %q{
53
+ # We explicitly call 'require' here because we might be
54
+ # using a stub Rails framework (that doesn't support automatic
55
+ # loading of model source files).
56
+ require 'app/models/passenger'
57
+ File.open('passenger.txt', 'w') do |f|
58
+ f.write(Passenger.new.name)
59
+ end
60
+ })
61
+ spawn_stub_application(stub).close
62
+ passenger_name = File.read("#{stub.app_root}/passenger.txt")
63
+ passenger_name.should == 'Gourry Gabriev'
64
+ end
65
+ end
66
+
38
67
  it "loads application_controller.rb instead of application.rb, if the former exists" do
39
68
  use_rails_stub('foobar') do |stub|
40
69
  File.rename("#{stub.app_root}/app/controllers/application.rb",
@@ -39,7 +39,7 @@ shared_examples_for "handling errors in application initialization" do
39
39
  spawn_stub_application(@stub)
40
40
  violated "Spawning the application should have raised an InitializationError."
41
41
  rescue AppInitError => e
42
- e.child_exception.should be_nil
42
+ e.child_exception.class.should == SystemExit
43
43
  end
44
44
  end
45
45
  end
@@ -65,20 +65,20 @@ shared_examples_for "a spawner that supports lowering of privileges" do
65
65
 
66
66
  it "doesn't switch user if environment.rb is owned by a nonexistant user, and 'lowest_user' doesn't exist either" do
67
67
  File.chown(CONFIG['nonexistant_uid'], nil, @environment_rb)
68
- spawn_stub_application(:lowest_user => CONFIG['nonexistant_user']) do |app|
68
+ spawn_stub_application("lowest_user" => CONFIG['nonexistant_user']) do |app|
69
69
  read_dumped_info[:username].should == my_username
70
70
  end
71
71
  end
72
72
 
73
73
  it "doesn't switch user if 'lower_privilege' is set to false" do
74
74
  File.chown(uid_for('normal_user_2'), nil, @environment_rb)
75
- spawn_stub_application(:lower_privilege => false) do |app|
75
+ spawn_stub_application("lower_privilege" => false) do |app|
76
76
  read_dumped_info[:username].should == my_username
77
77
  end
78
78
  end
79
79
 
80
80
  it "sets $HOME to the user's home directory, after privilege lowering" do
81
- spawn_stub_application(:lowest_user => CONFIG['normal_user_1']) do |app|
81
+ spawn_stub_application("lowest_user" => CONFIG['normal_user_1']) do |app|
82
82
  read_dumped_info[:home].should == Etc.getpwnam(CONFIG['normal_user_1']).dir
83
83
  end
84
84
  end
@@ -1,13 +1,13 @@
1
1
  require 'support/config'
2
2
  require 'support/test_helper'
3
- require 'passenger/spawn_manager'
3
+ require 'phusion_passenger/spawn_manager'
4
4
 
5
5
  require 'ruby/abstract_server_spec'
6
6
  require 'ruby/rails/minimal_spawner_spec'
7
7
  require 'ruby/rails/spawner_privilege_lowering_spec'
8
8
  require 'ruby/rails/spawner_error_handling_spec'
9
- include Passenger
10
- include Passenger::Utils
9
+ include PhusionPassenger
10
+ include PhusionPassenger::Utils
11
11
 
12
12
  # TODO: test whether SpawnManager restarts FrameworkSpawner if it crashed
13
13
 
@@ -64,7 +64,7 @@ describe SpawnManager do
64
64
  end
65
65
 
66
66
  it "can spawn when the server's not running" do
67
- app = @manager.spawn_application(@stub.app_root)
67
+ app = @manager.spawn_application("app_root" => @stub.app_root)
68
68
  app.close
69
69
  end
70
70
 
@@ -75,8 +75,7 @@ describe SpawnManager do
75
75
  a.close
76
76
  sleep(1) # Give @manager the chance to start.
77
77
  channel = MessageChannel.new(b)
78
- channel.write("spawn_application", @stub.app_root, "true",
79
- "nobody", "production", "smart", "rails")
78
+ channel.write("spawn_application", "app_root", @stub.app_root)
80
79
  channel.read
81
80
  pid, listen_socket = channel.read
82
81
  channel.recv_io.close
@@ -98,7 +97,7 @@ describe SpawnManager do
98
97
  content.sub(/^RAILS_GEM_VERSION = .*$/, '')
99
98
  end
100
99
  @stub.dont_use_vendor_rails
101
- @manager.spawn_application(@stub.app_root).close
100
+ @manager.spawn_application("app_root" => @stub.app_root).close
102
101
  end
103
102
 
104
103
  it "properly reloads applications that do not specify a Rails version" do
@@ -108,7 +107,9 @@ describe SpawnManager do
108
107
  @stub.dont_use_vendor_rails
109
108
  @manager.reload(@stub.app_root)
110
109
  spawners = @manager.instance_eval { @spawners }
111
- spawners.should be_empty
110
+ spawners.synchronize do
111
+ spawners.should be_empty
112
+ end
112
113
  end
113
114
  end
114
115
 
@@ -118,8 +119,9 @@ describe SpawnManager do
118
119
  it "can spawn a Rack application" do
119
120
  use_stub('rack') do |stub|
120
121
  @manager = SpawnManager.new
121
- app = @manager.spawn_application(stub.app_root, true,
122
- "nobody", "production", "smart", "rack")
122
+ app = @manager.spawn_application(
123
+ "app_root" => stub.app_root,
124
+ "app_type" => "rack")
123
125
  app.close
124
126
  end
125
127
  end
@@ -136,6 +138,14 @@ describe SpawnManager do
136
138
  it_should_behave_like "a minimal spawner"
137
139
  end
138
140
 
141
+ describe "smart-lv2 spawning" do
142
+ before :each do
143
+ @spawn_method = "smart-lv2"
144
+ end
145
+
146
+ it_should_behave_like "a minimal spawner"
147
+ end
148
+
139
149
  describe "conservative spawning" do
140
150
  before :each do
141
151
  @spawn_method = "conservative"
@@ -150,8 +160,9 @@ describe SpawnManager do
150
160
  def spawn_stub_application(stub)
151
161
  spawner = SpawnManager.new
152
162
  begin
153
- return spawner.spawn_application(stub.app_root, true,
154
- "nobody", "production", @spawn_method)
163
+ return spawner.spawn_application(
164
+ "app_root" => stub.app_root,
165
+ "spawn_method" => @spawn_method)
155
166
  ensure
156
167
  spawner.cleanup
157
168
  end
@@ -1,9 +1,9 @@
1
1
  require 'support/config'
2
2
 
3
3
  require 'tempfile'
4
- require 'passenger/utils'
4
+ require 'phusion_passenger/utils'
5
5
 
6
- include Passenger
6
+ include PhusionPassenger
7
7
 
8
8
  describe Utils do
9
9
  include Utils
@@ -30,4 +30,38 @@ describe Utils do
30
30
  File.unlink(filename) rescue nil
31
31
  end
32
32
  end
33
+
34
+ describe "#passenger_tmpdir" do
35
+ before :each do
36
+ ENV.delete('PHUSION_PASSENGER_TMP')
37
+ end
38
+
39
+ after :each do
40
+ ENV.delete('PHUSION_PASSENGER_TMP')
41
+ end
42
+
43
+ it "returns Dir.tmpdir if ENV['PHUSION_PASSENGER_TMP'] is nil" do
44
+ passenger_tmpdir(false).should == Dir.tmpdir
45
+ end
46
+
47
+ it "returns Dir.tmpdir if ENV['PHUSION_PASSENGER_TMP'] is an empty string" do
48
+ ENV['PHUSION_PASSENGER_TMP'] = ''
49
+ passenger_tmpdir(false).should == Dir.tmpdir
50
+ end
51
+
52
+ it "returns ENV['PHUSION_PASSENGER_TMP'] if it's set" do
53
+ ENV['PHUSION_PASSENGER_TMP'] = '/foo'
54
+ passenger_tmpdir(false).should == '/foo'
55
+ end
56
+
57
+ it "creates the directory if it doesn't exist, if the 'create' argument is true" do
58
+ ENV['PHUSION_PASSENGER_TMP'] = 'utils_spec.tmp'
59
+ passenger_tmpdir
60
+ begin
61
+ File.directory?('utils_spec.tmp').should be_true
62
+ ensure
63
+ Dir.rmdir('utils_spec.tmp') rescue nil
64
+ end
65
+ end
66
+ end
33
67
  end
@@ -0,0 +1,47 @@
1
+ require 'support/config'
2
+ require 'support/test_helper'
3
+ require 'phusion_passenger/wsgi/application_spawner'
4
+ require 'phusion_passenger/utils'
5
+ require 'fileutils'
6
+ require 'tempfile'
7
+
8
+ describe PhusionPassenger::WSGI::ApplicationSpawner do
9
+ include TestHelper
10
+ include PhusionPassenger::Utils
11
+
12
+ before :each do
13
+ ENV['PHUSION_PASSENGER_TMP'] = "#{Dir.tmpdir}/wsgi_test.tmp"
14
+ @stub = setup_stub('wsgi')
15
+ File.unlink("#{@stub.app_root}/passenger_wsgi.pyc") rescue nil
16
+ end
17
+
18
+ after :each do
19
+ @stub.destroy
20
+ ENV.delete('PHUSION_PASSENGER_TMP')
21
+ FileUtils.rm_rf("wsgi_test.tmp")
22
+ end
23
+
24
+ it "can spawn our stub application" do
25
+ spawn(@stub.app_root).close
26
+ end
27
+
28
+ it "creates a socket in Phusion Passenger's temp directory" do
29
+ begin
30
+ app = spawn(@stub.app_root)
31
+ Dir["#{passenger_tmpdir}/passenger_wsgi.*"].should have(1).item
32
+ ensure
33
+ app.close rescue nil
34
+ end
35
+ end
36
+
37
+ specify "the backend process deletes its socket upon termination" do
38
+ spawn(@stub.app_root).close
39
+ sleep 0.2 # Give it some time to terminate.
40
+ Dir["#{passenger_tmpdir}/passenger_wsgi.*"].should be_empty
41
+ end
42
+
43
+ def spawn(*args)
44
+ PhusionPassenger::WSGI::ApplicationSpawner.spawn_application(*args)
45
+ end
46
+ end
47
+