passenger 2.1.3 → 2.2.0

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 (398) hide show
  1. data/DEVELOPERS.TXT +2 -0
  2. data/INSTALL +3 -1
  3. data/LICENSE +19 -355
  4. data/NEWS +3 -0
  5. data/README +11 -4
  6. data/Rakefile +435 -236
  7. data/bin/passenger-config +20 -14
  8. data/bin/passenger-install-apache2-module +67 -201
  9. data/bin/passenger-install-nginx-module +477 -0
  10. data/bin/passenger-make-enterprisey +17 -12
  11. data/bin/passenger-memory-stats +33 -23
  12. data/bin/passenger-spawn-server +17 -12
  13. data/bin/passenger-status +18 -13
  14. data/bin/passenger-stress-test +17 -12
  15. data/doc/{Users guide.html → Users guide Apache.html } +79 -61
  16. data/doc/{Users guide.txt → Users guide Apache.txt } +43 -939
  17. data/doc/Users guide Nginx.html +2276 -0
  18. data/doc/Users guide Nginx.txt +776 -0
  19. data/doc/cxxapi/ApplicationPoolServer_8h-source.html +9 -4
  20. data/doc/cxxapi/ApplicationPool_8h-source.html +9 -4
  21. data/doc/cxxapi/Application_8h-source.html +26 -21
  22. data/doc/cxxapi/Bucket_8h-source.html +54 -44
  23. data/doc/cxxapi/CachedFileStat_8h-source.html +9 -4
  24. data/doc/cxxapi/Configuration_8h-source.html +357 -339
  25. data/doc/cxxapi/DirectoryMapper_8h-source.html +294 -280
  26. data/doc/cxxapi/DummySpawnManager_8h-source.html +9 -4
  27. data/doc/cxxapi/Exceptions_8h-source.html +9 -4
  28. data/doc/cxxapi/FileChecker_8h-source.html +9 -4
  29. data/doc/cxxapi/Hooks_8h-source.html +50 -40
  30. data/doc/cxxapi/Logging_8h-source.html +9 -4
  31. data/doc/cxxapi/MessageChannel_8h-source.html +20 -15
  32. data/doc/cxxapi/PoolOptions_8h-source.html +10 -5
  33. data/doc/cxxapi/SpawnManager_8h-source.html +9 -4
  34. data/doc/cxxapi/StandardApplicationPool_8h-source.html +10 -5
  35. data/doc/cxxapi/SystemTime_8h-source.html +9 -4
  36. data/doc/cxxapi/Utils_8h-source.html +242 -214
  37. data/doc/cxxapi/annotated.html +4 -28
  38. data/doc/cxxapi/classClient-members.html +4 -4
  39. data/doc/cxxapi/classClient.html +14 -11
  40. data/doc/cxxapi/classHooks-members.html +4 -5
  41. data/doc/cxxapi/classHooks.html +26 -24
  42. data/doc/cxxapi/classPassenger_1_1Application-members.html +4 -4
  43. data/doc/cxxapi/classPassenger_1_1Application.html +40 -37
  44. data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +4 -4
  45. data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +95 -92
  46. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer-members.html +4 -4
  47. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +26 -23
  48. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.map +1 -1
  49. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.md5 +1 -1
  50. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
  51. data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +17 -17
  52. data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +139 -136
  53. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +4 -4
  54. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +13 -10
  55. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +4 -4
  56. data/doc/cxxapi/classPassenger_1_1BusyException.html +11 -8
  57. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +4 -4
  58. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +11 -8
  59. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +4 -5
  60. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +45 -43
  61. data/doc/cxxapi/classPassenger_1_1DummySpawnManager-members.html +4 -4
  62. data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +13 -10
  63. data/doc/cxxapi/classPassenger_1_1FileChecker-members.html +4 -4
  64. data/doc/cxxapi/classPassenger_1_1FileChecker.html +22 -19
  65. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +4 -4
  66. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +12 -9
  67. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.map +1 -1
  68. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.md5 +1 -1
  69. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  70. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +4 -4
  71. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +14 -11
  72. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.map +1 -1
  73. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.md5 +1 -1
  74. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  75. data/doc/cxxapi/classPassenger_1_1IOException-members.html +4 -4
  76. data/doc/cxxapi/classPassenger_1_1IOException.html +12 -9
  77. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +1 -1
  78. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +1 -1
  79. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  80. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +4 -4
  81. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +228 -225
  82. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +4 -4
  83. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +11 -8
  84. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +4 -4
  85. data/doc/cxxapi/classPassenger_1_1SpawnException.html +14 -11
  86. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +4 -4
  87. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +50 -47
  88. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +4 -4
  89. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +73 -70
  90. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.map +1 -1
  91. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.md5 +1 -1
  92. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
  93. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +4 -4
  94. data/doc/cxxapi/classPassenger_1_1SystemException.html +17 -14
  95. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +1 -1
  96. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +1 -1
  97. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  98. data/doc/cxxapi/classPassenger_1_1SystemTime-members.html +4 -4
  99. data/doc/cxxapi/classPassenger_1_1SystemTime.html +14 -11
  100. data/doc/cxxapi/classes.html +35 -0
  101. data/doc/cxxapi/definitions_8h-source.html +9 -4
  102. data/doc/cxxapi/doxygen.css +311 -303
  103. data/doc/cxxapi/files.html +9 -18
  104. data/doc/cxxapi/functions.html +5 -224
  105. data/doc/cxxapi/functions_func.html +5 -185
  106. data/doc/cxxapi/functions_type.html +4 -4
  107. data/doc/cxxapi/functions_vars.html +4 -4
  108. data/doc/cxxapi/graph_legend.dot +19 -19
  109. data/doc/cxxapi/graph_legend.html +5 -5
  110. data/doc/cxxapi/graph_legend.png +0 -0
  111. data/doc/cxxapi/group__Configuration.html +11 -13
  112. data/doc/cxxapi/group__Configuration.png +0 -0
  113. data/doc/cxxapi/group__Core.html +10 -12
  114. data/doc/cxxapi/group__Core.png +0 -0
  115. data/doc/cxxapi/group__Exceptions.html +5 -7
  116. data/doc/cxxapi/group__Hooks.html +5 -7
  117. data/doc/cxxapi/group__Hooks.png +0 -0
  118. data/doc/cxxapi/group__Support.html +5 -624
  119. data/doc/cxxapi/hierarchy.html +6 -6
  120. data/doc/cxxapi/inherit__graph__0.map +1 -1
  121. data/doc/cxxapi/inherit__graph__0.md5 +1 -1
  122. data/doc/cxxapi/inherit__graph__0.png +0 -0
  123. data/doc/cxxapi/inherit__graph__1.map +1 -1
  124. data/doc/cxxapi/inherit__graph__1.md5 +1 -1
  125. data/doc/cxxapi/inherit__graph__1.png +0 -0
  126. data/doc/cxxapi/inherit__graph__10.map +1 -1
  127. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  128. data/doc/cxxapi/inherit__graph__10.png +0 -0
  129. data/doc/cxxapi/inherit__graph__11.map +1 -1
  130. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  131. data/doc/cxxapi/inherit__graph__11.png +0 -0
  132. data/doc/cxxapi/inherit__graph__12.map +1 -1
  133. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  134. data/doc/cxxapi/inherit__graph__12.png +0 -0
  135. data/doc/cxxapi/inherit__graph__13.map +1 -2
  136. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  137. data/doc/cxxapi/inherit__graph__13.png +0 -0
  138. data/doc/cxxapi/inherit__graph__14.map +2 -1
  139. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  140. data/doc/cxxapi/inherit__graph__14.png +0 -0
  141. data/doc/cxxapi/inherit__graph__15.map +1 -1
  142. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  143. data/doc/cxxapi/inherit__graph__15.png +0 -0
  144. data/doc/cxxapi/inherit__graph__16.map +1 -1
  145. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  146. data/doc/cxxapi/inherit__graph__16.png +0 -0
  147. data/doc/cxxapi/inherit__graph__17.map +1 -1
  148. data/doc/cxxapi/inherit__graph__17.md5 +1 -1
  149. data/doc/cxxapi/inherit__graph__17.png +0 -0
  150. data/doc/cxxapi/inherit__graph__18.map +1 -1
  151. data/doc/cxxapi/inherit__graph__18.md5 +1 -1
  152. data/doc/cxxapi/inherit__graph__18.png +0 -0
  153. data/doc/cxxapi/inherit__graph__19.map +1 -1
  154. data/doc/cxxapi/inherit__graph__19.md5 +1 -1
  155. data/doc/cxxapi/inherit__graph__19.png +0 -0
  156. data/doc/cxxapi/inherit__graph__2.map +1 -1
  157. data/doc/cxxapi/inherit__graph__2.md5 +1 -1
  158. data/doc/cxxapi/inherit__graph__2.png +0 -0
  159. data/doc/cxxapi/inherit__graph__20.map +2 -2
  160. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  161. data/doc/cxxapi/inherit__graph__20.png +0 -0
  162. data/doc/cxxapi/inherit__graph__21.map +1 -1
  163. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  164. data/doc/cxxapi/inherit__graph__21.png +0 -0
  165. data/doc/cxxapi/inherit__graph__3.map +1 -1
  166. data/doc/cxxapi/inherit__graph__3.md5 +1 -1
  167. data/doc/cxxapi/inherit__graph__3.png +0 -0
  168. data/doc/cxxapi/inherit__graph__4.map +1 -1
  169. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  170. data/doc/cxxapi/inherit__graph__4.png +0 -0
  171. data/doc/cxxapi/inherit__graph__5.map +1 -2
  172. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  173. data/doc/cxxapi/inherit__graph__5.png +0 -0
  174. data/doc/cxxapi/inherit__graph__6.map +2 -1
  175. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  176. data/doc/cxxapi/inherit__graph__6.png +0 -0
  177. data/doc/cxxapi/inherit__graph__7.map +1 -1
  178. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  179. data/doc/cxxapi/inherit__graph__7.png +0 -0
  180. data/doc/cxxapi/inherit__graph__8.map +1 -1
  181. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  182. data/doc/cxxapi/inherit__graph__8.png +0 -0
  183. data/doc/cxxapi/inherit__graph__9.map +1 -1
  184. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  185. data/doc/cxxapi/inherit__graph__9.png +0 -0
  186. data/doc/cxxapi/inherits.html +41 -41
  187. data/doc/cxxapi/main.html +4 -4
  188. data/doc/cxxapi/modules.html +4 -5
  189. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +4 -4
  190. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +13 -10
  191. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +5 -5
  192. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +16 -13
  193. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +4 -4
  194. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +63 -60
  195. data/doc/cxxapi/tabs.css +5 -2
  196. data/doc/cxxapi/tree.html +7 -81
  197. data/doc/rdoc/classes/ConditionVariable.html +59 -59
  198. data/doc/rdoc/classes/Exception.html +11 -11
  199. data/doc/rdoc/classes/GC.html +4 -4
  200. data/doc/rdoc/classes/IO.html +14 -14
  201. data/doc/rdoc/classes/PhusionPassenger.html +75 -20
  202. data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +153 -0
  203. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +125 -130
  204. data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +236 -236
  205. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +213 -213
  206. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +28 -28
  207. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +91 -75
  208. data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +10 -10
  209. data/doc/rdoc/classes/PhusionPassenger/Application.html +64 -64
  210. data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +34 -34
  211. data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +13 -13
  212. data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +30 -30
  213. data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +10 -10
  214. data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +136 -136
  215. data/doc/rdoc/classes/PhusionPassenger/NativeSupport.html +24 -24
  216. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +42 -42
  217. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +55 -53
  218. data/doc/rdoc/classes/PhusionPassenger/Railz.html +1 -1
  219. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +25 -30
  220. data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +23 -23
  221. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +116 -117
  222. data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +22 -22
  223. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +118 -124
  224. data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +10 -10
  225. data/doc/rdoc/classes/PhusionPassenger/Utils.html +354 -354
  226. data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +9 -9
  227. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +37 -37
  228. data/doc/rdoc/classes/PlatformInfo.html +282 -261
  229. data/doc/rdoc/classes/RakeExtensions.html +7 -7
  230. data/doc/rdoc/classes/Signal.html +26 -26
  231. data/doc/rdoc/created.rid +1 -1
  232. data/doc/rdoc/files/DEVELOPERS_TXT.html +6 -1
  233. data/doc/rdoc/files/README.html +15 -6
  234. data/doc/rdoc/files/ext/phusion_passenger/native_support_c.html +1 -1
  235. data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +129 -0
  236. data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +20 -13
  237. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +19 -13
  238. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +19 -13
  239. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +31 -1
  240. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +31 -1
  241. data/doc/rdoc/files/lib/phusion_passenger/application_rb.html +19 -13
  242. data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +19 -13
  243. data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +21 -12
  244. data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +19 -13
  245. data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +19 -13
  246. data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +19 -13
  247. data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +19 -13
  248. data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +19 -13
  249. data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +122 -0
  250. data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +19 -13
  251. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +22 -12
  252. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +21 -12
  253. data/doc/rdoc/files/lib/phusion_passenger/railz/application_spawner_rb.html +19 -13
  254. data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +1 -1
  255. data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +19 -13
  256. data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +21 -12
  257. data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +19 -13
  258. data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +19 -13
  259. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +27 -21
  260. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +21 -12
  261. data/doc/rdoc/files/misc/rake/extensions_rb.html +21 -12
  262. data/doc/rdoc/fr_class_index.html +1 -0
  263. data/doc/rdoc/fr_file_index.html +2 -0
  264. data/doc/rdoc/fr_method_index.html +116 -112
  265. data/doc/users_guide_snippets/analysis_and_system_maintenance_tools.txt +144 -0
  266. data/doc/users_guide_snippets/appendix_a_about.txt +13 -0
  267. data/doc/users_guide_snippets/appendix_b_terminology.txt +63 -0
  268. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +304 -0
  269. data/doc/users_guide_snippets/global_queueing_explained.txt +78 -0
  270. data/doc/users_guide_snippets/rackup_specifications.txt +75 -0
  271. data/doc/users_guide_snippets/rails_spawn_method.txt +48 -0
  272. data/doc/users_guide_snippets/tips.txt +173 -0
  273. data/ext/apache2/Bucket.cpp +17 -12
  274. data/ext/apache2/Bucket.h +17 -12
  275. data/ext/apache2/Configuration.cpp +17 -12
  276. data/ext/apache2/Configuration.h +27 -14
  277. data/ext/apache2/DirectoryMapper.h +21 -12
  278. data/ext/apache2/Hooks.cpp +67 -21
  279. data/ext/apache2/Hooks.h +17 -12
  280. data/ext/apache2/mod_passenger.c +17 -12
  281. data/ext/{apache2 → common}/Application.h +19 -14
  282. data/ext/{apache2 → common}/ApplicationPool.h +17 -12
  283. data/ext/{apache2 → common}/ApplicationPoolServer.h +18 -72
  284. data/ext/{apache2 → common}/ApplicationPoolServerExecutable.cpp +45 -104
  285. data/ext/common/ApplicationPoolStatusReporter.h +212 -0
  286. data/ext/{apache2 → common}/CachedFileStat.cpp +17 -12
  287. data/ext/{apache2 → common}/CachedFileStat.h +17 -12
  288. data/ext/{apache2 → common}/DummySpawnManager.h +17 -12
  289. data/ext/{apache2 → common}/Exceptions.h +17 -12
  290. data/ext/{apache2 → common}/FileChecker.h +17 -12
  291. data/ext/common/Logging.cpp +65 -0
  292. data/ext/{apache2 → common}/Logging.h +17 -12
  293. data/ext/{apache2 → common}/MessageChannel.h +17 -12
  294. data/ext/{apache2 → common}/PoolOptions.h +17 -12
  295. data/ext/{apache2 → common}/SpawnManager.h +17 -12
  296. data/ext/{apache2 → common}/StandardApplicationPool.h +17 -12
  297. data/ext/common/StaticString.h +147 -0
  298. data/ext/common/SystemTime.cpp +33 -0
  299. data/ext/{apache2 → common}/SystemTime.h +17 -12
  300. data/ext/{apache2 → common}/Utils.cpp +69 -12
  301. data/ext/{apache2 → common}/Utils.h +41 -12
  302. data/ext/nginx/Configuration.c +1091 -0
  303. data/ext/nginx/Configuration.h +71 -0
  304. data/ext/nginx/ContentHandler.c +1154 -0
  305. data/ext/nginx/ContentHandler.h +64 -0
  306. data/ext/nginx/HelperServer.cpp +857 -0
  307. data/ext/nginx/HttpStatusExtractor.h +161 -0
  308. data/ext/nginx/ScgiRequestParser.h +317 -0
  309. data/ext/nginx/StaticContentHandler.c +222 -0
  310. data/ext/nginx/StaticContentHandler.h +37 -0
  311. data/ext/nginx/config +41 -0
  312. data/ext/nginx/ngx_http_passenger_module.c +572 -0
  313. data/ext/nginx/ngx_http_passenger_module.h +72 -0
  314. data/ext/oxt/backtrace.cpp +8 -1
  315. data/ext/oxt/system_calls.cpp +40 -0
  316. data/ext/oxt/system_calls.hpp +14 -7
  317. data/ext/phusion_passenger/extconf.rb +17 -12
  318. data/ext/phusion_passenger/native_support.c +19 -12
  319. data/lib/phusion_passenger/abstract_installer.rb +196 -0
  320. data/lib/phusion_passenger/abstract_request_handler.rb +19 -24
  321. data/lib/phusion_passenger/abstract_server.rb +17 -12
  322. data/lib/phusion_passenger/abstract_server_collection.rb +17 -12
  323. data/lib/phusion_passenger/admin_tools.rb +23 -0
  324. data/lib/phusion_passenger/admin_tools/control_process.rb +39 -13
  325. data/lib/phusion_passenger/application.rb +17 -12
  326. data/lib/phusion_passenger/console_text_template.rb +17 -12
  327. data/lib/phusion_passenger/constants.rb +22 -11
  328. data/lib/phusion_passenger/dependencies.rb +47 -12
  329. data/lib/phusion_passenger/events.rb +17 -12
  330. data/lib/phusion_passenger/exceptions.rb +17 -12
  331. data/lib/phusion_passenger/html_template.rb +17 -12
  332. data/lib/phusion_passenger/message_channel.rb +17 -12
  333. data/lib/phusion_passenger/packaging.rb +39 -0
  334. data/lib/phusion_passenger/platform_info.rb +48 -22
  335. data/lib/phusion_passenger/rack/application_spawner.rb +22 -11
  336. data/lib/phusion_passenger/rack/request_handler.rb +21 -12
  337. data/lib/phusion_passenger/railz/application_spawner.rb +23 -23
  338. data/lib/phusion_passenger/railz/framework_spawner.rb +18 -14
  339. data/lib/phusion_passenger/railz/request_handler.rb +18 -11
  340. data/lib/phusion_passenger/simple_benchmarking.rb +17 -12
  341. data/lib/phusion_passenger/spawn_manager.rb +17 -20
  342. data/lib/phusion_passenger/templates/{apache_must_be_compiled_with_compatible_mpm.txt.erb → apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb} +0 -0
  343. data/lib/phusion_passenger/templates/{apache2_config_snippets.txt.erb → apache2/config_snippets.txt.erb} +0 -0
  344. data/lib/phusion_passenger/templates/{deployment_example.txt.erb → apache2/deployment_example.txt.erb} +0 -0
  345. data/lib/phusion_passenger/templates/{no_write_permission_to_passenger_root.txt.erb → apache2/no_write_permission_to_passenger_root.txt.erb} +0 -0
  346. data/lib/phusion_passenger/templates/{possible_solutions_for_compilation_and_installation_problems.txt.erb → apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb} +0 -0
  347. data/lib/phusion_passenger/templates/{run_installer_as_root.txt.erb → apache2/run_installer_as_root.txt.erb} +0 -0
  348. data/lib/phusion_passenger/templates/{welcome.txt.erb → apache2/welcome.txt.erb} +0 -0
  349. data/lib/phusion_passenger/templates/nginx/ask_for_extra_configure_flags.txt.erb +8 -0
  350. data/lib/phusion_passenger/templates/nginx/cannot_write_to_dir.txt.erb +11 -0
  351. data/lib/phusion_passenger/templates/nginx/config_snippets.txt.erb +17 -0
  352. data/lib/phusion_passenger/templates/nginx/config_snippets_inserted.txt.erb +20 -0
  353. data/lib/phusion_passenger/templates/nginx/confirm_extra_configure_flags.txt.erb +5 -0
  354. data/lib/phusion_passenger/templates/nginx/deployment_example.txt.erb +22 -0
  355. data/lib/phusion_passenger/templates/nginx/pcre_could_not_be_downloaded.txt.erb +11 -0
  356. data/lib/phusion_passenger/templates/nginx/pcre_could_not_be_extracted.txt.erb +11 -0
  357. data/lib/phusion_passenger/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +11 -0
  358. data/lib/phusion_passenger/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +20 -0
  359. data/lib/phusion_passenger/templates/nginx/query_download_and_install.txt.erb +21 -0
  360. data/lib/phusion_passenger/templates/nginx/run_installer_as_root.txt.erb +8 -0
  361. data/lib/phusion_passenger/templates/nginx/welcome.txt.erb +15 -0
  362. data/lib/phusion_passenger/utils.rb +20 -15
  363. data/lib/phusion_passenger/wsgi/application_spawner.rb +18 -11
  364. data/lib/phusion_passenger/wsgi/request_handler.py +23 -0
  365. data/misc/copy_boost_headers.rb +23 -0
  366. data/misc/find_owner_pipe_leaks.rb +18 -11
  367. data/misc/rake/cplusplus.rb +18 -11
  368. data/misc/rake/extensions.rb +21 -14
  369. data/misc/render_error_pages.rb +18 -11
  370. data/test/ApplicationPoolServerTest.cpp +1 -3
  371. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +1 -1
  372. data/test/CxxTestMain.cpp +19 -3
  373. data/test/HttpStatusExtractorTest.cpp +181 -0
  374. data/test/ScgiRequestParserTest.cpp +337 -0
  375. data/test/StaticStringTest.cpp +51 -0
  376. data/test/UtilsTest.cpp +32 -0
  377. data/test/config.yml.example +5 -0
  378. data/test/{integration_tests.rb → integration_tests/apache2_tests.rb} +7 -299
  379. data/test/integration_tests/hello_world_rack_spec.rb +36 -0
  380. data/test/integration_tests/hello_world_wsgi_spec.rb +41 -0
  381. data/test/integration_tests/mycook_spec.rb +192 -0
  382. data/test/integration_tests/nginx_tests.rb +98 -0
  383. data/test/ruby/rack/application_spawner_spec.rb +40 -0
  384. data/test/stub/nginx/koi-utf +109 -0
  385. data/test/stub/nginx/koi-win +103 -0
  386. data/test/stub/nginx/mime.types +70 -0
  387. data/test/stub/nginx/nginx.conf.erb +57 -0
  388. data/test/stub/nginx/win-utf +126 -0
  389. data/test/stub/rails_apps/mycook/app/controllers/uploads_controller.rb +4 -0
  390. data/test/stub/rails_apps/mycook/config/routes.rb +1 -1
  391. data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
  392. data/test/support/Support.h +40 -0
  393. data/test/support/nginx_controller.rb +98 -0
  394. data/test/support/test_helper.rb +79 -0
  395. metadata +1091 -1028
  396. data/benchmark/DummyRequestHandler.cpp +0 -101
  397. data/ext/apache2/Logging.cpp +0 -60
  398. data/ext/apache2/SystemTime.cpp +0 -28
