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
@@ -0,0 +1,37 @@
1
+ #include "tut.h"
2
+ #include "SystemTime.h"
3
+
4
+ using namespace Passenger;
5
+ using namespace std;
6
+
7
+ namespace tut {
8
+ struct SystemTimeTest {
9
+ ~SystemTimeTest() {
10
+ SystemTime::release();
11
+ }
12
+ };
13
+
14
+ DEFINE_TEST_GROUP(SystemTimeTest);
15
+
16
+ TEST_METHOD(1) {
17
+ time_t begin = SystemTime::get();
18
+
19
+ SystemTime::force(1);
20
+ ensure_equals(SystemTime::get(), (time_t) 1);
21
+ SystemTime::release();
22
+
23
+ time_t now = SystemTime::get();
24
+ ensure(now >= begin && now <= begin + 2);
25
+ }
26
+
27
+ TEST_METHOD(2) {
28
+ time_t begin = SystemTime::get();
29
+
30
+ SystemTime::force(1);
31
+ ensure_equals(SystemTime::get(), (time_t) 1);
32
+ SystemTime::release();
33
+
34
+ time_t now = SystemTime::get();
35
+ ensure(now >= begin && now <= begin + 2);
36
+ }
37
+ }
data/test/UtilsTest.cpp CHANGED
@@ -1,5 +1,9 @@
1
1
  #include "tut.h"
2
2
  #include "Utils.h"
3
+ #include <sys/types.h>
4
+ #include <sys/stat.h>
5
+ #include <stdio.h>
6
+ #include <dirent.h>
3
7
  #include <unistd.h>
4
8
  #include <limits.h>
5
9
 
@@ -13,12 +17,31 @@ namespace tut {
13
17
 
14
18
  UtilsTest() {
15
19
  oldPath = getenv("PATH");
20
+ unsetenv("TMPDIR");
21
+ unsetenv("PHUSION_PASSENGER_TMP");
16
22
  }
17
23
 
18
24
  ~UtilsTest() {
19
25
  setenv("PATH", oldPath.c_str(), 1);
26
+ unsetenv("TMPDIR");
27
+ unsetenv("PHUSION_PASSENGER_TMP");
20
28
  }
21
29
  };
30
+
31
+ static vector<string>
32
+ listDir(const char *path) {
33
+ vector<string> result;
34
+ DIR *d = opendir(path);
35
+ struct dirent *ent;
36
+
37
+ while ((ent = readdir(d)) != NULL) {
38
+ if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) {
39
+ continue;
40
+ }
41
+ result.push_back(ent->d_name);
42
+ }
43
+ return result;
44
+ }
22
45
 
23
46
  DEFINE_TEST_GROUP(UtilsTest);
24
47
 
@@ -98,4 +121,118 @@ namespace tut {
98
121
  setenv("PATH", binpath.c_str(), 1);
99
122
  ensure("Spawn server is found.", !findSpawnServer().empty());
100
123
  }
