passenger 2.2.15 → 3.0.0.pre1

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 (1338) hide show
  1. data/DEVELOPERS.TXT +21 -12
  2. data/LICENSE +1 -1
  3. data/NEWS +8 -1
  4. data/PACKAGING.TXT +25 -0
  5. data/Rakefile +28 -891
  6. data/bin/passenger +32 -0
  7. data/bin/passenger-config +5 -5
  8. data/bin/passenger-install-apache2-module +37 -24
  9. data/bin/passenger-install-nginx-module +48 -46
  10. data/bin/passenger-make-enterprisey +8 -9
  11. data/bin/passenger-memory-stats +20 -150
  12. data/bin/passenger-status +130 -44
  13. data/bin/passenger-stress-test +5 -4
  14. data/build/agents.rb +73 -0
  15. data/build/apache2.rb +165 -0
  16. data/build/basics.rb +81 -0
  17. data/build/common_library.rb +198 -0
  18. data/build/config.rb +35 -0
  19. data/{misc/rake/cplusplus.rb → build/cplusplus_support.rb} +1 -1
  20. data/build/cxx_tests.rb +205 -0
  21. data/build/documentation.rb +77 -0
  22. data/{misc/rake → build}/gempackagetask.rb +1 -1
  23. data/build/integration_tests.rb +57 -0
  24. data/build/misc.rb +146 -0
  25. data/build/nginx.rb +64 -0
  26. data/build/oxt_tests.rb +52 -0
  27. data/{misc/rake → build}/packagetask.rb +0 -0
  28. data/build/packaging.rb +189 -0
  29. data/{misc/rake/extensions.rb → build/rake_extensions.rb} +1 -1
  30. data/{misc/rake → build}/rdoctask.rb +0 -0
  31. data/build/ruby_extension.rb +46 -0
  32. data/build/ruby_tests.rb +42 -0
  33. data/build/test_basics.rb +31 -0
  34. data/doc/ApplicationPool algorithm.txt +447 -234
  35. data/doc/Architectural overview.html +47 -56
  36. data/doc/Doxyfile +1 -1
  37. data/doc/Security of user switching support.html +46 -57
  38. data/doc/Users guide Apache.html +1033 -306
  39. data/doc/Users guide Apache.txt +419 -99
  40. data/doc/Users guide Nginx.html +1252 -253
  41. data/doc/Users guide Nginx.txt +711 -87
  42. data/doc/Users guide Standalone.html +603 -0
  43. data/doc/Users guide Standalone.txt +40 -0
  44. data/doc/cxxapi/AbstractSpawnManager_8h_source.html +141 -0
  45. data/doc/cxxapi/Account_8h_source.html +206 -0
  46. data/doc/cxxapi/AccountsDatabase_8h_source.html +161 -0
  47. data/doc/cxxapi/AgentBase_8h_source.html +70 -0
  48. data/doc/cxxapi/AgentsStarter_8h_source.html +112 -0
  49. data/doc/cxxapi/BCrypt_8h_source.html +104 -0
  50. data/doc/cxxapi/Blowfish_8h_source.html +134 -0
  51. data/doc/cxxapi/Bucket_8h_source.html +4 -3
  52. data/doc/cxxapi/Constants_8h_source.html +79 -0
  53. data/doc/cxxapi/ContentHandler_8h_source.html +95 -0
  54. data/doc/cxxapi/DirectoryMapper_8h_source.html +9 -8
  55. data/doc/cxxapi/EventedClient_8h_source.html +629 -0
  56. data/doc/cxxapi/EventedMessageServer_8h_source.html +358 -0
  57. data/doc/cxxapi/EventedServer_8h_source.html +326 -0
  58. data/doc/cxxapi/Exceptions_8h_source.html +366 -0
  59. data/doc/cxxapi/FileDescriptor_8h_source.html +260 -0
  60. data/doc/cxxapi/Hooks_8h_source.html +2 -1
  61. data/doc/cxxapi/HttpStatusExtractor_8h_source.html +382 -0
  62. data/doc/cxxapi/Logging_8h_source.html +726 -0
  63. data/doc/cxxapi/MessageChannel_8h_source.html +852 -0
  64. data/doc/cxxapi/MessageClient_8h_source.html +328 -0
  65. data/doc/cxxapi/MessageReadersWriters_8h_source.html +539 -0
  66. data/doc/cxxapi/MessageServer_8h_source.html +606 -0
  67. data/doc/cxxapi/PoolOptions_8h_source.html +548 -0
  68. data/doc/cxxapi/Process_8h_source.html +286 -0
  69. data/doc/cxxapi/RandomGenerator_8h_source.html +191 -0
  70. data/doc/cxxapi/ResourceLocator_8h_source.html +115 -0
  71. data/doc/cxxapi/ScgiRequestParser_8h_source.html +406 -0
  72. data/doc/cxxapi/ServerInstanceDir_8h_source.html +374 -0
  73. data/doc/cxxapi/Session_8h_source.html +501 -0
  74. data/doc/cxxapi/SpawnManager_8h_source.html +647 -0
  75. data/doc/cxxapi/StaticContentHandler_8h_source.html +68 -0
  76. data/doc/cxxapi/StaticString_8h_source.html +254 -0
  77. data/doc/cxxapi/StringListCreator_8h_source.html +114 -0
  78. data/doc/cxxapi/Utils_8h_source.html +442 -0
  79. data/doc/cxxapi/annotated.html +46 -0
  80. data/doc/cxxapi/apache2_2Configuration_8h_source.html +82 -0
  81. data/doc/cxxapi/classAgentWatcher-members.html +30 -26
  82. data/doc/cxxapi/classAgentWatcher.html +168 -194
  83. data/doc/cxxapi/classClient-members.html +14 -11
  84. data/doc/cxxapi/classClient.html +35 -35
  85. data/doc/cxxapi/classHooks-members.html +2 -0
  86. data/doc/cxxapi/classHooks.html +2 -0
  87. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +16 -13
  88. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +78 -82
  89. data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +12 -9
  90. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +26 -22
  91. data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +37 -0
  92. data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +113 -0
  93. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +14 -11
  94. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +41 -42
  95. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +12 -9
  96. data/doc/cxxapi/classPassenger_1_1BusyException.html +24 -20
  97. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +12 -9
  98. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +23 -19
  99. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +2 -0
  100. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +8 -6
  101. data/doc/cxxapi/classPassenger_1_1EOFException-members.html +12 -9
  102. data/doc/cxxapi/classPassenger_1_1EOFException.html +27 -23
  103. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +12 -9
  104. data/doc/cxxapi/classPassenger_1_1EventFd.html +24 -21
  105. data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +54 -0
  106. data/doc/cxxapi/classPassenger_1_1EventedClient.html +436 -0
  107. data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +37 -0
  108. data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +59 -0
  109. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +3 -0
  110. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +1 -0
  111. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
  112. data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +37 -0
  113. data/doc/cxxapi/classPassenger_1_1EventedServer.html +93 -0
  114. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +3 -0
  115. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +1 -0
  116. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
  117. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +16 -13
  118. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +63 -70
  119. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +12 -9
  120. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +26 -22
  121. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +17 -14
  122. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +32 -30
  123. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +15 -12
  124. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +59 -59
  125. data/doc/cxxapi/classPassenger_1_1IOException-members.html +12 -9
  126. data/doc/cxxapi/classPassenger_1_1IOException.html +27 -23
  127. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +36 -33
  128. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +326 -344
  129. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +25 -22
  130. data/doc/cxxapi/classPassenger_1_1MessageServer.html +160 -191
  131. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +12 -9
  132. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +29 -27
  133. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +3 -1
  134. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +1 -1
  135. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
  136. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +17 -14
  137. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +69 -79
  138. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +3 -1
  139. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +1 -1
  140. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
  141. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +15 -12
  142. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +60 -63
  143. data/doc/cxxapi/classPassenger_1_1Process-members.html +20 -17
  144. data/doc/cxxapi/classPassenger_1_1Process.html +88 -95
  145. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +13 -10
  146. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +36 -35
  147. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +12 -9
  148. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +24 -20
  149. data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +37 -0
  150. data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +76 -0
  151. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +26 -23
  152. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +121 -138
  153. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +12 -9
  154. data/doc/cxxapi/classPassenger_1_1SecurityException.html +26 -22
  155. data/doc/cxxapi/classPassenger_1_1Session-members.html +29 -26
  156. data/doc/cxxapi/classPassenger_1_1Session.html +219 -240
  157. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +14 -11
  158. data/doc/cxxapi/classPassenger_1_1SpawnException.html +36 -37
  159. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +18 -15
  160. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +115 -110
  161. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +30 -27
  162. data/doc/cxxapi/classPassenger_1_1StandardSession.html +163 -184
  163. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +12 -9
  164. data/doc/cxxapi/classPassenger_1_1StaticString.html +27 -25
  165. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +16 -13
  166. data/doc/cxxapi/classPassenger_1_1SystemException.html +65 -67
  167. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +16 -13
  168. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +27 -23
  169. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +12 -9
  170. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +24 -20
  171. data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +36 -0
  172. data/doc/cxxapi/classPassenger_1_1Uint16Message.html +51 -0
  173. data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +36 -0
  174. data/doc/cxxapi/classPassenger_1_1Uint32Message.html +51 -0
  175. data/doc/cxxapi/classServer-members.html +12 -9
  176. data/doc/cxxapi/classServer.html +23 -20
  177. data/doc/cxxapi/classServerInstanceDirToucher-members.html +12 -9
  178. data/doc/cxxapi/classServerInstanceDirToucher.html +21 -17
  179. data/doc/cxxapi/classes.html +18 -4
  180. data/doc/cxxapi/definitions_8h_source.html +1 -0
  181. data/doc/cxxapi/files.html +36 -1
  182. data/doc/cxxapi/functions.html +53 -21
  183. data/doc/cxxapi/functions_0x62.html +82 -0
  184. data/doc/cxxapi/functions_0x63.html +99 -0
  185. data/doc/cxxapi/functions_0x64.html +95 -0
  186. data/doc/cxxapi/functions_0x65.html +88 -0
  187. data/doc/cxxapi/functions_0x66.html +100 -0
  188. data/doc/cxxapi/functions_0x67.html +170 -0
  189. data/doc/cxxapi/functions_0x68.html +88 -0
  190. data/doc/cxxapi/functions_0x69.html +93 -0
  191. data/doc/cxxapi/functions_0x6b.html +80 -0
  192. data/doc/cxxapi/functions_0x6c.html +88 -0
  193. data/doc/cxxapi/functions_0x6d.html +88 -0
  194. data/doc/cxxapi/functions_0x6e.html +86 -0
  195. data/doc/cxxapi/functions_0x6f.html +94 -0
  196. data/doc/cxxapi/functions_0x70.html +94 -0
  197. data/doc/cxxapi/functions_0x72.html +110 -0
  198. data/doc/cxxapi/functions_0x73.html +171 -0
  199. data/doc/cxxapi/functions_0x74.html +85 -0
  200. data/doc/cxxapi/functions_0x75.html +85 -0
  201. data/doc/cxxapi/functions_0x77.html +92 -0
  202. data/doc/cxxapi/functions_0x7e.html +79 -0
  203. data/doc/cxxapi/functions_enum.html +14 -12
  204. data/doc/cxxapi/functions_eval.html +22 -16
  205. data/doc/cxxapi/functions_func.html +460 -1
  206. data/doc/cxxapi/functions_vars.html +163 -63
  207. data/doc/cxxapi/graph_legend.html +1 -0
  208. data/doc/cxxapi/graph_legend.png +0 -0
  209. data/doc/cxxapi/group__Core.html +2 -2
  210. data/doc/cxxapi/group__Core.map +1 -2
  211. data/doc/cxxapi/group__Core.png +0 -0
  212. data/doc/cxxapi/group__Exceptions.html +32 -40
  213. data/doc/cxxapi/group__Hooks.html +2 -1
  214. data/doc/cxxapi/group__Hooks.map +1 -1
  215. data/doc/cxxapi/group__Hooks.png +0 -0
  216. data/doc/cxxapi/group__Support.html +509 -0
  217. data/doc/cxxapi/hierarchy.html +66 -62
  218. data/doc/cxxapi/inherit__graph__10.map +3 -1
  219. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  220. data/doc/cxxapi/inherit__graph__10.png +0 -0
  221. data/doc/cxxapi/inherit__graph__11.map +4 -1
  222. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  223. data/doc/cxxapi/inherit__graph__11.png +0 -0
  224. data/doc/cxxapi/inherit__graph__12.map +3 -1
  225. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  226. data/doc/cxxapi/inherit__graph__12.png +0 -0
  227. data/doc/cxxapi/inherit__graph__13.map +3 -1
  228. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  229. data/doc/cxxapi/inherit__graph__13.png +0 -0
  230. data/doc/cxxapi/inherit__graph__14.map +3 -1
  231. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  232. data/doc/cxxapi/inherit__graph__14.png +0 -0
  233. data/doc/cxxapi/inherit__graph__15.map +5 -1
  234. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  235. data/doc/cxxapi/inherit__graph__15.png +0 -0
  236. data/doc/cxxapi/inherit__graph__16.map +3 -3
  237. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  238. data/doc/cxxapi/inherit__graph__16.png +0 -0
  239. data/doc/cxxapi/inherit__graph__17.map +3 -1
  240. data/doc/cxxapi/inherit__graph__17.md5 +1 -1
  241. data/doc/cxxapi/inherit__graph__17.png +0 -0
  242. data/doc/cxxapi/inherit__graph__18.map +4 -1
  243. data/doc/cxxapi/inherit__graph__18.md5 +1 -1
  244. data/doc/cxxapi/inherit__graph__18.png +0 -0
  245. data/doc/cxxapi/inherit__graph__19.map +3 -1
  246. data/doc/cxxapi/inherit__graph__19.md5 +1 -1
  247. data/doc/cxxapi/inherit__graph__19.png +0 -0
  248. data/doc/cxxapi/inherit__graph__20.map +3 -2
  249. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  250. data/doc/cxxapi/inherit__graph__20.png +0 -0
  251. data/doc/cxxapi/inherit__graph__21.map +3 -1
  252. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  253. data/doc/cxxapi/inherit__graph__21.png +0 -0
  254. data/doc/cxxapi/inherit__graph__22.map +3 -1
  255. data/doc/cxxapi/inherit__graph__22.md5 +1 -1
  256. data/doc/cxxapi/inherit__graph__22.png +0 -0
  257. data/doc/cxxapi/inherit__graph__23.map +3 -1
  258. data/doc/cxxapi/inherit__graph__23.md5 +1 -1
  259. data/doc/cxxapi/inherit__graph__23.png +0 -0
  260. data/doc/cxxapi/inherit__graph__24.map +3 -1
  261. data/doc/cxxapi/inherit__graph__24.md5 +1 -1
  262. data/doc/cxxapi/inherit__graph__24.png +0 -0
  263. data/doc/cxxapi/inherit__graph__25.map +3 -1
  264. data/doc/cxxapi/inherit__graph__25.md5 +1 -1
  265. data/doc/cxxapi/inherit__graph__25.png +0 -0
  266. data/doc/cxxapi/inherit__graph__26.map +3 -1
  267. data/doc/cxxapi/inherit__graph__26.md5 +1 -1
  268. data/doc/cxxapi/inherit__graph__26.png +0 -0
  269. data/doc/cxxapi/inherit__graph__27.map +3 -1
  270. data/doc/cxxapi/inherit__graph__27.md5 +1 -1
  271. data/doc/cxxapi/inherit__graph__27.png +0 -0
  272. data/doc/cxxapi/inherit__graph__28.map +4 -1
  273. data/doc/cxxapi/inherit__graph__28.md5 +1 -1
  274. data/doc/cxxapi/inherit__graph__28.png +0 -0
  275. data/doc/cxxapi/inherit__graph__29.map +3 -1
  276. data/doc/cxxapi/inherit__graph__29.md5 +1 -1
  277. data/doc/cxxapi/inherit__graph__29.png +0 -0
  278. data/doc/cxxapi/inherit__graph__30.map +3 -2
  279. data/doc/cxxapi/inherit__graph__30.md5 +1 -1
  280. data/doc/cxxapi/inherit__graph__30.png +0 -0
  281. data/doc/cxxapi/inherit__graph__31.map +3 -1
  282. data/doc/cxxapi/inherit__graph__31.md5 +1 -1
  283. data/doc/cxxapi/inherit__graph__31.png +0 -0
  284. data/doc/cxxapi/inherit__graph__32.map +5 -1
  285. data/doc/cxxapi/inherit__graph__32.md5 +1 -1
  286. data/doc/cxxapi/inherit__graph__32.png +0 -0
  287. data/doc/cxxapi/inherit__graph__33.map +3 -1
  288. data/doc/cxxapi/inherit__graph__33.md5 +1 -1
  289. data/doc/cxxapi/inherit__graph__33.png +0 -0
  290. data/doc/cxxapi/inherit__graph__34.map +3 -3
  291. data/doc/cxxapi/inherit__graph__34.md5 +1 -1
  292. data/doc/cxxapi/inherit__graph__34.png +0 -0
  293. data/doc/cxxapi/inherit__graph__35.map +3 -1
  294. data/doc/cxxapi/inherit__graph__35.md5 +1 -1
  295. data/doc/cxxapi/inherit__graph__35.png +0 -0
  296. data/doc/cxxapi/inherit__graph__36.map +3 -1
  297. data/doc/cxxapi/inherit__graph__36.md5 +1 -1
  298. data/doc/cxxapi/inherit__graph__36.png +0 -0
  299. data/doc/cxxapi/inherit__graph__37.map +3 -1
  300. data/doc/cxxapi/inherit__graph__37.md5 +1 -1
  301. data/doc/cxxapi/inherit__graph__37.png +0 -0
  302. data/doc/cxxapi/inherit__graph__4.map +3 -1
  303. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  304. data/doc/cxxapi/inherit__graph__4.png +0 -0
  305. data/doc/cxxapi/inherit__graph__5.map +3 -1
  306. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  307. data/doc/cxxapi/inherit__graph__5.png +0 -0
  308. data/doc/cxxapi/inherit__graph__6.map +3 -1
  309. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  310. data/doc/cxxapi/inherit__graph__6.png +0 -0
  311. data/doc/cxxapi/inherit__graph__7.map +3 -1
  312. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  313. data/doc/cxxapi/inherit__graph__7.png +0 -0
  314. data/doc/cxxapi/inherit__graph__8.map +3 -1
  315. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  316. data/doc/cxxapi/inherit__graph__8.png +0 -0
  317. data/doc/cxxapi/inherit__graph__9.map +3 -1
  318. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  319. data/doc/cxxapi/inherit__graph__9.png +0 -0
  320. data/doc/cxxapi/inherits.html +123 -126
  321. data/doc/cxxapi/main.html +1 -0
  322. data/doc/cxxapi/modules.html +2 -1
  323. data/doc/cxxapi/namespacePassenger.html +263 -492
  324. data/doc/cxxapi/namespacemembers.html +68 -96
  325. data/doc/cxxapi/namespacemembers_enum.html +14 -12
  326. data/doc/cxxapi/namespacemembers_eval.html +20 -15
  327. data/doc/cxxapi/namespacemembers_func.html +52 -88
  328. data/doc/cxxapi/namespacemembers_type.html +18 -14
  329. data/doc/cxxapi/namespaces.html +12 -9
  330. data/doc/cxxapi/nginx_2Configuration_8h_source.html +125 -0
  331. data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +94 -0
  332. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +12 -9
  333. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +24 -22
  334. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +43 -38
  335. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +275 -325
  336. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +12 -9
  337. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +24 -22
  338. data/doc/cxxapi/tree.html +152 -7
  339. data/doc/users_guide_snippets/{analysis_and_system_maintenance_tools.txt → analysis_and_system_maintenance.txt} +58 -1
  340. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +1 -2
  341. data/doc/users_guide_snippets/global_queueing_explained.txt +1 -5
  342. data/doc/users_guide_snippets/{rails_spawn_method.txt → passenger_spawn_method.txt} +9 -8
  343. data/doc/users_guide_snippets/tips.txt +12 -6
  344. data/doc/users_guide_snippets/under_the_hood/page_caching_support.txt +22 -0
  345. data/ext/apache2/Bucket.cpp +4 -4
  346. data/ext/apache2/Bucket.h +3 -3
  347. data/ext/apache2/Configuration.cpp +278 -381
  348. data/ext/apache2/Configuration.h +3 -357
  349. data/ext/apache2/Configuration.hpp +461 -0
  350. data/ext/apache2/DirectoryMapper.h +3 -3
  351. data/ext/apache2/HelperAgent.cpp +359 -0
  352. data/ext/apache2/Hooks.cpp +339 -226
  353. data/ext/apache2/Hooks.h +1 -1
  354. data/ext/apache2/mod_passenger.c +10 -4
  355. data/ext/boost/algorithm/string/case_conv.hpp +4 -4
  356. data/ext/boost/algorithm/string/concept.hpp +2 -2
  357. data/ext/boost/algorithm/string/detail/case_conv.hpp +18 -9
  358. data/ext/boost/algorithm/string/detail/find_format.hpp +44 -43
  359. data/ext/boost/algorithm/string/detail/find_format_all.hpp +56 -56
  360. data/ext/boost/algorithm/string/detail/find_format_store.hpp +7 -0
  361. data/ext/boost/algorithm/string/detail/finder.hpp +14 -14
  362. data/ext/boost/algorithm/string/detail/formatter.hpp +2 -2
  363. data/ext/boost/algorithm/string/detail/replace_storage.hpp +3 -3
  364. data/ext/boost/algorithm/string/detail/sequence.hpp +3 -3
  365. data/ext/boost/algorithm/string/erase.hpp +98 -98
  366. data/ext/boost/algorithm/string/find_format.hpp +56 -38
  367. data/ext/boost/algorithm/string/finder.hpp +6 -6
  368. data/ext/boost/algorithm/string/formatter.hpp +1 -1
  369. data/ext/boost/algorithm/string/replace.hpp +99 -99
  370. data/ext/boost/bind.hpp +5 -1670
  371. data/ext/boost/bind/bind.hpp +1751 -0
  372. data/ext/boost/bind/bind_mf2_cc.hpp +228 -0
  373. data/ext/boost/bind/mem_fn.hpp +389 -0
  374. data/ext/boost/bind/mem_fn_template.hpp +54 -27
  375. data/ext/boost/bind/placeholders.hpp +3 -2
  376. data/ext/boost/concept_check.hpp +10 -0
  377. data/ext/boost/config/abi/msvc_prefix.hpp +15 -1
  378. data/ext/boost/config/abi_prefix.hpp +1 -1
  379. data/ext/boost/config/abi_suffix.hpp +3 -2
  380. data/ext/boost/config/auto_link.hpp +6 -1
  381. data/ext/boost/config/compiler/borland.hpp +75 -17
  382. data/ext/boost/config/compiler/codegear.hpp +163 -0
  383. data/ext/boost/config/compiler/common_edg.hpp +35 -0
  384. data/ext/boost/config/compiler/digitalmars.hpp +26 -0
  385. data/ext/boost/config/compiler/gcc.hpp +69 -14
  386. data/ext/boost/config/compiler/hp_acc.hpp +32 -0
  387. data/ext/boost/config/compiler/intel.hpp +13 -2
  388. data/ext/boost/config/compiler/kai.hpp +0 -2
  389. data/ext/boost/config/compiler/metrowerks.hpp +29 -1
  390. data/ext/boost/config/compiler/mpw.hpp +30 -0
  391. data/ext/boost/config/compiler/pgi.hpp +37 -0
  392. data/ext/boost/config/compiler/sgi_mipspro.hpp +1 -0
  393. data/ext/boost/config/compiler/sunpro_cc.hpp +39 -7
  394. data/ext/boost/config/compiler/vacpp.hpp +31 -3
  395. data/ext/boost/config/compiler/visualc.hpp +72 -5
  396. data/ext/boost/config/no_tr1/cmath.hpp +28 -0
  397. data/ext/boost/config/platform/bsd.hpp +16 -3
  398. data/ext/boost/config/platform/hpux.hpp +3 -0
  399. data/ext/boost/config/platform/macos.hpp +8 -0
  400. data/ext/boost/config/platform/solaris.hpp +7 -0
  401. data/ext/boost/config/platform/vxworks.hpp +31 -0
  402. data/ext/boost/config/select_compiler_config.hpp +4 -0
  403. data/ext/boost/config/select_platform_config.hpp +6 -2
  404. data/ext/boost/config/select_stdlib_config.hpp +17 -8
  405. data/ext/boost/config/stdlib/dinkumware.hpp +34 -2
  406. data/ext/boost/config/stdlib/libcomo.hpp +25 -0
  407. data/ext/boost/config/stdlib/libstdcpp3.hpp +56 -2
  408. data/ext/boost/config/stdlib/modena.hpp +25 -0
  409. data/ext/boost/config/stdlib/msl.hpp +24 -0
  410. data/ext/boost/config/stdlib/roguewave.hpp +26 -0
  411. data/ext/boost/config/stdlib/sgi.hpp +25 -0
  412. data/ext/boost/config/stdlib/stlport.hpp +36 -1
  413. data/ext/boost/config/stdlib/vacpp.hpp +25 -0
  414. data/ext/boost/config/suffix.hpp +67 -32
  415. data/ext/boost/config/warning_disable.hpp +47 -0
  416. data/ext/boost/cstdint.hpp +62 -36
  417. data/ext/boost/date_time/c_time.hpp +28 -12
  418. data/ext/boost/date_time/compiler_config.hpp +27 -5
  419. data/ext/boost/date_time/constrained_value.hpp +36 -13
  420. data/ext/boost/date_time/date.hpp +44 -33
  421. data/ext/boost/date_time/date_duration.hpp +13 -14
  422. data/ext/boost/date_time/date_facet.hpp +215 -226
  423. data/ext/boost/date_time/date_generator_formatter.hpp +22 -20
  424. data/ext/boost/date_time/date_generator_parser.hpp +52 -51
  425. data/ext/boost/date_time/date_generators.hpp +16 -16
  426. data/ext/boost/date_time/date_parsing.hpp +115 -98
  427. data/ext/boost/date_time/filetime_functions.hpp +133 -41
  428. data/ext/boost/date_time/format_date_parser.hpp +22 -10
  429. data/ext/boost/date_time/gregorian/conversion.hpp +32 -39
  430. data/ext/boost/date_time/gregorian/greg_calendar.hpp +15 -14
  431. data/ext/boost/date_time/gregorian/greg_date.hpp +19 -18
  432. data/ext/boost/date_time/gregorian/greg_duration.hpp +106 -10
  433. data/ext/boost/date_time/gregorian/greg_duration_types.hpp +16 -7
  434. data/ext/boost/date_time/gregorian/greg_weekday.hpp +2 -2
  435. data/ext/boost/date_time/gregorian/gregorian_io.hpp +11 -4
  436. data/ext/boost/date_time/gregorian_calendar.hpp +8 -8
  437. data/ext/boost/date_time/gregorian_calendar.ipp +30 -30
  438. data/ext/boost/date_time/int_adapter.hpp +4 -2
  439. data/ext/boost/date_time/microsec_time_clock.hpp +39 -117
  440. data/ext/boost/date_time/period_parser.hpp +17 -15
  441. data/ext/boost/date_time/posix_time/conversion.hpp +28 -29
  442. data/ext/boost/date_time/posix_time/posix_time_config.hpp +19 -19
  443. data/ext/boost/date_time/posix_time/posix_time_io.hpp +31 -38
  444. data/ext/boost/date_time/posix_time/time_formatters.hpp +32 -32
  445. data/ext/boost/date_time/string_parse_tree.hpp +46 -46
  446. data/ext/boost/date_time/strings_from_facet.hpp +7 -5
  447. data/ext/boost/date_time/time.hpp +7 -6
  448. data/ext/boost/date_time/time_defs.hpp +12 -2
  449. data/ext/boost/date_time/time_duration.hpp +27 -26
  450. data/ext/boost/date_time/time_facet.hpp +386 -321
  451. data/ext/boost/date_time/time_formatting_streams.hpp +8 -5
  452. data/ext/boost/date_time/time_resolution_traits.hpp +29 -25
  453. data/ext/boost/date_time/time_system_split.hpp +7 -13
  454. data/ext/boost/date_time/wrapping_int.hpp +21 -15
  455. data/ext/boost/detail/call_traits.hpp +1 -1
  456. data/ext/boost/detail/endian.hpp +4 -4
  457. data/ext/boost/detail/no_exceptions_support.hpp +87 -0
  458. data/ext/boost/detail/sp_typeinfo.hpp +50 -4
  459. data/ext/boost/detail/workaround.hpp +63 -3
  460. data/ext/boost/enable_shared_from_this.hpp +4 -59
  461. data/ext/boost/exception/current_exception_cast.hpp +43 -0
  462. data/ext/boost/exception/detail/attribute_noreturn.hpp +17 -0
  463. data/ext/boost/exception/detail/error_info_impl.hpp +75 -0
  464. data/ext/boost/exception/detail/exception_ptr.hpp +490 -0
  465. data/ext/boost/exception/detail/is_output_streamable.hpp +47 -0
  466. data/ext/boost/exception/detail/object_hex_dump.hpp +50 -0
  467. data/ext/boost/exception/detail/type_info.hpp +79 -0
  468. data/ext/boost/exception/diagnostic_information.hpp +182 -0
  469. data/ext/boost/exception/exception.hpp +422 -0
  470. data/ext/boost/exception/get_error_info.hpp +130 -0
  471. data/ext/boost/exception/info.hpp +167 -0
  472. data/ext/boost/exception/to_string.hpp +83 -0
  473. data/ext/boost/exception/to_string_stub.hpp +109 -0
  474. data/ext/boost/exception_ptr.hpp +11 -0
  475. data/ext/boost/function/detail/prologue.hpp +2 -1
  476. data/ext/boost/function/function_base.hpp +270 -128
  477. data/ext/boost/function/function_fwd.hpp +70 -0
  478. data/ext/boost/function/function_template.hpp +319 -130
  479. data/ext/boost/get_pointer.hpp +5 -1
  480. data/ext/boost/integer.hpp +253 -0
  481. data/ext/boost/integer_fwd.hpp +174 -0
  482. data/ext/boost/integer_traits.hpp +26 -1
  483. data/ext/boost/io/ios_state.hpp +8 -0
  484. data/ext/boost/iterator/detail/config_def.hpp +4 -2
  485. data/ext/boost/iterator/iterator_adaptor.hpp +7 -2
  486. data/ext/boost/iterator/iterator_facade.hpp +1 -2
  487. data/ext/boost/lexical_cast.hpp +113 -105
  488. data/ext/boost/limits.hpp +1 -1
  489. data/ext/boost/mem_fn.hpp +5 -370
  490. data/ext/boost/memory_order.hpp +53 -0
  491. data/ext/boost/mpl/always.hpp +3 -3
  492. data/ext/boost/mpl/and.hpp +3 -3
  493. data/ext/boost/mpl/apply.hpp +3 -3
  494. data/ext/boost/mpl/apply_fwd.hpp +3 -3
  495. data/ext/boost/mpl/apply_wrap.hpp +37 -6
  496. data/ext/boost/mpl/arg.hpp +3 -3
  497. data/ext/boost/mpl/arg_fwd.hpp +3 -3
  498. data/ext/boost/mpl/assert.hpp +6 -6
  499. data/ext/boost/mpl/aux_/adl_barrier.hpp +3 -3
  500. data/ext/boost/mpl/aux_/arg_typedef.hpp +3 -3
  501. data/ext/boost/mpl/aux_/arity.hpp +3 -3
  502. data/ext/boost/mpl/aux_/arity_spec.hpp +3 -3
  503. data/ext/boost/mpl/aux_/common_name_wknd.hpp +3 -3
  504. data/ext/boost/mpl/aux_/config/adl.hpp +4 -4
  505. data/ext/boost/mpl/aux_/config/arrays.hpp +4 -4
  506. data/ext/boost/mpl/aux_/config/bcc.hpp +28 -0
  507. data/ext/boost/mpl/aux_/config/bind.hpp +4 -4
  508. data/ext/boost/mpl/aux_/config/compiler.hpp +8 -6
  509. data/ext/boost/mpl/aux_/config/ctps.hpp +3 -3
  510. data/ext/boost/mpl/aux_/config/dtp.hpp +5 -5
  511. data/ext/boost/mpl/aux_/config/eti.hpp +3 -3
  512. data/ext/boost/mpl/aux_/config/gcc.hpp +3 -3
  513. data/ext/boost/mpl/aux_/config/has_apply.hpp +3 -3
  514. data/ext/boost/mpl/aux_/config/has_xxx.hpp +3 -3
  515. data/ext/boost/mpl/aux_/config/integral.hpp +4 -4
  516. data/ext/boost/mpl/aux_/config/intel.hpp +3 -3
  517. data/ext/boost/mpl/aux_/config/lambda.hpp +3 -3
  518. data/ext/boost/mpl/aux_/config/msvc.hpp +3 -3
  519. data/ext/boost/mpl/aux_/config/msvc_typename.hpp +3 -3
  520. data/ext/boost/mpl/aux_/config/nttp.hpp +3 -3
  521. data/ext/boost/mpl/aux_/config/overload_resolution.hpp +3 -3
  522. data/ext/boost/mpl/aux_/config/pp_counter.hpp +3 -3
  523. data/ext/boost/mpl/aux_/config/preprocessor.hpp +4 -4
  524. data/ext/boost/mpl/aux_/config/static_constant.hpp +3 -3
  525. data/ext/boost/mpl/aux_/config/ttp.hpp +4 -4
  526. data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +3 -3
  527. data/ext/boost/mpl/aux_/config/workaround.hpp +3 -3
  528. data/ext/boost/mpl/aux_/full_lambda.hpp +3 -3
  529. data/ext/boost/mpl/aux_/has_apply.hpp +3 -3
  530. data/ext/boost/mpl/aux_/has_type.hpp +3 -3
  531. data/ext/boost/mpl/aux_/include_preprocessed.hpp +3 -3
  532. data/ext/boost/mpl/aux_/integral_wrapper.hpp +3 -3
  533. data/ext/boost/mpl/aux_/lambda_arity_param.hpp +3 -3
  534. data/ext/boost/mpl/aux_/lambda_support.hpp +4 -4
  535. data/ext/boost/mpl/aux_/msvc_never_true.hpp +3 -3
  536. data/ext/boost/mpl/aux_/na.hpp +3 -3
  537. data/ext/boost/mpl/aux_/na_assert.hpp +3 -3
  538. data/ext/boost/mpl/aux_/na_fwd.hpp +3 -3
  539. data/ext/boost/mpl/aux_/na_spec.hpp +3 -3
  540. data/ext/boost/mpl/aux_/nested_type_wknd.hpp +3 -3
  541. data/ext/boost/mpl/aux_/nttp_decl.hpp +3 -3
  542. data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +3 -3
  543. data/ext/boost/mpl/aux_/preprocessor/enum.hpp +3 -3
  544. data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +3 -3
  545. data/ext/boost/mpl/aux_/preprocessor/params.hpp +3 -3
  546. data/ext/boost/mpl/aux_/preprocessor/sub.hpp +3 -3
  547. data/ext/boost/mpl/aux_/static_cast.hpp +3 -3
  548. data/ext/boost/mpl/aux_/template_arity.hpp +3 -3
  549. data/ext/boost/mpl/aux_/template_arity_fwd.hpp +3 -3
  550. data/ext/boost/mpl/aux_/type_wrapper.hpp +3 -3
  551. data/ext/boost/mpl/aux_/value_wknd.hpp +3 -3
  552. data/ext/boost/mpl/aux_/yes_no.hpp +3 -3
  553. data/ext/boost/mpl/bind.hpp +3 -3
  554. data/ext/boost/mpl/bind_fwd.hpp +3 -3
  555. data/ext/boost/mpl/bool.hpp +3 -3
  556. data/ext/boost/mpl/bool_fwd.hpp +3 -3
  557. data/ext/boost/mpl/eval_if.hpp +3 -3
  558. data/ext/boost/mpl/has_xxx.hpp +10 -8
  559. data/ext/boost/mpl/identity.hpp +3 -3
  560. data/ext/boost/mpl/if.hpp +3 -3
  561. data/ext/boost/mpl/int.hpp +3 -3
  562. data/ext/boost/mpl/int_fwd.hpp +3 -3
  563. data/ext/boost/mpl/integral_c.hpp +3 -3
  564. data/ext/boost/mpl/integral_c_fwd.hpp +3 -3
  565. data/ext/boost/mpl/integral_c_tag.hpp +3 -3
  566. data/ext/boost/mpl/lambda.hpp +3 -3
  567. data/ext/boost/mpl/lambda_fwd.hpp +3 -3
  568. data/ext/boost/mpl/limits/arity.hpp +3 -3
  569. data/ext/boost/mpl/logical.hpp +3 -3
  570. data/ext/boost/mpl/next.hpp +3 -3
  571. data/ext/boost/mpl/next_prior.hpp +3 -3
  572. data/ext/boost/mpl/not.hpp +3 -3
  573. data/ext/boost/mpl/or.hpp +3 -3
  574. data/ext/boost/mpl/placeholders.hpp +3 -3
  575. data/ext/boost/mpl/protect.hpp +3 -3
  576. data/ext/boost/mpl/quote.hpp +18 -7
  577. data/ext/boost/mpl/size_t.hpp +3 -3
  578. data/ext/boost/mpl/size_t_fwd.hpp +3 -3
  579. data/ext/boost/mpl/void.hpp +3 -3
  580. data/ext/boost/mpl/void_fwd.hpp +3 -3
  581. data/ext/boost/non_type.hpp +27 -27
  582. data/ext/boost/operators.hpp +51 -18
  583. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  584. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  585. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  586. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  587. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  588. data/ext/boost/preprocessor/seq/cat.hpp +48 -0
  589. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  590. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  591. data/ext/boost/range/as_literal.hpp +10 -14
  592. data/ext/boost/range/begin.hpp +4 -4
  593. data/ext/boost/range/detail/implementation_help.hpp +4 -0
  594. data/ext/boost/range/end.hpp +4 -4
  595. data/ext/boost/range/iterator_range.hpp +31 -15
  596. data/ext/boost/ref.hpp +12 -1
  597. data/ext/boost/scoped_array.hpp +16 -0
  598. data/ext/boost/scoped_ptr.hpp +16 -0
  599. data/ext/boost/shared_ptr.hpp +2 -602
  600. data/ext/boost/{detail → smart_ptr}/bad_weak_ptr.hpp +4 -4
  601. data/ext/boost/{detail → smart_ptr/detail}/atomic_count.hpp +14 -19
  602. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc.hpp +13 -9
  603. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc_x86.hpp +5 -12
  604. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_pthreads.hpp +5 -5
  605. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_solaris.hpp +3 -3
  606. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_sync.hpp +9 -5
  607. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_win32.hpp +3 -3
  608. data/ext/boost/smart_ptr/detail/operator_bool.hpp +56 -0
  609. data/ext/boost/{detail → smart_ptr/detail}/shared_count.hpp +86 -17
  610. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +76 -0
  611. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +70 -0
  612. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_acc_ia64.hpp +4 -4
  613. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_ppc.hpp +4 -4
  614. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_x86.hpp +4 -4
  615. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ia64.hpp +4 -4
  616. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +172 -0
  617. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ppc.hpp +4 -4
  618. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_sparc.hpp +7 -7
  619. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_x86.hpp +4 -4
  620. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_nt.hpp +4 -4
  621. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_pt.hpp +4 -4
  622. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_solaris.hpp +4 -4
  623. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +131 -0
  624. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_sync.hpp +8 -4
  625. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_w32.hpp +4 -4
  626. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_impl.hpp +5 -5
  627. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +49 -0
  628. data/ext/boost/smart_ptr/detail/spinlock.hpp +53 -0
  629. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +85 -0
  630. data/ext/boost/smart_ptr/detail/spinlock_nt.hpp +89 -0
  631. data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +87 -0
  632. data/ext/boost/smart_ptr/detail/spinlock_pt.hpp +79 -0
  633. data/ext/boost/smart_ptr/detail/spinlock_sync.hpp +87 -0
  634. data/ext/boost/smart_ptr/detail/yield_k.hpp +149 -0
  635. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +79 -0
  636. data/ext/boost/smart_ptr/scoped_array.hpp +107 -0
  637. data/ext/boost/smart_ptr/scoped_ptr.hpp +131 -0
  638. data/ext/boost/smart_ptr/shared_ptr.hpp +701 -0
  639. data/ext/boost/smart_ptr/weak_ptr.hpp +230 -0
  640. data/ext/boost/src/pthread/thread.cpp +115 -203
  641. data/ext/boost/src/tss_null.cpp +1 -1
  642. data/ext/boost/static_assert.hpp +14 -4
  643. data/ext/boost/thread.hpp +7 -2
  644. data/ext/boost/thread/barrier.hpp +63 -0
  645. data/ext/boost/thread/detail/force_cast.hpp +39 -0
  646. data/ext/boost/thread/detail/move.hpp +29 -2
  647. data/ext/boost/thread/detail/platform.hpp +3 -3
  648. data/ext/boost/thread/detail/singleton.hpp +59 -0
  649. data/ext/boost/thread/detail/thread.hpp +496 -0
  650. data/ext/boost/thread/detail/thread_group.hpp +105 -0
  651. data/ext/boost/thread/detail/thread_heap_alloc.hpp +23 -0
  652. data/ext/boost/thread/detail/thread_interruption.hpp +35 -0
  653. data/ext/boost/thread/detail/tss_hooks.hpp +82 -0
  654. data/ext/boost/thread/exceptions.hpp +174 -60
  655. data/ext/boost/thread/future.hpp +1364 -0
  656. data/ext/boost/thread/locks.hpp +899 -32
  657. data/ext/boost/thread/once.hpp +4 -0
  658. data/ext/boost/thread/pthread/condition_variable.hpp +16 -21
  659. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +37 -3
  660. data/ext/boost/thread/pthread/mutex.hpp +20 -7
  661. data/ext/boost/thread/pthread/once.hpp +7 -2
  662. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +5 -1
  663. data/ext/boost/thread/pthread/recursive_mutex.hpp +22 -5
  664. data/ext/boost/thread/pthread/shared_mutex.hpp +303 -0
  665. data/ext/boost/thread/pthread/thread_data.hpp +37 -10
  666. data/ext/boost/thread/pthread/thread_heap_alloc.hpp +242 -0
  667. data/ext/boost/thread/pthread/timespec.hpp +11 -3
  668. data/ext/boost/thread/shared_mutex.hpp +21 -0
  669. data/ext/boost/thread/thread.hpp +8 -3
  670. data/ext/boost/thread/thread_time.hpp +4 -0
  671. data/ext/boost/thread/tss.hpp +106 -13
  672. data/ext/boost/thread/xtime.hpp +6 -2
  673. data/ext/boost/throw_exception.hpp +36 -7
  674. data/ext/boost/token_functions.hpp +1 -1
  675. data/ext/boost/tokenizer.hpp +1 -1
  676. data/ext/boost/type_traits/add_pointer.hpp +1 -1
  677. data/ext/boost/type_traits/add_volatile.hpp +47 -0
  678. data/ext/boost/type_traits/alignment_of.hpp +29 -1
  679. data/ext/boost/type_traits/config.hpp +1 -1
  680. data/ext/boost/type_traits/conversion_traits.hpp +1 -1
  681. data/ext/boost/type_traits/has_trivial_destructor.hpp +42 -0
  682. data/ext/boost/type_traits/intrinsics.hpp +88 -1
  683. data/ext/boost/type_traits/is_abstract.hpp +14 -5
  684. data/ext/boost/type_traits/is_arithmetic.hpp +8 -0
  685. data/ext/boost/type_traits/is_array.hpp +3 -2
  686. data/ext/boost/type_traits/is_base_and_derived.hpp +254 -0
  687. data/ext/boost/type_traits/is_base_of.hpp +51 -0
  688. data/ext/boost/type_traits/is_class.hpp +12 -0
  689. data/ext/boost/type_traits/is_const.hpp +6 -2
  690. data/ext/boost/type_traits/is_convertible.hpp +14 -2
  691. data/ext/boost/type_traits/is_enum.hpp +10 -1
  692. data/ext/boost/type_traits/is_function.hpp +11 -3
  693. data/ext/boost/type_traits/is_fundamental.hpp +45 -0
  694. data/ext/boost/type_traits/is_integral.hpp +5 -0
  695. data/ext/boost/type_traits/is_member_function_pointer.hpp +5 -3
  696. data/ext/boost/type_traits/is_member_pointer.hpp +4 -2
  697. data/ext/boost/type_traits/is_pointer.hpp +3 -1
  698. data/ext/boost/type_traits/is_reference.hpp +4 -2
  699. data/ext/boost/type_traits/is_signed.hpp +135 -0
  700. data/ext/boost/type_traits/is_unsigned.hpp +130 -0
  701. data/ext/boost/type_traits/is_void.hpp +5 -0
  702. data/ext/boost/type_traits/is_volatile.hpp +4 -2
  703. data/ext/boost/type_traits/make_unsigned.hpp +137 -0
  704. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  705. data/ext/boost/type_traits/type_with_alignment.hpp +106 -1
  706. data/ext/boost/utility.hpp +2 -1
  707. data/ext/boost/utility/addressof.hpp +61 -17
  708. data/ext/boost/utility/binary.hpp +708 -0
  709. data/ext/boost/utility/enable_if.hpp +2 -2
  710. data/ext/boost/weak_ptr.hpp +4 -174
  711. data/ext/common/AbstractSpawnManager.h +110 -0
  712. data/ext/common/Account.h +175 -0
  713. data/ext/common/AccountsDatabase.cpp +81 -0
  714. data/ext/common/AccountsDatabase.h +130 -0
  715. data/ext/common/AgentBase.cpp +323 -0
  716. data/ext/common/{Version.h → AgentBase.h} +14 -6
  717. data/ext/common/AgentsStarter.cpp +154 -0
  718. data/ext/common/AgentsStarter.h +81 -0
  719. data/ext/common/AgentsStarter.hpp +619 -0
  720. data/ext/common/ApplicationPool/Client.h +796 -0
  721. data/ext/common/{ApplicationPool.h → ApplicationPool/Interface.h} +108 -18
  722. data/ext/common/ApplicationPool/Pool.h +1315 -0
  723. data/ext/common/ApplicationPool/Server.h +475 -0
  724. data/ext/common/BCrypt.cpp +343 -0
  725. data/ext/common/BCrypt.h +73 -0
  726. data/ext/common/Blowfish.c +685 -0
  727. data/ext/common/Blowfish.h +103 -0
  728. data/ext/common/Constants.h +48 -0
  729. data/ext/common/EventedClient.h +598 -0
  730. data/ext/common/EventedMessageServer.h +327 -0
  731. data/ext/common/EventedServer.h +295 -0
  732. data/ext/common/Exceptions.h +78 -1
  733. data/ext/common/FileDescriptor.h +229 -0
  734. data/ext/common/HelperAgent/BacktracesServer.h +59 -0
  735. data/ext/common/Logging.cpp +8 -9
  736. data/ext/common/Logging.h +593 -21
  737. data/ext/common/LoggingAgent/ChangeNotifier.h +63 -0
  738. data/ext/common/LoggingAgent/DataStoreId.h +177 -0
  739. data/ext/common/LoggingAgent/LoggingServer.h +1343 -0
  740. data/ext/common/LoggingAgent/Main.cpp +278 -0
  741. data/ext/common/LoggingAgent/RemoteSender.h +457 -0
  742. data/ext/common/MessageChannel.h +196 -34
  743. data/ext/common/MessageClient.h +297 -0
  744. data/ext/common/MessageReadersWriters.h +508 -0
  745. data/ext/common/MessageServer.h +575 -0
  746. data/ext/common/PoolOptions.h +279 -117
  747. data/ext/common/Process.h +255 -0
  748. data/ext/common/RandomGenerator.h +160 -0
  749. data/ext/common/ResourceLocator.h +84 -0
  750. data/ext/common/ServerInstanceDir.h +343 -0
  751. data/ext/common/Session.h +470 -0
  752. data/ext/common/SpawnManager.h +256 -201
  753. data/ext/common/StaticString.h +79 -4
  754. data/ext/common/StringListCreator.h +2 -2
  755. data/ext/common/Utils.cpp +385 -397
  756. data/ext/common/Utils.h +79 -165
  757. data/ext/common/{Base64.cpp → Utils/Base64.cpp} +0 -0
  758. data/ext/common/{Base64.h → Utils/Base64.h} +27 -1
  759. data/ext/common/Utils/BlockingQueue.h +136 -0
  760. data/ext/common/Utils/BlockingScalar.h +50 -0
  761. data/ext/common/{CachedFileStat.cpp → Utils/CachedFileStat.cpp} +1 -1
  762. data/ext/common/{CachedFileStat.h → Utils/CachedFileStat.h} +1 -1
  763. data/ext/common/{CachedFileStat.hpp → Utils/CachedFileStat.hpp} +1 -1
  764. data/ext/common/{FileChangeChecker.h → Utils/FileChangeChecker.h} +1 -1
  765. data/ext/common/Utils/FileHandleGuard.h +81 -0
  766. data/ext/common/Utils/IOUtils.cpp +754 -0
  767. data/ext/common/Utils/IOUtils.h +253 -0
  768. data/ext/common/Utils/MD5.cpp +406 -0
  769. data/ext/common/Utils/MD5.h +98 -0
  770. data/ext/common/Utils/MemZeroGuard.h +103 -0
  771. data/ext/common/Utils/ProcessMetricsCollector.h +462 -0
  772. data/ext/common/Utils/ScopeGuard.h +72 -0
  773. data/ext/common/Utils/StrIntUtils.cpp +329 -0
  774. data/ext/common/Utils/StrIntUtils.h +228 -0
  775. data/ext/common/{SystemTime.cpp → Utils/SystemTime.cpp} +5 -1
  776. data/ext/common/Utils/SystemTime.h +201 -0
  777. data/ext/common/{Timer.h → Utils/Timer.h} +58 -18
  778. data/ext/common/Utils/VariantMap.h +363 -0
  779. data/ext/common/Utils/foo.cpp +10 -0
  780. data/ext/common/Watchdog.cpp +1034 -0
  781. data/ext/google/COPYING +28 -0
  782. data/ext/google/ChangeLog +167 -0
  783. data/ext/google/dense_hash_map +310 -0
  784. data/ext/google/dense_hash_set +287 -0
  785. data/ext/google/sparse_hash_map +294 -0
  786. data/ext/google/sparse_hash_set +275 -0
  787. data/ext/google/sparsehash/densehashtable.h +1062 -0
  788. data/ext/google/sparsehash/sparseconfig.h +55 -0
  789. data/ext/google/sparsehash/sparsehashtable.h +1015 -0
  790. data/ext/google/sparsetable +1468 -0
  791. data/ext/google/type_traits.h +250 -0
  792. data/ext/libev/Changes +302 -0
  793. data/ext/libev/LICENSE +36 -0
  794. data/ext/libev/Makefile.am +18 -0
  795. data/ext/libev/Makefile.in +685 -0
  796. data/ext/libev/README +58 -0
  797. data/ext/libev/aclocal.m4 +7549 -0
  798. data/ext/libev/autogen.sh +6 -0
  799. data/ext/libev/config.guess +1526 -0
  800. data/ext/libev/config.h +122 -0
  801. data/ext/libev/config.h.in +121 -0
  802. data/ext/libev/config.sub +1658 -0
  803. data/ext/libev/configure +22156 -0
  804. data/ext/libev/configure.ac +18 -0
  805. data/ext/libev/ev++.h +800 -0
  806. data/ext/libev/ev.c +3694 -0
  807. data/ext/libev/ev.h +705 -0
  808. data/ext/libev/ev_epoll.c +228 -0
  809. data/ext/libev/ev_kqueue.c +196 -0
  810. data/ext/libev/ev_poll.c +144 -0
  811. data/ext/libev/ev_port.c +165 -0
  812. data/ext/libev/ev_select.c +308 -0
  813. data/ext/libev/ev_vars.h +187 -0
  814. data/ext/libev/ev_win32.c +153 -0
  815. data/ext/libev/ev_wrap.h +178 -0
  816. data/ext/libev/event.c +401 -0
  817. data/ext/libev/event.h +158 -0
  818. data/ext/libev/install-sh +294 -0
  819. data/ext/libev/libev.m4 +38 -0
  820. data/ext/libev/ltmain.sh +6871 -0
  821. data/ext/libev/missing +336 -0
  822. data/ext/libev/mkinstalldirs +111 -0
  823. data/ext/nginx/Configuration.c +532 -182
  824. data/ext/nginx/Configuration.h +33 -10
  825. data/ext/nginx/ContentHandler.c +188 -53
  826. data/ext/nginx/ContentHandler.h +1 -1
  827. data/ext/nginx/{HelperServer.cpp → HelperAgent.cpp} +433 -299
  828. data/ext/nginx/HttpStatusExtractor.h +1 -1
  829. data/ext/nginx/ScgiRequestParser.h +68 -11
  830. data/ext/nginx/StaticContentHandler.c +4 -1
  831. data/ext/nginx/StaticContentHandler.h +1 -1
  832. data/ext/nginx/config +5 -5
  833. data/ext/nginx/ngx_http_passenger_module.c +315 -469
  834. data/ext/nginx/ngx_http_passenger_module.h +8 -17
  835. data/ext/oxt/backtrace.cpp +49 -41
  836. data/ext/oxt/backtrace.hpp +1 -1
  837. data/ext/oxt/detail/backtrace_disabled.hpp +1 -1
  838. data/ext/oxt/detail/backtrace_enabled.hpp +16 -15
  839. data/ext/oxt/detail/spin_lock_darwin.hpp +69 -0
  840. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +3 -4
  841. data/ext/oxt/detail/spin_lock_portable.hpp +1 -1
  842. data/ext/oxt/detail/spin_lock_pthreads.hpp +1 -1
  843. data/ext/oxt/detail/tracable_exception_disabled.hpp +1 -1
  844. data/ext/oxt/detail/tracable_exception_enabled.hpp +1 -1
  845. data/ext/oxt/dynamic_thread_group.hpp +195 -0
  846. data/ext/oxt/macros.hpp +1 -1
  847. data/ext/oxt/spin_lock.hpp +4 -2
  848. data/ext/oxt/system_calls.cpp +129 -13
  849. data/ext/oxt/system_calls.hpp +16 -2
  850. data/ext/oxt/thread.cpp +1 -1
  851. data/ext/oxt/thread.hpp +49 -14
  852. data/ext/oxt/tracable_exception.cpp +5 -5
  853. data/ext/oxt/tracable_exception.hpp +1 -1
  854. data/ext/phusion_passenger/extconf.rb +7 -2
  855. data/ext/phusion_passenger/native_support.c +733 -33
  856. data/{bin → helper-scripts}/passenger-spawn-server +50 -12
  857. data/helper-scripts/prespawn +63 -0
  858. data/lib/phusion_passenger.rb +113 -0
  859. data/lib/phusion_passenger/abstract_installer.rb +50 -12
  860. data/lib/phusion_passenger/abstract_request_handler.rb +432 -171
  861. data/lib/phusion_passenger/abstract_server.rb +125 -122
  862. data/lib/phusion_passenger/abstract_server_collection.rb +51 -22
  863. data/lib/phusion_passenger/admin_tools.rb +1 -1
  864. data/lib/phusion_passenger/admin_tools/memory_stats.rb +299 -0
  865. data/lib/phusion_passenger/admin_tools/server_instance.rb +334 -0
  866. data/lib/phusion_passenger/analytics_logger.rb +342 -0
  867. data/lib/phusion_passenger/{application.rb → app_process.rb} +73 -24
  868. data/lib/phusion_passenger/classic_rails/application_spawner.rb +344 -0
  869. data/lib/phusion_passenger/{railz → classic_rails}/cgi_fixed.rb +2 -2
  870. data/lib/phusion_passenger/{railz → classic_rails}/framework_spawner.rb +75 -98
  871. data/lib/phusion_passenger/{railz → classic_rails}/request_handler.rb +8 -6
  872. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_base_extension.rb +65 -0
  873. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_benchmarking_extension.rb +48 -0
  874. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_rescue_extension.rb +59 -0
  875. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ar_abstract_adapter_extension.rb +54 -0
  876. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/as_cache_extension.rb +130 -0
  877. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/av_benchmark_helper_extension.rb +47 -0
  878. data/lib/phusion_passenger/classic_rails_extensions/init.rb +123 -0
  879. data/lib/phusion_passenger/console_text_template.rb +1 -1
  880. data/lib/phusion_passenger/constants.rb +9 -5
  881. data/lib/phusion_passenger/debug_logging.rb +104 -0
  882. data/lib/phusion_passenger/dependencies.rb +187 -4
  883. data/lib/phusion_passenger/exceptions.rb +4 -4
  884. data/lib/phusion_passenger/html_template.rb +6 -8
  885. data/lib/phusion_passenger/message_channel.rb +137 -21
  886. data/lib/phusion_passenger/message_client.rb +173 -0
  887. data/lib/phusion_passenger/native_support.rb +108 -0
  888. data/lib/phusion_passenger/packaging.rb +82 -13
  889. data/lib/phusion_passenger/platform_info.rb +84 -475
  890. data/lib/phusion_passenger/platform_info/apache.rb +329 -0
  891. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +187 -0
  892. data/lib/phusion_passenger/platform_info/compiler.rb +154 -0
  893. data/lib/phusion_passenger/{events.rb → platform_info/curl.rb} +26 -23
  894. data/lib/phusion_passenger/platform_info/documentation_tools.rb +35 -0
  895. data/lib/phusion_passenger/platform_info/linux.rb +77 -0
  896. data/lib/phusion_passenger/platform_info/operating_system.rb +51 -0
  897. data/lib/phusion_passenger/platform_info/ruby.rb +198 -0
  898. data/lib/phusion_passenger/platform_info/zlib.rb +38 -0
  899. data/lib/phusion_passenger/plugin.rb +96 -0
  900. data/lib/phusion_passenger/public_api.rb +112 -0
  901. data/lib/phusion_passenger/rack/application_spawner.rb +146 -71
  902. data/lib/phusion_passenger/rack/request_handler.rb +36 -13
  903. data/lib/phusion_passenger/rails3_extensions/init.rb +204 -0
  904. data/lib/phusion_passenger/simple_benchmarking.rb +1 -1
  905. data/lib/phusion_passenger/spawn_manager.rb +137 -141
  906. data/lib/phusion_passenger/standalone/app_finder.rb +153 -0
  907. data/lib/phusion_passenger/standalone/command.rb +237 -0
  908. data/lib/phusion_passenger/standalone/config_file.rb +119 -0
  909. data/lib/phusion_passenger/standalone/help_command.rb +57 -0
  910. data/lib/phusion_passenger/standalone/main.rb +101 -0
  911. data/lib/phusion_passenger/standalone/package_runtime_command.rb +92 -0
  912. data/lib/phusion_passenger/standalone/runtime_installer.rb +466 -0
  913. data/lib/phusion_passenger/standalone/start_command.rb +510 -0
  914. data/lib/phusion_passenger/standalone/status_command.rb +62 -0
  915. data/lib/phusion_passenger/standalone/stop_command.rb +74 -0
  916. data/lib/phusion_passenger/standalone/utils.rb +42 -0
  917. data/lib/phusion_passenger/standalone/version_command.rb +42 -0
  918. data/lib/phusion_passenger/templates/framework_init_error.html.erb +1 -1
  919. data/lib/phusion_passenger/templates/standalone/cannot_write_to_dir.txt.erb +11 -0
  920. data/lib/phusion_passenger/templates/standalone/config.erb +69 -0
  921. data/lib/phusion_passenger/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +17 -0
  922. data/lib/phusion_passenger/templates/standalone/run_installer_as_root.txt.erb +8 -0
  923. data/lib/phusion_passenger/templates/standalone/welcome.txt.erb +8 -0
  924. data/lib/phusion_passenger/templates/standalone_default_root/index.html +1 -0
  925. data/lib/phusion_passenger/templates/version_not_found.html.erb +2 -2
  926. data/lib/phusion_passenger/utils.rb +476 -125
  927. data/lib/phusion_passenger/utils/file_system_watcher.rb +186 -0
  928. data/lib/phusion_passenger/utils/hosts_file_parser.rb +130 -0
  929. data/lib/phusion_passenger/utils/tmpdir.rb +70 -0
  930. data/lib/phusion_passenger/utils/unseekable_socket.rb +196 -0
  931. data/lib/phusion_passenger/wsgi/application_spawner.rb +24 -20
  932. data/lib/phusion_passenger/wsgi/request_handler.py +1 -1
  933. data/misc/copy_boost_headers.rb +36 -9
  934. data/misc/find_owner_pipe_leaks.rb +1 -1
  935. data/misc/render_error_pages.rb +1 -1
  936. data/misc/union_station_gateway.crt +32 -0
  937. data/test/config.yml.example +24 -13
  938. data/test/cxx/ApplicationPool_PoolTest.cpp +33 -0
  939. data/test/cxx/ApplicationPool_PoolTestCases.cpp +1029 -0
  940. data/test/cxx/ApplicationPool_ServerTest.cpp +308 -0
  941. data/test/cxx/ApplicationPool_Server_PoolTest.cpp +80 -0
  942. data/test/{Base64Test.cpp → cxx/Base64Test.cpp} +4 -2
  943. data/test/{CachedFileStatTest.cpp → cxx/CachedFileStatTest.cpp} +3 -3
  944. data/test/{CxxTestMain.cpp → cxx/CxxTestMain.cpp} +6 -27
  945. data/test/cxx/EventedClientTest.cpp +386 -0
  946. data/test/{FileChangeCheckerTest.cpp → cxx/FileChangeCheckerTest.cpp} +3 -5
  947. data/test/cxx/FileDescriptorTest.cpp +69 -0
  948. data/test/{HttpStatusExtractorTest.cpp → cxx/HttpStatusExtractorTest.cpp} +1 -1
  949. data/test/cxx/IOUtilsTest.cpp +398 -0
  950. data/test/cxx/LoggingTest.cpp +914 -0
  951. data/test/cxx/MessageChannelTest.cpp +672 -0
  952. data/test/cxx/MessageReadersWritersTest.cpp +574 -0
  953. data/test/cxx/MessageServerTest.cpp +383 -0
  954. data/test/{PoolOptionsTest.cpp → cxx/PoolOptionsTest.cpp} +2 -3
  955. data/test/{ScgiRequestParserTest.cpp → cxx/ScgiRequestParserTest.cpp} +53 -1
  956. data/test/cxx/ServerInstanceDirTest.cpp +186 -0
  957. data/test/cxx/SpawnManagerTest.cpp +161 -0
  958. data/test/cxx/StaticStringTest.cpp +86 -0
  959. data/test/{SystemTimeTest.cpp → cxx/SystemTimeTest.cpp} +2 -2
  960. data/test/cxx/TestSupport.cpp +166 -0
  961. data/test/cxx/TestSupport.h +254 -0
  962. data/test/cxx/UtilsTest.cpp +521 -0
  963. data/test/cxx/VariantMapTest.cpp +179 -0
  964. data/test/integration_tests/apache2_tests.rb +198 -127
  965. data/test/integration_tests/cgi_environment_spec.rb +26 -0
  966. data/test/integration_tests/mycook_spec.rb +2 -28
  967. data/test/integration_tests/nginx_tests.rb +125 -16
  968. data/test/integration_tests/spec_helper.rb +19 -0
  969. data/test/oxt/backtrace_test.cpp +19 -59
  970. data/test/oxt/counter.hpp +55 -0
  971. data/test/oxt/dynamic_thread_group_test.cpp +131 -0
  972. data/test/oxt/oxt_test_main.cpp +2 -2
  973. data/test/oxt/spin_lock_test.cpp +59 -0
  974. data/test/oxt/syscall_interruption_test.cpp +1 -1
  975. data/test/ruby/abstract_request_handler_spec.rb +346 -25
  976. data/test/ruby/abstract_server_collection_spec.rb +4 -3
  977. data/test/ruby/abstract_server_spec.rb +37 -27
  978. data/test/ruby/admin_tools_spec.rb +362 -0
  979. data/test/ruby/analytics_logger_spec.rb +253 -0
  980. data/test/ruby/{application_spec.rb → app_process_spec.rb} +14 -14
  981. data/test/ruby/classic_rails/application_spawner_spec.rb +89 -0
  982. data/test/ruby/classic_rails/framework_spawner_spec.rb +92 -0
  983. data/test/ruby/debug_logging_spec.rb +141 -0
  984. data/test/ruby/message_channel_spec.rb +51 -25
  985. data/test/ruby/rack/application_spawner_spec.rb +99 -82
  986. data/test/ruby/shared/abstract_server_spec.rb +23 -0
  987. data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +375 -0
  988. data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +38 -0
  989. data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +19 -0
  990. data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +15 -0
  991. data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +27 -0
  992. data/test/ruby/shared/spawners/preloading_spawner_spec.rb +29 -0
  993. data/test/ruby/shared/spawners/reload_all_spec.rb +36 -0
  994. data/test/ruby/shared/spawners/reload_single_spec.rb +52 -0
  995. data/test/ruby/shared/spawners/spawn_server_spec.rb +28 -0
  996. data/test/ruby/shared/spawners/spawner_spec.rb +273 -0
  997. data/test/ruby/shared/utils/pseudo_io_spec.rb +60 -0
  998. data/test/ruby/spawn_manager_spec.rb +104 -175
  999. data/test/ruby/spec_helper.rb +104 -0
  1000. data/test/ruby/utils/file_system_watcher_spec.rb +221 -0
  1001. data/test/ruby/utils/hosts_file_parser.rb +258 -0
  1002. data/test/ruby/utils/unseekable_socket_spec.rb +66 -0
  1003. data/test/ruby/utils_spec.rb +410 -59
  1004. data/test/ruby/wsgi/application_spawner_spec.rb +16 -20
  1005. data/test/stub/apache2/httpd.conf.erb +11 -6
  1006. data/test/stub/message_channel.rb +3 -1
  1007. data/test/stub/message_channel_2.rb +3 -1
  1008. data/test/stub/message_channel_3.rb +5 -3
  1009. data/test/stub/nginx/nginx.conf.erb +3 -2
  1010. data/test/stub/rails_apps/1.2/empty/Rakefile +10 -0
  1011. data/test/stub/rails_apps/1.2/empty/app/controllers/application.rb +7 -0
  1012. data/test/stub/rails_apps/{foobar → 1.2/empty}/app/helpers/application_helper.rb +0 -0
  1013. data/test/stub/rails_apps/{mycook → 1.2/empty}/config/boot.rb +3 -3
  1014. data/test/stub/rails_apps/1.2/empty/config/database.yml +31 -0
  1015. data/test/stub/rails_apps/1.2/empty/config/environment.rb +66 -0
  1016. data/test/stub/rails_apps/1.2/empty/config/environments/development.rb +21 -0
  1017. data/test/stub/rails_apps/{foobar → 1.2/empty}/config/environments/production.rb +0 -0
  1018. data/test/stub/rails_apps/1.2/empty/config/environments/staging.rb +18 -0
  1019. data/test/stub/rails_apps/1.2/empty/config/environments/test.rb +19 -0
  1020. data/test/stub/rails_apps/1.2/empty/config/routes.rb +23 -0
  1021. data/test/stub/rails_apps/1.2/empty/doc/README_FOR_APP +2 -0
  1022. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/404.html +0 -0
  1023. data/test/stub/rails_apps/1.2/empty/public/500.html +30 -0
  1024. data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +10 -0
  1025. data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +24 -0
  1026. data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +10 -0
  1027. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/favicon.ico +0 -0
  1028. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/images/rails.png +0 -0
  1029. data/test/stub/rails_apps/1.2/empty/public/robots.txt +1 -0
  1030. data/test/stub/rails_apps/1.2/empty/script/about +3 -0
  1031. data/test/stub/rails_apps/1.2/empty/script/breakpointer +3 -0
  1032. data/test/stub/rails_apps/1.2/empty/script/console +3 -0
  1033. data/test/stub/rails_apps/1.2/empty/script/destroy +3 -0
  1034. data/test/stub/rails_apps/1.2/empty/script/generate +3 -0
  1035. data/test/stub/rails_apps/1.2/empty/script/performance/benchmarker +3 -0
  1036. data/test/stub/rails_apps/1.2/empty/script/performance/profiler +3 -0
  1037. data/test/stub/rails_apps/1.2/empty/script/plugin +3 -0
  1038. data/test/stub/rails_apps/1.2/empty/script/process/inspector +3 -0
  1039. data/test/stub/rails_apps/1.2/empty/script/process/reaper +3 -0
  1040. data/test/stub/rails_apps/1.2/empty/script/process/spawner +3 -0
  1041. data/test/stub/rails_apps/1.2/empty/script/runner +3 -0
  1042. data/test/stub/rails_apps/1.2/empty/script/server +3 -0
  1043. data/test/stub/rails_apps/1.2/empty/test/test_helper.rb +28 -0
  1044. data/test/stub/rails_apps/2.0/empty/Rakefile +10 -0
  1045. data/test/stub/rails_apps/2.0/empty/app/controllers/application.rb +10 -0
  1046. data/test/stub/rails_apps/{mycook → 2.0/empty}/app/helpers/application_helper.rb +0 -0
  1047. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/boot.rb +3 -3
  1048. data/test/stub/rails_apps/2.0/empty/config/database.yml +31 -0
  1049. data/test/stub/rails_apps/2.0/empty/config/environment.rb +59 -0
  1050. data/test/stub/rails_apps/{mycook → 2.0/empty}/config/environments/development.rb +1 -1
  1051. data/test/stub/rails_apps/2.0/empty/config/environments/production.rb +18 -0
  1052. data/test/stub/rails_apps/2.0/empty/config/environments/staging.rb +18 -0
  1053. data/test/stub/rails_apps/2.0/empty/config/environments/test.rb +22 -0
  1054. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/inflections.rb +0 -0
  1055. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/mime_types.rb +0 -0
  1056. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/routes.rb +0 -0
  1057. data/test/stub/rails_apps/2.0/empty/doc/README_FOR_APP +2 -0
  1058. data/test/stub/rails_apps/2.0/empty/public/404.html +30 -0
  1059. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/422.html +0 -0
  1060. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/500.html +0 -0
  1061. data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +10 -0
  1062. data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +24 -0
  1063. data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +10 -0
  1064. data/test/stub/rails_apps/2.0/empty/public/favicon.ico +0 -0
  1065. data/test/stub/rails_apps/2.0/empty/public/images/rails.png +0 -0
  1066. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/robots.txt +0 -0
  1067. data/test/stub/rails_apps/2.0/empty/script/about +3 -0
  1068. data/test/stub/rails_apps/2.0/empty/script/console +3 -0
  1069. data/test/stub/rails_apps/2.0/empty/script/destroy +3 -0
  1070. data/test/stub/rails_apps/2.0/empty/script/generate +3 -0
  1071. data/test/stub/rails_apps/2.0/empty/script/performance/benchmarker +3 -0
  1072. data/test/stub/rails_apps/2.0/empty/script/performance/profiler +3 -0
  1073. data/test/stub/rails_apps/2.0/empty/script/performance/request +3 -0
  1074. data/test/stub/rails_apps/2.0/empty/script/plugin +3 -0
  1075. data/test/stub/rails_apps/2.0/empty/script/process/inspector +3 -0
  1076. data/test/stub/rails_apps/2.0/empty/script/process/reaper +3 -0
  1077. data/test/stub/rails_apps/2.0/empty/script/process/spawner +3 -0
  1078. data/test/stub/rails_apps/2.0/empty/script/runner +3 -0
  1079. data/test/stub/rails_apps/2.0/empty/script/server +3 -0
  1080. data/test/stub/rails_apps/2.0/empty/test/test_helper.rb +38 -0
  1081. data/test/stub/rails_apps/2.2/empty/Rakefile +10 -0
  1082. data/test/stub/rails_apps/2.2/empty/app/controllers/application.rb +15 -0
  1083. data/test/stub/rails_apps/2.2/empty/app/helpers/application_helper.rb +3 -0
  1084. data/test/stub/rails_apps/2.2/empty/config/boot.rb +109 -0
  1085. data/test/stub/rails_apps/2.2/empty/config/database.yml +31 -0
  1086. data/test/stub/rails_apps/2.2/empty/config/environment.rb +75 -0
  1087. data/test/stub/rails_apps/{foobar → 2.2/empty}/config/environments/development.rb +0 -0
  1088. data/test/stub/rails_apps/2.2/empty/config/environments/production.rb +24 -0
  1089. data/test/stub/rails_apps/2.2/empty/config/environments/staging.rb +24 -0
  1090. data/test/stub/rails_apps/2.2/empty/config/environments/test.rb +22 -0
  1091. data/test/stub/rails_apps/2.2/empty/config/initializers/inflections.rb +10 -0
  1092. data/test/stub/rails_apps/{mycook → 2.2/empty}/config/initializers/mime_types.rb +0 -0
  1093. data/test/stub/rails_apps/2.2/empty/config/initializers/new_rails_defaults.rb +17 -0
  1094. data/test/stub/rails_apps/2.2/empty/config/locales/en.yml +5 -0
  1095. data/test/stub/rails_apps/2.2/empty/config/routes.rb +43 -0
  1096. data/test/stub/rails_apps/2.2/empty/doc/README_FOR_APP +5 -0
  1097. data/test/stub/rails_apps/2.2/empty/public/404.html +30 -0
  1098. data/test/stub/rails_apps/2.2/empty/public/422.html +30 -0
  1099. data/test/stub/rails_apps/2.2/empty/public/500.html +33 -0
  1100. data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +10 -0
  1101. data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +24 -0
  1102. data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +10 -0
  1103. data/test/stub/rails_apps/2.2/empty/public/favicon.ico +0 -0
  1104. data/test/stub/rails_apps/2.2/empty/public/images/rails.png +0 -0
  1105. data/test/stub/rails_apps/2.2/empty/public/robots.txt +5 -0
  1106. data/test/stub/rails_apps/2.2/empty/script/about +4 -0
  1107. data/test/stub/rails_apps/2.2/empty/script/console +3 -0
  1108. data/test/stub/rails_apps/2.2/empty/script/dbconsole +3 -0
  1109. data/test/stub/rails_apps/2.2/empty/script/destroy +3 -0
  1110. data/test/stub/rails_apps/2.2/empty/script/generate +3 -0
  1111. data/test/stub/rails_apps/2.2/empty/script/performance/benchmarker +3 -0
  1112. data/test/stub/rails_apps/2.2/empty/script/performance/profiler +3 -0
  1113. data/test/stub/rails_apps/2.2/empty/script/performance/request +3 -0
  1114. data/test/stub/rails_apps/2.2/empty/script/plugin +3 -0
  1115. data/test/stub/rails_apps/2.2/empty/script/process/inspector +3 -0
  1116. data/test/stub/rails_apps/2.2/empty/script/process/reaper +3 -0
  1117. data/test/stub/rails_apps/2.2/empty/script/process/spawner +3 -0
  1118. data/test/stub/rails_apps/2.2/empty/script/runner +3 -0
  1119. data/test/stub/rails_apps/2.2/empty/script/server +3 -0
  1120. data/test/stub/rails_apps/2.2/empty/test/performance/browsing_test.rb +9 -0
  1121. data/test/stub/rails_apps/2.2/empty/test/test_helper.rb +38 -0
  1122. data/test/stub/rails_apps/2.3/empty/Rakefile +10 -0
  1123. data/test/stub/rails_apps/2.3/empty/app/controllers/application_controller.rb +10 -0
  1124. data/test/stub/rails_apps/2.3/empty/app/helpers/application_helper.rb +3 -0
  1125. data/test/stub/rails_apps/2.3/empty/config/boot.rb +110 -0
  1126. data/test/stub/rails_apps/2.3/empty/config/database.yml +31 -0
  1127. data/test/stub/rails_apps/2.3/empty/config/environment.rb +41 -0
  1128. data/test/stub/rails_apps/2.3/empty/config/environments/development.rb +17 -0
  1129. data/test/stub/rails_apps/2.3/empty/config/environments/production.rb +28 -0
  1130. data/test/stub/rails_apps/2.3/empty/config/environments/staging.rb +28 -0
  1131. data/test/stub/rails_apps/2.3/empty/config/environments/test.rb +28 -0
  1132. data/test/stub/rails_apps/2.3/empty/config/initializers/backtrace_silencers.rb +7 -0
  1133. data/test/stub/rails_apps/2.3/empty/config/initializers/inflections.rb +10 -0
  1134. data/test/stub/rails_apps/2.3/empty/config/initializers/mime_types.rb +5 -0
  1135. data/test/stub/rails_apps/2.3/empty/config/initializers/new_rails_defaults.rb +21 -0
  1136. data/test/stub/rails_apps/2.3/empty/config/initializers/session_store.rb +15 -0
  1137. data/test/stub/rails_apps/2.3/empty/config/locales/en.yml +5 -0
  1138. data/test/stub/rails_apps/2.3/empty/config/routes.rb +43 -0
  1139. data/test/stub/rails_apps/2.3/empty/db/seeds.rb +7 -0
  1140. data/test/stub/rails_apps/2.3/empty/doc/README_FOR_APP +2 -0
  1141. data/test/stub/rails_apps/2.3/empty/public/404.html +30 -0
  1142. data/test/stub/rails_apps/2.3/empty/public/422.html +30 -0
  1143. data/test/stub/rails_apps/2.3/empty/public/500.html +30 -0
  1144. data/test/stub/rails_apps/2.3/empty/public/favicon.ico +0 -0
  1145. data/test/stub/rails_apps/2.3/empty/public/images/rails.png +0 -0
  1146. data/test/stub/rails_apps/2.3/empty/public/robots.txt +5 -0
  1147. data/test/stub/rails_apps/2.3/empty/script/about +4 -0
  1148. data/test/stub/rails_apps/2.3/empty/script/console +3 -0
  1149. data/test/stub/rails_apps/2.3/empty/script/dbconsole +3 -0
  1150. data/test/stub/rails_apps/2.3/empty/script/destroy +3 -0
  1151. data/test/stub/rails_apps/2.3/empty/script/generate +3 -0
  1152. data/test/stub/rails_apps/2.3/empty/script/performance/benchmarker +3 -0
  1153. data/test/stub/rails_apps/2.3/empty/script/performance/profiler +3 -0
  1154. data/test/stub/rails_apps/2.3/empty/script/plugin +3 -0
  1155. data/test/stub/rails_apps/2.3/empty/script/runner +3 -0
  1156. data/test/stub/rails_apps/2.3/empty/script/server +3 -0
  1157. data/test/stub/rails_apps/2.3/empty/test/performance/browsing_test.rb +9 -0
  1158. data/test/stub/rails_apps/2.3/empty/test/test_helper.rb +38 -0
  1159. data/test/stub/rails_apps/2.3/foobar/Rakefile +10 -0
  1160. data/test/stub/rails_apps/{foobar/app/controllers/application.rb → 2.3/foobar/app/controllers/application_controller.rb} +0 -0
  1161. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_1.rb +0 -0
  1162. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_2.rb +0 -0
  1163. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/foo_controller.rb +0 -0
  1164. data/test/stub/rails_apps/2.3/foobar/app/helpers/application_helper.rb +3 -0
  1165. data/test/stub/rails_apps/2.3/foobar/config/boot.rb +110 -0
  1166. data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/database.yml +0 -0
  1167. data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/environment.rb +1 -1
  1168. data/test/stub/rails_apps/2.3/foobar/config/environments/development.rb +17 -0
  1169. data/test/stub/rails_apps/2.3/foobar/config/environments/production.rb +18 -0
  1170. data/test/stub/rails_apps/2.3/foobar/config/environments/staging.rb +18 -0
  1171. data/test/stub/rails_apps/{mycook → 2.3/foobar}/config/initializers/inflections.rb +0 -0
  1172. data/test/stub/rails_apps/2.3/foobar/config/initializers/mime_types.rb +5 -0
  1173. data/test/stub/rails_apps/2.3/foobar/config/routes.rb +35 -0
  1174. data/test/stub/rails_apps/2.3/foobar/script/about +3 -0
  1175. data/test/stub/rails_apps/2.3/foobar/script/console +3 -0
  1176. data/test/stub/rails_apps/2.3/foobar/script/dbconsole +3 -0
  1177. data/test/stub/rails_apps/2.3/foobar/script/destroy +3 -0
  1178. data/test/stub/rails_apps/2.3/foobar/script/generate +3 -0
  1179. data/test/stub/rails_apps/2.3/foobar/script/performance/benchmarker +3 -0
  1180. data/test/stub/rails_apps/2.3/foobar/script/performance/profiler +3 -0
  1181. data/test/stub/rails_apps/2.3/foobar/script/performance/request +3 -0
  1182. data/test/stub/rails_apps/2.3/foobar/script/plugin +3 -0
  1183. data/test/stub/rails_apps/2.3/foobar/script/process/inspector +3 -0
  1184. data/test/stub/rails_apps/2.3/foobar/script/process/reaper +3 -0
  1185. data/test/stub/rails_apps/2.3/foobar/script/process/spawner +3 -0
  1186. data/test/stub/rails_apps/2.3/foobar/script/runner +3 -0
  1187. data/test/stub/rails_apps/2.3/foobar/script/server +3 -0
  1188. data/test/stub/rails_apps/2.3/mycook/Rakefile +10 -0
  1189. data/test/stub/rails_apps/{mycook/app/controllers/application.rb → 2.3/mycook/app/controllers/application_controller.rb} +0 -0
  1190. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/recipes_controller.rb +0 -0
  1191. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/uploads_controller.rb +0 -0
  1192. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/welcome_controller.rb +0 -0
  1193. data/test/stub/rails_apps/2.3/mycook/app/helpers/application_helper.rb +3 -0
  1194. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/layouts/default.rhtml +0 -0
  1195. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/create.rhtml +0 -0
  1196. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/index.rhtml +0 -0
  1197. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/new.rhtml +0 -0
  1198. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/index.rhtml +0 -0
  1199. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/new.html.erb +0 -0
  1200. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/cached.rhtml +0 -0
  1201. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/index.rhtml +0 -0
  1202. data/test/stub/rails_apps/2.3/mycook/config/boot.rb +110 -0
  1203. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/database.yml +0 -0
  1204. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environment.rb +1 -1
  1205. data/test/stub/rails_apps/2.3/mycook/config/environments/development.rb +18 -0
  1206. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environments/production.rb +0 -0
  1207. data/test/stub/rails_apps/2.3/mycook/config/initializers/inflections.rb +10 -0
  1208. data/test/stub/rails_apps/2.3/mycook/config/initializers/mime_types.rb +5 -0
  1209. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/routes.rb +0 -0
  1210. data/test/stub/rails_apps/{mycook → 2.3/mycook}/log/useless.txt +0 -0
  1211. data/test/stub/rails_apps/2.3/mycook/public/404.html +30 -0
  1212. data/test/stub/rails_apps/2.3/mycook/public/422.html +30 -0
  1213. data/test/stub/rails_apps/2.3/mycook/public/500.html +30 -0
  1214. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.cgi +0 -0
  1215. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.fcgi +0 -0
  1216. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.rb +1 -1
  1217. data/test/stub/rails_apps/2.3/mycook/public/favicon.ico +0 -0
  1218. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/angrywizard.gif +0 -0
  1219. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/cookbook.gif +0 -0
  1220. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/header.png +0 -0
  1221. data/test/stub/rails_apps/2.3/mycook/public/images/rails.png +0 -0
  1222. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/application.js +0 -0
  1223. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/controls.js +73 -73
  1224. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/dragdrop.js +166 -165
  1225. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/effects.js +174 -166
  1226. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/prototype.js +362 -267
  1227. data/test/stub/rails_apps/2.3/mycook/public/robots.txt +5 -0
  1228. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/uploads.html +0 -0
  1229. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/welcome/cached.html +0 -0
  1230. data/test/stub/rails_apps/2.3/mycook/script/about +3 -0
  1231. data/test/stub/rails_apps/2.3/mycook/script/console +3 -0
  1232. data/test/stub/rails_apps/2.3/mycook/script/dbconsole +3 -0
  1233. data/test/stub/rails_apps/2.3/mycook/script/destroy +3 -0
  1234. data/test/stub/rails_apps/2.3/mycook/script/generate +3 -0
  1235. data/test/stub/rails_apps/2.3/mycook/script/performance/benchmarker +3 -0
  1236. data/test/stub/rails_apps/2.3/mycook/script/performance/profiler +3 -0
  1237. data/test/stub/rails_apps/2.3/mycook/script/performance/request +3 -0
  1238. data/test/stub/rails_apps/2.3/mycook/script/plugin +3 -0
  1239. data/test/stub/rails_apps/2.3/mycook/script/process/inspector +3 -0
  1240. data/test/stub/rails_apps/2.3/mycook/script/process/reaper +3 -0
  1241. data/test/stub/rails_apps/2.3/mycook/script/process/spawner +3 -0
  1242. data/test/stub/rails_apps/2.3/mycook/script/runner +3 -0
  1243. data/test/stub/rails_apps/2.3/mycook/script/server +3 -0
  1244. data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/uploads.html +0 -0
  1245. data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/welcome/cached.html +0 -0
  1246. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/cache/useless.txt +0 -0
  1247. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/pids/useless.txt +0 -0
  1248. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sessions/useless.txt +0 -0
  1249. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sockets/useless.txt +0 -0
  1250. data/test/stub/rails_apps/3.0/empty/Gemfile +22 -0
  1251. data/test/stub/rails_apps/3.0/empty/Rakefile +10 -0
  1252. data/test/stub/rails_apps/3.0/empty/app/controllers/application_controller.rb +4 -0
  1253. data/test/stub/rails_apps/3.0/empty/app/helpers/application_helper.rb +2 -0
  1254. data/test/stub/rails_apps/3.0/empty/app/views/layouts/application.html.erb +14 -0
  1255. data/test/stub/rails_apps/3.0/empty/config.ru +4 -0
  1256. data/test/stub/rails_apps/3.0/empty/config/application.rb +48 -0
  1257. data/test/stub/rails_apps/3.0/empty/config/boot.rb +13 -0
  1258. data/test/stub/rails_apps/3.0/empty/config/database.yml +22 -0
  1259. data/test/stub/rails_apps/3.0/empty/config/environment.rb +5 -0
  1260. data/test/stub/rails_apps/3.0/empty/config/environments/development.rb +19 -0
  1261. data/test/stub/rails_apps/3.0/empty/config/environments/production.rb +48 -0
  1262. data/test/stub/rails_apps/3.0/empty/config/environments/test.rb +32 -0
  1263. data/test/stub/rails_apps/3.0/empty/config/initializers/backtrace_silencers.rb +7 -0
  1264. data/test/stub/rails_apps/3.0/empty/config/initializers/inflections.rb +10 -0
  1265. data/test/stub/rails_apps/3.0/empty/config/initializers/mime_types.rb +5 -0
  1266. data/test/stub/rails_apps/3.0/empty/config/initializers/passenger.rb +1 -0
  1267. data/test/stub/rails_apps/3.0/empty/config/initializers/secret_token.rb +7 -0
  1268. data/test/stub/rails_apps/3.0/empty/config/initializers/session_store.rb +8 -0
  1269. data/test/stub/rails_apps/3.0/empty/config/locales/en.yml +5 -0
  1270. data/test/stub/rails_apps/3.0/empty/config/routes.rb +58 -0
  1271. data/test/stub/rails_apps/3.0/empty/db/seeds.rb +7 -0
  1272. data/test/stub/rails_apps/3.0/empty/doc/README_FOR_APP +2 -0
  1273. data/test/stub/rails_apps/3.0/empty/log/development.log +3 -0
  1274. data/test/stub/rails_apps/3.0/empty/public/404.html +26 -0
  1275. data/test/stub/rails_apps/3.0/empty/public/422.html +26 -0
  1276. data/test/stub/rails_apps/3.0/empty/public/500.html +26 -0
  1277. data/test/stub/rails_apps/3.0/empty/public/favicon.ico +0 -0
  1278. data/test/stub/rails_apps/3.0/empty/public/index.html +279 -0
  1279. data/test/stub/rails_apps/3.0/empty/public/robots.txt +5 -0
  1280. data/test/stub/rails_apps/3.0/empty/script/rails +9 -0
  1281. data/test/stub/rails_apps/3.0/empty/test/performance/browsing_test.rb +9 -0
  1282. data/test/stub/rails_apps/3.0/empty/test/test_helper.rb +13 -0
  1283. data/test/stub/spawn_server.rb +4 -2
  1284. data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +3 -0
  1285. data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +7 -2
  1286. data/test/support/apache2_controller.rb +10 -2
  1287. data/test/support/nginx_controller.rb +3 -2
  1288. data/test/support/test_helper.rb +282 -46
  1289. data/test/{support → tut}/tut.h +6 -0
  1290. data/test/{support → tut}/tut_reporter.h +0 -0
  1291. metadata +824 -266
  1292. data/benchmark/ApplicationPool.cpp +0 -52
  1293. data/benchmark/accept_vs_socketpair_vs_named_pipes.rb +0 -126
  1294. data/benchmark/dispatcher.rb +0 -42
  1295. data/benchmark/overhead_of_password_checking.rb +0 -81
  1296. data/benchmark/socket_connections_vs_persistent_pipe.rb +0 -99
  1297. data/benchmark/unix_sockets_vs_pipes.rb +0 -83
  1298. data/ext/boost/LICENSE.TXT +0 -23
  1299. data/ext/boost/VERSION.TXT +0 -1
  1300. data/ext/boost/detail/sp_counted_base.hpp +0 -81
  1301. data/ext/boost/src/pthread/exceptions.cpp +0 -146
  1302. data/ext/boost/src/win32/exceptions.cpp +0 -124
  1303. data/ext/boost/src/win32/thread.cpp +0 -629
  1304. data/ext/boost/src/win32/timeconv.inl +0 -130
  1305. data/ext/boost/src/win32/tss_dll.cpp +0 -72
  1306. data/ext/boost/src/win32/tss_pe.cpp +0 -269
  1307. data/ext/boost/thread/pthread/thread.hpp +0 -339
  1308. data/ext/boost/thread/pthread/tss.hpp +0 -103
  1309. data/ext/common/Application.h +0 -511
  1310. data/ext/common/ApplicationPoolServer.h +0 -794
  1311. data/ext/common/ApplicationPoolServerExecutable.cpp +0 -743
  1312. data/ext/common/ApplicationPoolStatusReporter.h +0 -336
  1313. data/ext/common/DummySpawnManager.h +0 -108
  1314. data/ext/common/StandardApplicationPool.h +0 -821
  1315. data/ext/common/SystemTime.h +0 -88
  1316. data/lib/phusion_passenger/admin_tools/control_process.rb +0 -150
  1317. data/lib/phusion_passenger/railz/application_spawner.rb +0 -463
  1318. data/lib/phusion_passenger/templates/invalid_app_root.html.erb +0 -9
  1319. data/test/ApplicationPoolServerTest.cpp +0 -114
  1320. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +0 -33
  1321. data/test/ApplicationPoolTest.cpp +0 -599
  1322. data/test/MessageChannelTest.cpp +0 -320
  1323. data/test/SpawnManagerTest.cpp +0 -64
  1324. data/test/StandardApplicationPoolTest.cpp +0 -27
  1325. data/test/StaticStringTest.cpp +0 -51
  1326. data/test/UtilsTest.cpp +0 -257
  1327. data/test/ruby/rails/application_spawner_spec.rb +0 -159
  1328. data/test/ruby/rails/framework_spawner_spec.rb +0 -133
  1329. data/test/ruby/rails/minimal_spawner_spec.rb +0 -93
  1330. data/test/ruby/rails/spawner_error_handling_spec.rb +0 -107
  1331. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +0 -97
  1332. data/test/ruby/spawn_server_spec.rb +0 -26
  1333. data/test/stub/MessageServer.dSYM/Contents/Info.plist +0 -25
  1334. data/test/stub/MessageServer.dSYM/Contents/Resources/DWARF/MessageServer +0 -0
  1335. data/test/support/Support.cpp +0 -84
  1336. data/test/support/Support.h +0 -118
  1337. data/test/support/config.rb +0 -38
  1338. data/test/support/run_rspec_tests.rb +0 -10
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Phusion Passenger - http://www.modrails.com/
3
- * Copyright (c) 2008, 2009 Phusion
3
+ * Copyright (c) 2010 Phusion
4
4
  *
