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,28 @@
1
+ /*
2
+ * Phusion Passenger - http://www.modrails.com/
3
+ * Copyright (C) 2009 Phusion
4
+ *
5
+ * Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
6
+ *
7
+ * This program is free software; you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation; version 2 of the License.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License along
17
+ * with this program; if not, write to the Free Software Foundation, Inc.,
18
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
+ */
20
+
21
+ #include <time.h>
22
+
23
+ namespace Passenger {
24
+ namespace SystemTimeData {
25
+ bool hasForcedValue = false;
26
+ time_t forcedValue = 0;
27
+ }
28
+ }
@@ -0,0 +1,82 @@
1
+ /*
2
+ * Phusion Passenger - http://www.modrails.com/
3
+ * Copyright (C) 2009 Phusion
4
+ *
5
+ * Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
6
+ *
7
+ * This program is free software; you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation; version 2 of the License.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License along
17
+ * with this program; if not, write to the Free Software Foundation, Inc.,
18
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
+ */
20
+ #ifndef _PASSENGER_SYSTEM_TIME_H_
21
+ #define _PASSENGER_SYSTEM_TIME_H_
22
+
23
+ #include <boost/thread.hpp>
24
+ #include <oxt/system_calls.hpp>
25
+ #include "Exceptions.h"
26
+
27
+ namespace Passenger {
28
+
29
+ using namespace oxt;
30
+
31
+ namespace SystemTimeData {
32
+ extern bool hasForcedValue;
33
+ extern time_t forcedValue;
34
+ }
35
+
36
+ /**
37
+ * This class allows one to obtain the system time, similar to time(). Unlike
38
+ * time(), it is possible to force a certain time to be returned, which is
39
+ * useful for testing code that depends on the system time.
40
+ */
41
+ class SystemTime {
42
+ public:
43
+ /**
44
+ * Returns the time since the Epoch, measured in seconds. Or, if a time
45
+ * was forced, then the forced time is returned instead.
46
+ *
47
+ * @throws SystemException Something went wrong while retrieving the time.
48
+ * @throws boost::thread_interrupted
49
+ */
50
+ static time_t get() {
51
+ if (SystemTimeData::hasForcedValue) {
52
+ return SystemTimeData::forcedValue;
53
+ } else {
54
+ time_t ret = syscalls::time(NULL);
55
+ if (ret == -1) {
56
+ throw SystemException("Unable to retrieve the system time",
57
+ errno);
58
+ }
59
+ return ret;
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Force get() to return the given value.
65
+ */
66
+ static void force(time_t value) {
67
+ SystemTimeData::hasForcedValue = true;
68
+ SystemTimeData::forcedValue = value;
69
+ }
70
+
71
+ /**
72
+ * Release the previously forced value, so that get()
73
+ * returns the system time once again.
74
+ */
75
+ static void release() {
76
+ SystemTimeData::hasForcedValue = false;
77
+ }
78
+ };
79
+
80
+ } // namespace Passenger
81
+
82
+ #endif /* _PASSENGER_SYSTEM_TIME_H_ */
@@ -19,7 +19,7 @@
19
19
  */
20
20
 
21
21
  #include <cassert>
22
- #include <unistd.h>
22
+ #include "CachedFileStat.h"
23
23
  #include "Utils.h"
24
24
 
25
25
  #define SPAWN_SERVER_SCRIPT_NAME "passenger-spawn-server"
@@ -31,6 +31,11 @@ atoi(const string &s) {
31
31
  return ::atoi(s.c_str());
32
32
  }
33
33
 
34
+ long
35
+ atol(const string &s) {
36
+ return ::atol(s.c_str());
37
+ }
38
+
34
39
  void
35
40
  split(const string &str, char sep, vector<string> &output) {
36
41
  string::size_type start, pos;
@@ -44,14 +49,31 @@ split(const string &str, char sep, vector<string> &output) {
44
49
  }
45
50
 
46
51
  bool
47
- fileExists(const char *filename) {
52
+ fileExists(const char *filename, CachedMultiFileStat *mstat, unsigned int throttleRate) {
53
+ return getFileType(filename, mstat, throttleRate) == FT_REGULAR;
54
+ }
55
+
56
+ FileType
57
+ getFileType(const char *filename, CachedMultiFileStat *mstat, unsigned int throttleRate) {
48
58
  struct stat buf;
59
+ int ret;
49
60
 
50
- if (stat(filename, &buf) == 0) {
51
- return S_ISREG(buf.st_mode);
61
+ if (mstat != NULL) {
62
+ ret = cached_multi_file_stat_perform(mstat, filename, &buf, throttleRate);
63
+ } else {
64
+ ret = stat(filename, &buf);
65
+ }
66
+ if (ret == 0) {
67
+ if (S_ISREG(buf.st_mode)) {
68
+ return FT_REGULAR;
69
+ } else if (S_ISDIR(buf.st_mode)) {
70
+ return FT_DIRECTORY;
71
+ } else {
72
+ return FT_OTHER;
73
+ }
52
74
  } else {
53
75
  if (errno == ENOENT) {
54
- return false;
76
+ return FT_NONEXISTANT;
55
77
  } else {
56
78
  int e = errno;
57
79
  string message("Cannot stat '");
@@ -76,7 +98,7 @@ findSpawnServer(const char *passengerRoot) {
76
98
  return path;
77
99
  } else {
78
100
  path.assign(root);
79
- path.append("lib/passenger/passenger-spawn-server");
101
+ path.append("lib/phusion_passenger/passenger-spawn-server");
80
102
  return path;
81
103
  }
82
104
  return path;
@@ -115,7 +137,7 @@ findApplicationPoolServer(const char *passengerRoot) {
115
137
  return path;
116
138
  } else {
117
139
  path.assign(root);
118
- path.append("lib/passenger/ApplicationPoolServerExecutable");
140
+ path.append("lib/phusion_passenger/ApplicationPoolServerExecutable");
119
141
  return path;
120
142
  }
121
143
  }
@@ -128,7 +150,13 @@ canonicalizePath(const string &path) {
128
150
  // rationale.
129
151
  char *tmp = realpath(path.c_str(), NULL);
130
152
  if (tmp == NULL) {
131
- return "";
153
+ int e = errno;
154
+ string message;
155
+
156
+ message = "Cannot resolve the path '";
157
+ message.append(path);
158
+ message.append("'");
159
+ throw FileSystemException(message, e, path);
132
160
  } else {
133
161
  string result(tmp);
134
162
  free(tmp);
@@ -137,32 +165,158 @@ canonicalizePath(const string &path) {
137
165
  #else
138
166
  char tmp[PATH_MAX];
139
167
  if (realpath(path.c_str(), tmp) == NULL) {
140
- return "";
168
+ int e = errno;
169
+ string message;
170
+
171
+ message = "Cannot resolve the path '";
172
+ message.append(path);
173
+ message.append("'");
174
+ throw FileSystemException(message, e, path);
141
175
  } else {
142
176
  return tmp;
143
177
  }
144
178
  #endif
145
179
  }
146
180
 
181
+ string
182
+ escapeForXml(const string &input) {
183
+ string result(input);
184
+ string::size_type input_pos = 0;
185
+ string::size_type input_end_pos = input.size();
186
+ string::size_type result_pos = 0;
187
+
188
+ while (input_pos < input_end_pos) {
189
+ const unsigned char ch = input[input_pos];
190
+
191
+ if ((ch >= 'A' && ch <= 'z')
192
+ || (ch >= '0' && ch <= '9')
193
+ || ch == '/' || ch == ' ' || ch == '_' || ch == '.') {
194
+ // This is an ASCII character. Ignore it and
195
+ // go to next character.
196
+ result_pos++;
197
+ } else {
198
+ // Not an ASCII character; escape it.
199
+ char escapedCharacter[sizeof("&#255;") + 1];
200
+ int size;
201
+
202
+ size = snprintf(escapedCharacter,
203
+ sizeof(escapedCharacter) - 1,
204
+ "&#%d;",
205
+ (int) ch);
206
+ if (size < 0) {
207
+ throw std::bad_alloc();
208
+ }
209
+ escapedCharacter[sizeof(escapedCharacter) - 1] = '\0';
210
+
211
+ result.replace(result_pos, 1, escapedCharacter, size);
212
+ result_pos += size;
213
+ }
214
+ input_pos++;
215
+ }
216
+
217
+ return result;
218
+ }
219
+
220
+ const char *
221
+ getTempDir() {
222
+ const char *temp_dir = getenv("TMPDIR");
223
+ if (temp_dir == NULL || *temp_dir == '\0') {
224
+ temp_dir = "/tmp";
225
+ }
226
+ return temp_dir;
227
+ }
228
+
229
+ string
230
+ getPassengerTempDir(bool bypassCache) {
231
+ if (bypassCache) {
232
+ goto calculateResult;
233
+ } else {
234
+ const char *tmp = getenv("PHUSION_PASSENGER_TMP");
235
+ if (tmp != NULL && *tmp != '\0') {
236
+ return tmp;
237
+ } else {
238
+ goto calculateResult;
239
+ }
240
+ }
241
+
242
+ calculateResult:
243
+ const char *temp_dir = getTempDir();
244
+ char buffer[PATH_MAX];
245
+
246
+ snprintf(buffer, sizeof(buffer), "%s/passenger.%lu",
247
+ temp_dir, (unsigned long) getpid());
248
+ buffer[sizeof(buffer) - 1] = '\0';
249
+ setenv("PHUSION_PASSENGER_TMP", buffer, 1);
250
+ return buffer;
251
+ }
252
+
253
+ void
254
+ createPassengerTempDir() {
255
+ makeDirTree(getPassengerTempDir().c_str(), "u=rwxs,g=wx,o=wx");
256
+ }
257
+
258
+ void
259
+ makeDirTree(const char *path, const char *mode) {
260
+ char command[PATH_MAX + 10];
261
+ snprintf(command, sizeof(command), "mkdir -p -m \"%s\" \"%s\"", mode, path);
262
+ command[sizeof(command) - 1] = '\0';
263
+
264
+ int result;
265
+ do {
266
+ result = system(command);
267
+ } while (result == -1 && errno == EINTR);
268
+ if (result != 0) {
269
+ char message[1024];
270
+ int e = errno;
271
+
272
+ snprintf(message, sizeof(message) - 1, "Cannot create directory '%s'", path);
273
+ message[sizeof(message) - 1] = '\0';
274
+ if (result == -1) {
275
+ throw SystemException(message, e);
276
+ } else {
277
+ throw IOException(message);
278
+ }
279
+ }
280
+ }
281
+
282
+ void
283
+ removeDirTree(const char *path) {
284
+ char command[PATH_MAX + 10];
285
+ snprintf(command, sizeof(command), "rm -rf \"%s\"", path);
286
+ command[sizeof(command) - 1] = '\0';
287
+
288
+ int result;
289
+ do {
290
+ result = system(command);
291
+ } while (result == -1 && errno == EINTR);
292
+ if (result == -1) {
293
+ char message[1024];
294
+
295
+ snprintf(message, sizeof(message) - 1, "Cannot create directory '%s'", path);
296
+ message[sizeof(message) - 1] = '\0';
297
+ throw IOException(message);
298
+ }
299
+ }
300
+
147
301
  bool
148
- verifyRailsDir(const string &dir) {
302
+ verifyRailsDir(const string &dir, CachedMultiFileStat *mstat, unsigned int throttleRate) {
149
303
  string temp(dir);
150
- temp.append("/../config/environment.rb");
151
- return fileExists(temp.c_str());
304
+ temp.append("/config/environment.rb");
305
+ return fileExists(temp.c_str(), mstat, throttleRate);
152
306
  }
153
307
 
154
308
  bool
155
- verifyRackDir(const string &dir) {
309
+ verifyRackDir(const string &dir, CachedMultiFileStat *mstat, unsigned int throttleRate) {
156
310
  string temp(dir);
157
- temp.append("/../config.ru");
158
- return fileExists(temp.c_str());
311
+ temp.append("/config.ru");
312
+ return fileExists(temp.c_str(), mstat, throttleRate);
159
313
  }
160
314
 
161
315
  bool
162
- verifyWSGIDir(const string &dir) {
316
+ verifyWSGIDir(const string &dir, CachedMultiFileStat *mstat, unsigned int throttleRate) {
163
317
  string temp(dir);
164
- temp.append("/../passenger_wsgi.py");
165
- return fileExists(temp.c_str());
318
+ temp.append("/passenger_wsgi.py");
319
+ return fileExists(temp.c_str(), mstat, throttleRate);
166
320
  }
167
321
 
168
322
  } // namespace Passenger
data/ext/apache2/Utils.h CHANGED
@@ -32,13 +32,28 @@
32
32
  #include <cstdlib>
33
33
  #include <cstring>
34
34
  #include <errno.h>
35
+ #include <unistd.h>
35
36
  #include "Exceptions.h"
36
37
 
38
+ typedef struct CachedMultiFileStat CachedMultiFileStat;
39
+
37
40
  namespace Passenger {
38
41
 
39
42
  using namespace std;
40
43
  using namespace boost;
41
44
 
45
+ /** Enumeration which indicates what kind of file a file is. */
46
+ typedef enum {
47
+ /** The file doesn't exist. */
48
+ FT_NONEXISTANT,
49
+ /** A regular file or a symlink to a regular file. */
50
+ FT_REGULAR,
51
+ /** A directory. */
52
+ FT_DIRECTORY,
53
+ /** Something else, e.g. a pipe or a socket. */
54
+ FT_OTHER
55
+ } FileType;
56
+
42
57
  /**
43
58
  * Convenience shortcut for creating a <tt>shared_ptr</tt>.
44
59
  * Instead of:
@@ -118,6 +133,12 @@ toString(T something) {
118
133
  */
119
134
  int atoi(const string &s);
120
135
 
136
+ /**
137
+ * Converts the given string to a long integer.
138
+ * @ingroup Support
139
+ */
140
+ long atol(const string &s);
141
+
121
142
  /**
122
143
  * Split the given string using the given separator.
123
144
  *
@@ -132,11 +153,27 @@ void split(const string &str, char sep, vector<string> &output);
132
153
  * Check whether the specified file exists.
133
154
  *
134
155
  * @param filename The filename to check.
156
+ * @param mstat A CachedMultiFileStat object, if you want to use cached statting.
157
+ * @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.
135
158
  * @return Whether the file exists.
136
159
  * @throws FileSystemException Unable to check because of a filesystem error.
137
160
  * @ingroup Support
138
161
  */
139
- bool fileExists(const char *filename);
162
+ bool fileExists(const char *filename, CachedMultiFileStat *mstat = 0,
163
+ unsigned int throttleRate = 0);
164
+
165
+ /**
166
+ * Check whether 'filename' exists and what kind of file it is.
167
+ *
168
+ * @param filename The filename to check.
169
+ * @param mstat A CachedMultiFileStat object, if you want to use cached statting.
170
+ * @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.
171
+ * @return The file type.
172
+ * @throws FileSystemException Unable to check because of a filesystem error.
173
+ * @ingroup Support
174
+ */
175
+ FileType getFileType(const char *filename, CachedMultiFileStat *mstat = 0,
176
+ unsigned int throttleRate = 0);
140
177
 
141
178
  /**
142
179
  * Find the location of the Passenger spawn server script.
@@ -167,38 +204,109 @@ string findApplicationPoolServer(const char *passengerRoot);
167
204
  /**
168
205
  * Returns a canonical version of the specified path. All symbolic links
169
206
  * and relative path elements are resolved.
170
- * Returns an empty string if something went wrong.
171
207
  *
208
+ * @throws FileSystemException Something went wrong.
172
209
  * @ingroup Support
173
210
  */
174
211
  string canonicalizePath(const string &path);
175
212
 
213
+ /**
214
+ * Escape the given raw string into an XML value.
215
+ *
216
+ * @throws std::bad_alloc Something went wrong.
217
+ * @ingroup Support
218
+ */
219
+ string escapeForXml(const string &input);
220
+
221
+ /**
222
+ * Return the path name for the directory in which temporary files are
223
+ * to be stored.
224
+ *
225
+ * @ensure result != NULL
226
+ * @ingroup Support
227
+ */
228
+ const char *getTempDir();
229
+
230
+ /**
231
+ * Return the path name for the directory in which Phusion Passenger-specific
232
+ * temporary files are to be stored. This directory is unique for this instance
233
+ * of the web server in which Phusion Passenger is running.
234
+ *
235
+ * The result will be cached into the PHUSION_PASSENGER_TMP environment variable,
236
+ * which will be used for future calls to this function. To bypass this cache,
237
+ * set 'bypassCache' to true.
238
+ *
239
+ * @ensure !result.empty()
240
+ * @ingroup Support
241
+ */
242
+ string getPassengerTempDir(bool bypassCache = false);
243
+
244
+ /* Create a temp folder for storing Phusion Passenger-specific temp files,
245
+ * such as temporarily buffered uploads, sockets for backend processes, etc.
246
+ * This call also sets the PHUSION_PASSENGER_TMP environment variable, which
247
+ * allows backend processes to find this temp folder.
248
+ *
249
+ * Does nothing if this folder already exists.
250
+ *
251
+ * @throws IOException Something went wrong.
252
+ * @throws SystemException Something went wrong.
253
+ */
254
+ void createPassengerTempDir();
255
+
256
+ /**
257
+ * Create the directory at the given path, creating intermediate directories
258
+ * if necessary. The created directories' permissions are as specified by the
259
+ * 'mode' parameter.
260
+ *
261
+ * If 'path' already exists, then nothing will happen.
262
+ *
263
+ * @throws IOException Something went wrong.
264
+ * @throws SystemException Something went wrong.
265
+ */
266
+ void makeDirTree(const char *path, const char *mode = "u=rwx,g=,o=");
267
+
268
+ /**
269
+ * Remove an entire directory tree recursively.
270
+ *
271
+ * @throws SystemException Something went wrong.
272
+ */
273
+ void removeDirTree(const char *path);
274
+
176
275
  /**
177
276
  * Check whether the specified directory is a valid Ruby on Rails
178
- * 'public' directory.
277
+ * application root directory.
179
278
  *
279
+ * @param mstat A CachedMultiFileStat object, if you want to use cached statting.
280
+ * @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.
180
281
  * @throws FileSystemException Unable to check because of a system error.
181
282
  * @ingroup Support
182
283
  */
183
- bool verifyRailsDir(const string &dir);
284
+ bool verifyRailsDir(const string &dir, CachedMultiFileStat *mstat = 0,
285
+ unsigned int throttleRate = 0);
184
286
 
185
287
  /**
186
- * Check whether the specified directory is a valid Rack 'public'
187
- * directory.
288
+ * Check whether the specified directory is a valid Rack application
289
+ * root directory.
188
290
  *
291
+ * @param mstat A CachedMultiFileStat object, if you want to use cached statting.
292
+ * @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.
189
293
  * @throws FileSystemException Unable to check because of a filesystem error.
190
294
  * @ingroup Support
191
295
  */
192
- bool verifyRackDir(const string &dir);
296
+ bool verifyRackDir(const string &dir, CachedMultiFileStat *mstat = 0,
297
+ unsigned int throttleRate = 0);
193
298
 
194
299
  /**
195
- * Check whether the specified directory is a valid WSGI 'public'
196
- * directory.
300
+ * Check whether the specified directory is a valid WSGI application
301
+ * root directory.
197
302
  *
303
+ * @param mstat A CachedMultiFileStat object, if you want to use cached statting.
304
+ * @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.
198
305
  * @throws FileSystemException Unable to check because of a filesystem error.
199
306
  * @ingroup Support
200
307
  */
201
- bool verifyWSGIDir(const string &dir);
308
+ bool verifyWSGIDir(const string &dir, CachedMultiFileStat *mstat = 0,
309
+ unsigned int throttleRate = 0);
202
310
 
203
311
  /**
204
312
  * Represents a temporary file. The associated file is automatically
@@ -221,21 +329,18 @@ public:
221
329
  * a big not-in-memory buffer to work with.
222
330
  * @throws SystemException Something went wrong.
223
331
  */
224
- TempFile(bool anonymous = true) {
225
- const char *temp_dir;
332
+ TempFile(const char *identifier = "temp", bool anonymous = true) {
226
333
  char templ[PATH_MAX];
227
334
  int fd;
228
335
 
229
- temp_dir = getenv("TMP");
230
- if (temp_dir == NULL || *temp_dir == '\0') {
231
- temp_dir = "/tmp";
232
- }
233
-
234
- snprintf(templ, sizeof(templ), "%s/passenger.XXXXXX", temp_dir);
336
+ snprintf(templ, sizeof(templ), "%s/%s.XXXXXX", getPassengerTempDir().c_str(), identifier);
235
337
  templ[sizeof(templ) - 1] = '\0';
236
338
  fd = mkstemp(templ);
237
339
  if (fd == -1) {
238
- throw SystemException("Cannot create a temporary file", errno);
340
+ char message[1024];
341
+ snprintf(message, sizeof(message), "Cannot create a temporary file '%s'", templ);
342
+ message[sizeof(message) - 1] = '\0';
343
+ throw SystemException(message, errno);
239
344
  }
240
345
  if (anonymous) {
241
346
  fchmod(fd, 0000);