124
+
125
+
126
+ /***** Test getTempDir() *****/
127
+
128
+ TEST_METHOD(11) {
129
+ // It returns "/tmp" if the TMPDIR environment is NULL.
130
+ ensure_equals(string(getTempDir()), "/tmp");
131
+ }
132
+
133
+ TEST_METHOD(12) {
134
+ // It returns "/tmp" if the TMPDIR environment is an empty string.
135
+ setenv("TMPDIR", "", 1);
136
+ ensure_equals(string(getTempDir()), "/tmp");
137
+ }
138
+
139
+ TEST_METHOD(13) {
140
+ // It returns the value of the TMPDIR environment if it is not NULL and not empty.
141
+ setenv("TMPDIR", "/foo", 1);
142
+ ensure_equals(string(getTempDir()), "/foo");
143
+ }
144
+
145
+
146
+ /***** Test getPassengerTempDir() *****/
147
+
148
+ TEST_METHOD(15) {
149
+ // It returns "(tempdir)/passenger.(pid)"
150
+ char dir[128];
151
+
152
+ snprintf(dir, sizeof(dir), "/tmp/passenger.%lu", (unsigned long) getpid());
153
+ ensure_equals(getPassengerTempDir(), dir);
154
+ }
155
+
156
+ TEST_METHOD(16) {
157
+ // It caches the result into the PHUSION_PASSENGER_TMP environment variable.
158
+ char dir[128];
159
+
160
+ snprintf(dir, sizeof(dir), "/tmp/passenger.%lu", (unsigned long) getpid());
161
+ getPassengerTempDir();
162
+ ensure_equals(getenv("PHUSION_PASSENGER_TMP"), string(dir));
163
+ }
164
+
165
+ TEST_METHOD(17) {
166
+ // It returns the value of the PHUSION_PASSENGER_TMP environment variable if it's not NULL and not an empty string.
167
+ setenv("PHUSION_PASSENGER_TMP", "/foo", 1);
168
+ ensure_equals(getPassengerTempDir(), "/foo");
169
+ }
170
+
171
+ TEST_METHOD(18) {
172
+ // It does not use query the PHUSION_PASSENGER_TMP environment variable if bypassCache is true.
173
+ char dir[128];
174
+
175
+ setenv("PHUSION_PASSENGER_TMP", "/foo", 1);
176
+ snprintf(dir, sizeof(dir), "/tmp/passenger.%lu", (unsigned long) getpid());
177
+ ensure_equals(getPassengerTempDir(true), dir);
178
+ }
179
+
180
+
181
+ /***** Test TempFile *****/
182
+
183
+ TEST_METHOD(20) {
184
+ // It creates a temp file inside getPassengerTempDir().
185
+ setenv("PHUSION_PASSENGER_TMP", "utils_test.tmp", 1);
186
+ mkdir("utils_test.tmp", S_IRWXU);
187
+ TempFile t("temp", false);
188
+ unsigned int size = listDir("utils_test.tmp").size();
189
+ removeDirTree("utils_test.tmp");
190
+ ensure_equals(size, 1u);
191
+ }
192
+
193
+ TEST_METHOD(21) {
194
+ // It deletes the temp file upon destruction.
195
+ setenv("PHUSION_PASSENGER_TMP", "utils_test.tmp", 1);
196
+ mkdir("utils_test.tmp", S_IRWXU);
197
+ {
198
+ TempFile t("temp", false);
199
+ }
200
+ bool dirEmpty = listDir("utils_test.tmp").empty();
201
+ removeDirTree("utils_test.tmp");
202
+ ensure(dirEmpty);
203
+ }
204
+
205
+ TEST_METHOD(22) {
206
+ // The temp file's filename is constructed using the given identifier.
207
+ setenv("PHUSION_PASSENGER_TMP", "utils_test.tmp", 1);
208
+ mkdir("utils_test.tmp", S_IRWXU);
209
+ TempFile t("foobar", false);
210
+ vector<string> files(listDir("utils_test.tmp"));
211
+ removeDirTree("utils_test.tmp");
212
+
213
+ ensure(files[0].find("foobar") != string::npos);
214
+ }
215
+
216
+ TEST_METHOD(23) {
217
+ // It immediately unlinks the temp file if 'anonymous' is true.
218
+ // It creates a temp file inside getPassengerTempDir().
219
+ setenv("PHUSION_PASSENGER_TMP", "utils_test.tmp", 1);
220
+ mkdir("utils_test.tmp", S_IRWXU);
221
+ TempFile t;
222
+ unsigned int size = listDir("utils_test.tmp").size();
223
+ removeDirTree("utils_test.tmp");
224
+ ensure_equals(size, 0u);
225
+ }
226
+
227
+ /***** Test escapeForXml() *****/
228
+
229
+ TEST_METHOD(25) {
230
+ ensure_equals(escapeForXml(""), "");
231
+ ensure_equals(escapeForXml("hello world"), "hello world");
232
+ ensure_equals(escapeForXml("./hello_world/foo.txt"), "./hello_world/foo.txt");
233
+ ensure_equals(escapeForXml("hello<world"), "hello&#60;world");
234
+ ensure_equals(escapeForXml("hello\xFFworld"), "hello&#255;world");
235
+ ensure_equals(escapeForXml("hello\xFF\xCCworld"), "hello&#255;&#204;world");
236
+ ensure_equals(escapeForXml("hello\xFFworld\xCC"), "hello&#255;world&#204;");
237
+ }
101
238
  }