@@ -1,10 +1,10 @@
1
1
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
2
  <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
3
3
  <title>Passenger: DirectoryMapper.h Source File</title>
4
- <link href="doxygen.css" rel="stylesheet" type="text/css">
5
4
  <link href="tabs.css" rel="stylesheet" type="text/css">
5
+ <link href="doxygen.css" rel="stylesheet" type="text/css">
6
6
  </head><body>
7
- <!-- Generated by Doxygen 1.5.5 -->
7
+ <!-- Generated by Doxygen 1.5.8 -->
8
8
  <div class="navigation" id="top">
9
9
  <div class="tabs">
10
10
  <ul>
@@ -14,296 +14,310 @@
14
14
  <li class="current"><a href="files.html"><span>Files</span></a></li>
15
15
  </ul>
16
16
  </div>
17
+ <div class="tabs">
18
+ <ul>
19
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
20
+ </ul>
21
+ </div>
17
22
  <h1>DirectoryMapper.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
18
23
  <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
19
- <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2008 Phusion</span>
24
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2008, 2009 Phusion</span>
20
25
  <a name="l00004"></a>00004 <span class="comment"> *</span>
21
- <a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai &amp; Ninh Bui.</span>
26
+ <a name="l00005"></a>00005 <span class="comment"> * "Phusion Passenger" is a trademark of Hongli Lai &amp; Ninh Bui.</span>
22
27
  <a name="l00006"></a>00006 <span class="comment"> *</span>