5
5
  * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  *
@@ -31,9 +31,9 @@
31
31
 
32
32
  #include <oxt/backtrace.hpp>
33
33
 
34
- #include "CachedFileStat.hpp"
35
- #include "Configuration.h"
34
+ #include "Configuration.hpp"
36
35
  #include "Utils.h"
36
+ #include "Utils/CachedFileStat.hpp"
37
37
 
38
38
  // The Apache/APR headers *must* come after the Boost headers, otherwise
39
39
  // compilation will fail on OpenBSD.
@@ -0,0 +1,359 @@
1
+ /*
2
+ * Phusion Passenger - http://www.modrails.com/
3
+ * Copyright (c) 2010 Phusion
4
+ *
5
+ * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ */
25
+
26
+ #include <boost/shared_ptr.hpp>
27
+ #include <boost/bind.hpp>
28
+ #include <oxt/thread.hpp>
29
+ #include <oxt/system_calls.hpp>
30
+ #include <oxt/backtrace.hpp>
31
+
32
+ #include <string>
33
+ #include <sys/types.h>
34
+ #include <sys/select.h>
35
+ #include <unistd.h>
36
+ #include <pwd.h>
37
+ #include <grp.h>
38
+ #include <cstdlib>
39
+ #include <cstring>
40
+ #include <cerrno>
41
+
42
+ #include "AgentBase.h"
43
+ #include "HelperAgent/BacktracesServer.h"
44
+ #include "Constants.h"
45
+ #include "ApplicationPool/Pool.h"
46
+ #include "ApplicationPool/Server.h"
47
+ #include "AccountsDatabase.h"
48
+ #include "Account.h"
49
+ #include "MessageServer.h"
50
+ #include "ServerInstanceDir.h"
51
+ #include "ResourceLocator.h"
52
+ #include "MessageChannel.h"
53
+ #include "FileDescriptor.h"
54
+ #include "Logging.h"
55
+ #include "Exceptions.h"
56
+ #include "Utils.h"
57
+ #include "Utils/Timer.h"
58
+
59
+ using namespace std;
60
+ using namespace boost;
61
+ using namespace oxt;
62
+ using namespace Passenger;
63
+
64
+ class Server;
65
+
66
+
67
+ class TimerUpdateHandler: public MessageServer::Handler {
68
+ private:
69
+ Timer &timer;
70
+ unsigned int clients;
71
+
72
+ public:
73
+ TimerUpdateHandler(Timer &_timer): timer(_timer) {
74
+ clients = 0;
75
+ }
76
+
77
+ virtual MessageServer::ClientContextPtr newClient(MessageServer::CommonClientContext &commonContext) {
78
+ clients++;
79
+ timer.stop();
80
+ return MessageServer::ClientContextPtr();
81
+ }
82
+
83
+ virtual void clientDisconnected(MessageServer::CommonClientContext &commonContext,
84
+ MessageServer::ClientContextPtr &handlerSpecificContext)
85
+ {
86
+ clients--;
87
+ if (clients == 0) {
88
+ timer.start();
89
+ }
90
+ }
91
+
92
+ virtual bool processMessage(MessageServer::CommonClientContext &commonContext,
93
+ MessageServer::ClientContextPtr &handlerSpecificContext,
94
+ const vector<string> &args)
95
+ {
96
+ return false;
97
+ }
98
+ };
99
+
100
+ class ExitHandler: public MessageServer::Handler {
101
+ private:
102
+ EventFd &exitEvent;
103
+
104
+ public:
105
+ ExitHandler(EventFd &_exitEvent)
106
+ : exitEvent(_exitEvent)
107
+ { }
108
+
109
+ virtual bool processMessage(MessageServer::CommonClientContext &commonContext,
110
+ MessageServer::ClientContextPtr &handlerSpecificContext,
111
+ const vector<string> &args)
112
+ {
113
+ if (args[0] == "exit") {
114
+ TRACE_POINT();
115
+ commonContext.requireRights(Account::EXIT);
116
+ UPDATE_TRACE_POINT();
117
+ exitEvent.notify();
118
+ UPDATE_TRACE_POINT();
119
+ commonContext.channel.write("exit command received", NULL);
120
+ return true;
121
+ } else {
122
+ return false;
123
+ }
124
+ }
125
+ };
126
+
127
+ class Server {
128
+ private:
129
+ static const unsigned int MESSAGE_SERVER_STACK_SIZE = 64 * 1024;
130
+
131
+ ServerInstanceDir serverInstanceDir;
132
+ ServerInstanceDir::GenerationPtr generation;
133
+ FileDescriptor feedbackFd;
134
+ MessageChannel feedbackChannel;
135
+ AnalyticsLoggerPtr analyticsLogger;
136
+ AccountsDatabasePtr accountsDatabase;
137
+ MessageServerPtr messageServer;
138
+ ApplicationPool::PoolPtr pool;
139
+ ResourceLocator resourceLocator;
140
+ shared_ptr<oxt::thread> prestarterThread;
141
+ shared_ptr<oxt::thread> messageServerThread;
142
+ EventFd exitEvent;
143
+ Timer exitTimer;
144
+
145
+ string receivePassword() {
146
+ TRACE_POINT();
147
+ vector<string> args;
148
+
149
+ if (!feedbackChannel.read(args)) {
150
+ throw IOException("The watchdog unexpectedly closed the connection.");
151
+ }
152
+ if (args[0] != "request socket password" && args[0] != "message socket password") {
153
+ throw IOException("Unexpected input message '" + args[0] + "'");
154
+ }
155
+ return Base64::decode(args[1]);
156
+ }
157
+
158
+ /**
159
+ * Lowers this process's privilege to that of <em>username</em> and <em>groupname</em>.
160
+ */
161
+ void lowerPrivilege(const string &username, const string &groupname) {
162
+ struct passwd *userEntry;
163
+ struct group *groupEntry;
164
+ int e;
165
+
166
+ userEntry = getpwnam(username.c_str());
167
+ if (userEntry == NULL) {
168
+ throw NonExistentUserException(string("Unable to lower Passenger "
169
+ "HelperServer's privilege to that of user '") + username +
170
+ "': user does not exist.");
171
+ }
172
+ groupEntry = getgrnam(groupname.c_str());
173
+ if (groupEntry == NULL) {
174
+ throw NonExistentGroupException(string("Unable to lower Passenger "
175
+ "HelperServer's privilege to that of user '") + username +
176
+ "': user does not exist.");
177
+ }
178
+
179
+ if (initgroups(username.c_str(), userEntry->pw_gid) != 0) {
180
+ e = errno;
181
+ throw SystemException(string("Unable to lower Passenger HelperServer's "
182
+ "privilege to that of user '") + username +
183
+ "': cannot set supplementary groups for this user", e);
184
+ }
185
+ if (setgid(groupEntry->gr_gid) != 0) {
186
+ e = errno;
187
+ throw SystemException(string("Unable to lower Passenger HelperServer's "
188
+ "privilege to that of user '") + username +
189
+ "': cannot set group ID", e);
190
+ }
191
+ if (setuid(userEntry->pw_uid) != 0) {
192
+ e = errno;
193
+ throw SystemException(string("Unable to lower Passenger HelperServer's "
194
+ "privilege to that of user '") + username +
195
+ "': cannot set user ID", e);
196
+ }
197
+ }
198
+
199
+ public:
200
+ Server(FileDescriptor feedbackFd,
201
+ pid_t webServerPid, const string &tempDir,
202
+ bool userSwitching, const string &defaultUser, const string &defaultGroup,
203
+ const string &passengerRoot, const string &rubyCommand,
204
+ unsigned int generationNumber, unsigned int maxPoolSize,
205
+ unsigned int maxInstancesPerApp, unsigned int poolIdleTime,
206
+ const VariantMap &options)
207
+ : serverInstanceDir(webServerPid, tempDir, false),
208
+ resourceLocator(passengerRoot)
209
+ {
210
+ TRACE_POINT();
211
+ string messageSocketPassword;
212
+ string loggingAgentPassword;
213
+
214
+ this->feedbackFd = feedbackFd;
215
+ feedbackChannel = MessageChannel(feedbackFd);
216
+
217
+ UPDATE_TRACE_POINT();
218
+ messageSocketPassword = Base64::decode(options.get("message_socket_password"));
219
+ loggingAgentPassword = options.get("logging_agent_password");
220
+
221
+ generation = serverInstanceDir.getGeneration(generationNumber);
222
+ accountsDatabase = AccountsDatabase::createDefault(generation,
223
+ userSwitching, defaultUser, defaultGroup);
224
+ accountsDatabase->add("_web_server", messageSocketPassword, false,
225
+ Account::GET | Account::DETACH | Account::SET_PARAMETERS | Account::EXIT);
226
+ messageServer = ptr(new MessageServer(generation->getPath() + "/socket", accountsDatabase));
227
+
228
+ createFile(generation->getPath() + "/helper_server.pid",
229
+ toString(getpid()), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
230
+
231
+ if (geteuid() == 0 && !userSwitching) {
232
+ lowerPrivilege(defaultUser, defaultGroup);
233
+ }
234
+
235
+ UPDATE_TRACE_POINT();
236
+ analyticsLogger = ptr(new AnalyticsLogger(options.get("logging_agent_address"),
237
+ "logging", loggingAgentPassword));
238
+
239
+ pool = ptr(new ApplicationPool::Pool(
240
+ resourceLocator.getSpawnServerFilename(), generation,
241
+ accountsDatabase, rubyCommand,
242
+ analyticsLogger,
243
+ options.getInt("log_level"),
244
+ options.get("debug_log_file", false)
245
+ ));
246
+ pool->setMax(maxPoolSize);
247
+ pool->setMaxPerApp(maxInstancesPerApp);
248
+ pool->setMaxIdleTime(poolIdleTime);
249
+
250
+ messageServer->addHandler(ptr(new TimerUpdateHandler(exitTimer)));
251
+ messageServer->addHandler(ptr(new ApplicationPool::Server(pool)));
252
+ messageServer->addHandler(ptr(new BacktracesServer()));
253
+ messageServer->addHandler(ptr(new ExitHandler(exitEvent)));
254
+
255
+ UPDATE_TRACE_POINT();
256
+ feedbackChannel.write("initialized",
257
+ "", // Request socket filename; not available in the Apache helper server.
258
+ messageServer->getSocketFilename().c_str(),
259
+ NULL);
260
+
261
+ prestarterThread = ptr(new oxt::thread(
262
+ boost::bind(prestartWebApps, resourceLocator, options.get("prestart_urls"))
263
+ ));
264
+ }
265
+
266
+ ~Server() {
267
+ TRACE_POINT();
268
+ prestarterThread->interrupt_and_join();
269
+ if (messageServerThread != NULL) {
270
+ messageServerThread->interrupt_and_join();
271
+ }
272
+ }
273
+
274
+ void mainLoop() {
275
+ TRACE_POINT();
276
+
277
+ messageServerThread.reset(new oxt::thread(
278
+ boost::bind(&MessageServer::mainLoop, messageServer.get()),
279
+ "MessageServer thread",
280
+ MESSAGE_SERVER_STACK_SIZE
281
+ ));
282
+
283
+ /* Wait until the watchdog closes the feedback fd (meaning it
284
+ * was killed) or until we receive an exit message.
285
+ */
286
+ this_thread::disable_syscall_interruption dsi;
287
+ fd_set fds;
288
+ int largestFd;
289
+
290
+ FD_ZERO(&fds);
291
+ FD_SET(feedbackFd, &fds);
292
+ FD_SET(exitEvent.fd(), &fds);
293
+ largestFd = (feedbackFd > exitEvent.fd()) ? (int) feedbackFd : exitEvent.fd();
294
+ UPDATE_TRACE_POINT();
295
+ if (syscalls::select(largestFd + 1, &fds, NULL, NULL, NULL) == -1) {
296
+ int e = errno;
297
+ throw SystemException("select() failed", e);
298
+ }
299
+
300
+ if (FD_ISSET(feedbackFd, &fds)) {
301
+ /* If the watchdog has been killed then we'll kill all descendant
302
+ * processes and exit. There's no point in keeping this helper
303
+ * server running because we can't detect when the web server exits,
304
+ * and because this helper server doesn't own the server instance
305
+ * directory. As soon as passenger-status is run, the server
306
+ * instance directory will be cleaned up, making this helper server
307
+ * inaccessible.
308
+ */
309
+ syscalls::killpg(getpgrp(), SIGKILL);
310
+ _exit(2); // In case killpg() fails.
311
+ } else {
312
+ /* We received an exit command. We want to exit 5 seconds after
313
+ * the last client has disconnected, .
314
+ */
315
+ exitTimer.start();
316
+ exitTimer.wait(5000);
317
+ }
318
+ }
319
+ };
320
+
321
+ int
322
+ main(int argc, char *argv[]) {
323
+ TRACE_POINT();
324
+ VariantMap options = initializeAgent(argc, argv, "PassengerHelperAgent");
325
+ pid_t webServerPid = options.getPid("web_server_pid");
326
+ string tempDir = options.get("temp_dir");
327
+ bool userSwitching = options.getBool("user_switching");
328
+ string defaultUser = options.get("default_user");
329
+ string defaultGroup = options.get("default_group");
330
+ string passengerRoot = options.get("passenger_root");
331
+ string rubyCommand = options.get("ruby");
332
+ unsigned int generationNumber = options.getInt("generation_number");
333
+ unsigned int maxPoolSize = options.getInt("max_pool_size");
334
+ unsigned int maxInstancesPerApp = options.getInt("max_instances_per_app");
335
+ unsigned int poolIdleTime = options.getInt("pool_idle_time");
336
+
337
+ try {
338
+ UPDATE_TRACE_POINT();
339
+ Server server(FEEDBACK_FD, webServerPid, tempDir,
340
+ userSwitching, defaultUser, defaultGroup,
341
+ passengerRoot, rubyCommand, generationNumber,
342
+ maxPoolSize, maxInstancesPerApp, poolIdleTime,
343
+ options);
344
+
345
+ UPDATE_TRACE_POINT();
346
+ server.mainLoop();
347
+ } catch (const tracable_exception &e) {
348
+ P_ERROR(e.what() << "\n" << e.backtrace());
349
+ return 1;
350
+ } catch (const std::exception &e) {
351
+ P_ERROR(e.what());
352
+ return 1;
353
+ } catch (...) {
354
+ P_ERROR("Unknown exception thrown in main thread.");
355
+ throw;
356
+ }
357
+
358
+ return 0;
359
+ }
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Phusion Passenger - http://www.modrails.com/
3
- * Copyright (c) 2008, 2009 Phusion
3
+ * Copyright (c) 2010 Phusion
4
4
  *
5
5
  * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  *
@@ -22,6 +22,21 @@
22
22
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
23
  * THE SOFTWARE.
24
24
  */
25
+
26
+ /*
27
+ * This is the main source file which interfaces directly with Apache by
28
+ * installing hooks. The code here can look a bit convoluted, but it'll make
29
+ * more sense if you read:
30
+ * http://httpd.apache.org/docs/2.2/developer/request.html
31
+ *
32
+ * Scroll all the way down to passenger_register_hooks to get an idea of
33
+ * what we're hooking into and what we do in those hooks. There are many
34
+ * hooks but the gist is implemented in just two methods: prepareRequest()
35
+ * and handleRequest(). Most hooks exist for implementing compatibility
36
+ * with other Apache modules. These hooks create an environment in which
37
+ * prepareRequest() and handleRequest() can be comfortably run.
38
+ */
39
+
25
40
  #include <boost/thread.hpp>
26
41
 
27
42
  #include <sys/time.h>
@@ -33,21 +48,22 @@
33
48
  #include <oxt/macros.hpp>
34
49
  #include "Hooks.h"
35
50
  #include "Bucket.h"
36
- #include "Configuration.h"
51
+ #include "Configuration.hpp"
37
52
  #include "Utils.h"
53
+ #include "Utils/Timer.h"
38
54
  #include "Logging.h"
39
- #include "ApplicationPoolServer.h"
55
+ #include "AgentsStarter.hpp"
56
+ #include "ApplicationPool/Client.h"
40
57
  #include "MessageChannel.h"
41
58
  #include "DirectoryMapper.h"
42
- #include "Timer.h"
43
- #include "Version.h"
59
+ #include "Constants.h"
44
60
 
45
61
  /* The Apache/APR headers *must* come after the Boost headers, otherwise
46
62
  * compilation will fail on OpenBSD.
47
63
  *
48
64
  * apr_want.h *must* come after MessageChannel.h, otherwise compilation will
49
65
  * fail on platforms on which apr_want.h tries to redefine 'struct iovec'.
50
- * http://tinyurl.com/b6aatw
66
+ * http://groups.google.com/group/phusion-passenger/browse_thread/thread/7e162f60df212e9c
51
67
  */
52
68
  #include <ap_config.h>
53
69
  #include <httpd.h>
@@ -68,17 +84,6 @@ using namespace Passenger;
68
84
  extern "C" module AP_MODULE_DECLARE_DATA passenger_module;
69
85
 
70
86
 
71
- /*
72
- * This is the main source file which interfaces directly with Apache by
73
- * installing hooks. The code here can look a bit convoluted, but it'll make
74
- * more sense if you read:
75
- * http://httpd.apache.org/docs/2.2/developer/request.html
76
- *
77
- * Scroll all the way down to passenger_register_hooks to get an idea of
78
- * what we're hooking into and what we do in those hooks.
79
- */
80
-
81
-
82
87
  /**
83
88
  * If the HTTP client sends POST data larger than this value (in bytes),
84
89
  * then the POST data will be fully buffered into a temporary file, before
@@ -95,38 +100,17 @@ extern "C" module AP_MODULE_DECLARE_DATA passenger_module;
95
100
  */
96
101
  class Hooks {
97
102
  private:
98
- struct AprDestructable {
99
- virtual ~AprDestructable() { }
100
-
101
- static apr_status_t cleanup(void *p) {
102
- delete (AprDestructable *) p;
103
- return APR_SUCCESS;
104
- }
105
- };
106
-
107
- struct RequestNote: public AprDestructable {
108
- DirectoryMapper mapper;
109
- DirConfig *config;
110
- bool forwardToBackend;
111
- const char *handlerBeforeModRewrite;
112
- char *filenameBeforeModRewrite;
113
- apr_filetype_e oldFileType;
114
- const char *handlerBeforeModAutoIndex;
115
-
116
- RequestNote(const DirectoryMapper &m)
117
- : mapper(m) {
118
- forwardToBackend = false;
119
- filenameBeforeModRewrite = NULL;
120
- }
121
- };
122
-
123
- struct ErrorReport: public AprDestructable {
103
+ class ErrorReport {
104
+ public:
105
+ virtual ~ErrorReport() { }
124
106
  virtual int report(request_rec *r) = 0;
125
107
  };
126
108
 
127
- struct ReportFileSystemError: public ErrorReport {
109
+ class ReportFileSystemError: public ErrorReport {
110
+ private:
128
111
  FileSystemException e;
129
-
112
+
113
+ public:
130
114
  ReportFileSystemError(const FileSystemException &ex): e(ex) { }
131
115
 
132
116
  int report(request_rec *r) {
@@ -150,6 +134,37 @@ private:
150
134
  }
151
135
  };
152
136
 
137
+ struct RequestNote {
138
+ DirectoryMapper mapper;
139
+ DirConfig *config;
140
+ ErrorReport *errorReport;
141
+
142
+ const char *handlerBeforeModRewrite;
143
+ char *filenameBeforeModRewrite;
144
+ apr_filetype_e oldFileType;
145
+ const char *handlerBeforeModAutoIndex;
146
+
147
+ RequestNote(const DirectoryMapper &m, DirConfig *c)
148
+ : mapper(m),
149
+ config(c)
150
+ {
151
+ errorReport = NULL;
152
+ handlerBeforeModRewrite = NULL;
153
+ filenameBeforeModRewrite = NULL;
154
+ oldFileType = APR_NOFILE;
155
+ handlerBeforeModAutoIndex = NULL;
156
+ }
157
+
158
+ ~RequestNote() {
159
+ delete errorReport;
160
+ }
161
+
162
+ static apr_status_t cleanup(void *p) {
163
+ delete (RequestNote *) p;
164
+ return APR_SUCCESS;
165
+ }
166
+ };
167
+
153
168
  /**
154
169
  * A StringListCreator which returns a list of environment variable
155
170
  * names and values, as found in r->subprocess_env.
@@ -157,27 +172,31 @@ private:
157
172
  class EnvironmentVariablesStringListCreator: public StringListCreator {
158
173
  private:
159
174
  request_rec *r;
175
+ mutable StringListPtr result;
160
176
  public:
161
177
  EnvironmentVariablesStringListCreator(request_rec *r) {
162
178
  this->r = r;
163
179
  }
164
180
 
165
181
  virtual const StringListPtr getItems() const {
166
- const apr_array_header_t *env_arr;
167
- apr_table_entry_t *env_entries;
168
- StringListPtr result = ptr(new StringList());
169
-
170
- // Some standard CGI headers.
171
- result->push_back("SERVER_SOFTWARE");
172
- result->push_back(ap_get_server_version());
173
-
174
- // Subprocess environment variables.
175
- env_arr = apr_table_elts(r->subprocess_env);
176
- env_entries = (apr_table_entry_t *) env_arr->elts;
177
- for (int i = 0; i < env_arr->nelts; ++i) {
178
- if (env_entries[i].key != NULL && env_entries[i].val != NULL) {
179
- result->push_back(env_entries[i].key);
180
- result->push_back(env_entries[i].val);
182
+ if (!result) {
183
+ const apr_array_header_t *env_arr;
184
+ apr_table_entry_t *env_entries;
185
+
186
+ result.reset(new StringList());
187
+
188
+ // Some standard CGI headers.
189
+ result->push_back("SERVER_SOFTWARE");
190
+ result->push_back(ap_get_server_version());
191
+
192
+ // Subprocess environment variables.
193
+ env_arr = apr_table_elts(r->subprocess_env);
194
+ env_entries = (apr_table_entry_t *) env_arr->elts;
195
+ for (int i = 0; i < env_arr->nelts; ++i) {
196
+ if (env_entries[i].key != NULL && env_entries[i].val != NULL) {
197
+ result->push_back(env_entries[i].key);
198
+ result->push_back(env_entries[i].val);
199
+ }
181
200
  }
182
201
  }
183
202
  return result;
@@ -186,19 +205,19 @@ private:
186
205
 
187
206
  enum Threeway { YES, NO, UNKNOWN };
188
207
 
189
- ApplicationPoolServerPtr applicationPoolServer;
190
- thread_specific_ptr<ApplicationPoolPtr> threadSpecificApplicationPool;
208
+ thread_specific_ptr<ApplicationPool::Client> threadSpecificApplicationPool;
191
209
  Threeway m_hasModRewrite, m_hasModDir, m_hasModAutoIndex, m_hasModXsendfile;
192
210
  CachedFileStat cstat;
211
+ AgentsStarter agentsStarter;
212
+ AnalyticsLoggerPtr analyticsLogger;
193
213
 
194
214
  inline DirConfig *getDirConfig(request_rec *r) {
195
215
  return (DirConfig *) ap_get_module_config(r->per_dir_config, &passenger_module);
196
216
  }
197
217
 
198
- inline ServerConfig *getServerConfig(server_rec *s) {
199
- return (ServerConfig *) ap_get_module_config(s->module_config, &passenger_module);
200
- }
201
-
218
+ /**
219
+ * The existance of a request note means that the handler should be run.
220
+ */
202
221
  inline RequestNote *getRequestNote(request_rec *r) {
203
222
  // The union is needed in order to be compliant with
204
223
  // C99/C++'s strict aliasing rules. http://tinyurl.com/g5hgh
@@ -212,27 +231,92 @@ private:
212
231
  }
213
232
 
214
233
  /**
215
- * Returns a usable ApplicationPool object.
234
+ * Returns a usable ApplicationPool::Client object.
216
235
  *
217
- * When using the worker MPM and global queuing, deadlocks can occur, for
218
- * the same reason described in ApplicationPoolServer::connect(). This
219
- * method allows us to avoid this deadlock by making sure that each
220
- * thread gets its own connection to the application pool server.
236
+ * When using the worker MPM and global queuing, deadlocks can occur, as
237
+ * explained by ApplicationPool::Client's overview. This method allows us
238
+ * to avoid deadlocks by making sure that each thread gets its own connection
239
+ * to the application pool server.
221
240
  *
222
241
  * It also checks whether the currently cached ApplicationPool object
223
242
  * is disconnected (which can happen if an error previously occured).
224
- * If so, it will reconnect to the ApplicationPool server.
243
+ * If so, it will reconnect to the application pool server.
244
+ *
245
+ * @throws SystemException
246
+ * @throws IOException
247
+ * @throws RuntimeException
248
+ * @throws SecurityException
225
249
  */
226
- ApplicationPoolPtr getApplicationPool() {
227
- ApplicationPoolPtr *pool_ptr = threadSpecificApplicationPool.get();
228
- if (pool_ptr == NULL) {
229
- pool_ptr = new ApplicationPoolPtr(applicationPoolServer->connect());
230
- threadSpecificApplicationPool.reset(pool_ptr);
231
- } else if (!(*pool_ptr)->connected()) {
232
- P_DEBUG("Reconnecting to ApplicationPool server");
233
- *pool_ptr = applicationPoolServer->connect();
250
+ ApplicationPool::Client *getApplicationPool() {
251
+ TRACE_POINT();
252
+ ApplicationPool::Client *pool = threadSpecificApplicationPool.get();
253
+ if (pool == NULL || !pool->connected()) {
254
+ UPDATE_TRACE_POINT();
255
+ if (pool != NULL) {
256
+ P_DEBUG("Reconnecting to ApplicationPool server");
257
+ }
258
+ auto_ptr<ApplicationPool::Client> pool_ptr(new ApplicationPool::Client);
259
+ pool_ptr->connect(agentsStarter.getMessageSocketFilename(),
260
+ "_web_server", agentsStarter.getMessageSocketPassword());
261
+ pool = pool_ptr.release();
262
+ threadSpecificApplicationPool.reset(pool);
263
+ }
264
+ return pool;
265
+ }
266
+
267
+ /**
268
+ * Get a session from the application pool, similar to how
269
+ * ApplicationPool::Interface::get() works. This method also checks whether
270
+ * the helper server has crashed. If it did then it will attempt to
271
+ * reconnect to the helper server for a small period of time until it's up
272
+ * again.
273
+ *
274
+ * @throws SystemException
275
+ * @throws IOException
276
+ * @throws RuntimeException
277
+ * @throws SecurityExcepion
278
+ */
279
+ SessionPtr getSession(const PoolOptions &options) {
280
+ TRACE_POINT();
281
+ ApplicationPool::Client *pool = getApplicationPool();
282
+ try {
283
+ return pool->get(options);
284
+ } catch (const SystemException &e) {
285
+ if (e.code() == EPIPE) {
286
+ UPDATE_TRACE_POINT();
287
+
288
+ // Maybe the helper server crashed. First wait 50 ms.
289
+ usleep(50000);
290
+
291
+ // Then try to reconnect to the helper server for the
292
+ // next 5 seconds.
293
+ time_t deadline = time(NULL) + 5;
294
+ while (time(NULL) < deadline) {
295
+ try {
296
+ pool = getApplicationPool();
297
+ } catch (const SystemException &e) {
298
+ if (e.code() == ECONNREFUSED || e.code() == ECONNRESET) {
299
+ // Looks like the helper server hasn't been
300
+ // restarted yet. Wait between 20 and 100 ms.
301
+ usleep(20000 + rand() % 80000);
302
+ // Don't care about thread-safety of rand()
303
+ } else {
304
+ throw;
305
+ }
306
+ }
307
+ }
308
+
309
+ UPDATE_TRACE_POINT();
310
+ if (pool != NULL && pool->connected()) {
311
+ return pool->get(options);
312
+ } else {
313
+ UPDATE_TRACE_POINT();
314
+ throw IOException("Cannot connect to the helper server");
315
+ }
316
+ } else {
317
+ throw;
318
+ }
234
319
  }
235
- return *pool_ptr;
236
320
  }
237
321
 
238
322
  bool hasModRewrite() {
@@ -293,31 +377,29 @@ private:
293
377
  }
294
378
 
295
379
  /**
296
- * Gather some information about the request and do some preparations. In this method,
297
- * it will be determined whether the request URI should be served statically by Apache
298
- * (in case of static assets or in case there's a page cache file available) or
299
- * whether it should be forwarded to the backend application.
300
- *
301
- * The strategy is as follows:
380
+ * Gather some information about the request and do some preparations.
302
381
  *
303
- * We check whether Phusion Passenger is enabled for this URI (A).
304
- * If so, then we check whether the following situations are true:
382
+ * This method will determine whether the Phusion Passenger handler method
383
+ * should be run for this request, through the following checks:
305
384
  * (B) There is a backend application defined for this URI.
306
- * (C) r->filename already exists.
307
- * (D) There is a page cache file for the URI.
385
+ * (C) r->filename already exists, meaning that this URI already maps to an existing file.
386
+ * (D) There is a page cache file for this URI.
308
387
  *
309
- * - If A is not true, or if B is not true, or if C is true, then don't do anything.
310
- * Passenger will be disabled during the rest of this request.
388
+ * - If B is not true, or if C is true, then the handler shouldn't be run.
311
389
  * - If D is true, then we first transform r->filename to the page cache file's
312
- * filename, and then we let Apache serve it statically.
313
- * - If D is not true, then we forward the request to the backend application.
390
+ * filename, and then we let Apache serve it statically. The Phusion Passenger
391
+ * handler shouldn't be run.
392
+ * - If D is not true, then the handler should be run.
314
393
  *
315
- * @pre The (A) condition must be true.
394
+ * @pre config->isEnabled()
316
395
  * @param coreModuleWillBeRun Whether the core.c map_to_storage hook might be called after this.
317
- * @return Whether the Passenger handler hook method should be run.
396
+ * @return Whether the Phusion Passenger handler hook method should be run.
397
+ * When true, this method will save a request note object so that future hooks
398
+ * can store request-specific information.
318
399
  */
319
400
  bool prepareRequest(request_rec *r, DirConfig *config, const char *filename, bool coreModuleWillBeRun = false) {
320
401
  TRACE_POINT();
402
+
321
403
  DirectoryMapper mapper(r, config, &cstat, config->getStatThrottleRate());
322
404
  try {
323
405
  if (mapper.getBaseURI() == NULL) {
@@ -339,34 +421,19 @@ private:
339
421
  * Phusion Passenger for the rest of the request.
340
422
  */
341
423
  if (e.code() == EACCES || e.code() == EPERM) {
342
- // TODO: filesystem error is not always reported. need
343
- // to figure out why. test case:
344
- // - mkdir /foo
345
- // - mkdir /foo/public
346
- // - mkdir /foo/config
347
- // - chmod 000 /foo/config
348
- // - add vhost 'foo' with document root /foo/public
349
- // - curl http://foo/
350
- apr_pool_userdata_set(new ReportFileSystemError(e),
351
- "Phusion Passenger: error report",
352
- ReportFileSystemError::cleanup,
353
- r->pool);
424
+ auto_ptr<RequestNote> note(new RequestNote(mapper, config));
425
+ note->errorReport = new ReportFileSystemError(e);
426
+ apr_pool_userdata_set(note.release(), "Phusion Passenger",
427
+ RequestNote::cleanup, r->pool);
354
428
  return true;
355
429
  } else {
356
430
  return false;
357
431
  }
358
432
  }
359
433
 
360
- /* Save some information for the hook methods that are called later.
361
- * The existance of this note indicates that the URI belongs to a Phusion
362
- * Passenger-served application.
363
- */
364
- RequestNote *note = new RequestNote(mapper);
365
- note->config = config;
366
- apr_pool_userdata_set(note, "Phusion Passenger", RequestNote::cleanup, r->pool);
434
+ // (B) is true.
367
435
 
368
436
  try {
369
- // (B) is true.
370
437
  FileType fileType = getFileType(filename);
371
438
  if (fileType == FT_REGULAR) {
372
439
  // (C) is true.
@@ -417,7 +484,9 @@ private:
417
484
  return false;
418
485
  } else {
419
486
  // (D) is not true.
420
- note->forwardToBackend = true;
487
+ RequestNote *note = new RequestNote(mapper, config);
488
+ apr_pool_userdata_set(note, "Phusion Passenger",
489
+ RequestNote::cleanup, r->pool);
421
490
  return true;
422
491
  }
423
492
  } catch (const FileSystemException &e) {
@@ -443,25 +512,14 @@ private:
443
512
  * to the browser.
444
513
  */
445
514
 
446
- // The union is needed in order to be compliant with
447
- // C99/C++'s strict aliasing rules. http://tinyurl.com/g5hgh
448
- union {
449
- ErrorReport *errorReport;
450
- void *pointer;
451
- } u;
452
-
453
- /* Did an error occur in any of the previous hook methods during
454
- * this request? If so, show the error and stop here.
455
- */
456
- u.errorReport = 0;
457
- apr_pool_userdata_get(&u.pointer, "Phusion Passenger: error report", r->pool);
458
- if (u.errorReport != 0) {
459
- return u.errorReport->report(r);
460
- }
461
-
462
515
  RequestNote *note = getRequestNote(r);
463
- if (note == 0 || !note->forwardToBackend) {
516
+ if (note == NULL) {
464
517
  return DECLINED;
518
+ } else if (note->errorReport != NULL) {
519
+ /* Did an error occur in any of the previous hook methods during
520
+ * this request? If so, show the error and stop here.
521
+ */
522
+ return note->errorReport->report(r);
465
523
  } else if (r->handler != NULL && strcmp(r->handler, "redirect-handler") == 0) {
466
524
  // mod_rewrite is at work.
467
525
  return DECLINED;
@@ -469,24 +527,45 @@ private:
469
527
 
470
528
  TRACE_POINT();
471
529
  DirConfig *config = note->config;
472
- DirectoryMapper &mapper(note->mapper);
530
+ DirectoryMapper &mapper = note->mapper;
531
+ string publicDirectory, appRoot;
473
532
 
474
- if (mapper.getPublicDirectory().empty()) {
475
- return reportDocumentRootDeterminationError(r);
533
+ try {
534
+ publicDirectory = mapper.getPublicDirectory();
535
+ if (publicDirectory.empty()) {
536
+ return reportDocumentRootDeterminationError(r);
537
+ }
538
+ appRoot = config->getAppRoot(publicDirectory.c_str());
539
+ } catch (const FileSystemException &e) {
540
+ /* The application root cannot be determined. This could
541
+ * happen if, for example, the user specified 'RailsBaseURI /foo'
542
+ * while there is no filesystem entry called "foo" in the virtual
543
+ * host's document root.
544
+ */
545
+ return ReportFileSystemError(e).report(r);
476
546
  }
477
547
 
478
548
 
479
- /********** Step 2: handle HTTP upload data, if any **********/
480
-
481
- int httpStatus = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
482
- if (httpStatus != OK) {
483
- return httpStatus;
484
- }
485
-
549
+ UPDATE_TRACE_POINT();
486
550
  try {
551
+ AnalyticsLogPtr log;
552
+ if (config->analyticsEnabled()) {
553
+ log = analyticsLogger->newTransaction(config->getAppGroupName(appRoot));
554
+ log->message(string("URI: ") + r->uri);
555
+ } else {
556
+ log.reset(new AnalyticsLog());
557
+ }
558
+
559
+ /********** Step 2: handle HTTP upload data, if any **********/
560
+
561
+ int httpStatus = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
562
+ if (httpStatus != OK) {
563
+ return httpStatus;
564
+ }
565
+
487
566
  this_thread::disable_interruption di;
488
567
  this_thread::disable_syscall_interruption dsi;
489
- Application::SessionPtr session;
568
+ SessionPtr session;
490
569
  bool expectingUploadData;
491
570
  string uploadDataMemory;
492
571
  shared_ptr<BufferedUpload> uploadDataFile;
@@ -537,59 +616,71 @@ private:
537
616
  /********** Step 3: forwarding the request to a backend
538
617
  process from the application pool **********/
539
618
 
540
- UPDATE_TRACE_POINT();
619
+ AnalyticsScopeLog requestProcessingScope(log, "request processing");
620
+
541
621
  try {
542
- ServerConfig *sconfig = getServerConfig(r->server);
543
- string publicDirectory(mapper.getPublicDirectory());
622
+ AnalyticsScopeLog scope(log, "get from pool");
544
623
  PoolOptions options(
545
- config->getAppRoot(publicDirectory.c_str()),
546
- true,
547
- sconfig->getDefaultUser(),
624
+ appRoot,
625
+ config->getAppGroupName(appRoot),
626
+ mapper.getApplicationTypeString(),
548
627
  mapper.getEnvironment(),
549
628
  config->getSpawnMethodString(),
550
- mapper.getApplicationTypeString(),
629
+ config->getUser(),
630
+ config->getGroup(),
631
+ serverConfig.defaultUser,
632
+ serverConfig.defaultGroup,
551
633
  config->frameworkSpawnerTimeout,
552
634
  config->appSpawnerTimeout,
635
+ mapper.getBaseURI(),
553
636
  config->getMaxRequests(),
554
- config->getMemoryLimit(),
637
+ config->getMinInstances(),
555
638
  config->usingGlobalQueue(),
639
+ true,
556
640
  config->getStatThrottleRate(),
557
641
  config->getRestartDir(),
558
- mapper.getBaseURI()
642
+ DEFAULT_BACKEND_ACCOUNT_RIGHTS,
643
+ false,
644
+ config->analyticsEnabled(),
645
+ log->isNull() ? AnalyticsLogPtr() : log
559
646
  );
560
647
  options.environmentVariables = ptr(new EnvironmentVariablesStringListCreator(r));
561
648
 
562
- session = getApplicationPool()->get(options);
649
+ session = getSession(options);
563
650
  P_TRACE(3, "Forwarding " << r->uri << " to PID " << session->getPid());
651
+ scope.success();
652
+ log->message("Application PID: " + toString(session->getPid()) +
653
+ " (GUPID: " + session->getGupid() + ")");
564
654
  } catch (const SpawnException &e) {
565
655
  r->status = 500;
566
- if (e.hasErrorPage()) {
656
+ if (e.hasErrorPage() && config->showFriendlyErrorPages()) {
567
657
  ap_set_content_type(r, "text/html; charset=utf-8");
568
658
  ap_rputs(e.getErrorPage().c_str(), r);
569
659
  return OK;
570
660
  } else {
571
661
  throw;
572
662
  }
573
- } catch (const FileSystemException &e) {
574
- /* The application root cannot be determined. This could
575
- * happen if, for example, the user specified 'RailsBaseURI /foo'
576
- * while there is no filesystem entry called "foo" in the virtual
577
- * host's document root.
578
- */
579
- return ReportFileSystemError(e).report(r);
580
663
  } catch (const BusyException &e) {
581
664
  return reportBusyException(r);
582
665
  }
583
666
 
584
667
  UPDATE_TRACE_POINT();
585
- sendHeaders(r, config, session, mapper.getBaseURI());
668
+ AnalyticsScopeLog requestProxyingScope(log, "request proxying");
669
+
670
+ {
671
+ AnalyticsScopeLog scope(log, "send request headers");
672
+ sendHeaders(r, config, session, mapper.getBaseURI(), log, appRoot);
673
+ scope.success();
674
+ }
586
675
  if (expectingUploadData) {
676
+ AnalyticsScopeLog scope(log, "send request body");
587
677
  if (uploadDataFile != NULL) {
588
678
  sendRequestBody(r, session, uploadDataFile);
589
679
  uploadDataFile.reset();
590
680
  } else {
591
681
  sendRequestBody(r, session, uploadDataMemory);
592
682
  }
683
+ scope.success();
593
684
  }
594
685
  try {
595
686
  session->shutdownWriter();
@@ -680,6 +771,9 @@ private:
680
771
  P_WARN("Apache stopped forwarding the backend's response, "
681
772
  "even though the HTTP client did not close the "
682
773
  "connection. Is this an Apache bug?");
774
+ } else {
775
+ requestProxyingScope.success();
776
+ requestProcessingScope.success();
683
777
  }
684
778
 
685
779
  return OK;
@@ -749,7 +843,7 @@ private:
749
843
  e.what() << "\n" << " Backtrace:\n" << e.backtrace());
750
844
  return HTTP_INTERNAL_SERVER_ERROR;
751
845
 
752
- } catch (const exception &e) {
846
+ } catch (const std::exception &e) {
753
847
  P_ERROR("Unexpected error in mod_passenger: " <<
754
848
  e.what() << "\n" << " Backtrace: not available");
755
849
  return HTTP_INTERNAL_SERVER_ERROR;
@@ -808,7 +902,9 @@ private:
808
902
  }
809
903
  }
810
904
 
811
- apr_status_t sendHeaders(request_rec *r, DirConfig *config, Application::SessionPtr &session, const char *baseURI) {
905
+ apr_status_t sendHeaders(request_rec *r, DirConfig *config, SessionPtr &session,
906
+ const char *baseURI, const AnalyticsLogPtr &log, const string &appRoot)
907
+ {
812
908
  apr_table_t *headers;
813
909
  headers = apr_table_make(r->pool, 40);
814
910
  if (headers == NULL) {
@@ -884,6 +980,12 @@ private:
884
980
  addHeader(headers, env[i].key, env[i].val);
885
981
  }
886
982
 
983
+ if (config->analyticsEnabled()) {
984
+ addHeader(headers, "PASSENGER_GROUP_NAME",
985
+ config->getAppGroupName(appRoot).c_str());
986
+ addHeader(headers, "PASSENGER_TXN_ID", log->getTxnId().c_str());
987
+ }
988
+
887
989
  // Now send the headers.
888
990
  string buffer;
889
991
 
@@ -897,6 +999,14 @@ private:
897
999
  buffer.append(1, '\0');
898
1000
  }
899
1001
 
1002
+ buffer.append("PASSENGER_CONNECT_PASSWORD");
1003
+ buffer.append(1, '\0');
1004
+ buffer.append(session->getConnectPassword());
1005
+ buffer.append(1, '\0');
1006
+
1007
+ /*********************/
1008
+ /*********************/
1009
+
900
1010
  /*
901
1011
  * If the last header value is an empty string, then the buffer
902
1012
  * will end with "\0\0". For example, if 'SSLOptions +ExportCertData'
@@ -932,7 +1042,8 @@ private:
932
1042
  string message("An error occured while "
933
1043
  "buffering HTTP upload data to "
934
1044
  "a temporary file in ");
935
- message.append(config->getUploadBufferDir());
1045
+ ServerInstanceDir::GenerationPtr generation = agentsStarter.getGeneration();
1046
+ message.append(config->getUploadBufferDir(generation));
936
1047
 
937
1048
  switch (code) {
938
1049
  case ENOSPC:
@@ -1103,7 +1214,9 @@ private:
1103
1214
  DirConfig *config = getDirConfig(r);
1104
1215
  shared_ptr<BufferedUpload> tempFile;
1105
1216
  try {
1106
- tempFile.reset(new BufferedUpload(config->getUploadBufferDir()));
1217
+ ServerInstanceDir::GenerationPtr generation = agentsStarter.getGeneration();
1218
+ string uploadBufferDir = config->getUploadBufferDir(generation);
1219
+ tempFile.reset(new BufferedUpload(uploadBufferDir));
1107
1220
  } catch (const SystemException &e) {
1108
1221
  throwUploadBufferingException(r, e.code());
1109
1222
  }
@@ -1155,7 +1268,7 @@ private:
1155
1268
  }
1156
1269
  }
1157
1270
 
1158
- void sendRequestBody(request_rec *r, Application::SessionPtr &session, shared_ptr<BufferedUpload> &uploadData) {
1271
+ void sendRequestBody(request_rec *r, SessionPtr &session, shared_ptr<BufferedUpload> &uploadData) {
1159
1272
  TRACE_POINT();
1160
1273
  rewind(uploadData->handle);
1161
1274
  while (!feof(uploadData->handle)) {
@@ -1168,16 +1281,20 @@ private:
1168
1281
  }
1169
1282
  }
1170
1283
 
1171
- void sendRequestBody(request_rec *r, Application::SessionPtr &session, const string &buffer) {
1284
+ void sendRequestBody(request_rec *r, SessionPtr &session, const string &buffer) {
1172
1285
  session->sendBodyBlock(buffer.c_str(), buffer.size());
1173
1286
  }
1174
1287
 
1175
1288
  public:
1176
1289
  Hooks(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
1177
- : cstat(1024) {
1178
- passenger_config_merge_all_servers(pconf, s);
1179
- ServerConfig *config = getServerConfig(s);
1180
- Passenger::setLogLevel(config->logLevel);
1290
+ : cstat(1024),
1291
+ agentsStarter(AgentsStarter::APACHE)
1292
+ {
1293
+ serverConfig.finalize();
1294
+ Passenger::setLogLevel(serverConfig.logLevel);
1295
+ if (serverConfig.debugLogFile != NULL) {
1296
+ Passenger::setDebugFile(serverConfig.debugLogFile);
1297
+ }
1181
1298
  m_hasModRewrite = UNKNOWN;
1182
1299
  m_hasModDir = UNKNOWN;
1183
1300
  m_hasModAutoIndex = UNKNOWN;
@@ -1186,64 +1303,50 @@ public:
1186
1303
  P_DEBUG("Initializing Phusion Passenger...");
1187
1304
  ap_add_version_component(pconf, "Phusion_Passenger/" PASSENGER_VERSION);
1188
1305
 
1189
- const char *user;
1190
- string applicationPoolServerExe, spawnServer;
1191
-
1192
- createPassengerTempDir(config->getTempDir(), config->userSwitching,
1193
- config->getDefaultUser(), unixd_config.user_id,
1194
- unixd_config.group_id);
1195
-
1196
- if (config->userSwitching) {
1197
- user = "";
1198
- } else {
1199
- user = config->getDefaultUser();
1200
- }
1201
-
1202
- if (config->root == NULL) {
1306
+ if (serverConfig.root == NULL) {
1203
1307
  throw ConfigurationException("The 'PassengerRoot' configuration option "
1204
1308
  "is not specified. This option is required, so please specify it. "
1205
1309
  "TIP: The correct value for this option was given to you by "
1206
1310
  "'passenger-install-apache2-module'.");
1207
1311
  }
1208
1312
 
1209
- spawnServer = findSpawnServer(config->root);
1210
- if (!fileExists(spawnServer.c_str())) {
1211
- string message("The Passenger spawn server script, '");
1212
- message.append(spawnServer);
1213
- message.append("', does not exist. Please check whether the 'PassengerRoot' "
1214
- "option is specified correctly.");
1215
- throw FileNotFoundException(message);
1216
- }
1217
- applicationPoolServerExe = findApplicationPoolServer(config->root);
1218
- if (!fileExists(applicationPoolServerExe.c_str())) {
1219
- string message("The Passenger application pool server, '");
1220
- message.append(applicationPoolServerExe);
1221
- message.append("', does not exist. Please check whether the 'PassengerRoot' "
1222
- "option is specified correctly.");
1223
- throw FileNotFoundException(message);
1224
- }
1313
+ agentsStarter.start(serverConfig.logLevel,
1314
+ (serverConfig.debugLogFile == NULL) ? "" : serverConfig.debugLogFile,
1315
+ getpid(), serverConfig.tempDir,
1316
+ serverConfig.userSwitching,
1317
+ serverConfig.defaultUser, serverConfig.defaultGroup,
1318
+ unixd_config.user_id, unixd_config.group_id,
1319
+ serverConfig.root, serverConfig.ruby, serverConfig.maxPoolSize,
1320
+ serverConfig.maxInstancesPerApp, serverConfig.poolIdleTime,
1321
+ "",
1322
+ serverConfig.analyticsLogDir, serverConfig.analyticsLogUser,
1323
+ serverConfig.analyticsLogGroup, serverConfig.analyticsLogPermissions,
1324
+ DEFAULT_UNION_STATION_GATEWAY_ADDRESS,
1325
+ DEFAULT_UNION_STATION_GATEWAY_PORT,
1326
+ "",
1327
+ serverConfig.prestartURLs);
1328
+
1329
+ analyticsLogger = ptr(new AnalyticsLogger(agentsStarter.getLoggingSocketAddress(),
1330
+ "logging", agentsStarter.getLoggingSocketPassword()));
1331
+
1332
+ // Store some relevant information in the generation directory.
1333
+ string generationPath = agentsStarter.getGeneration()->getPath();
1334
+ server_rec *server;
1335
+ string configFiles;
1225
1336
 
1226
- applicationPoolServer = ptr(
1227
- new ApplicationPoolServer(
1228
- applicationPoolServerExe, spawnServer, "",
1229
- config->getRuby(), user)
1230
- );
1337
+ createFile(generationPath + "/web_server.txt", ap_get_server_description());
1231
1338
 
1232
- ApplicationPoolPtr pool(applicationPoolServer->connect());
1233
- pool->setMax(config->maxPoolSize);
1234
- pool->setMaxPerApp(config->maxInstancesPerApp);
1235
- pool->setMaxIdleTime(config->poolIdleTime);
1339
+ for (server = s; server != NULL; server = server->next) {
1340
+ if (server->defn_name != NULL) {
1341
+ configFiles.append(server->defn_name);
1342
+ configFiles.append(1, '\n');
1343
+ }
1344
+ }
1345
+ createFile(generationPath + "/config_files.txt", configFiles);
1236
1346
  }
1237
1347
 
1238
- ~Hooks() {
1239
- removeDirTree(getPassengerTempDir().c_str());
1240
- /* mod_passenger is loaded twice during Apache startup (load, unload, load),
1241
- * but on OS X sometimes the old memory values of global variables can
1242
- * stay behind and affect the next load. So here we empty the temp dir variable
1243
- * explicitly so that the next load correctly calculates a new temp dir
1244
- * filename using the after-daemonization Apache PID.
1245
- */
1246
- setPassengerTempDir("");
1348
+ void childInit(apr_pool_t *pchild, server_rec *s) {
1349
+ agentsStarter.detach();
1247
1350
  }
1248
1351
 
1249
1352
  int prepareRequestWhenInHighPerformanceMode(request_rec *r) {
@@ -1470,7 +1573,7 @@ destroy_hooks(void *arg) {
1470
1573
  } catch (const thread_interrupted &) {
1471
1574
  // Ignore interruptions, we're shutting down anyway.
1472
1575
  P_TRACE(3, "A system call was interrupted during shutdown of mod_passenger.");
1473
- } catch (const exception &e) {
1576
+ } catch (const std::exception &e) {
1474
1577
  // Ignore other exceptions, we're shutting down anyway.
1475
1578
  P_TRACE(3, "Exception during shutdown of mod_passenger: " << e.what());
1476
1579
  }
@@ -1558,7 +1661,7 @@ init_module(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *
1558
1661
 
1559
1662
  return DECLINED;
1560
1663
 
1561
- } catch (const exception &e) {
1664
+ } catch (const std::exception &e) {
1562
1665
  ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
1563
1666
  "*** Passenger could not be initialized because of this error: %s",
1564
1667
  e.what());
@@ -1567,6 +1670,13 @@ init_module(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *
1567
1670
  }
1568
1671
  }
1569
1672
 
1673
+ static void
1674
+ child_init(apr_pool_t *pchild, server_rec *s) {
1675
+ if (OXT_LIKELY(hooks != NULL)) {
1676
+ hooks->childInit(pchild, s);
1677
+ }
1678
+ }
1679
+
1570
1680
  #define DEFINE_REQUEST_HOOK(c_name, cpp_name) \
1571
1681
  static int c_name(request_rec *r) { \
1572
1682
  if (OXT_LIKELY(hooks != NULL)) { \
@@ -1597,8 +1707,11 @@ passenger_register_hooks(apr_pool_t *p) {
1597
1707
  static const char * const rewrite_module[] = { "mod_rewrite.c", NULL };
1598
1708
  static const char * const dir_module[] = { "mod_dir.c", NULL };
1599
1709
  static const char * const autoindex_module[] = { "mod_autoindex.c", NULL };
1600
-
1710
+
1601
1711
  ap_hook_post_config(init_module, NULL, NULL, APR_HOOK_MIDDLE);
1712
+ ap_hook_child_init(child_init, NULL, NULL, APR_HOOK_MIDDLE);
1713
+
1714
+ // The hooks here are defined in the order that they're called.
1602
1715
 
1603
1716
  ap_hook_map_to_storage(prepare_request_when_in_high_performance_mode, NULL, NULL, APR_HOOK_FIRST);
1604
1717
  ap_hook_map_to_storage(save_original_filename, NULL, NULL, APR_HOOK_LAST);