@@ -8,9 +8,7 @@ require 'support/config'
8
8
  require 'support/test_helper'
9
9
  require 'support/multipart'
10
10
  require 'support/apache2_controller'
11
- require 'passenger/platform_info'
12
-
13
- include PlatformInfo
11
+ require 'phusion_passenger/platform_info'
14
12
 
15
13
  # TODO: test the 'RailsUserSwitching' and 'RailsDefaultUser' option.
16
14
  # TODO: test custom page caching directory
@@ -80,11 +78,20 @@ shared_examples_for "MyCook(tm) beta" do
80
78
  response = get_response('/welcome/headers_test')
81
79
  response["X-Foo"].should == "Bar"
82
80
  end
83
-
81
+
82
+ it "supports %2f in URIs" do
83
+ get('/welcome/show_id/foo%2fbar').should == 'foo/bar'
84
+ end
85
+
86
+ it "has AbstractRequest which returns a request_uri without hostname, with query_string" do
87
+ get('/welcome/request_uri?foo=bar%20escaped').should =~ %r{/welcome/request_uri\?foo=bar%20escaped}
88
+ end
89
+
84
90
  it "supports restarting via restart.txt" do
85
91
  begin
86
92
  controller = "#{@stub.app_root}/app/controllers/test_controller.rb"
87
93
  restart_file = "#{@stub.app_root}/tmp/restart.txt"
94
+ now = Time.now
88
95
 
89
96
  File.open(controller, 'w') do |f|
90
97
  f.write %q{
@@ -96,9 +103,10 @@ shared_examples_for "MyCook(tm) beta" do
96
103
  end
97
104
  }
98
105
  end
99
- File.open(restart_file, 'w') do end
106
+ File.open(restart_file, 'w').close
107
+ File.utime(now - 10, now - 10, restart_file)
100
108
  get('/test').should == "foo"
101
-
109
+
102
110
  File.open(controller, 'w') do |f|
103
111
  f.write %q{
104
112
  class TestController < ApplicationController
@@ -110,7 +118,7 @@ shared_examples_for "MyCook(tm) beta" do
110
118
  }
111
119
  end
112
120
 
113
- File.open(restart_file, 'w') do end
121
+ File.utime(now - 5, now - 5, restart_file)
114
122
  get('/test').should == 'bar'
115
123
  ensure
116
124
  File.unlink(controller) rescue nil
@@ -124,6 +132,30 @@ shared_examples_for "MyCook(tm) beta" do
124
132
  get('/').should =~ /Welcome to MyCook/
125
133
  end
126
134
 
135
+ it "does not conflict with Phusion Passenger if there's a model named 'Passenger'" do
136
+ Dir.mkdir("#{@stub.app_root}/app/models") rescue nil
137
+ File.open("#{@stub.app_root}/app/models/passenger.rb", 'w') do |f|
138
+ f.write(%q{
139
+ class Passenger
140
+ def name
141
+ return "Gourry Gabriev"
142
+ end
143
+ end
144
+ })
145
+ end
146
+ begin
147
+ system "touch '#{@stub.app_root}/tmp/restart.txt'"
148
+ get('/welcome/passenger_name').should == 'Gourry Gabriev'
149
+ ensure
150
+ File.unlink("#{@stub.app_root}/app/models/passenger.rb") rescue nil
151
+ end
152
+ end
153
+
154
+ it "sets the 'Status' header" do
155
+ response = get_response('/nonexistant')
156
+ response["Status"].should == "404 Not Found"
157
+ end
158
+
127
159
  if Process.uid == 0