23
- <a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
24
- <a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
25
- <a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
26
- <a name="l00010"></a>00010 <span class="comment"> *</span>
27
- <a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
28
- <a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
29
- <a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
30
- <a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
31
- <a name="l00015"></a>00015 <span class="comment"> *</span>
32
- <a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
33
- <a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
34
- <a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
35
- <a name="l00019"></a>00019 <span class="comment"> */</span>
36
- <a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_DIRECTORY_MAPPER_H_</span>
37
- <a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_DIRECTORY_MAPPER_H_</span>
38
- <a name="l00022"></a>00022 <span class="preprocessor"></span>
39
- <a name="l00023"></a>00023 <span class="preprocessor">#include &lt;string&gt;</span>
40
- <a name="l00024"></a>00024 <span class="preprocessor">#include &lt;set&gt;</span>
41
- <a name="l00025"></a>00025 <span class="preprocessor">#include &lt;cstring&gt;</span>
42
- <a name="l00026"></a>00026
43
- <a name="l00027"></a>00027 <span class="preprocessor">#include &lt;oxt/backtrace.hpp&gt;</span>
44
- <a name="l00028"></a>00028
45
- <a name="l00029"></a>00029 <span class="preprocessor">#include "CachedFileStat.h"</span>
46
- <a name="l00030"></a>00030 <span class="preprocessor">#include "Configuration.h"</span>
47
- <a name="l00031"></a>00031 <span class="preprocessor">#include "Utils.h"</span>
48
- <a name="l00032"></a>00032
49
- <a name="l00033"></a>00033 <span class="comment">// The Apache/APR headers *must* come after the Boost headers, otherwise</span>
50
- <a name="l00034"></a>00034 <span class="comment">// compilation will fail on OpenBSD.</span>
51
- <a name="l00035"></a>00035 <span class="preprocessor">#include &lt;httpd.h&gt;</span>
52
- <a name="l00036"></a>00036 <span class="preprocessor">#include &lt;http_core.h&gt;</span>
28
+ <a name="l00007"></a>00007 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span>
29
+ <a name="l00008"></a>00008 <span class="comment"> * of this software and associated documentation files (the "Software"), to deal</span>
30
+ <a name="l00009"></a>00009 <span class="comment"> * in the Software without restriction, including without limitation the rights</span>
31
+ <a name="l00010"></a>00010 <span class="comment"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
32
+ <a name="l00011"></a>00011 <span class="comment"> * copies of the Software, and to permit persons to whom the Software is</span>
33
+ <a name="l00012"></a>00012 <span class="comment"> * furnished to do so, subject to the following conditions:</span>
34
+ <a name="l00013"></a>00013 <span class="comment"> *</span>
35
+ <a name="l00014"></a>00014 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
36
+ <a name="l00015"></a>00015 <span class="comment"> * all copies or substantial portions of the Software.</span>
37
+ <a name="l00016"></a>00016 <span class="comment"> *</span>
38
+ <a name="l00017"></a>00017 <span class="comment"> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
39
+ <a name="l00018"></a>00018 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
40
+ <a name="l00019"></a>00019 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
41
+ <a name="l00020"></a>00020 <span class="comment"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
42
+ <a name="l00021"></a>00021 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
43
+ <a name="l00022"></a>00022 <span class="comment"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
44
+ <a name="l00023"></a>00023 <span class="comment"> * THE SOFTWARE.</span>
45
+ <a name="l00024"></a>00024 <span class="comment"> */</span>
46
+ <a name="l00025"></a>00025 <span class="preprocessor">#ifndef _PASSENGER_DIRECTORY_MAPPER_H_</span>
47
+ <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_DIRECTORY_MAPPER_H_</span>
48
+ <a name="l00027"></a>00027 <span class="preprocessor"></span>
49
+ <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;string&gt;</span>
50
+ <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;set&gt;</span>
51
+ <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;cstring&gt;</span>
52
+ <a name="l00031"></a>00031
53
+ <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;oxt/backtrace.hpp&gt;</span>
54
+ <a name="l00033"></a>00033
55
+ <a name="l00034"></a>00034 <span class="preprocessor">#include "CachedFileStat.h"</span>
56
+ <a name="l00035"></a>00035 <span class="preprocessor">#include "Configuration.h"</span>
57
+ <a name="l00036"></a>00036 <span class="preprocessor">#include "Utils.h"</span>
53
58
  <a name="l00037"></a>00037