128
160
  it "runs as an unprivileged user" do
129
161
  post('/welcome/touch')
@@ -157,7 +189,6 @@ shared_examples_for "HelloWorld Rack application" do
157
189
  })
158
190
  File.new("#{@stub.app_root}/tmp/restart.txt", "w").close
159
191
  get('/').should == "changed"
160
- File.exist?("#{@stub.app_root}/tmp/restart.txt").should == false
161
192
  end
162
193
 
163
194
  if Process.uid == 0
@@ -199,7 +230,6 @@ shared_examples_for "HelloWorld WSGI application" do
199
230
  File.write("#{@stub.app_root}/passenger_wsgi.py", code)
200
231
  File.new("#{@stub.app_root}/tmp/restart.txt", "w").close
201
232
  get('/').should == "changed"
202
- File.exist?("#{@stub.app_root}/tmp/restart.txt").should == false
203
233
  end
204
234
 
205
235
  if Process.uid == 0
@@ -238,7 +268,7 @@ describe "mod_passenger running in Apache 2" do
238
268
  @server = "http://passenger.test:#{@apache2.port}"
239
269
  @stub = setup_rails_stub('mycook')
240
270
  @apache2 << "RailsMaxPoolSize 1"
241
- @apache2.add_vhost("passenger.test", File.expand_path("#{@stub.app_root}/public"))
271
+ @apache2.set_vhost("passenger.test", File.expand_path("#{@stub.app_root}/public"))
242
272
  @apache2.start
243
273
  end
244
274
 
@@ -305,7 +335,7 @@ describe "mod_passenger running in Apache 2" do
305
335
  FileUtils.cp_r('stub/zsfa/.', 'tmp.webdir')
306
336
  FileUtils.ln_sf(File.expand_path(@stub.app_root) + "/public", 'tmp.webdir/mycook')
307
337
 
308
- @apache2.add_vhost('passenger.test', File.expand_path('tmp.webdir')) do |vhost|
338
+ @apache2.set_vhost('passenger.test', File.expand_path('tmp.webdir')) do |vhost|
309
339
  vhost << "RailsBaseURI /mycook"
310
340
  end
311
341
  @apache2.start
@@ -330,18 +360,24 @@ describe "mod_passenger running in Apache 2" do
330
360
 
331
361
  describe "configuration options" do
332
362
  before :all do
363
+ @apache2 << "PassengerMaxPoolSize 3"
364
+
333
365
  @stub = setup_rails_stub('mycook')
334
366
  rails_dir = File.expand_path(@stub.app_root) + "/public"
335
- @apache2.add_vhost('mycook.passenger.test', rails_dir)
336
- @apache2.add_vhost('norails.passenger.test', rails_dir) do |vhost|
367
+
368
+ @apache2.set_vhost('mycook.passenger.test', rails_dir)
369
+
370
+ @apache2.set_vhost('norails.passenger.test', rails_dir) do |vhost|
337
371
  vhost << "RailsAutoDetect off"
338
372
  end
339
373
 
340
374
  @stub2 = setup_rails_stub('foobar', 'tmp.stub2')
341
375
  rails_dir = File.expand_path(@stub2.app_root) + "/public"
342
- @apache2.add_vhost('passenger.test', rails_dir) do |vhost|
376
+ @apache2.set_vhost('passenger.test', rails_dir) do |vhost|
343
377
  vhost << "RailsEnv development"
344
378
  vhost << "RailsSpawnMethod conservative"
379
+ vhost << "PassengerUseGlobalQueue on"
380
+ vhost << "PassengerRestartDir #{rails_dir}"
345
381
  end
346
382
  @apache2.start
347
383
  end
@@ -356,12 +392,12 @@ describe "mod_passenger running in Apache 2" do
356
392
  get('/').should_not =~ /MyCook/
357
393
  end
358
394
 
359
- it "setting RailsAutoDetect for one virtual host should not interfere with others" do
395
+ specify "setting RailsAutoDetect for one virtual host should not interfere with others" do
360
396
  @server = "http://mycook.passenger.test:#{@apache2.port}"
361
397
  get('/').should =~ /MyCook/
362
398
  end
363
399
 
364
- it "RailsEnv is per-virtual host" do
400
+ specify "RailsEnv is per-virtual host" do
365
401
  @server = "http://mycook.passenger.test:#{@apache2.port}"
366
402
  get('/welcome/rails_env').should == "production"
367
403
 
@@ -374,10 +410,218 @@ describe "mod_passenger running in Apache 2" do
374
410
  get('/foo/backtrace').should_not =~ /framework_spawner/
375
411
  end
376
412
 
377
- it "RailsSpawnMethod spawning is per-virtual host" do
413
+ specify "RailsSpawnMethod spawning is per-virtual host" do
378
414
  @server = "http://mycook.passenger.test:#{@apache2.port}"
379
- get('/welcome/backtrace').should =~ /framework_spawner/
415
+ get('/welcome/backtrace').should =~ /application_spawner/
416
+ end
417
+
418
+ it "looks for restart.txt in the directory specified by PassengerRestartDir" do
419
+ @server = "http://passenger.test:#{@apache2.port}"
420
+ controller = "#{@stub2.app_root}/app/controllers/bar_controller.rb"
421
+ restart_file = "#{@stub2.app_root}/public/restart.txt"
422
+ begin
423
+ File.open(controller, 'w') do |f|
424
+ f.write(%Q{
425
+ class BarController < ApplicationController
426
+ def index
427
+ render :text => 'hello world'
428
+ end
429
+ end
430
+ })
431
+ end
432
+
433
+ File.open(restart_file, 'w').close
434
+ get('/bar').should == "hello world"
435
+
436
+ File.open(controller, 'w') do |f|
437
+ f.write(%Q{
438
+ class BarController < ApplicationController
439
+ def index
440
+ render :text => 'oh hai'
441
+ end
442
+ end
443
+ })
444
+ end
445
+
446
+ now = Time.now
447
+ File.open(restart_file, 'w').close
448
+ File.utime(now - 10, now - 10, restart_file)
449
+ get('/bar').should == "oh hai"
450
+ ensure
451
+ File.unlink(controller) rescue nil
452
+ File.unlink(restart_file) rescue nil
453
+ end
454
+ end
455
+
456
+ describe "PassengerUseGlobalQueue" do
457
+ after :each do
458
+ # Restart Apache to reset the application pool's state.
459
+ @apache2.start
460
+ end
461
+
462
+ it "is off by default" do
463
+ @server = "http://mycook.passenger.test:#{@apache2.port}"
464
+
465
+ # Spawn the application.
466
+ get('/')
467
+
468
+ threads = []
469
+ # Reserve all application pool slots.
470
+ 3.times do |i|
471
+ thread = Thread.new do
472
+ File.unlink("#{@stub.app_root}/#{i}.txt") rescue nil
473
+ get("/welcome/sleep_until_exists?name=#{i}.txt")
474
+ end
475
+ threads << thread
476
+ end
477
+
478
+ # Wait until all application instances are waiting
479
+ # for the quit file.
480
+ while !File.exist?("#{@stub.app_root}/waiting_0.txt") ||
481
+ !File.exist?("#{@stub.app_root}/waiting_1.txt") ||
482
+ !File.exist?("#{@stub.app_root}/waiting_2.txt")
483
+ sleep 0.1
484
+ end
485
+
486
+ # While all slots are reserved, make two more requests.
487
+ first_request_done = false
488
+ second_request_done = false
489
+ thread = Thread.new do
490
+ get("/")
491
+ first_request_done = true
492
+ end
493
+ threads << thread
494
+ thread = Thread.new do
495
+ get("/")
496
+ second_request_done = true
497
+ end
498
+ threads << thread
499
+
500
+ # These requests should both block.
501
+ sleep 0.5
502
+ first_request_done.should be_false
503
+ second_request_done.should be_false
504
+
505
+ # One of the requests should still be blocked
506
+ # if one application instance frees up.
507
+ File.open("#{@stub.app_root}/2.txt", 'w')
508
+ begin
509
+ Timeout.timeout(5) do
510
+ while !first_request_done && !second_request_done
511
+ sleep 0.1
512
+ end
513
+ end
514
+ rescue Timeout::Error
515
+ end
516
+ (first_request_done || second_request_done).should be_true
517
+
518
+ File.open("#{@stub.app_root}/0.txt", 'w')
519
+ File.open("#{@stub.app_root}/1.txt", 'w')
520
+ File.open("#{@stub.app_root}/2.txt", 'w')
521
+ threads.each do |thread|
522
+ thread.join
523
+ end
524
+ end
525
+
526
+ it "works and is per-virtual host" do
527
+ @server = "http://passenger.test:#{@apache2.port}"
528
+
529
+ # Spawn the application.
530
+ get('/')
531
+
532
+ threads = []
533
+ # Reserve all application pool slots.
534
+ 3.times do |i|
535
+ thread = Thread.new do
536
+ File.unlink("#{@stub2.app_root}/#{i}.txt") rescue nil
537
+ get("/foo/sleep_until_exists?name=#{i}.txt")
538
+ end
539
+ threads << thread
540
+ end
541
+
542
+ # Wait until all application instances are waiting
543
+ # for the quit file.
544
+ while !File.exist?("#{@stub2.app_root}/waiting_0.txt") ||
545
+ !File.exist?("#{@stub2.app_root}/waiting_1.txt") ||
546
+ !File.exist?("#{@stub2.app_root}/waiting_2.txt")
547
+ sleep 0.1
548
+ end
549
+
550
+ # While all slots are reserved, make two more requests.
551
+ first_request_done = false
552
+ second_request_done = false
553
+ thread = Thread.new do
554
+ get("/")
555
+ first_request_done = true
556
+ end
557
+ threads << thread
558
+ thread = Thread.new do
559
+ get("/")
560
+ second_request_done = true
561
+ end
562
+ threads << thread
563
+
564
+ # These requests should both block.
565
+ sleep 0.5
566
+ first_request_done.should be_false
567
+ second_request_done.should be_false
568
+
569
+ # Both requests should be processed if one application instance frees up.
570
+ File.open("#{@stub2.app_root}/2.txt", 'w')
571
+ begin
572
+ Timeout.timeout(5) do
573
+ while !first_request_done || !second_request_done
574
+ sleep 0.1
575
+ end
576
+ end
577
+ rescue Timeout::Error
578
+ end
579
+ first_request_done.should be_true
580
+ second_request_done.should be_true
581
+
582
+ File.open("#{@stub2.app_root}/0.txt", 'w')
583
+ File.open("#{@stub2.app_root}/1.txt", 'w')
584
+ File.open("#{@stub2.app_root}/2.txt", 'w')
585
+ threads.each do |thread|
586
+ thread.join
587
+ end
588
+ end
589
+ end
590
+
591
+ describe "PassengerAppRoot" do
592
+ before :all do
593
+ @stub3 = setup_rails_stub('mycook', 'tmp.stub3')
594
+ doc_root = File.expand_path(@stub3.app_root) + "/sites/some.site/public"
595
+ @apache2.set_vhost('passenger.test', doc_root) do |vhost|
596
+ vhost << "PassengerAppRoot #{File.expand_path(@stub3.app_root).inspect}"
597
+ end
598
+ @apache2.start
599
+ end
600
+
601
+ after :all do
602
+ @stub3.destroy
603
+ end
604
+
605
+ it "supports page caching on non-index URIs" do
606
+ @server = "http://passenger.test:#{@apache2.port}"
607
+ get('/welcome/cached.html').should =~ %r{This is the cached version of some.site/public/welcome/cached}
608
+ end
609
+
610
+ it "supports page caching on index URIs" do
611
+ @server = "http://passenger.test:#{@apache2.port}"
612
+ get('/uploads.html').should =~ %r{This is the cached version of some.site/public/uploads}
613
+ end
614
+
615
+ it "works as a rails application" do
616
+ @server = "http://passenger.test:#{@apache2.port}"
617
+ result = get('/welcome/parameters_test?hello=world&recipe[name]=Green+Bananas')
618
+ result.should =~ %r{<hello>world</hello>}
619
+ result.should =~ %r{<recipe>}
620
+ result.should =~ %r{<name>Green Bananas</name>}
621
+ end
380
622
  end