54
- <a name="l00038"></a>00038 <span class="keyword">namespace </span>Passenger {
55
- <a name="l00039"></a>00039
56
- <a name="l00040"></a>00040 <span class="keyword">using namespace </span>std;
57
- <a name="l00041"></a>00041 <span class="keyword">using namespace </span>oxt;
58
- <a name="l00042"></a>00042 <span class="comment"></span>
59
- <a name="l00043"></a>00043 <span class="comment">/**</span>
60
- <a name="l00044"></a>00044 <span class="comment"> * Utility class for determining URI-to-application directory mappings.</span>
61
- <a name="l00045"></a>00045 <span class="comment"> * Given a URI, it will determine whether that URI belongs to a Phusion</span>
62
- <a name="l00046"></a>00046 <span class="comment"> * Passenger-handled application, what the base URI of that application is,</span>
63
- <a name="l00047"></a>00047 <span class="comment"> * and what the associated 'public' directory is.</span>
64
- <a name="l00048"></a>00048 <span class="comment"> *</span>
65
- <a name="l00049"></a>00049 <span class="comment"> * @note This class is not thread-safe, but is reentrant.</span>
66
- <a name="l00050"></a>00050 <span class="comment"> * @ingroup Core</span>
67
- <a name="l00051"></a>00051 <span class="comment"> */</span>
68
- <a name="l00052"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html">00052</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1DirectoryMapper.html" title="Utility class for determining URI-to-application directory mappings.">DirectoryMapper</a> {
69
- <a name="l00053"></a>00053 <span class="keyword">public</span>:
70
- <a name="l00054"></a>00054 <span class="keyword">enum</span> ApplicationType {
71
- <a name="l00055"></a>00055 NONE,
72
- <a name="l00056"></a>00056 RAILS,
73
- <a name="l00057"></a>00057 RACK,
74
- <a name="l00058"></a>00058 WSGI
75
- <a name="l00059"></a>00059 };
76
- <a name="l00060"></a>00060
77
- <a name="l00061"></a>00061 <span class="keyword">private</span>:
78
- <a name="l00062"></a>00062 DirConfig *config;
79
- <a name="l00063"></a>00063 request_rec *r;
80
- <a name="l00064"></a>00064 CachedMultiFileStat *mstat;
81
- <a name="l00065"></a>00065 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate;
82
- <a name="l00066"></a>00066 <span class="keywordtype">bool</span> baseURIKnown;
83
- <a name="l00067"></a>00067 <span class="keyword">const</span> <span class="keywordtype">char</span> *baseURI;
84
- <a name="l00068"></a>00068 ApplicationType appType;
85
- <a name="l00069"></a>00069
86
- <a name="l00070"></a>00070 <span class="keyword">inline</span> <span class="keywordtype">bool</span> shouldAutoDetectRails() {
87
- <a name="l00071"></a>00071 <span class="keywordflow">return</span> config-&gt;autoDetectRails == DirConfig::ENABLED ||
88
- <a name="l00072"></a>00072 config-&gt;autoDetectRails == DirConfig::UNSET;
89
- <a name="l00073"></a>00073 }
59
+ <a name="l00038"></a>00038 <span class="comment">// The Apache/APR headers *must* come after the Boost headers, otherwise</span>
60
+ <a name="l00039"></a>00039 <span class="comment">// compilation will fail on OpenBSD.</span>
61
+ <a name="l00040"></a>00040 <span class="preprocessor">#include &lt;httpd.h&gt;</span>
62
+ <a name="l00041"></a>00041 <span class="preprocessor">#include &lt;http_core.h&gt;</span>
63
+ <a name="l00042"></a>00042
64
+ <a name="l00043"></a>00043 <span class="keyword">namespace </span>Passenger {
65
+ <a name="l00044"></a>00044
66
+ <a name="l00045"></a>00045 <span class="keyword">using namespace </span>std;
67
+ <a name="l00046"></a>00046 <span class="keyword">using namespace </span>oxt;
68
+ <a name="l00047"></a>00047 <span class="comment"></span>
69
+ <a name="l00048"></a>00048 <span class="comment">/**</span>
70
+ <a name="l00049"></a>00049 <span class="comment"> * Utility class for determining URI-to-application directory mappings.</span>
71
+ <a name="l00050"></a>00050 <span class="comment"> * Given a URI, it will determine whether that URI belongs to a Phusion</span>
72
+ <a name="l00051"></a>00051 <span class="comment"> * Passenger-handled application, what the base URI of that application is,</span>
73
+ <a name="l00052"></a>00052 <span class="comment"> * and what the associated 'public' directory is.</span>
74
+ <a name="l00053"></a>00053 <span class="comment"> *</span>
75
+ <a name="l00054"></a>00054 <span class="comment"> * @note This class is not thread-safe, but is reentrant.</span>
76
+ <a name="l00055"></a>00055 <span class="comment"> * @ingroup Core</span>
77
+ <a name="l00056"></a>00056 <span class="comment"> */</span>
78
+ <a name="l00057"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html">00057</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1DirectoryMapper.html" title="Utility class for determining URI-to-application directory mappings.">DirectoryMapper</a> {
79
+ <a name="l00058"></a>00058 <span class="keyword">public</span>:
80
+ <a name="l00059"></a>00059 <span class="keyword">enum</span> ApplicationType {
81
+ <a name="l00060"></a>00060 NONE,
82
+ <a name="l00061"></a>00061 RAILS,
83
+ <a name="l00062"></a>00062 RACK,
84
+ <a name="l00063"></a>00063 WSGI
85
+ <a name="l00064"></a>00064 };
86
+ <a name="l00065"></a>00065
87
+ <a name="l00066"></a>00066 <span class="keyword">private</span>:
88
+ <a name="l00067"></a>00067 DirConfig *config;
89
+ <a name="l00068"></a>00068 request_rec *r;
90
+ <a name="l00069"></a>00069 CachedMultiFileStat *mstat;
91
+ <a name="l00070"></a>00070 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate;
92
+ <a name="l00071"></a>00071 <span class="keywordtype">bool</span> baseURIKnown;
93
+ <a name="l00072"></a>00072 <span class="keyword">const</span> <span class="keywordtype">char</span> *baseURI;
94
+ <a name="l00073"></a>00073 ApplicationType appType;
90
95
  <a name="l00074"></a>00074
91
- <a name="l00075"></a>00075 <span class="keyword">inline</span> <span class="keywordtype">bool</span> shouldAutoDetectRack() {
92
- <a name="l00076"></a>00076 <span class="keywordflow">return</span> config-&gt;autoDetectRack == DirConfig::ENABLED ||
93
- <a name="l00077"></a>00077 config-&gt;autoDetectRack == DirConfig::UNSET;
96
+ <a name="l00075"></a>00075 <span class="keyword">inline</span> <span class="keywordtype">bool</span> shouldAutoDetectRails() {
97
+ <a name="l00076"></a>00076 <span class="keywordflow">return</span> config-&gt;autoDetectRails == DirConfig::ENABLED ||
98
+ <a name="l00077"></a>00077 config-&gt;autoDetectRails == DirConfig::UNSET;
94
99
  <a name="l00078"></a>00078 }
95
100
  <a name="l00079"></a>00079
96
- <a name="l00080"></a>00080 <span class="keyword">inline</span> <span class="keywordtype">bool</span> shouldAutoDetectWSGI() {
97
- <a name="l00081"></a>00081 <span class="keywordflow">return</span> config-&gt;autoDetectWSGI == DirConfig::ENABLED ||
98
- <a name="l00082"></a>00082 config-&gt;autoDetectWSGI == DirConfig::UNSET;
101
+ <a name="l00080"></a>00080 <span class="keyword">inline</span> <span class="keywordtype">bool</span> shouldAutoDetectRack() {
102
+ <a name="l00081"></a>00081 <span class="keywordflow">return</span> config-&gt;autoDetectRack == DirConfig::ENABLED ||
103
+ <a name="l00082"></a>00082 config-&gt;autoDetectRack == DirConfig::UNSET;
99
104
  <a name="l00083"></a>00083 }
100
105
  <a name="l00084"></a>00084
101
- <a name="l00085"></a>00085 <span class="keyword">public</span>:<span class="comment"></span>
102
- <a name="l00086"></a>00086 <span class="comment"> /**</span>
103
- <a name="l00087"></a>00087 <span class="comment"> * Create a new DirectoryMapper object.</span>
104
- <a name="l00088"></a>00088 <span class="comment"> *</span>
105
- <a name="l00089"></a>00089 <span class="comment"> * @param mstat A CachedMultiFileStat object used for statting files.</span>
106
- <a name="l00090"></a>00090 <span class="comment"> * @param throttleRate A throttling rate for mstat.</span>
107
- <a name="l00091"></a>00091 <span class="comment"> * @warning Do not use this object after the destruction of &lt;tt&gt;r&lt;/tt&gt;,</span>
108
- <a name="l00092"></a>00092 <span class="comment"> * &lt;tt&gt;config&lt;/tt&gt; or &lt;tt&gt;mstat&lt;/tt&gt;.</span>
109
- <a name="l00093"></a>00093 <span class="comment"> */</span>
110
- <a name="l00094"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#e2725c3280a5e5d63dbc099fe3c3d82a">00094</a> <a class="code" href="classPassenger_1_1DirectoryMapper.html#e2725c3280a5e5d63dbc099fe3c3d82a" title="Create a new DirectoryMapper object.">DirectoryMapper</a>(request_rec *r, DirConfig *config,
111
- <a name="l00095"></a>00095 CachedMultiFileStat *mstat, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate) {
112
- <a name="l00096"></a>00096 this-&gt;r = r;
113
- <a name="l00097"></a>00097 this-&gt;config = config;
114
- <a name="l00098"></a>00098 this-&gt;mstat = mstat;
115
- <a name="l00099"></a>00099 this-&gt;throttleRate = throttleRate;
116
- <a name="l00100"></a>00100 appType = NONE;
117
- <a name="l00101"></a>00101 baseURIKnown = <span class="keyword">false</span>;
118
- <a name="l00102"></a>00102 baseURI = NULL;
119
- <a name="l00103"></a>00103 }
120
- <a name="l00104"></a>00104 <span class="comment"></span>
121
- <a name="l00105"></a>00105 <span class="comment"> /**</span>
122
- <a name="l00106"></a>00106 <span class="comment"> * Determine whether the given HTTP request falls under one of the specified</span>
123
- <a name="l00107"></a>00107 <span class="comment"> * RailsBaseURIs or RackBaseURIs. If yes, then the first matching base URI will</span>
124
- <a name="l00108"></a>00108 <span class="comment"> * be returned.</span>
125
- <a name="l00109"></a>00109 <span class="comment"> *</span>
126
- <a name="l00110"></a>00110 <span class="comment"> * If Rails/Rack autodetection was enabled in the configuration, and the document</span>
127
- <a name="l00111"></a>00111 <span class="comment"> * root seems to be a valid Rails/Rack 'public' folder, then this method will</span>
128
- <a name="l00112"></a>00112 <span class="comment"> * return "/".</span>
129
- <a name="l00113"></a>00113 <span class="comment"> *</span>
130
- <a name="l00114"></a>00114 <span class="comment"> * Otherwise, NULL will be returned.</span>
131
- <a name="l00115"></a>00115 <span class="comment"> *</span>
132
- <a name="l00116"></a>00116 <span class="comment"> * @throws FileSystemException This method might also examine the filesystem in</span>
133
- <a name="l00117"></a>00117 <span class="comment"> * order to detect the application's type. During that process, a</span>
134
- <a name="l00118"></a>00118 <span class="comment"> * FileSystemException might be thrown.</span>
135
- <a name="l00119"></a>00119 <span class="comment"> * @warning The return value may only be used as long as &lt;tt&gt;config&lt;/tt&gt;</span>
136
- <a name="l00120"></a>00120 <span class="comment"> * hasn't been destroyed.</span>
137
- <a name="l00121"></a>00121 <span class="comment"> */</span>
138
- <a name="l00122"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#2da887c077fc2460dea204783470e821">00122</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classPassenger_1_1DirectoryMapper.html#2da887c077fc2460dea204783470e821" title="Determine whether the given HTTP request falls under one of the specified RailsBaseURIs...">getBaseURI</a>() {
139
- <a name="l00123"></a>00123 TRACE_POINT();
140
- <a name="l00124"></a>00124 <span class="keywordflow">if</span> (baseURIKnown) {
141
- <a name="l00125"></a>00125 <span class="keywordflow">return</span> baseURI;
142
- <a name="l00126"></a>00126 }
143
- <a name="l00127"></a>00127
144
- <a name="l00128"></a>00128 set&lt;string&gt;::const_iterator it;
145
- <a name="l00129"></a>00129 <span class="keyword">const</span> <span class="keywordtype">char</span> *uri = r-&gt;uri;
146
- <a name="l00130"></a>00130 <span class="keywordtype">size_t</span> uri_len = strlen(uri);
147
- <a name="l00131"></a>00131
148
- <a name="l00132"></a>00132 <span class="keywordflow">if</span> (uri_len == 0 || uri[0] != <span class="charliteral">'/'</span>) {
149
- <a name="l00133"></a>00133 baseURIKnown = <span class="keyword">true</span>;
150
- <a name="l00134"></a>00134 <span class="keywordflow">return</span> NULL;
151
- <a name="l00135"></a>00135 }
106
+ <a name="l00085"></a>00085 <span class="keyword">inline</span> <span class="keywordtype">bool</span> shouldAutoDetectWSGI() {
107
+ <a name="l00086"></a>00086 <span class="keywordflow">return</span> config-&gt;autoDetectWSGI == DirConfig::ENABLED ||
108
+ <a name="l00087"></a>00087 config-&gt;autoDetectWSGI == DirConfig::UNSET;
109
+ <a name="l00088"></a>00088 }
110
+ <a name="l00089"></a>00089
111
+ <a name="l00090"></a>00090 <span class="keyword">public</span>:<span class="comment"></span>
112
+ <a name="l00091"></a>00091 <span class="comment"> /**</span>
113
+ <a name="l00092"></a>00092 <span class="comment"> * Create a new DirectoryMapper object.</span>
114
+ <a name="l00093"></a>00093 <span class="comment"> *</span>
115
+ <a name="l00094"></a>00094 <span class="comment"> * @param mstat A CachedMultiFileStat object used for statting files.</span>
116
+ <a name="l00095"></a>00095 <span class="comment"> * @param throttleRate A throttling rate for mstat.</span>
117
+ <a name="l00096"></a>00096 <span class="comment"> * @warning Do not use this object after the destruction of &lt;tt&gt;r&lt;/tt&gt;,</span>
118
+ <a name="l00097"></a>00097 <span class="comment"> * &lt;tt&gt;config&lt;/tt&gt; or &lt;tt&gt;mstat&lt;/tt&gt;.</span>
119
+ <a name="l00098"></a>00098 <span class="comment"> */</span>
120
+ <a name="l00099"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#e2725c3280a5e5d63dbc099fe3c3d82a">00099</a> <a class="code" href="classPassenger_1_1DirectoryMapper.html#e2725c3280a5e5d63dbc099fe3c3d82a" title="Create a new DirectoryMapper object.">DirectoryMapper</a>(request_rec *r, DirConfig *config,
121
+ <a name="l00100"></a>00100 CachedMultiFileStat *mstat, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate) {
122
+ <a name="l00101"></a>00101 this-&gt;r = r;
123
+ <a name="l00102"></a>00102 this-&gt;config = config;
124
+ <a name="l00103"></a>00103 this-&gt;mstat = mstat;
125
+ <a name="l00104"></a>00104 this-&gt;throttleRate = throttleRate;
126
+ <a name="l00105"></a>00105 appType = NONE;
127
+ <a name="l00106"></a>00106 baseURIKnown = <span class="keyword">false</span>;
128
+ <a name="l00107"></a>00107 baseURI = NULL;
129
+ <a name="l00108"></a>00108 }
130
+ <a name="l00109"></a>00109 <span class="comment"></span>
131
+ <a name="l00110"></a>00110 <span class="comment"> /**</span>
132
+ <a name="l00111"></a>00111 <span class="comment"> * Determine whether the given HTTP request falls under one of the specified</span>
133
+ <a name="l00112"></a>00112 <span class="comment"> * RailsBaseURIs or RackBaseURIs. If yes, then the first matching base URI will</span>
134
+ <a name="l00113"></a>00113 <span class="comment"> * be returned.</span>
135
+ <a name="l00114"></a>00114 <span class="comment"> *</span>
136
+ <a name="l00115"></a>00115 <span class="comment"> * If Rails/Rack autodetection was enabled in the configuration, and the document</span>
137
+ <a name="l00116"></a>00116 <span class="comment"> * root seems to be a valid Rails/Rack 'public' folder, then this method will</span>
138
+ <a name="l00117"></a>00117 <span class="comment"> * return "/".</span>
139
+ <a name="l00118"></a>00118 <span class="comment"> *</span>
140
+ <a name="l00119"></a>00119 <span class="comment"> * Otherwise, NULL will be returned.</span>
141
+ <a name="l00120"></a>00120 <span class="comment"> *</span>
142
+ <a name="l00121"></a>00121 <span class="comment"> * @throws FileSystemException This method might also examine the filesystem in</span>
143
+ <a name="l00122"></a>00122 <span class="comment"> * order to detect the application's type. During that process, a</span>
144
+ <a name="l00123"></a>00123 <span class="comment"> * FileSystemException might be thrown.</span>
145
+ <a name="l00124"></a>00124 <span class="comment"> * @warning The return value may only be used as long as &lt;tt&gt;config&lt;/tt&gt;</span>
146
+ <a name="l00125"></a>00125 <span class="comment"> * hasn't been destroyed.</span>
147
+ <a name="l00126"></a>00126 <span class="comment"> */</span>
148
+ <a name="l00127"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#2da887c077fc2460dea204783470e821">00127</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classPassenger_1_1DirectoryMapper.html#2da887c077fc2460dea204783470e821" title="Determine whether the given HTTP request falls under one of the specified RailsBaseURIs...">getBaseURI</a>() {
149
+ <a name="l00128"></a>00128 TRACE_POINT();
150
+ <a name="l00129"></a>00129 <span class="keywordflow">if</span> (baseURIKnown) {
151
+ <a name="l00130"></a>00130 <span class="keywordflow">return</span> baseURI;
152
+ <a name="l00131"></a>00131 }
153
+ <a name="l00132"></a>00132
154
+ <a name="l00133"></a>00133 set&lt;string&gt;::const_iterator it;
155
+ <a name="l00134"></a>00134 <span class="keyword">const</span> <span class="keywordtype">char</span> *uri = r-&gt;uri;
156
+ <a name="l00135"></a>00135 <span class="keywordtype">size_t</span> uri_len = strlen(uri);
152
157
  <a name="l00136"></a>00136
153
- <a name="l00137"></a>00137 UPDATE_TRACE_POINT();
154
- <a name="l00138"></a>00138 <span class="keywordflow">for</span> (it = config-&gt;railsBaseURIs.begin(); it != config-&gt;railsBaseURIs.end(); it++) {
155
- <a name="l00139"></a>00139 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;base(*it);
156
- <a name="l00140"></a>00140 <span class="keywordflow">if</span> ( base == <span class="stringliteral">"/"</span>
157
- <a name="l00141"></a>00141 || ( uri_len == base.size() &amp;&amp; memcmp(uri, base.c_str(), uri_len) == 0 )
158
- <a name="l00142"></a>00142 || ( uri_len &gt; base.size() &amp;&amp; memcmp(uri, base.c_str(), base.size()) == 0
159
- <a name="l00143"></a>00143 &amp;&amp; uri[base.size()] == <span class="charliteral">'/'</span> )
160
- <a name="l00144"></a>00144 ) {
161
- <a name="l00145"></a>00145 baseURIKnown = <span class="keyword">true</span>;
162
- <a name="l00146"></a>00146 baseURI = base.c_str();
163
- <a name="l00147"></a>00147 appType = RAILS;
164
- <a name="l00148"></a>00148 <span class="keywordflow">return</span> baseURI;
165
- <a name="l00149"></a>00149 }
166
- <a name="l00150"></a>00150 }
167
- <a name="l00151"></a>00151
168
- <a name="l00152"></a>00152 UPDATE_TRACE_POINT();
169
- <a name="l00153"></a>00153 <span class="keywordflow">for</span> (it = config-&gt;rackBaseURIs.begin(); it != config-&gt;rackBaseURIs.end(); it++) {
170
- <a name="l00154"></a>00154 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;base(*it);
171
- <a name="l00155"></a>00155 <span class="keywordflow">if</span> ( base == <span class="stringliteral">"/"</span>
172
- <a name="l00156"></a>00156 || ( uri_len == base.size() &amp;&amp; memcmp(uri, base.c_str(), uri_len) == 0 )
173
- <a name="l00157"></a>00157 || ( uri_len &gt; base.size() &amp;&amp; memcmp(uri, base.c_str(), base.size()) == 0
174
- <a name="l00158"></a>00158 &amp;&amp; uri[base.size()] == <span class="charliteral">'/'</span> )
175
- <a name="l00159"></a>00159 ) {
176
- <a name="l00160"></a>00160 baseURIKnown = <span class="keyword">true</span>;
177
- <a name="l00161"></a>00161 baseURI = base.c_str();
178
- <a name="l00162"></a>00162 appType = RACK;
179
- <a name="l00163"></a>00163 <span class="keywordflow">return</span> baseURI;
180
- <a name="l00164"></a>00164 }
181
- <a name="l00165"></a>00165 }
182
- <a name="l00166"></a>00166
183
- <a name="l00167"></a>00167 UPDATE_TRACE_POINT();
184
- <a name="l00168"></a>00168 <span class="keywordflow">if</span> (shouldAutoDetectRails()
185
- <a name="l00169"></a>00169 &amp;&amp; <a class="code" href="group__Support.html#g02c80bd02d38cea295f24250ca8e2502" title="Check whether the specified directory is a valid Ruby on Rails application root directory...">verifyRailsDir</a>(config-&gt;getAppRoot(ap_document_root(r)), mstat, throttleRate)) {
186
- <a name="l00170"></a>00170 baseURIKnown = <span class="keyword">true</span>;
187
- <a name="l00171"></a>00171 baseURI = <span class="stringliteral">"/"</span>;
188
- <a name="l00172"></a>00172 appType = RAILS;
189
- <a name="l00173"></a>00173 <span class="keywordflow">return</span> baseURI;
190
- <a name="l00174"></a>00174 }
191
- <a name="l00175"></a>00175
192
- <a name="l00176"></a>00176 UPDATE_TRACE_POINT();
193
- <a name="l00177"></a>00177 <span class="keywordflow">if</span> (shouldAutoDetectRack()
194
- <a name="l00178"></a>00178 &amp;&amp; <a class="code" href="group__Support.html#g7bb22ba786fa3c88dbbd9f84aaaed59a" title="Check whether the specified directory is a valid Rack application root directory...">verifyRackDir</a>(config-&gt;getAppRoot(ap_document_root(r)), mstat, throttleRate)) {
195
- <a name="l00179"></a>00179 baseURIKnown = <span class="keyword">true</span>;
196
- <a name="l00180"></a>00180 baseURI = <span class="stringliteral">"/"</span>;
197
- <a name="l00181"></a>00181 appType = RACK;
198
- <a name="l00182"></a>00182 <span class="keywordflow">return</span> baseURI;
199
- <a name="l00183"></a>00183 }
200
- <a name="l00184"></a>00184
201
- <a name="l00185"></a>00185 UPDATE_TRACE_POINT();
202
- <a name="l00186"></a>00186 <span class="keywordflow">if</span> (shouldAutoDetectWSGI()
203
- <a name="l00187"></a>00187 &amp;&amp; <a class="code" href="group__Support.html#g8bfea2692733dfd80703707a120bce86" title="Check whether the specified directory is a valid WSGI application root directory...">verifyWSGIDir</a>(config-&gt;getAppRoot(ap_document_root(r)), mstat, throttleRate)) {
204
- <a name="l00188"></a>00188 baseURIKnown = <span class="keyword">true</span>;
205
- <a name="l00189"></a>00189 baseURI = <span class="stringliteral">"/"</span>;
206
- <a name="l00190"></a>00190 appType = WSGI;
207
- <a name="l00191"></a>00191 <span class="keywordflow">return</span> baseURI;
208
- <a name="l00192"></a>00192 }
209
- <a name="l00193"></a>00193
210
- <a name="l00194"></a>00194 baseURIKnown = <span class="keyword">true</span>;
211
- <a name="l00195"></a>00195 <span class="keywordflow">return</span> NULL;
212
- <a name="l00196"></a>00196 }
213
- <a name="l00197"></a>00197 <span class="comment"></span>
214
- <a name="l00198"></a>00198 <span class="comment"> /**</span>
215
- <a name="l00199"></a>00199 <span class="comment"> * Returns the filename of the 'public' directory of the Rails/Rack application</span>
216
- <a name="l00200"></a>00200 <span class="comment"> * that's associated with the HTTP request.</span>
217
- <a name="l00201"></a>00201 <span class="comment"> *</span>
218
- <a name="l00202"></a>00202 <span class="comment"> * Returns an empty string if the document root of the HTTP request</span>
219
- <a name="l00203"></a>00203 <span class="comment"> * cannot be determined, or if it isn't a valid folder.</span>
220
- <a name="l00204"></a>00204 <span class="comment"> *</span>
221
- <a name="l00205"></a>00205 <span class="comment"> * @throws FileSystemException An error occured while examening the filesystem.</span>
222
- <a name="l00206"></a>00206 <span class="comment"> */</span>
223
- <a name="l00207"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#ef969f27622fb215990a870076648aa1">00207</a> <span class="keywordtype">string</span> <a class="code" href="classPassenger_1_1DirectoryMapper.html#ef969f27622fb215990a870076648aa1" title="Returns the filename of the &amp;#39;public&amp;#39; directory of the Rails/Rack application...">getPublicDirectory</a>() {
224
- <a name="l00208"></a>00208 <span class="keywordflow">if</span> (!baseURIKnown) {
225
- <a name="l00209"></a>00209 <a class="code" href="classPassenger_1_1DirectoryMapper.html#2da887c077fc2460dea204783470e821" title="Determine whether the given HTTP request falls under one of the specified RailsBaseURIs...">getBaseURI</a>();
226
- <a name="l00210"></a>00210 }
227
- <a name="l00211"></a>00211 <span class="keywordflow">if</span> (baseURI == NULL) {
228
- <a name="l00212"></a>00212 <span class="keywordflow">return</span> <span class="stringliteral">""</span>;
229
- <a name="l00213"></a>00213 }
230
- <a name="l00214"></a>00214
231
- <a name="l00215"></a>00215 <span class="keyword">const</span> <span class="keywordtype">char</span> *docRoot = ap_document_root(r);
232
- <a name="l00216"></a>00216 <span class="keywordtype">size_t</span> len = strlen(docRoot);
233
- <a name="l00217"></a>00217 <span class="keywordflow">if</span> (len &gt; 0) {
234
- <a name="l00218"></a>00218 <span class="keywordtype">string</span> path;
235
- <a name="l00219"></a>00219 <span class="keywordflow">if</span> (docRoot[len - 1] == <span class="charliteral">'/'</span>) {
236
- <a name="l00220"></a>00220 path.assign(docRoot, len - 1);
237
- <a name="l00221"></a>00221 } <span class="keywordflow">else</span> {
238
- <a name="l00222"></a>00222 path.assign(docRoot, len);
239
- <a name="l00223"></a>00223 }
240
- <a name="l00224"></a>00224 <span class="keywordflow">if</span> (strcmp(baseURI, <span class="stringliteral">"/"</span>) != 0) {
241
- <a name="l00225"></a>00225 path.append(baseURI);
242
- <a name="l00226"></a>00226 }
243
- <a name="l00227"></a>00227 <span class="keywordflow">return</span> path;
244
- <a name="l00228"></a>00228 } <span class="keywordflow">else</span> {
245
- <a name="l00229"></a>00229 <span class="keywordflow">return</span> <span class="stringliteral">""</span>;
246
- <a name="l00230"></a>00230 }
247
- <a name="l00231"></a>00231 }
248
- <a name="l00232"></a>00232 <span class="comment"></span>
249
- <a name="l00233"></a>00233 <span class="comment"> /**</span>
250
- <a name="l00234"></a>00234 <span class="comment"> * Returns the application type that's associated with the HTTP request.</span>
251
- <a name="l00235"></a>00235 <span class="comment"> *</span>
252
- <a name="l00236"></a>00236 <span class="comment"> * @throws FileSystemException An error occured while examening the filesystem.</span>
253
- <a name="l00237"></a>00237 <span class="comment"> */</span>
254
- <a name="l00238"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#ba438d86ca263972a47540956bf11ec1">00238</a> ApplicationType <a class="code" href="classPassenger_1_1DirectoryMapper.html#ba438d86ca263972a47540956bf11ec1" title="Returns the application type that&amp;#39;s associated with the HTTP request.">getApplicationType</a>() {
255
- <a name="l00239"></a>00239 <span class="keywordflow">if</span> (!baseURIKnown) {
256
- <a name="l00240"></a>00240 <a class="code" href="classPassenger_1_1DirectoryMapper.html#2da887c077fc2460dea204783470e821" title="Determine whether the given HTTP request falls under one of the specified RailsBaseURIs...">getBaseURI</a>();
257
- <a name="l00241"></a>00241 }
258
- <a name="l00242"></a>00242 <span class="keywordflow">return</span> appType;
259
- <a name="l00243"></a>00243 }
260
- <a name="l00244"></a>00244 <span class="comment"></span>
261
- <a name="l00245"></a>00245 <span class="comment"> /**</span>
262
- <a name="l00246"></a>00246 <span class="comment"> * Returns the application type (as a string) that's associated</span>
263
- <a name="l00247"></a>00247 <span class="comment"> * with the HTTP request.</span>
264
- <a name="l00248"></a>00248 <span class="comment"> *</span>
265
- <a name="l00249"></a>00249 <span class="comment"> * @throws FileSystemException An error occured while examening the filesystem.</span>
266
- <a name="l00250"></a>00250 <span class="comment"> */</span>
267
- <a name="l00251"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#c46f0e74ffd05b7fe9924dd99a057cf7">00251</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classPassenger_1_1DirectoryMapper.html#c46f0e74ffd05b7fe9924dd99a057cf7" title="Returns the application type (as a string) that&amp;#39;s associated with the HTTP request...">getApplicationTypeString</a>() {
268
- <a name="l00252"></a>00252 <span class="keywordflow">if</span> (!baseURIKnown) {
269
- <a name="l00253"></a>00253 <a class="code" href="classPassenger_1_1DirectoryMapper.html#2da887c077fc2460dea204783470e821" title="Determine whether the given HTTP request falls under one of the specified RailsBaseURIs...">getBaseURI</a>();
270
- <a name="l00254"></a>00254 }
271
- <a name="l00255"></a>00255 <span class="keywordflow">switch</span> (appType) {
272
- <a name="l00256"></a>00256 <span class="keywordflow">case</span> RAILS:
273
- <a name="l00257"></a>00257 <span class="keywordflow">return</span> <span class="stringliteral">"rails"</span>;
274
- <a name="l00258"></a>00258 <span class="keywordflow">case</span> RACK:
275
- <a name="l00259"></a>00259 <span class="keywordflow">return</span> <span class="stringliteral">"rack"</span>;
276
- <a name="l00260"></a>00260 <span class="keywordflow">case</span> WSGI:
277
- <a name="l00261"></a>00261 <span class="keywordflow">return</span> <span class="stringliteral">"wsgi"</span>;
278
- <a name="l00262"></a>00262 <span class="keywordflow">default</span>:
279
- <a name="l00263"></a>00263 <span class="keywordflow">return</span> NULL;
280
- <a name="l00264"></a>00264 };
281
- <a name="l00265"></a>00265 }
282
- <a name="l00266"></a>00266 <span class="comment"></span>
283
- <a name="l00267"></a>00267 <span class="comment"> /**</span>
284
- <a name="l00268"></a>00268 <span class="comment"> * Returns the environment under which the application should be spawned.</span>
285
- <a name="l00269"></a>00269 <span class="comment"> *</span>
286
- <a name="l00270"></a>00270 <span class="comment"> * @throws FileSystemException An error occured while examening the filesystem.</span>
287
- <a name="l00271"></a>00271 <span class="comment"> */</span>
288
- <a name="l00272"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#f5091e3cef3878e160e5d3b2181d82fb">00272</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classPassenger_1_1DirectoryMapper.html#f5091e3cef3878e160e5d3b2181d82fb" title="Returns the environment under which the application should be spawned.">getEnvironment</a>() {
289
- <a name="l00273"></a>00273 <span class="keywordflow">switch</span> (<a class="code" href="classPassenger_1_1DirectoryMapper.html#ba438d86ca263972a47540956bf11ec1" title="Returns the application type that&amp;#39;s associated with the HTTP request.">getApplicationType</a>()) {
290
- <a name="l00274"></a>00274 <span class="keywordflow">case</span> RAILS:
291
- <a name="l00275"></a>00275 <span class="keywordflow">return</span> config-&gt;getRailsEnv();
292
- <a name="l00276"></a>00276 <span class="keywordflow">case</span> RACK:
293
- <a name="l00277"></a>00277 <span class="keywordflow">return</span> config-&gt;getRackEnv();
294
- <a name="l00278"></a>00278 <span class="keywordflow">default</span>:
295
- <a name="l00279"></a>00279 <span class="keywordflow">return</span> <span class="stringliteral">"production"</span>;
296
- <a name="l00280"></a>00280 }
297
- <a name="l00281"></a>00281 }
298
- <a name="l00282"></a>00282 };
299
- <a name="l00283"></a>00283
300
- <a name="l00284"></a>00284 } <span class="comment">// namespace Passenger</span>
301
- <a name="l00285"></a>00285
302
- <a name="l00286"></a>00286 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_DIRECTORY_MAPPER_H_ */</span>
303
- <a name="l00287"></a>00287
158
+ <a name="l00137"></a>00137 <span class="keywordflow">if</span> (uri_len == 0 || uri[0] != <span class="charliteral">'/'</span>) {
159
+ <a name="l00138"></a>00138 baseURIKnown = <span class="keyword">true</span>;
160
+ <a name="l00139"></a>00139 <span class="keywordflow">return</span> NULL;
161
+ <a name="l00140"></a>00140 }
162
+ <a name="l00141"></a>00141
163
+ <a name="l00142"></a>00142 UPDATE_TRACE_POINT();
164
+ <a name="l00143"></a>00143 <span class="keywordflow">for</span> (it = config-&gt;railsBaseURIs.begin(); it != config-&gt;railsBaseURIs.end(); it++) {
165
+ <a name="l00144"></a>00144 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;base(*it);
166
+ <a name="l00145"></a>00145 <span class="keywordflow">if</span> ( base == <span class="stringliteral">"/"</span>
167
+ <a name="l00146"></a>00146 || ( uri_len == base.size() &amp;&amp; memcmp(uri, base.c_str(), uri_len) == 0 )
168
+ <a name="l00147"></a>00147 || ( uri_len &gt; base.size() &amp;&amp; memcmp(uri, base.c_str(), base.size()) == 0
169
+ <a name="l00148"></a>00148 &amp;&amp; uri[base.size()] == <span class="charliteral">'/'</span> )
170
+ <a name="l00149"></a>00149 ) {
171
+ <a name="l00150"></a>00150 baseURIKnown = <span class="keyword">true</span>;
172
+ <a name="l00151"></a>00151 baseURI = base.c_str();
173
+ <a name="l00152"></a>00152 appType = RAILS;
174
+ <a name="l00153"></a>00153 <span class="keywordflow">return</span> baseURI;
175
+ <a name="l00154"></a>00154 }
176
+ <a name="l00155"></a>00155 }
177
+ <a name="l00156"></a>00156
178
+ <a name="l00157"></a>00157 UPDATE_TRACE_POINT();
179
+ <a name="l00158"></a>00158 <span class="keywordflow">for</span> (it = config-&gt;rackBaseURIs.begin(); it != config-&gt;rackBaseURIs.end(); it++) {
180
+ <a name="l00159"></a>00159 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;base(*it);
181
+ <a name="l00160"></a>00160 <span class="keywordflow">if</span> ( base == <span class="stringliteral">"/"</span>
182
+ <a name="l00161"></a>00161 || ( uri_len == base.size() &amp;&amp; memcmp(uri, base.c_str(), uri_len) == 0 )
183
+ <a name="l00162"></a>00162 || ( uri_len &gt; base.size() &amp;&amp; memcmp(uri, base.c_str(), base.size()) == 0
184
+ <a name="l00163"></a>00163 &amp;&amp; uri[base.size()] == <span class="charliteral">'/'</span> )
185
+ <a name="l00164"></a>00164 ) {
186
+ <a name="l00165"></a>00165 baseURIKnown = <span class="keyword">true</span>;
187
+ <a name="l00166"></a>00166 baseURI = base.c_str();
188
+ <a name="l00167"></a>00167 appType = RACK;
189
+ <a name="l00168"></a>00168 <span class="keywordflow">return</span> baseURI;
190
+ <a name="l00169"></a>00169 }
191
+ <a name="l00170"></a>00170 }
192
+ <a name="l00171"></a>00171
193
+ <a name="l00172"></a>00172 UPDATE_TRACE_POINT();
194
+ <a name="l00173"></a>00173 <span class="keywordflow">if</span> (shouldAutoDetectRails()
195
+ <a name="l00174"></a>00174 &amp;&amp; verifyRailsDir(config-&gt;getAppRoot(ap_document_root(r)), mstat, throttleRate)) {
196
+ <a name="l00175"></a>00175 baseURIKnown = <span class="keyword">true</span>;
197
+ <a name="l00176"></a>00176 baseURI = <span class="stringliteral">"/"</span>;
198
+ <a name="l00177"></a>00177 appType = RAILS;
199
+ <a name="l00178"></a>00178 <span class="keywordflow">return</span> baseURI;
200
+ <a name="l00179"></a>00179 }
201
+ <a name="l00180"></a>00180
202
+ <a name="l00181"></a>00181 UPDATE_TRACE_POINT();
203
+ <a name="l00182"></a>00182 <span class="keywordflow">if</span> (shouldAutoDetectRack()
204
+ <a name="l00183"></a>00183 &amp;&amp; verifyRackDir(config-&gt;getAppRoot(ap_document_root(r)), mstat, throttleRate)) {
205
+ <a name="l00184"></a>00184 baseURIKnown = <span class="keyword">true</span>;
206
+ <a name="l00185"></a>00185 baseURI = <span class="stringliteral">"/"</span>;
207
+ <a name="l00186"></a>00186 appType = RACK;
208
+ <a name="l00187"></a>00187 <span class="keywordflow">return</span> baseURI;
209
+ <a name="l00188"></a>00188 }
210
+ <a name="l00189"></a>00189
211
+ <a name="l00190"></a>00190 UPDATE_TRACE_POINT();
212
+ <a name="l00191"></a>00191 <span class="keywordflow">if</span> (shouldAutoDetectWSGI()
213
+ <a name="l00192"></a>00192 &amp;&amp; verifyWSGIDir(config-&gt;getAppRoot(ap_document_root(r)), mstat, throttleRate)) {
214
+ <a name="l00193"></a>00193 baseURIKnown = <span class="keyword">true</span>;
215
+ <a name="l00194"></a>00194 baseURI = <span class="stringliteral">"/"</span>;
216
+ <a name="l00195"></a>00195 appType = WSGI;
217
+ <a name="l00196"></a>00196 <span class="keywordflow">return</span> baseURI;
218
+ <a name="l00197"></a>00197 }
219
+ <a name="l00198"></a>00198
220
+ <a name="l00199"></a>00199 baseURIKnown = <span class="keyword">true</span>;
221
+ <a name="l00200"></a>00200 <span class="keywordflow">return</span> NULL;
222
+ <a name="l00201"></a>00201 }
223
+ <a name="l00202"></a>00202 <span class="comment"></span>
224
+ <a name="l00203"></a>00203 <span class="comment"> /**</span>
225
+ <a name="l00204"></a>00204 <span class="comment"> * Returns the filename of the 'public' directory of the Rails/Rack application</span>
226
+ <a name="l00205"></a>00205 <span class="comment"> * that's associated with the HTTP request.</span>
227
+ <a name="l00206"></a>00206 <span class="comment"> *</span>
228
+ <a name="l00207"></a>00207 <span class="comment"> * Returns an empty string if the document root of the HTTP request</span>
229
+ <a name="l00208"></a>00208 <span class="comment"> * cannot be determined, or if it isn't a valid folder.</span>
230
+ <a name="l00209"></a>00209 <span class="comment"> *</span>
231
+ <a name="l00210"></a>00210 <span class="comment"> * @throws FileSystemException An error occured while examening the filesystem.</span>
232
+ <a name="l00211"></a>00211 <span class="comment"> */</span>
233
+ <a name="l00212"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#ef969f27622fb215990a870076648aa1">00212</a> <span class="keywordtype">string</span> <a class="code" href="classPassenger_1_1DirectoryMapper.html#ef969f27622fb215990a870076648aa1" title="Returns the filename of the &amp;#39;public&amp;#39; directory of the Rails/Rack application...">getPublicDirectory</a>() {
234
+ <a name="l00213"></a>00213 <span class="keywordflow">if</span> (!baseURIKnown) {
235
+ <a name="l00214"></a>00214 <a class="code" href="classPassenger_1_1DirectoryMapper.html#2da887c077fc2460dea204783470e821" title="Determine whether the given HTTP request falls under one of the specified RailsBaseURIs...">getBaseURI</a>();
236
+ <a name="l00215"></a>00215 }
237
+ <a name="l00216"></a>00216 <span class="keywordflow">if</span> (baseURI == NULL) {
238
+ <a name="l00217"></a>00217 <span class="keywordflow">return</span> <span class="stringliteral">""</span>;
239
+ <a name="l00218"></a>00218 }
240
+ <a name="l00219"></a>00219
241
+ <a name="l00220"></a>00220 <span class="keyword">const</span> <span class="keywordtype">char</span> *docRoot = ap_document_root(r);
242
+ <a name="l00221"></a>00221 <span class="keywordtype">size_t</span> len = strlen(docRoot);
243
+ <a name="l00222"></a>00222 <span class="keywordflow">if</span> (len &gt; 0) {
244
+ <a name="l00223"></a>00223 <span class="keywordtype">string</span> path;
245
+ <a name="l00224"></a>00224 <span class="keywordflow">if</span> (docRoot[len - 1] == <span class="charliteral">'/'</span>) {
246
+ <a name="l00225"></a>00225 path.assign(docRoot, len - 1);
247
+ <a name="l00226"></a>00226 } <span class="keywordflow">else</span> {
248
+ <a name="l00227"></a>00227 path.assign(docRoot, len);
249
+ <a name="l00228"></a>00228 }
250
+ <a name="l00229"></a>00229 <span class="keywordflow">if</span> (strcmp(baseURI, <span class="stringliteral">"/"</span>) != 0) {
251
+ <a name="l00230"></a>00230 <span class="comment">/* Application is deployed in a sub-URI.</span>
252
+ <a name="l00231"></a>00231 <span class="comment"> * This is probably a symlink, so let's resolve it.</span>
253
+ <a name="l00232"></a>00232 <span class="comment"> */</span>
254
+ <a name="l00233"></a>00233 path.append(baseURI);
255
+ <a name="l00234"></a>00234 path = resolveSymlink(path);
256
+ <a name="l00235"></a>00235 }
257
+ <a name="l00236"></a>00236 <span class="keywordflow">return</span> path;
258
+ <a name="l00237"></a>00237 } <span class="keywordflow">else</span> {
259
+ <a name="l00238"></a>00238 <span class="keywordflow">return</span> <span class="stringliteral">""</span>;
260
+ <a name="l00239"></a>00239 }
261
+ <a name="l00240"></a>00240 }
262
+ <a name="l00241"></a>00241 <span class="comment"></span>
263
+ <a name="l00242"></a>00242 <span class="comment"> /**</span>
264
+ <a name="l00243"></a>00243 <span class="comment"> * Returns the application type that's associated with the HTTP request.</span>
265
+ <a name="l00244"></a>00244 <span class="comment"> *</span>
266
+ <a name="l00245"></a>00245 <span class="comment"> * @throws FileSystemException An error occured while examening the filesystem.</span>
267
+ <a name="l00246"></a>00246 <span class="comment"> */</span>
268
+ <a name="l00247"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#ba438d86ca263972a47540956bf11ec1">00247</a> ApplicationType <a class="code" href="classPassenger_1_1DirectoryMapper.html#ba438d86ca263972a47540956bf11ec1" title="Returns the application type that&amp;#39;s associated with the HTTP request.">getApplicationType</a>() {
269
+ <a name="l00248"></a>00248 <span class="keywordflow">if</span> (!baseURIKnown) {
270
+ <a name="l00249"></a>00249 <a class="code" href="classPassenger_1_1DirectoryMapper.html#2da887c077fc2460dea204783470e821" title="Determine whether the given HTTP request falls under one of the specified RailsBaseURIs...">getBaseURI</a>();
271
+ <a name="l00250"></a>00250 }
272
+ <a name="l00251"></a>00251 <span class="keywordflow">return</span> appType;
273
+ <a name="l00252"></a>00252 }
274
+ <a name="l00253"></a>00253 <span class="comment"></span>
275
+ <a name="l00254"></a>00254 <span class="comment"> /**</span>
276
+ <a name="l00255"></a>00255 <span class="comment"> * Returns the application type (as a string) that's associated</span>
277
+ <a name="l00256"></a>00256 <span class="comment"> * with the HTTP request.</span>
278
+ <a name="l00257"></a>00257 <span class="comment"> *</span>
279
+ <a name="l00258"></a>00258 <span class="comment"> * @throws FileSystemException An error occured while examening the filesystem.</span>
280
+ <a name="l00259"></a>00259 <span class="comment"> */</span>
281
+ <a name="l00260"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#c46f0e74ffd05b7fe9924dd99a057cf7">00260</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classPassenger_1_1DirectoryMapper.html#c46f0e74ffd05b7fe9924dd99a057cf7" title="Returns the application type (as a string) that&amp;#39;s associated with the HTTP request...">getApplicationTypeString</a>() {
282
+ <a name="l00261"></a>00261 <span class="keywordflow">if</span> (!baseURIKnown) {
283
+ <a name="l00262"></a>00262 <a class="code" href="classPassenger_1_1DirectoryMapper.html#2da887c077fc2460dea204783470e821" title="Determine whether the given HTTP request falls under one of the specified RailsBaseURIs...">getBaseURI</a>();
284
+ <a name="l00263"></a>00263 }
285
+ <a name="l00264"></a>00264 <span class="keywordflow">switch</span> (appType) {
286
+ <a name="l00265"></a>00265 <span class="keywordflow">case</span> RAILS:
287
+ <a name="l00266"></a>00266 <span class="keywordflow">return</span> <span class="stringliteral">"rails"</span>;
288
+ <a name="l00267"></a>00267 <span class="keywordflow">case</span> RACK:
289
+ <a name="l00268"></a>00268 <span class="keywordflow">return</span> <span class="stringliteral">"rack"</span>;
290
+ <a name="l00269"></a>00269 <span class="keywordflow">case</span> WSGI:
291
+ <a name="l00270"></a>00270 <span class="keywordflow">return</span> <span class="stringliteral">"wsgi"</span>;
292
+ <a name="l00271"></a>00271 <span class="keywordflow">default</span>:
293
+ <a name="l00272"></a>00272 <span class="keywordflow">return</span> NULL;
294
+ <a name="l00273"></a>00273 };
295
+ <a name="l00274"></a>00274 }
296
+ <a name="l00275"></a>00275 <span class="comment"></span>
297
+ <a name="l00276"></a>00276 <span class="comment"> /**</span>
298
+ <a name="l00277"></a>00277 <span class="comment"> * Returns the environment under which the application should be spawned.</span>
299
+ <a name="l00278"></a>00278 <span class="comment"> *</span>
300
+ <a name="l00279"></a>00279 <span class="comment"> * @throws FileSystemException An error occured while examening the filesystem.</span>
301
+ <a name="l00280"></a>00280 <span class="comment"> */</span>
302
+ <a name="l00281"></a><a class="code" href="classPassenger_1_1DirectoryMapper.html#f5091e3cef3878e160e5d3b2181d82fb">00281</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classPassenger_1_1DirectoryMapper.html#f5091e3cef3878e160e5d3b2181d82fb" title="Returns the environment under which the application should be spawned.">getEnvironment</a>() {
303
+ <a name="l00282"></a>00282 <span class="keywordflow">switch</span> (<a class="code" href="classPassenger_1_1DirectoryMapper.html#ba438d86ca263972a47540956bf11ec1" title="Returns the application type that&amp;#39;s associated with the HTTP request.">getApplicationType</a>()) {
304
+ <a name="l00283"></a>00283 <span class="keywordflow">case</span> RAILS:
305
+ <a name="l00284"></a>00284 <span class="keywordflow">return</span> config-&gt;getRailsEnv();
306
+ <a name="l00285"></a>00285 <span class="keywordflow">case</span> RACK:
307
+ <a name="l00286"></a>00286 <span class="keywordflow">return</span> config-&gt;getRackEnv();
308
+ <a name="l00287"></a>00287 <span class="keywordflow">default</span>:
309
+ <a name="l00288"></a>00288 <span class="keywordflow">return</span> <span class="stringliteral">"production"</span>;
310
+ <a name="l00289"></a>00289 }
311
+ <a name="l00290"></a>00290 }
312
+ <a name="l00291"></a>00291 };
313
+ <a name="l00292"></a>00292
314
+ <a name="l00293"></a>00293 } <span class="comment">// namespace Passenger</span>
315
+ <a name="l00294"></a>00294
316
+ <a name="l00295"></a>00295 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_DIRECTORY_MAPPER_H_ */</span>
317
+ <a name="l00296"></a>00296
304
318
  </pre></div></div>
305
- <hr size="1"><address style="text-align: right;"><small>Generated on Tue Mar 31 14:00:27 2009 for Passenger by&nbsp;
319
+ <hr size="1"><address style="text-align: right;"><small>Generated on Thu Apr 16 19:48:18 2009 for Passenger by&nbsp;
306
320
  <a href="http://www.doxygen.org/index.html">
307
- <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.5 </small></address>
321
+ <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
308
322
  </body>
309
323
  </html>