623
+
624
+ ####################################
381
625
  end
382
626
 
383
627
  describe "error handling" do
@@ -385,7 +629,7 @@ describe "mod_passenger running in Apache 2" do
385
629
  FileUtils.rm_rf('tmp.webdir')
386
630
  FileUtils.mkdir_p('tmp.webdir')
387
631
  @webdir = File.expand_path('tmp.webdir')
388
- @apache2.add_vhost('passenger.test', @webdir) do |vhost|
632
+ @apache2.set_vhost('passenger.test', @webdir) do |vhost|
389
633
  vhost << "RailsBaseURI /app-with-nonexistant-rails-version/public"
390
634
  vhost << "RailsBaseURI /app-that-crashes-during-startup/public"
391
635
  vhost << "RailsBaseURI /app-with-crashing-vendor-rails/public"
@@ -435,7 +679,7 @@ describe "mod_passenger running in Apache 2" do
435
679
  describe "Rack application running in root URI" do
436
680
  before :all do
437
681
  @stub = setup_stub('rack')
438
- @apache2.add_vhost('passenger.test', File.expand_path(@stub.app_root) + "/public")
682
+ @apache2.set_vhost('passenger.test', File.expand_path(@stub.app_root) + "/public")
439
683
  @apache2.start
440
684
  @server = "http://passenger.test:#{@apache2.port}"
441
685
  end
@@ -452,7 +696,7 @@ describe "mod_passenger running in Apache 2" do
452
696
  FileUtils.rm_rf('tmp.webdir')
453
697
  FileUtils.mkdir_p('tmp.webdir')
454
698
  @stub = setup_stub('rack')
455
- @apache2.add_vhost('passenger.test', File.expand_path('tmp.webdir')) do |vhost|
699
+ @apache2.set_vhost('passenger.test', File.expand_path('tmp.webdir')) do |vhost|
456
700
  FileUtils.ln_s(File.expand_path(@stub.app_root) + "/public", 'tmp.webdir/rack')
457
701
  vhost << "RackBaseURI /rack"
458
702
  end
@@ -471,7 +715,7 @@ describe "mod_passenger running in Apache 2" do
471
715
  describe "WSGI application running in root URI" do
472
716
  before :all do
473
717
  @stub = setup_stub('wsgi')
474
- @apache2.add_vhost('passenger.test', File.expand_path(@stub.app_root) + "/public")
718
+ @apache2.set_vhost('passenger.test', File.expand_path(@stub.app_root) + "/public")
475
719
  @apache2.start
476
720
  @server = "http://passenger.test:#{@apache2.port}"
477
721
  end
@@ -522,7 +766,10 @@ describe "mod_passenger running in Apache 2" do
522
766
  def check_hosts_configuration
523
767
  begin
524
768
  ok = Resolv.getaddress("passenger.test") == "127.0.0.1"
525
- rescue Resolv::ResolvError
769
+ rescue Resolv::ResolvError, ArgumentError
770
+ # There's a bug in Ruby 1.8.6-p287's resolv.rb library, which causes
771
+ # an ArgumentError to be raised instead of ResolvError when resolving
772
+ # failed.
526
773
  ok = false
527
774
  end
528
775
  if !ok