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
@@ -13,6 +13,7 @@
13
13
  <ul>
14
14
  <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
15
15
  <li><a href="modules.html"><span>Modules</span></a></li>
16
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
16
17
  <li><a href="annotated.html"><span>Classes</span></a></li>
17
18
  <li class="current"><a href="files.html"><span>Files</span></a></li>
18
19
  </ul>
@@ -24,7 +25,7 @@
24
25
  </div>
25
26
  <h1>Hooks.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
26
27
  <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
27
- <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2008, 2009 Phusion</span>
28
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
28
29
  <a name="l00004"></a>00004 <span class="comment"> *</span>
29
30
  <a name="l00005"></a>00005 <span class="comment"> * &quot;Phusion Passenger&quot; is a trademark of Hongli Lai &amp; Ninh Bui.</span>
30
31
  <a name="l00006"></a>00006 <span class="comment"> *</span>
@@ -0,0 +1,382 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5
+ <title>Passenger: HttpStatusExtractor.h Source File</title>
6
+ <link href="tabs.css" rel="stylesheet" type="text/css"/>
7
+ <link href="doxygen.css" rel="stylesheet" type="text/css"/>
8
+ </head>
9
+ <body>
10
+ <!-- Generated by Doxygen 1.6.2 -->
11
+ <div class="navigation" id="top">
12
+ <div class="tabs">
13
+ <ul>
14
+ <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
15
+ <li><a href="modules.html"><span>Modules</span></a></li>
16
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
17
+ <li><a href="annotated.html"><span>Classes</span></a></li>
18
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
19
+ </ul>
20
+ </div>
21
+ <div class="tabs">
22
+ <ul>
23
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
24
+ </ul>
25
+ </div>
26
+ <h1>HttpStatusExtractor.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
27
+ <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
28
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
29
+ <a name="l00004"></a>00004 <span class="comment"> *</span>
30
+ <a name="l00005"></a>00005 <span class="comment"> * &quot;Phusion Passenger&quot; is a trademark of Hongli Lai &amp; Ninh Bui.</span>
31
+ <a name="l00006"></a>00006 <span class="comment"> *</span>
32
+ <a name="l00007"></a>00007 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span>
33
+ <a name="l00008"></a>00008 <span class="comment"> * of this software and associated documentation files (the &quot;Software&quot;), to deal</span>
34
+ <a name="l00009"></a>00009 <span class="comment"> * in the Software without restriction, including without limitation the rights</span>
35
+ <a name="l00010"></a>00010 <span class="comment"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
36
+ <a name="l00011"></a>00011 <span class="comment"> * copies of the Software, and to permit persons to whom the Software is</span>
37
+ <a name="l00012"></a>00012 <span class="comment"> * furnished to do so, subject to the following conditions:</span>
38
+ <a name="l00013"></a>00013 <span class="comment"> *</span>
39
+ <a name="l00014"></a>00014 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
40
+ <a name="l00015"></a>00015 <span class="comment"> * all copies or substantial portions of the Software.</span>
41
+ <a name="l00016"></a>00016 <span class="comment"> *</span>
42
+ <a name="l00017"></a>00017 <span class="comment"> * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
43
+ <a name="l00018"></a>00018 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
44
+ <a name="l00019"></a>00019 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
45
+ <a name="l00020"></a>00020 <span class="comment"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
46
+ <a name="l00021"></a>00021 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
47
+ <a name="l00022"></a>00022 <span class="comment"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
48
+ <a name="l00023"></a>00023 <span class="comment"> * THE SOFTWARE.</span>
49
+ <a name="l00024"></a>00024 <span class="comment"> */</span>
50
+ <a name="l00025"></a>00025
51
+ <a name="l00026"></a>00026 <span class="preprocessor">#include &lt;string&gt;</span>
52
+ <a name="l00027"></a>00027 <span class="preprocessor">#include &lt;cstdio&gt;</span>
53
+ <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;cstdlib&gt;</span>
54
+ <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;cstring&gt;</span>
55
+ <a name="l00030"></a>00030
56
+ <a name="l00031"></a>00031 <span class="keyword">namespace </span>Passenger {
57
+ <a name="l00032"></a>00032
58
+ <a name="l00033"></a>00033 <span class="keyword">using namespace </span>std;
59
+ <a name="l00034"></a>00034 <span class="comment"></span>
60
+ <a name="l00035"></a>00035 <span class="comment">/**</span>
61
+ <a name="l00036"></a>00036 <span class="comment"> * Utility class for extracting the HTTP status value from an HTTP response.</span>
62
+ <a name="l00037"></a>00037 <span class="comment"> *</span>
63
+ <a name="l00038"></a>00038 <span class="comment"> * This class is used for generating a proper HTTP response. The response data</span>
64
+ <a name="l00039"></a>00039 <span class="comment"> * that Passenger backend processes generate are like CGI responses, and do not</span>
65
+ <a name="l00040"></a>00040 <span class="comment"> * include an initial &quot;HTTP/1.1 [status here]&quot; line, so this class used to</span>
66
+ <a name="l00041"></a>00041 <span class="comment"> * extract the status from the response in order to generate a proper initial</span>
67
+ <a name="l00042"></a>00042 <span class="comment"> * HTTP response line.</span>
68
+ <a name="l00043"></a>00043 <span class="comment"> *</span>
69
+ <a name="l00044"></a>00044 <span class="comment"> * This class is supposed to be used as follows:</span>
70
+ <a name="l00045"></a>00045 <span class="comment"> * - Keep feeding HTTP response data until feed() returns true. feed()</span>
71
+ <a name="l00046"></a>00046 <span class="comment"> * buffers all fed data until it is able to extract the HTTP status.</span>
72
+ <a name="l00047"></a>00047 <span class="comment"> * - Call getStatusLine() to retrieve the status line, and use this to generate</span>
73
+ <a name="l00048"></a>00048 <span class="comment"> * an HTTP response line.</span>
74
+ <a name="l00049"></a>00049 <span class="comment"> * - Call getBuffer() to retrieve all fed data so far. This data can be sent to</span>
75
+ <a name="l00050"></a>00050 <span class="comment"> * the HTTP client.</span>
76
+ <a name="l00051"></a>00051 <span class="comment"> *</span>
77
+ <a name="l00052"></a>00052 <span class="comment"> * This class will also ensure that the status line contains a status text, e.g.</span>
78
+ <a name="l00053"></a>00053 <span class="comment"> * if the HTTP data&#39;s status value is only &quot;200&quot; then &quot;OK&quot; will be automatically</span>
79
+ <a name="l00054"></a>00054 <span class="comment"> * appended.</span>
80
+ <a name="l00055"></a>00055 <span class="comment"> *</span>
81
+ <a name="l00056"></a>00056 <span class="comment"> * @note</span>
82
+ <a name="l00057"></a>00057 <span class="comment"> * When the API documentation for this class refers to &quot;\r\n&quot;, we actually</span>
83
+ <a name="l00058"></a>00058 <span class="comment"> * mean &quot;\x0D\x0A&quot; (the HTTP line termination string). &quot;\r\n&quot; is only written</span>
84
+ <a name="l00059"></a>00059 <span class="comment"> * out of convenience.</span>
85
+ <a name="l00060"></a>00060 <span class="comment"> */</span>
86
+ <a name="l00061"></a><a class="code" href="classPassenger_1_1HttpStatusExtractor.html">00061</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1HttpStatusExtractor.html" title="Utility class for extracting the HTTP status value from an HTTP response.">HttpStatusExtractor</a> {
87
+ <a name="l00062"></a>00062 <span class="keyword">private</span>:
88
+ <a name="l00063"></a>00063 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> CR = <span class="stringliteral">&#39;\x0D&#39;</span>;
89
+ <a name="l00064"></a>00064 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> LF = <span class="stringliteral">&#39;\x0A&#39;</span>;
90
+ <a name="l00065"></a>00065
91
+ <a name="l00066"></a>00066 <span class="keywordtype">string</span> buffer;
92
+ <a name="l00067"></a>00067 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> searchStart;
93
+ <a name="l00068"></a>00068 <span class="keywordtype">bool</span> fullHeaderReceived;
94
+ <a name="l00069"></a>00069 <span class="keywordtype">string</span> statusLine;
95
+ <a name="l00070"></a>00070
96
+ <a name="l00071"></a>00071 <span class="keywordtype">bool</span> extractStatusLine() {
97
+ <a name="l00072"></a>00072 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> statusHeaderName[] = <span class="stringliteral">&quot;Status: &quot;</span>;
98
+ <a name="l00073"></a>00073 string::size_type start_pos, newline_pos;
99
+ <a name="l00074"></a>00074
100
+ <a name="l00075"></a>00075 <span class="keywordflow">if</span> (buffer.size() &gt; <span class="keyword">sizeof</span>(statusHeaderName) - 1
101
+ <a name="l00076"></a>00076 &amp;&amp; memcmp(buffer.c_str(), statusHeaderName, <span class="keyword">sizeof</span>(statusHeaderName) - 1) == 0) {
102
+ <a name="l00077"></a>00077 <span class="comment">// Status line starts at beginning of the header.</span>
103
+ <a name="l00078"></a>00078 start_pos = <span class="keyword">sizeof</span>(statusHeaderName) - 1;
104
+ <a name="l00079"></a>00079 newline_pos = buffer.find(<span class="stringliteral">&quot;\x0D\x0A&quot;</span>, 0, 2) + 2;
105
+ <a name="l00080"></a>00080 } <span class="keywordflow">else</span> {
106
+ <a name="l00081"></a>00081 <span class="comment">// Status line is not at the beginning of the header.</span>
107
+ <a name="l00082"></a>00082 <span class="comment">// Look for it.</span>
108
+ <a name="l00083"></a>00083 start_pos = buffer.find(<span class="stringliteral">&quot;\x0D\x0AStatus: &quot;</span>);
109
+ <a name="l00084"></a>00084 <span class="keywordflow">if</span> (start_pos != string::npos) {
110
+ <a name="l00085"></a>00085 start_pos += 2 + <span class="keyword">sizeof</span>(statusHeaderName) - 1;
111
+ <a name="l00086"></a>00086 newline_pos = buffer.find(<span class="stringliteral">&quot;\x0D\x0A&quot;</span>, start_pos, 2) + 2;
112
+ <a name="l00087"></a>00087 }
113
+ <a name="l00088"></a>00088 }
114
+ <a name="l00089"></a>00089 <span class="keywordflow">if</span> (start_pos != string::npos) {
115
+ <a name="l00090"></a>00090 <span class="comment">// Status line has been found. Extract it.</span>
116
+ <a name="l00091"></a>00091 statusLine = buffer.substr(start_pos, newline_pos - start_pos);
117
+ <a name="l00092"></a>00092 addStatusTextIfNecessary();
118
+ <a name="l00093"></a>00093 <span class="keywordflow">return</span> <span class="keyword">true</span>;
119
+ <a name="l00094"></a>00094 } <span class="keywordflow">else</span> {
120
+ <a name="l00095"></a>00095 <span class="comment">// Status line is not found. Do not change default</span>
121
+ <a name="l00096"></a>00096 <span class="comment">// status line value.</span>
122
+ <a name="l00097"></a>00097 <span class="keywordflow">return</span> <span class="keyword">false</span>;
123
+ <a name="l00098"></a>00098 }
124
+ <a name="l00099"></a>00099 }
125
+ <a name="l00100"></a>00100
126
+ <a name="l00101"></a>00101 <span class="keywordtype">void</span> addStatusTextIfNecessary() {
127
+ <a name="l00102"></a>00102 <span class="keywordflow">if</span> (statusLine.find(<span class="charliteral">&#39; &#39;</span>) == string::npos) {
128
+ <a name="l00103"></a>00103 <span class="comment">// The status line doesn&#39;t contain a status text, so add it.</span>
129
+ <a name="l00104"></a>00104 <span class="keywordtype">int</span> statusCode = atoi(statusLine.c_str());
130
+ <a name="l00105"></a>00105 <span class="keywordflow">switch</span> (statusCode) {
131
+ <a name="l00106"></a>00106 <span class="keywordflow">case</span> 100:
132
+ <a name="l00107"></a>00107 statusLine = <span class="stringliteral">&quot;100 Continue\x0D\x0A&quot;</span>;
133
+ <a name="l00108"></a>00108 <span class="keywordflow">break</span>;
134
+ <a name="l00109"></a>00109 <span class="keywordflow">case</span> 101:
135
+ <a name="l00110"></a>00110 statusLine = <span class="stringliteral">&quot;101 Switching Protocols\x0D\x0A&quot;</span>;
136
+ <a name="l00111"></a>00111 <span class="keywordflow">break</span>;
137
+ <a name="l00112"></a>00112 <span class="keywordflow">case</span> 102:
138
+ <a name="l00113"></a>00113 statusLine = <span class="stringliteral">&quot;102 Processing\x0D\x0A&quot;</span>;
139
+ <a name="l00114"></a>00114 <span class="keywordflow">break</span>;
140
+ <a name="l00115"></a>00115 <span class="keywordflow">case</span> 200:
141
+ <a name="l00116"></a>00116 statusLine = <span class="stringliteral">&quot;200 OK\x0D\x0A&quot;</span>;
142
+ <a name="l00117"></a>00117 <span class="keywordflow">break</span>;
143
+ <a name="l00118"></a>00118 <span class="keywordflow">case</span> 201:
144
+ <a name="l00119"></a>00119 statusLine = <span class="stringliteral">&quot;201 Created\x0D\x0A&quot;</span>;
145
+ <a name="l00120"></a>00120 <span class="keywordflow">break</span>;
146
+ <a name="l00121"></a>00121 <span class="keywordflow">case</span> 202:
147
+ <a name="l00122"></a>00122 statusLine = <span class="stringliteral">&quot;202 Accepted\x0D\x0A&quot;</span>;
148
+ <a name="l00123"></a>00123 <span class="keywordflow">break</span>;
149
+ <a name="l00124"></a>00124 <span class="keywordflow">case</span> 203:
150
+ <a name="l00125"></a>00125 statusLine = <span class="stringliteral">&quot;203 Non-Authoritative Information\x0D\x0A&quot;</span>;
151
+ <a name="l00126"></a>00126 <span class="keywordflow">break</span>;
152
+ <a name="l00127"></a>00127 <span class="keywordflow">case</span> 204:
153
+ <a name="l00128"></a>00128 statusLine = <span class="stringliteral">&quot;204 No Content\x0D\x0A&quot;</span>;
154
+ <a name="l00129"></a>00129 <span class="keywordflow">break</span>;
155
+ <a name="l00130"></a>00130 <span class="keywordflow">case</span> 205:
156
+ <a name="l00131"></a>00131 statusLine = <span class="stringliteral">&quot;205 Reset Content\x0D\x0A&quot;</span>;
157
+ <a name="l00132"></a>00132 <span class="keywordflow">break</span>;
158
+ <a name="l00133"></a>00133 <span class="keywordflow">case</span> 206:
159
+ <a name="l00134"></a>00134 statusLine = <span class="stringliteral">&quot;206 Partial Content\x0D\x0A&quot;</span>;
160
+ <a name="l00135"></a>00135 <span class="keywordflow">break</span>;
161
+ <a name="l00136"></a>00136 <span class="keywordflow">case</span> 207:
162
+ <a name="l00137"></a>00137 statusLine = <span class="stringliteral">&quot;207 Multi-Status\x0D\x0A&quot;</span>;
163
+ <a name="l00138"></a>00138 <span class="keywordflow">break</span>;
164
+ <a name="l00139"></a>00139 <span class="keywordflow">case</span> 300:
165
+ <a name="l00140"></a>00140 statusLine = <span class="stringliteral">&quot;300 Multiple Choices\x0D\x0A&quot;</span>;
166
+ <a name="l00141"></a>00141 <span class="keywordflow">break</span>;
167
+ <a name="l00142"></a>00142 <span class="keywordflow">case</span> 301:
168
+ <a name="l00143"></a>00143 statusLine = <span class="stringliteral">&quot;301 Moved Permanently\x0D\x0A&quot;</span>;
169
+ <a name="l00144"></a>00144 <span class="keywordflow">break</span>;
170
+ <a name="l00145"></a>00145 <span class="keywordflow">case</span> 302:
171
+ <a name="l00146"></a>00146 statusLine = <span class="stringliteral">&quot;302 Found\x0D\x0A&quot;</span>;
172
+ <a name="l00147"></a>00147 <span class="keywordflow">break</span>;
173
+ <a name="l00148"></a>00148 <span class="keywordflow">case</span> 303:
174
+ <a name="l00149"></a>00149 statusLine = <span class="stringliteral">&quot;303 See Other\x0D\x0A&quot;</span>;
175
+ <a name="l00150"></a>00150 <span class="keywordflow">break</span>;
176
+ <a name="l00151"></a>00151 <span class="keywordflow">case</span> 304:
177
+ <a name="l00152"></a>00152 statusLine = <span class="stringliteral">&quot;304 Not Modified\x0D\x0A&quot;</span>;
178
+ <a name="l00153"></a>00153 <span class="keywordflow">break</span>;
179
+ <a name="l00154"></a>00154 <span class="keywordflow">case</span> 305:
180
+ <a name="l00155"></a>00155 statusLine = <span class="stringliteral">&quot;305 Use Proxy\x0D\x0A&quot;</span>;
181
+ <a name="l00156"></a>00156 <span class="keywordflow">break</span>;
182
+ <a name="l00157"></a>00157 <span class="keywordflow">case</span> 306:
183
+ <a name="l00158"></a>00158 statusLine = <span class="stringliteral">&quot;306 Switch Proxy\x0D\x0A&quot;</span>;
184
+ <a name="l00159"></a>00159 <span class="keywordflow">break</span>;
185
+ <a name="l00160"></a>00160 <span class="keywordflow">case</span> 307:
186
+ <a name="l00161"></a>00161 statusLine = <span class="stringliteral">&quot;307 Temporary Redirect\x0D\x0A&quot;</span>;
187
+ <a name="l00162"></a>00162 <span class="keywordflow">break</span>;
188
+ <a name="l00163"></a>00163 <span class="keywordflow">case</span> 308:
189
+ <a name="l00164"></a>00164 <span class="comment">// Google Gears: http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal</span>
190
+ <a name="l00165"></a>00165 statusLine = <span class="stringliteral">&quot;308 Resume Incomplete\x0D\x0A&quot;</span>;
191
+ <a name="l00166"></a>00166 <span class="keywordflow">break</span>;
192
+ <a name="l00167"></a>00167 <span class="keywordflow">case</span> 400:
193
+ <a name="l00168"></a>00168 statusLine = <span class="stringliteral">&quot;400 Bad Request\x0D\x0A&quot;</span>;
194
+ <a name="l00169"></a>00169 <span class="keywordflow">break</span>;
195
+ <a name="l00170"></a>00170 <span class="keywordflow">case</span> 401:
196
+ <a name="l00171"></a>00171 statusLine = <span class="stringliteral">&quot;401 Unauthorized\x0D\x0A&quot;</span>;
197
+ <a name="l00172"></a>00172 <span class="keywordflow">break</span>;
198
+ <a name="l00173"></a>00173 <span class="keywordflow">case</span> 402:
199
+ <a name="l00174"></a>00174 statusLine = <span class="stringliteral">&quot;402 Payment Required\x0D\x0A&quot;</span>;
200
+ <a name="l00175"></a>00175 <span class="keywordflow">break</span>;
201
+ <a name="l00176"></a>00176 <span class="keywordflow">case</span> 403:
202
+ <a name="l00177"></a>00177 statusLine = <span class="stringliteral">&quot;403 Forbidden\x0D\x0A&quot;</span>;
203
+ <a name="l00178"></a>00178 <span class="keywordflow">break</span>;
204
+ <a name="l00179"></a>00179 <span class="keywordflow">case</span> 404:
205
+ <a name="l00180"></a>00180 statusLine = <span class="stringliteral">&quot;404 Not Found\x0D\x0A&quot;</span>;
206
+ <a name="l00181"></a>00181 <span class="keywordflow">break</span>;
207
+ <a name="l00182"></a>00182 <span class="keywordflow">case</span> 405:
208
+ <a name="l00183"></a>00183 statusLine = <span class="stringliteral">&quot;405 Method Not Allowed\x0D\x0A&quot;</span>;
209
+ <a name="l00184"></a>00184 <span class="keywordflow">break</span>;
210
+ <a name="l00185"></a>00185 <span class="keywordflow">case</span> 406:
211
+ <a name="l00186"></a>00186 statusLine = <span class="stringliteral">&quot;406 Not Acceptable\x0D\x0A&quot;</span>;
212
+ <a name="l00187"></a>00187 <span class="keywordflow">break</span>;
213
+ <a name="l00188"></a>00188 <span class="keywordflow">case</span> 407:
214
+ <a name="l00189"></a>00189 statusLine = <span class="stringliteral">&quot;407 Proxy Authentication Required\x0D\x0A&quot;</span>;
215
+ <a name="l00190"></a>00190 <span class="keywordflow">break</span>;
216
+ <a name="l00191"></a>00191 <span class="keywordflow">case</span> 408:
217
+ <a name="l00192"></a>00192 statusLine = <span class="stringliteral">&quot;408 Request Timeout\x0D\x0A&quot;</span>;
218
+ <a name="l00193"></a>00193 <span class="keywordflow">break</span>;
219
+ <a name="l00194"></a>00194 <span class="keywordflow">case</span> 409:
220
+ <a name="l00195"></a>00195 statusLine = <span class="stringliteral">&quot;409 Conflict\x0D\x0A&quot;</span>;
221
+ <a name="l00196"></a>00196 <span class="keywordflow">break</span>;
222
+ <a name="l00197"></a>00197 <span class="keywordflow">case</span> 410:
223
+ <a name="l00198"></a>00198 statusLine = <span class="stringliteral">&quot;410 Gone\x0D\x0A&quot;</span>;
224
+ <a name="l00199"></a>00199 <span class="keywordflow">break</span>;
225
+ <a name="l00200"></a>00200 <span class="keywordflow">case</span> 411:
226
+ <a name="l00201"></a>00201 statusLine = <span class="stringliteral">&quot;411 Length Required\x0D\x0A&quot;</span>;
227
+ <a name="l00202"></a>00202 <span class="keywordflow">break</span>;
228
+ <a name="l00203"></a>00203 <span class="keywordflow">case</span> 412:
229
+ <a name="l00204"></a>00204 statusLine = <span class="stringliteral">&quot;412 Precondition Failed\x0D\x0A&quot;</span>;
230
+ <a name="l00205"></a>00205 <span class="keywordflow">break</span>;
231
+ <a name="l00206"></a>00206 <span class="keywordflow">case</span> 413:
232
+ <a name="l00207"></a>00207 statusLine = <span class="stringliteral">&quot;413 Request Entity Too Large\x0D\x0A&quot;</span>;
233
+ <a name="l00208"></a>00208 <span class="keywordflow">break</span>;
234
+ <a name="l00209"></a>00209 <span class="keywordflow">case</span> 414:
235
+ <a name="l00210"></a>00210 statusLine = <span class="stringliteral">&quot;414 Request-URI Too Long\x0D\x0A&quot;</span>;
236
+ <a name="l00211"></a>00211 <span class="keywordflow">break</span>;
237
+ <a name="l00212"></a>00212 <span class="keywordflow">case</span> 415:
238
+ <a name="l00213"></a>00213 statusLine = <span class="stringliteral">&quot;415 Unsupported Media Type\x0D\x0A&quot;</span>;
239
+ <a name="l00214"></a>00214 <span class="keywordflow">break</span>;
240
+ <a name="l00215"></a>00215 <span class="keywordflow">case</span> 416:
241
+ <a name="l00216"></a>00216 statusLine = <span class="stringliteral">&quot;416 Requested Range Not Satisfiable\x0D\x0A&quot;</span>;
242
+ <a name="l00217"></a>00217 <span class="keywordflow">break</span>;
243
+ <a name="l00218"></a>00218 <span class="keywordflow">case</span> 417:
244
+ <a name="l00219"></a>00219 statusLine = <span class="stringliteral">&quot;417 Expectation Failed\x0D\x0A&quot;</span>;
245
+ <a name="l00220"></a>00220 <span class="keywordflow">break</span>;
246
+ <a name="l00221"></a>00221 <span class="keywordflow">case</span> 418:
247
+ <a name="l00222"></a>00222 statusLine = <span class="stringliteral">&quot;418 Not A Funny April Fools Joke\x0D\x0A&quot;</span>;
248
+ <a name="l00223"></a>00223 <span class="keywordflow">break</span>;
249
+ <a name="l00224"></a>00224 <span class="keywordflow">case</span> 422:
250
+ <a name="l00225"></a>00225 statusLine = <span class="stringliteral">&quot;422 Unprocessable Entity\x0D\x0A&quot;</span>;
251
+ <a name="l00226"></a>00226 <span class="keywordflow">break</span>;
252
+ <a name="l00227"></a>00227 <span class="keywordflow">case</span> 423:
253
+ <a name="l00228"></a>00228 statusLine = <span class="stringliteral">&quot;423 Locked\x0D\x0A&quot;</span>;
254
+ <a name="l00229"></a>00229 <span class="keywordflow">break</span>;
255
+ <a name="l00230"></a>00230 <span class="keywordflow">case</span> 424:
256
+ <a name="l00231"></a>00231 statusLine = <span class="stringliteral">&quot;424 Unordered Collection\x0D\x0A&quot;</span>;
257
+ <a name="l00232"></a>00232 <span class="keywordflow">break</span>;
258
+ <a name="l00233"></a>00233 <span class="keywordflow">case</span> 426:
259
+ <a name="l00234"></a>00234 statusLine = <span class="stringliteral">&quot;426 Upgrade Required\x0D\x0A&quot;</span>;
260
+ <a name="l00235"></a>00235 <span class="keywordflow">break</span>;
261
+ <a name="l00236"></a>00236 <span class="keywordflow">case</span> 449:
262
+ <a name="l00237"></a>00237 statusLine = <span class="stringliteral">&quot;449 Retry With\x0D\x0A&quot;</span>;
263
+ <a name="l00238"></a>00238 <span class="keywordflow">break</span>;
264
+ <a name="l00239"></a>00239 <span class="keywordflow">case</span> 450:
265
+ <a name="l00240"></a>00240 statusLine = <span class="stringliteral">&quot;450 Blocked\x0D\x0A&quot;</span>;
266
+ <a name="l00241"></a>00241 <span class="keywordflow">break</span>;
267
+ <a name="l00242"></a>00242 <span class="keywordflow">case</span> 500:
268
+ <a name="l00243"></a>00243 statusLine = <span class="stringliteral">&quot;500 Internal Server Error\x0D\x0A&quot;</span>;
269
+ <a name="l00244"></a>00244 <span class="keywordflow">break</span>;
270
+ <a name="l00245"></a>00245 <span class="keywordflow">case</span> 501:
271
+ <a name="l00246"></a>00246 statusLine = <span class="stringliteral">&quot;501 Not Implemented\x0D\x0A&quot;</span>;
272
+ <a name="l00247"></a>00247 <span class="keywordflow">break</span>;
273
+ <a name="l00248"></a>00248 <span class="keywordflow">case</span> 502:
274
+ <a name="l00249"></a>00249 statusLine = <span class="stringliteral">&quot;502 Bad Gateway\x0D\x0A&quot;</span>;
275
+ <a name="l00250"></a>00250 <span class="keywordflow">break</span>;
276
+ <a name="l00251"></a>00251 <span class="keywordflow">case</span> 503:
277
+ <a name="l00252"></a>00252 statusLine = <span class="stringliteral">&quot;503 Service Unavailable\x0D\x0A&quot;</span>;
278
+ <a name="l00253"></a>00253 <span class="keywordflow">break</span>;
279
+ <a name="l00254"></a>00254 <span class="keywordflow">case</span> 504:
280
+ <a name="l00255"></a>00255 statusLine = <span class="stringliteral">&quot;504 Gateway Timeout\x0D\x0A&quot;</span>;
281
+ <a name="l00256"></a>00256 <span class="keywordflow">break</span>;
282
+ <a name="l00257"></a>00257 <span class="keywordflow">case</span> 505:
283
+ <a name="l00258"></a>00258 statusLine = <span class="stringliteral">&quot;505 HTTP Version Not Supported\x0D\x0A&quot;</span>;
284
+ <a name="l00259"></a>00259 <span class="keywordflow">break</span>;
285
+ <a name="l00260"></a>00260 <span class="keywordflow">case</span> 506:
286
+ <a name="l00261"></a>00261 statusLine = <span class="stringliteral">&quot;506 Variant Also Negotiates\x0D\x0A&quot;</span>;
287
+ <a name="l00262"></a>00262 <span class="keywordflow">break</span>;
288
+ <a name="l00263"></a>00263 <span class="keywordflow">case</span> 507:
289
+ <a name="l00264"></a>00264 statusLine = <span class="stringliteral">&quot;507 Insufficient Storage\x0D\x0A&quot;</span>;
290
+ <a name="l00265"></a>00265 <span class="keywordflow">break</span>;
291
+ <a name="l00266"></a>00266 <span class="keywordflow">case</span> 509:
292
+ <a name="l00267"></a>00267 statusLine = <span class="stringliteral">&quot;509 Bandwidth Limit Exceeded\x0D\x0A&quot;</span>;
293
+ <a name="l00268"></a>00268 <span class="keywordflow">break</span>;
294
+ <a name="l00269"></a>00269 <span class="keywordflow">case</span> 510:
295
+ <a name="l00270"></a>00270 statusLine = <span class="stringliteral">&quot;510 Not Extended\x0D\x0A&quot;</span>;
296
+ <a name="l00271"></a>00271 <span class="keywordflow">break</span>;
297
+ <a name="l00272"></a>00272 <span class="keywordflow">default</span>:
298
+ <a name="l00273"></a>00273 <span class="keywordtype">char</span> temp[32];
299
+ <a name="l00274"></a>00274 snprintf(temp, <span class="keyword">sizeof</span>(temp),
300
+ <a name="l00275"></a>00275 <span class="stringliteral">&quot;%d Unknown Status Code\x0D\x0A&quot;</span>,
301
+ <a name="l00276"></a>00276 statusCode);
302
+ <a name="l00277"></a>00277 temp[<span class="keyword">sizeof</span>(temp) - 1] = <span class="charliteral">&#39;\0&#39;</span>;
303
+ <a name="l00278"></a>00278 statusLine = temp;
304
+ <a name="l00279"></a>00279 }
305
+ <a name="l00280"></a>00280 }
306
+ <a name="l00281"></a>00281 }
307
+ <a name="l00282"></a>00282
308
+ <a name="l00283"></a>00283 <span class="keyword">public</span>:
309
+ <a name="l00284"></a>00284 <a class="code" href="classPassenger_1_1HttpStatusExtractor.html" title="Utility class for extracting the HTTP status value from an HTTP response.">HttpStatusExtractor</a>() {
310
+ <a name="l00285"></a>00285 searchStart = 0;
311
+ <a name="l00286"></a>00286 fullHeaderReceived = <span class="keyword">false</span>;
312
+ <a name="l00287"></a>00287 statusLine = <span class="stringliteral">&quot;200 OK\r\n&quot;</span>;
313
+ <a name="l00288"></a>00288 }
314
+ <a name="l00289"></a>00289 <span class="comment"></span>
315
+ <a name="l00290"></a>00290 <span class="comment"> /**</span>
316
+ <a name="l00291"></a>00291 <span class="comment"> * Feed HTTP response data to this HttpStatusExtractor.</span>
317
+ <a name="l00292"></a>00292 <span class="comment"> *</span>
318
+ <a name="l00293"></a>00293 <span class="comment"> * One is to keep feeding data until this method returns true.</span>
319
+ <a name="l00294"></a>00294 <span class="comment"> * When a sufficient amount of data has been fed, this method will</span>
320
+ <a name="l00295"></a>00295 <span class="comment"> * extract the status line from the data that has been fed so far,</span>
321
+ <a name="l00296"></a>00296 <span class="comment"> * and return true.</span>
322
+ <a name="l00297"></a>00297 <span class="comment"> *</span>
323
+ <a name="l00298"></a>00298 <span class="comment"> * Do not call this method again once it has returned true.</span>
324
+ <a name="l00299"></a>00299 <span class="comment"> *</span>
325
+ <a name="l00300"></a>00300 <span class="comment"> * It is safe to feed excess data. That is, it is safe if the &#39;data&#39;</span>
326
+ <a name="l00301"></a>00301 <span class="comment"> * argument contains a part of the HTTP response body.</span>
327
+ <a name="l00302"></a>00302 <span class="comment"> * HttpStatusExtractor will only look for the status line in the HTTP</span>
328
+ <a name="l00303"></a>00303 <span class="comment"> * response header, not in the HTTP response body. All fed data is</span>
329
+ <a name="l00304"></a>00304 <span class="comment"> * buffered and will be available via getBuffer(), so no data will be</span>
330
+ <a name="l00305"></a>00305 <span class="comment"> * lost.</span>
331
+ <a name="l00306"></a>00306 <span class="comment"> *</span>
332
+ <a name="l00307"></a>00307 <span class="comment"> * @return Whether the HTTP status has been extracted yet.</span>
333
+ <a name="l00308"></a>00308 <span class="comment"> * @pre feed() did not previously return true.</span>
334
+ <a name="l00309"></a>00309 <span class="comment"> * @pre data != NULL</span>
335
+ <a name="l00310"></a>00310 <span class="comment"> * @pre size &gt; 0</span>
336
+ <a name="l00311"></a>00311 <span class="comment"> */</span>
337
+ <a name="l00312"></a><a class="code" href="classPassenger_1_1HttpStatusExtractor.html#aca6fd77038e76b313830757730780d51">00312</a> <span class="keywordtype">bool</span> <a class="code" href="classPassenger_1_1HttpStatusExtractor.html#aca6fd77038e76b313830757730780d51" title="Feed HTTP response data to this HttpStatusExtractor.">feed</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size) {
338
+ <a name="l00313"></a>00313 <span class="keywordflow">if</span> (fullHeaderReceived) {
339
+ <a name="l00314"></a>00314 <span class="keywordflow">return</span> <span class="keyword">true</span>;
340
+ <a name="l00315"></a>00315 }
341
+ <a name="l00316"></a>00316 buffer.append(data, size);
342
+ <a name="l00317"></a>00317 <span class="keywordflow">for</span> (; buffer.size() &gt;= 3 &amp;&amp; searchStart &lt; buffer.size() - 3; searchStart++) {
343
+ <a name="l00318"></a>00318 <span class="keywordflow">if</span> (buffer[searchStart] == CR &amp;&amp;
344
+ <a name="l00319"></a>00319 buffer[searchStart + 1] == LF &amp;&amp;
345
+ <a name="l00320"></a>00320 buffer[searchStart + 2] == CR &amp;&amp;
346
+ <a name="l00321"></a>00321 buffer[searchStart + 3] == LF) {
347
+ <a name="l00322"></a>00322 fullHeaderReceived = <span class="keyword">true</span>;
348
+ <a name="l00323"></a>00323 extractStatusLine();
349
+ <a name="l00324"></a>00324 <span class="keywordflow">return</span> <span class="keyword">true</span>;
350
+ <a name="l00325"></a>00325 }
351
+ <a name="l00326"></a>00326 }
352
+ <a name="l00327"></a>00327 <span class="keywordflow">return</span> <span class="keyword">false</span>;
353
+ <a name="l00328"></a>00328 }
354
+ <a name="l00329"></a>00329 <span class="comment"></span>
355
+ <a name="l00330"></a>00330 <span class="comment"> /**</span>
356
+ <a name="l00331"></a>00331 <span class="comment"> * Returns the HTTP status line that has been determined.</span>
357
+ <a name="l00332"></a>00332 <span class="comment"> *</span>
358
+ <a name="l00333"></a>00333 <span class="comment"> * The default value is &quot;200 OK\r\n&quot;, which is returned if the HTTP</span>
359
+ <a name="l00334"></a>00334 <span class="comment"> * response data that has been fed so far does not include a status</span>
360
+ <a name="l00335"></a>00335 <span class="comment"> * line.</span>
361
+ <a name="l00336"></a>00336 <span class="comment"> *</span>
362
+ <a name="l00337"></a>00337 <span class="comment"> * @note The return value includes a trailing CRLF, e.g. &quot;404 Not Found\r\n&quot;.</span>
363
+ <a name="l00338"></a>00338 <span class="comment"> */</span>
364
+ <a name="l00339"></a><a class="code" href="classPassenger_1_1HttpStatusExtractor.html#af0db266fc713f532047880c5eaae44d5">00339</a> <span class="keywordtype">string</span> <a class="code" href="classPassenger_1_1HttpStatusExtractor.html#af0db266fc713f532047880c5eaae44d5" title="Returns the HTTP status line that has been determined.">getStatusLine</a>()<span class="keyword"> const </span>{
365
+ <a name="l00340"></a>00340 <span class="keywordflow">return</span> statusLine;
366
+ <a name="l00341"></a>00341 }
367
+ <a name="l00342"></a>00342 <span class="comment"></span>
368
+ <a name="l00343"></a>00343 <span class="comment"> /**</span>
369
+ <a name="l00344"></a>00344 <span class="comment"> * Get the data that has been fed so far.</span>
370
+ <a name="l00345"></a>00345 <span class="comment"> */</span>
371
+ <a name="l00346"></a><a class="code" href="classPassenger_1_1HttpStatusExtractor.html#a3749842ba4f8f59b6b69c594da963f22">00346</a> <span class="keywordtype">string</span> <a class="code" href="classPassenger_1_1HttpStatusExtractor.html#a3749842ba4f8f59b6b69c594da963f22" title="Get the data that has been fed so far.">getBuffer</a>()<span class="keyword"> const </span>{
372
+ <a name="l00347"></a>00347 <span class="keywordflow">return</span> buffer;
373
+ <a name="l00348"></a>00348 }
374
+ <a name="l00349"></a>00349 };
375
+ <a name="l00350"></a>00350
376
+ <a name="l00351"></a>00351 } <span class="comment">// namespace Passenger</span>
377
+ </pre></div></div>
378
+ <hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
379
+ <a href="http://www.doxygen.org/index.html">
380
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
381
+ </body>
382
+ </html>
@@ -0,0 +1,726 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5
+ <title>Passenger: Logging.h Source File</title>
6
+ <link href="tabs.css" rel="stylesheet" type="text/css"/>
7
+ <link href="doxygen.css" rel="stylesheet" type="text/css"/>
8
+ </head>
9
+ <body>
10
+ <!-- Generated by Doxygen 1.6.2 -->
11
+ <div class="navigation" id="top">
12
+ <div class="tabs">
13
+ <ul>
14
+ <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
15
+ <li><a href="modules.html"><span>Modules</span></a></li>
16
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
17
+ <li><a href="annotated.html"><span>Classes</span></a></li>
18
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
19
+ </ul>
20
+ </div>
21
+ <div class="tabs">
22
+ <ul>
23
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
24
+ </ul>
25
+ </div>
26
+ <h1>Logging.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
27
+ <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
28
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
29
+ <a name="l00004"></a>00004 <span class="comment"> *</span>
30
+ <a name="l00005"></a>00005 <span class="comment"> * &quot;Phusion Passenger&quot; is a trademark of Hongli Lai &amp; Ninh Bui.</span>
31
+ <a name="l00006"></a>00006 <span class="comment"> *</span>
32
+ <a name="l00007"></a>00007 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span>
33
+ <a name="l00008"></a>00008 <span class="comment"> * of this software and associated documentation files (the &quot;Software&quot;), to deal</span>
34
+ <a name="l00009"></a>00009 <span class="comment"> * in the Software without restriction, including without limitation the rights</span>
35
+ <a name="l00010"></a>00010 <span class="comment"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
36
+ <a name="l00011"></a>00011 <span class="comment"> * copies of the Software, and to permit persons to whom the Software is</span>
37
+ <a name="l00012"></a>00012 <span class="comment"> * furnished to do so, subject to the following conditions:</span>
38
+ <a name="l00013"></a>00013 <span class="comment"> *</span>
39
+ <a name="l00014"></a>00014 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
40
+ <a name="l00015"></a>00015 <span class="comment"> * all copies or substantial portions of the Software.</span>
41
+ <a name="l00016"></a>00016 <span class="comment"> *</span>
42
+ <a name="l00017"></a>00017 <span class="comment"> * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
43
+ <a name="l00018"></a>00018 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
44
+ <a name="l00019"></a>00019 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
45
+ <a name="l00020"></a>00020 <span class="comment"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
46
+ <a name="l00021"></a>00021 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
47
+ <a name="l00022"></a>00022 <span class="comment"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
48
+ <a name="l00023"></a>00023 <span class="comment"> * THE SOFTWARE.</span>
49
+ <a name="l00024"></a>00024 <span class="comment"> */</span>
50
+ <a name="l00025"></a>00025 <span class="preprocessor">#ifndef _PASSENGER_LOGGING_H_</span>
51
+ <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_LOGGING_H_</span>
52
+ <a name="l00027"></a>00027 <span class="preprocessor"></span>
53
+ <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;boost/shared_ptr.hpp&gt;</span>
54
+ <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;oxt/system_calls.hpp&gt;</span>
55
+ <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;oxt/backtrace.hpp&gt;</span>
56
+ <a name="l00031"></a>00031
57
+ <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
58
+ <a name="l00033"></a>00033 <span class="preprocessor">#include &lt;sys/time.h&gt;</span>
59
+ <a name="l00034"></a>00034 <span class="preprocessor">#include &lt;sys/file.h&gt;</span>
60
+ <a name="l00035"></a>00035 <span class="preprocessor">#include &lt;sys/resource.h&gt;</span>
61
+ <a name="l00036"></a>00036 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
62
+ <a name="l00037"></a>00037 <span class="preprocessor">#include &lt;fcntl.h&gt;</span>
63
+ <a name="l00038"></a>00038 <span class="preprocessor">#include &lt;pthread.h&gt;</span>
64
+ <a name="l00039"></a>00039 <span class="preprocessor">#include &lt;string&gt;</span>
65
+ <a name="l00040"></a>00040 <span class="preprocessor">#include &lt;map&gt;</span>
66
+ <a name="l00041"></a>00041 <span class="preprocessor">#include &lt;ostream&gt;</span>
67
+ <a name="l00042"></a>00042 <span class="preprocessor">#include &lt;sstream&gt;</span>
68
+ <a name="l00043"></a>00043 <span class="preprocessor">#include &lt;cstdio&gt;</span>
69
+ <a name="l00044"></a>00044 <span class="preprocessor">#include &lt;ctime&gt;</span>
70
+ <a name="l00045"></a>00045
71
+ <a name="l00046"></a>00046 <span class="preprocessor">#include &quot;RandomGenerator.h&quot;</span>
72
+ <a name="l00047"></a>00047 <span class="preprocessor">#include &quot;FileDescriptor.h&quot;</span>
73
+ <a name="l00048"></a>00048 <span class="preprocessor">#include &quot;MessageClient.h&quot;</span>
74
+ <a name="l00049"></a>00049 <span class="preprocessor">#include &quot;StaticString.h&quot;</span>
75
+ <a name="l00050"></a>00050 <span class="preprocessor">#include &quot;Exceptions.h&quot;</span>
76
+ <a name="l00051"></a>00051 <span class="preprocessor">#include &quot;Utils.h&quot;</span>
77
+ <a name="l00052"></a>00052 <span class="preprocessor">#include &quot;Utils/StrIntUtils.h&quot;</span>
78
+ <a name="l00053"></a>00053 <span class="preprocessor">#include &quot;Utils/MD5.h&quot;</span>
79
+ <a name="l00054"></a>00054 <span class="preprocessor">#include &quot;Utils/SystemTime.h&quot;</span>
80
+ <a name="l00055"></a>00055
81
+ <a name="l00056"></a>00056
82
+ <a name="l00057"></a>00057 <span class="keyword">namespace </span>Passenger {
83
+ <a name="l00058"></a>00058
84
+ <a name="l00059"></a>00059 <span class="keyword">using namespace </span>std;
85
+ <a name="l00060"></a>00060 <span class="keyword">using namespace </span>boost;
86
+ <a name="l00061"></a>00061 <span class="keyword">using namespace </span>oxt;
87
+ <a name="l00062"></a>00062
88
+ <a name="l00063"></a>00063
89
+ <a name="l00064"></a>00064 <span class="comment">/********** Debug logging facilities **********/</span>
90
+ <a name="l00065"></a>00065
91
+ <a name="l00066"></a>00066 <span class="keyword">extern</span> <span class="keywordtype">int</span> _logLevel;
92
+ <a name="l00067"></a>00067 <span class="keyword">extern</span> ostream *_logStream;
93
+ <a name="l00068"></a>00068
94
+ <a name="l00069"></a>00069 <span class="keywordtype">int</span> getLogLevel();
95
+ <a name="l00070"></a>00070 <span class="keywordtype">void</span> setLogLevel(<span class="keywordtype">int</span> value);
96
+ <a name="l00071"></a>00071 <span class="keywordtype">void</span> setDebugFile(<span class="keyword">const</span> <span class="keywordtype">char</span> *logFile = NULL);
97
+ <a name="l00072"></a>00072 <span class="comment"></span>
98
+ <a name="l00073"></a>00073 <span class="comment">/**</span>
99
+ <a name="l00074"></a>00074 <span class="comment"> * Write the given expression to the given stream.</span>
100
+ <a name="l00075"></a>00075 <span class="comment"> *</span>
101
+ <a name="l00076"></a>00076 <span class="comment"> * @param expr The expression to write.</span>
102
+ <a name="l00077"></a>00077 <span class="comment"> * @param stream A pointer to an object that accepts the &#39;&lt;&lt;&#39; operator.</span>
103
+ <a name="l00078"></a>00078 <span class="comment"> */</span>
104
+ <a name="l00079"></a>00079 <span class="preprocessor">#define P_LOG_TO(level, expr, stream) \</span>
105
+ <a name="l00080"></a>00080 <span class="preprocessor"> do { \</span>
106
+ <a name="l00081"></a>00081 <span class="preprocessor"> if (stream != 0 &amp;&amp; Passenger::_logLevel &gt;= level) { \</span>
107
+ <a name="l00082"></a>00082 <span class="preprocessor"> time_t the_time; \</span>
108
+ <a name="l00083"></a>00083 <span class="preprocessor"> struct tm the_tm; \</span>
109
+ <a name="l00084"></a>00084 <span class="preprocessor"> char datetime_buf[60]; \</span>
110
+ <a name="l00085"></a>00085 <span class="preprocessor"> struct timeval tv; \</span>
111
+ <a name="l00086"></a>00086 <span class="preprocessor"> std::stringstream sstream; \</span>
112
+ <a name="l00087"></a>00087 <span class="preprocessor"> \</span>
113
+ <a name="l00088"></a>00088 <span class="preprocessor"> the_time = time(NULL); \</span>
114
+ <a name="l00089"></a>00089 <span class="preprocessor"> localtime_r(&amp;the_time, &amp;the_tm); \</span>
115
+ <a name="l00090"></a>00090 <span class="preprocessor"> strftime(datetime_buf, sizeof(datetime_buf), &quot;%F %H:%M:%S&quot;, &amp;the_tm); \</span>
116
+ <a name="l00091"></a>00091 <span class="preprocessor"> gettimeofday(&amp;tv, NULL); \</span>
117
+ <a name="l00092"></a>00092 <span class="preprocessor"> sstream &lt;&lt; \</span>
118
+ <a name="l00093"></a>00093 <span class="preprocessor"> &quot;[ pid=&quot; &lt;&lt; ((unsigned long) getpid()) &lt;&lt; \</span>
119
+ <a name="l00094"></a>00094 <span class="preprocessor"> &quot; thr=&quot; &lt;&lt; pthread_self() &lt;&lt; \</span>
120
+ <a name="l00095"></a>00095 <span class="preprocessor"> &quot; file=&quot; &lt;&lt; __FILE__ &lt;&lt; &quot;:&quot; &lt;&lt; (unsigned long) __LINE__ &lt;&lt; \</span>
121
+ <a name="l00096"></a>00096 <span class="preprocessor"> &quot; time=&quot; &lt;&lt; datetime_buf &lt;&lt; &quot;.&quot; &lt;&lt; (unsigned long) (tv.tv_usec / 1000) &lt;&lt; \</span>
122
+ <a name="l00097"></a>00097 <span class="preprocessor"> &quot; ]: &quot; &lt;&lt; \</span>
123
+ <a name="l00098"></a>00098 <span class="preprocessor"> expr &lt;&lt; std::endl; \</span>
124
+ <a name="l00099"></a>00099 <span class="preprocessor"> *stream &lt;&lt; sstream.str(); \</span>
125
+ <a name="l00100"></a>00100 <span class="preprocessor"> stream-&gt;flush(); \</span>
126
+ <a name="l00101"></a>00101 <span class="preprocessor"> } \</span>
127
+ <a name="l00102"></a>00102 <span class="preprocessor"> } while (false)</span>
128
+ <a name="l00103"></a>00103 <span class="preprocessor"></span><span class="comment"></span>
129
+ <a name="l00104"></a>00104 <span class="comment">/**</span>
130
+ <a name="l00105"></a>00105 <span class="comment"> * Write the given expression to the log stream.</span>
131
+ <a name="l00106"></a>00106 <span class="comment"> */</span>
132
+ <a name="l00107"></a>00107 <span class="preprocessor">#define P_LOG(level, expr) P_LOG_TO(level, expr, Passenger::_logStream)</span>
133
+ <a name="l00108"></a>00108 <span class="preprocessor"></span><span class="comment"></span>
134
+ <a name="l00109"></a>00109 <span class="comment">/**</span>
135
+ <a name="l00110"></a>00110 <span class="comment"> * Write the given expression, which represents a warning,</span>
136
+ <a name="l00111"></a>00111 <span class="comment"> * to the log stream.</span>
137
+ <a name="l00112"></a>00112 <span class="comment"> */</span>
138
+ <a name="l00113"></a>00113 <span class="preprocessor">#define P_WARN(expr) P_LOG(0, expr)</span>
139
+ <a name="l00114"></a>00114 <span class="preprocessor"></span><span class="comment"></span>
140
+ <a name="l00115"></a>00115 <span class="comment">/**</span>
141
+ <a name="l00116"></a>00116 <span class="comment"> * Write the given expression, which represents an error,</span>
142
+ <a name="l00117"></a>00117 <span class="comment"> * to the log stream.</span>
143
+ <a name="l00118"></a>00118 <span class="comment"> */</span>
144
+ <a name="l00119"></a>00119 <span class="preprocessor">#define P_ERROR(expr) P_LOG(-1, expr)</span>
145
+ <a name="l00120"></a>00120 <span class="preprocessor"></span><span class="comment"></span>
146
+ <a name="l00121"></a>00121 <span class="comment">/**</span>
147
+ <a name="l00122"></a>00122 <span class="comment"> * Write the given expression, which represents a debugging message,</span>
148
+ <a name="l00123"></a>00123 <span class="comment"> * to the log stream.</span>
149
+ <a name="l00124"></a>00124 <span class="comment"> */</span>
150
+ <a name="l00125"></a>00125 <span class="preprocessor">#define P_DEBUG(expr) P_TRACE(1, expr)</span>
151
+ <a name="l00126"></a>00126 <span class="preprocessor"></span>
152
+ <a name="l00127"></a>00127 <span class="preprocessor">#ifdef PASSENGER_DEBUG</span>
153
+ <a name="l00128"></a>00128 <span class="preprocessor"></span><span class="preprocessor"> #define P_TRACE(level, expr) P_LOG_TO(level, expr, Passenger::_logStream)</span>
154
+ <a name="l00129"></a>00129 <span class="preprocessor"></span>
155
+ <a name="l00130"></a>00130 <span class="preprocessor"> #define P_ASSERT(expr, result_if_failed, message) \</span>
156
+ <a name="l00131"></a>00131 <span class="preprocessor"> do { \</span>
157
+ <a name="l00132"></a>00132 <span class="preprocessor"> if (!(expr)) { \</span>
158
+ <a name="l00133"></a>00133 <span class="preprocessor"> P_ERROR(&quot;Assertion failed: &quot; &lt;&lt; message); \</span>
159
+ <a name="l00134"></a>00134 <span class="preprocessor"> return result_if_failed; \</span>
160
+ <a name="l00135"></a>00135 <span class="preprocessor"> } \</span>
161
+ <a name="l00136"></a>00136 <span class="preprocessor"> } while (false)</span>
162
+ <a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor"> #define P_ASSERT_WITH_VOID_RETURN(expr, message) \</span>
163
+ <a name="l00138"></a>00138 <span class="preprocessor"> do { \</span>
164
+ <a name="l00139"></a>00139 <span class="preprocessor"> if (!(expr)) { \</span>
165
+ <a name="l00140"></a>00140 <span class="preprocessor"> P_ERROR(&quot;Assertion failed: &quot; &lt;&lt; message); \</span>
166
+ <a name="l00141"></a>00141 <span class="preprocessor"> return; \</span>
167
+ <a name="l00142"></a>00142 <span class="preprocessor"> } \</span>
168
+ <a name="l00143"></a>00143 <span class="preprocessor"> } while (false)</span>
169
+ <a name="l00144"></a>00144 <span class="preprocessor"></span><span class="preprocessor">#else</span>
170
+ <a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor"> #define P_TRACE(level, expr) do { </span><span class="comment">/* nothing */</span> } while (false)
171
+ <a name="l00146"></a>00146
172
+ <a name="l00147"></a>00147 <span class="preprocessor"> #define P_ASSERT(expr, result_if_failed, message) do { </span><span class="comment">/* nothing */</span> } while (false)
173
+ <a name="l00148"></a>00148 <span class="preprocessor"> #define P_ASSERT_WITH_VOID_RETURN(expr, message) do { </span><span class="comment">/* nothing */</span> } while (false)
174
+ <a name="l00149"></a>00149 <span class="preprocessor">#endif</span>
175
+ <a name="l00150"></a>00150 <span class="preprocessor"></span>
176
+ <a name="l00151"></a>00151
177
+ <a name="l00152"></a>00152 <span class="comment">/********** Transaction logging facilities *********/</span>
178
+ <a name="l00153"></a>00153
179
+ <a name="l00154"></a>00154 <span class="keyword">struct </span>AnalyticsLoggerSharedData {
180
+ <a name="l00155"></a>00155 boost::mutex lock;
181
+ <a name="l00156"></a>00156 MessageClient client;
182
+ <a name="l00157"></a>00157
183
+ <a name="l00158"></a>00158 <span class="keywordtype">void</span> disconnect(<span class="keywordtype">bool</span> checkErrorResponse = <span class="keyword">false</span>) {
184
+ <a name="l00159"></a>00159 <span class="keywordflow">if</span> (checkErrorResponse &amp;&amp; client.connected()) {
185
+ <a name="l00160"></a>00160 <span class="comment">// Maybe the server sent us an error message and closed</span>
186
+ <a name="l00161"></a>00161 <span class="comment">// the connection. Let&#39;s check.</span>
187
+ <a name="l00162"></a>00162 TRACE_POINT();
188
+ <a name="l00163"></a>00163 vector&lt;string&gt; args;
189
+ <a name="l00164"></a>00164 <span class="keywordtype">bool</span> hasData = <span class="keyword">true</span>;
190
+ <a name="l00165"></a>00165
191
+ <a name="l00166"></a>00166 <span class="keywordflow">try</span> {
192
+ <a name="l00167"></a>00167 hasData = client.read(args);
193
+ <a name="l00168"></a>00168 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;e) {
194
+ <a name="l00169"></a>00169 <span class="keywordflow">if</span> (e.code() != ECONNRESET) {
195
+ <a name="l00170"></a>00170 <span class="keywordflow">throw</span>;
196
+ <a name="l00171"></a>00171 }
197
+ <a name="l00172"></a>00172 }
198
+ <a name="l00173"></a>00173
199
+ <a name="l00174"></a>00174 UPDATE_TRACE_POINT();
200
+ <a name="l00175"></a>00175 client.disconnect();
201
+ <a name="l00176"></a>00176 <span class="keywordflow">if</span> (hasData) {
202
+ <a name="l00177"></a>00177 <span class="keywordflow">if</span> (args[0] == <span class="stringliteral">&quot;error&quot;</span>) {
203
+ <a name="l00178"></a>00178 <span class="keywordflow">throw</span> IOException(<span class="stringliteral">&quot;The logging server responded with an error: &quot;</span> + args[1]);
204
+ <a name="l00179"></a>00179 } <span class="keywordflow">else</span> {
205
+ <a name="l00180"></a>00180 <span class="keywordflow">throw</span> IOException(<span class="stringliteral">&quot;The logging server sent an unexpected reply.&quot;</span>);
206
+ <a name="l00181"></a>00181 }
207
+ <a name="l00182"></a>00182 }
208
+ <a name="l00183"></a>00183 } <span class="keywordflow">else</span> {
209
+ <a name="l00184"></a>00184 client.disconnect();
210
+ <a name="l00185"></a>00185 }
211
+ <a name="l00186"></a>00186 }
212
+ <a name="l00187"></a>00187 };
213
+ <a name="l00188"></a>00188 <span class="keyword">typedef</span> shared_ptr&lt;AnalyticsLoggerSharedData&gt; AnalyticsLoggerSharedDataPtr;
214
+ <a name="l00189"></a>00189
215
+ <a name="l00190"></a>00190 <span class="keyword">class </span>AnalyticsLog {
216
+ <a name="l00191"></a>00191 <span class="keyword">private</span>:
217
+ <a name="l00192"></a>00192 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> INT64_STR_BUFSIZE = 22; <span class="comment">// Long enough for a 64-bit number.</span>
218
+ <a name="l00193"></a>00193
219
+ <a name="l00194"></a>00194 AnalyticsLoggerSharedDataPtr sharedData;
220
+ <a name="l00195"></a>00195 <span class="keywordtype">string</span> txnId;
221
+ <a name="l00196"></a>00196 <span class="keywordtype">string</span> groupName;
222
+ <a name="l00197"></a>00197 <span class="keywordtype">string</span> category;
223
+ <a name="l00198"></a>00198 <span class="keywordtype">string</span> unionStationKey;
224
+ <a name="l00199"></a>00199 <span class="keywordtype">bool</span> shouldFlushToDiskAfterClose;
225
+ <a name="l00200"></a>00200 <span class="comment"></span>
226
+ <a name="l00201"></a>00201 <span class="comment"> /**</span>
227
+ <a name="l00202"></a>00202 <span class="comment"> * Buffer must be at least txnId.size() + 1 + INT64_STR_BUFSIZE + 1 bytes.</span>
228
+ <a name="l00203"></a>00203 <span class="comment"> */</span>
229
+ <a name="l00204"></a>00204 <span class="keywordtype">char</span> *insertTxnIdAndTimestamp(<span class="keywordtype">char</span> *buffer) {
230
+ <a name="l00205"></a>00205 <span class="keywordtype">int</span> size;
231
+ <a name="l00206"></a>00206
232
+ <a name="l00207"></a>00207 <span class="comment">// &quot;txn-id-here&quot;</span>
233
+ <a name="l00208"></a>00208 memcpy(buffer, txnId.c_str(), txnId.size());
234
+ <a name="l00209"></a>00209 buffer += txnId.size();
235
+ <a name="l00210"></a>00210
236
+ <a name="l00211"></a>00211 <span class="comment">// &quot;txn-id-here &quot;</span>
237
+ <a name="l00212"></a>00212 *buffer = <span class="charliteral">&#39; &#39;</span>;
238
+ <a name="l00213"></a>00213 buffer++;
239
+ <a name="l00214"></a>00214
240
+ <a name="l00215"></a>00215 <span class="comment">// &quot;txn-id-here 123456&quot;</span>
241
+ <a name="l00216"></a>00216 size = snprintf(buffer, INT64_STR_BUFSIZE, <span class="stringliteral">&quot;%llu&quot;</span>, SystemTime::getUsec());
242
+ <a name="l00217"></a>00217 <span class="keywordflow">if</span> (size &gt;= INT64_STR_BUFSIZE) {
243
+ <a name="l00218"></a>00218 <span class="comment">// The buffer is too small.</span>
244
+ <a name="l00219"></a>00219 <span class="keywordflow">throw</span> IOException(<span class="stringliteral">&quot;Cannot format a new transaction log message timestamp.&quot;</span>);
245
+ <a name="l00220"></a>00220 }
246
+ <a name="l00221"></a>00221 buffer += size;
247
+ <a name="l00222"></a>00222
248
+ <a name="l00223"></a>00223 <span class="comment">// &quot;txn-id-here 123456 &quot;</span>
249
+ <a name="l00224"></a>00224 *buffer = <span class="charliteral">&#39; &#39;</span>;
250
+ <a name="l00225"></a>00225
251
+ <a name="l00226"></a>00226 <span class="keywordflow">return</span> buffer + 1;
252
+ <a name="l00227"></a>00227 }
253
+ <a name="l00228"></a>00228
254
+ <a name="l00229"></a>00229 <span class="keyword">public</span>:
255
+ <a name="l00230"></a>00230 AnalyticsLog() { }
256
+ <a name="l00231"></a>00231
257
+ <a name="l00232"></a>00232 AnalyticsLog(<span class="keyword">const</span> AnalyticsLoggerSharedDataPtr &amp;sharedData, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;txnId,
258
+ <a name="l00233"></a>00233 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;groupName, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;category, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;unionStationKey)
259
+ <a name="l00234"></a>00234 {
260
+ <a name="l00235"></a>00235 this-&gt;sharedData = sharedData;
261
+ <a name="l00236"></a>00236 this-&gt;txnId = txnId;
262
+ <a name="l00237"></a>00237 this-&gt;groupName = groupName;
263
+ <a name="l00238"></a>00238 this-&gt;category = category;
264
+ <a name="l00239"></a>00239 this-&gt;unionStationKey = unionStationKey;
265
+ <a name="l00240"></a>00240 shouldFlushToDiskAfterClose = <span class="keyword">false</span>;
266
+ <a name="l00241"></a>00241 }
267
+ <a name="l00242"></a>00242
268
+ <a name="l00243"></a>00243 ~AnalyticsLog() {
269
+ <a name="l00244"></a>00244 <span class="keywordflow">if</span> (sharedData != NULL) {
270
+ <a name="l00245"></a>00245 lock_guard&lt;boost::mutex&gt; l(sharedData-&gt;lock);
271
+ <a name="l00246"></a>00246 <span class="keywordflow">if</span> (sharedData-&gt;client.connected()) {
272
+ <a name="l00247"></a>00247 <span class="keywordflow">try</span> {
273
+ <a name="l00248"></a>00248 <span class="keywordtype">char</span> timestamp[2 * <span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> long) + 1];
274
+ <a name="l00249"></a>00249 integerToHexatri&lt;unsigned long long&gt;(SystemTime::getUsec(),
275
+ <a name="l00250"></a>00250 timestamp);
276
+ <a name="l00251"></a>00251 sharedData-&gt;client.write(<span class="stringliteral">&quot;closeTransaction&quot;</span>,
277
+ <a name="l00252"></a>00252 txnId.c_str(), timestamp, NULL);
278
+ <a name="l00253"></a>00253 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;e) {
279
+ <a name="l00254"></a>00254 <span class="keywordflow">if</span> (e.code() == EPIPE || e.code() == ECONNRESET) {
280
+ <a name="l00255"></a>00255 TRACE_POINT();
281
+ <a name="l00256"></a>00256 sharedData-&gt;disconnect(<span class="keyword">true</span>);
282
+ <a name="l00257"></a>00257 } <span class="keywordflow">else</span> {
283
+ <a name="l00258"></a>00258 <span class="keywordflow">throw</span>;
284
+ <a name="l00259"></a>00259 }
285
+ <a name="l00260"></a>00260 }
286
+ <a name="l00261"></a>00261
287
+ <a name="l00262"></a>00262 <span class="keywordflow">if</span> (shouldFlushToDiskAfterClose) {
288
+ <a name="l00263"></a>00263 vector&lt;string&gt; args;
289
+ <a name="l00264"></a>00264 sharedData-&gt;client.write(<span class="stringliteral">&quot;flush&quot;</span>, NULL);
290
+ <a name="l00265"></a>00265 sharedData-&gt;client.read(args);
291
+ <a name="l00266"></a>00266 }
292
+ <a name="l00267"></a>00267 }
293
+ <a name="l00268"></a>00268 }
294
+ <a name="l00269"></a>00269 }
295
+ <a name="l00270"></a>00270
296
+ <a name="l00271"></a>00271 <span class="keywordtype">void</span> message(<span class="keyword">const</span> StaticString &amp;text) {
297
+ <a name="l00272"></a>00272 <span class="keywordflow">if</span> (sharedData != NULL) {
298
+ <a name="l00273"></a>00273 lock_guard&lt;boost::mutex&gt; l(sharedData-&gt;lock);
299
+ <a name="l00274"></a>00274 <span class="keywordflow">if</span> (sharedData-&gt;client.connected()) {
300
+ <a name="l00275"></a>00275 <span class="keywordtype">char</span> timestamp[2 * <span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> long) + 1];
301
+ <a name="l00276"></a>00276 integerToHexatri&lt;unsigned long long&gt;(SystemTime::getUsec(), timestamp);
302
+ <a name="l00277"></a>00277 sharedData-&gt;client.write(<span class="stringliteral">&quot;log&quot;</span>, txnId.c_str(),
303
+ <a name="l00278"></a>00278 timestamp, NULL);
304
+ <a name="l00279"></a>00279 sharedData-&gt;client.writeScalar(text);
305
+ <a name="l00280"></a>00280 }
306
+ <a name="l00281"></a>00281 }
307
+ <a name="l00282"></a>00282 }
308
+ <a name="l00283"></a>00283
309
+ <a name="l00284"></a>00284 <span class="keywordtype">void</span> abort(<span class="keyword">const</span> StaticString &amp;text) {
310
+ <a name="l00285"></a>00285 <span class="keywordflow">if</span> (sharedData != NULL) {
311
+ <a name="l00286"></a>00286 lock_guard&lt;boost::mutex&gt; l(sharedData-&gt;lock);
312
+ <a name="l00287"></a>00287 <span class="keywordflow">if</span> (sharedData-&gt;client.connected()) {
313
+ <a name="l00288"></a>00288 message(<span class="stringliteral">&quot;ABORT&quot;</span>);
314
+ <a name="l00289"></a>00289 }
315
+ <a name="l00290"></a>00290 }
316
+ <a name="l00291"></a>00291 }
317
+ <a name="l00292"></a>00292
318
+ <a name="l00293"></a>00293 <span class="keywordtype">void</span> flushToDiskAfterClose(<span class="keywordtype">bool</span> value) {
319
+ <a name="l00294"></a>00294 shouldFlushToDiskAfterClose = value;
320
+ <a name="l00295"></a>00295 }
321
+ <a name="l00296"></a>00296
322
+ <a name="l00297"></a>00297 <span class="keywordtype">bool</span> isNull()<span class="keyword"> const </span>{
323
+ <a name="l00298"></a>00298 <span class="keywordflow">return</span> sharedData == NULL;
324
+ <a name="l00299"></a>00299 }
325
+ <a name="l00300"></a>00300
326
+ <a name="l00301"></a>00301 <span class="keywordtype">string</span> getTxnId()<span class="keyword"> const </span>{
327
+ <a name="l00302"></a>00302 <span class="keywordflow">return</span> txnId;
328
+ <a name="l00303"></a>00303 }
329
+ <a name="l00304"></a>00304
330
+ <a name="l00305"></a>00305 <span class="keywordtype">string</span> getGroupName()<span class="keyword"> const </span>{
331
+ <a name="l00306"></a>00306 <span class="keywordflow">return</span> groupName;
332
+ <a name="l00307"></a>00307 }
333
+ <a name="l00308"></a>00308
334
+ <a name="l00309"></a>00309 <span class="keywordtype">string</span> getCategory()<span class="keyword"> const </span>{
335
+ <a name="l00310"></a>00310 <span class="keywordflow">return</span> category;
336
+ <a name="l00311"></a>00311 }
337
+ <a name="l00312"></a>00312
338
+ <a name="l00313"></a>00313 <span class="keywordtype">string</span> getUnionStationKey()<span class="keyword"> const </span>{
339
+ <a name="l00314"></a>00314 <span class="keywordflow">return</span> unionStationKey;
340
+ <a name="l00315"></a>00315 }
341
+ <a name="l00316"></a>00316 };
342
+ <a name="l00317"></a>00317
343
+ <a name="l00318"></a>00318 <span class="keyword">typedef</span> shared_ptr&lt;AnalyticsLog&gt; AnalyticsLogPtr;
344
+ <a name="l00319"></a>00319
345
+ <a name="l00320"></a>00320 <span class="keyword">class </span>AnalyticsScopeLog {
346
+ <a name="l00321"></a>00321 <span class="keyword">private</span>:
347
+ <a name="l00322"></a>00322 AnalyticsLog *log;
348
+ <a name="l00323"></a>00323 <span class="keyword">enum</span> {
349
+ <a name="l00324"></a>00324 NAME,
350
+ <a name="l00325"></a>00325 GRANULAR
351
+ <a name="l00326"></a>00326 } type;
352
+ <a name="l00327"></a>00327 <span class="keyword">union </span>{
353
+ <a name="l00328"></a>00328 <span class="keyword">const</span> <span class="keywordtype">char</span> *name;
354
+ <a name="l00329"></a>00329 <span class="keyword">struct </span>{
355
+ <a name="l00330"></a>00330 <span class="keyword">const</span> <span class="keywordtype">char</span> *endMessage;
356
+ <a name="l00331"></a>00331 <span class="keyword">const</span> <span class="keywordtype">char</span> *abortMessage;
357
+ <a name="l00332"></a>00332 } granular;
358
+ <a name="l00333"></a>00333 } data;
359
+ <a name="l00334"></a>00334 <span class="keywordtype">bool</span> ok;
360
+ <a name="l00335"></a>00335
361
+ <a name="l00336"></a>00336 <span class="keyword">static</span> <span class="keywordtype">string</span> timevalToString(<span class="keyword">struct</span> timeval &amp;tv) {
362
+ <a name="l00337"></a>00337 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> i = (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> long) tv.tv_sec * 1000000 + tv.tv_usec;
363
+ <a name="l00338"></a>00338 <span class="keywordflow">return</span> usecToString(i);
364
+ <a name="l00339"></a>00339 }
365
+ <a name="l00340"></a>00340
366
+ <a name="l00341"></a>00341 <span class="keyword">static</span> <span class="keywordtype">string</span> usecToString(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> usec) {
367
+ <a name="l00342"></a>00342 <span class="keywordtype">char</span> timestamp[2 * <span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> long) + 1];
368
+ <a name="l00343"></a>00343 integerToHexatri&lt;unsigned long long&gt;(usec, timestamp);
369
+ <a name="l00344"></a>00344 <span class="keywordflow">return</span> timestamp;
370
+ <a name="l00345"></a>00345 }
371
+ <a name="l00346"></a>00346
372
+ <a name="l00347"></a>00347 <span class="keyword">public</span>:
373
+ <a name="l00348"></a>00348 AnalyticsScopeLog(<span class="keyword">const</span> AnalyticsLogPtr &amp;log, <span class="keyword">const</span> <span class="keywordtype">char</span> *name) {
374
+ <a name="l00349"></a>00349 this-&gt;log = log.get();
375
+ <a name="l00350"></a>00350 type = NAME;
376
+ <a name="l00351"></a>00351 data.name = name;
377
+ <a name="l00352"></a>00352 ok = <span class="keyword">false</span>;
378
+ <a name="l00353"></a>00353 <span class="keywordflow">if</span> (log != NULL &amp;&amp; !log-&gt;isNull()) {
379
+ <a name="l00354"></a>00354 <span class="keywordtype">string</span> message;
380
+ <a name="l00355"></a>00355 <span class="keyword">struct </span>rusage usage;
381
+ <a name="l00356"></a>00356
382
+ <a name="l00357"></a>00357 message.reserve(150);
383
+ <a name="l00358"></a>00358 message.append(<span class="stringliteral">&quot;BEGIN: &quot;</span>);
384
+ <a name="l00359"></a>00359 message.append(name);
385
+ <a name="l00360"></a>00360 message.append(<span class="stringliteral">&quot; (&quot;</span>);
386
+ <a name="l00361"></a>00361 message.append(usecToString(SystemTime::getUsec()));
387
+ <a name="l00362"></a>00362 message.append(<span class="stringliteral">&quot;,&quot;</span>);
388
+ <a name="l00363"></a>00363 <span class="keywordflow">if</span> (getrusage(RUSAGE_SELF, &amp;usage) == -1) {
389
+ <a name="l00364"></a>00364 <span class="keywordtype">int</span> e = errno;
390
+ <a name="l00365"></a>00365 <span class="keywordflow">throw</span> SystemException(<span class="stringliteral">&quot;getrusage() failed&quot;</span>, e);
391
+ <a name="l00366"></a>00366 }
392
+ <a name="l00367"></a>00367 message.append(timevalToString(usage.ru_utime));
393
+ <a name="l00368"></a>00368 message.append(<span class="stringliteral">&quot;,&quot;</span>);
394
+ <a name="l00369"></a>00369 message.append(timevalToString(usage.ru_stime));
395
+ <a name="l00370"></a>00370 message.append(<span class="stringliteral">&quot;) &quot;</span>);
396
+ <a name="l00371"></a>00371 log-&gt;message(message);
397
+ <a name="l00372"></a>00372 }
398
+ <a name="l00373"></a>00373 }
399
+ <a name="l00374"></a>00374
400
+ <a name="l00375"></a>00375 AnalyticsScopeLog(<span class="keyword">const</span> AnalyticsLogPtr &amp;log, <span class="keyword">const</span> <span class="keywordtype">char</span> *beginMessage,
401
+ <a name="l00376"></a>00376 <span class="keyword">const</span> <span class="keywordtype">char</span> *endMessage, <span class="keyword">const</span> <span class="keywordtype">char</span> *abortMessage = NULL
402
+ <a name="l00377"></a>00377 ) {
403
+ <a name="l00378"></a>00378 this-&gt;log = log.get();
404
+ <a name="l00379"></a>00379 <span class="keywordflow">if</span> (log != NULL) {
405
+ <a name="l00380"></a>00380 type = GRANULAR;
406
+ <a name="l00381"></a>00381 data.granular.endMessage = endMessage;
407
+ <a name="l00382"></a>00382 data.granular.abortMessage = abortMessage;
408
+ <a name="l00383"></a>00383 ok = abortMessage == NULL;
409
+ <a name="l00384"></a>00384 log-&gt;message(beginMessage);
410
+ <a name="l00385"></a>00385 }
411
+ <a name="l00386"></a>00386 }
412
+ <a name="l00387"></a>00387
413
+ <a name="l00388"></a>00388 ~AnalyticsScopeLog() {
414
+ <a name="l00389"></a>00389 <span class="keywordflow">if</span> (log == NULL) {
415
+ <a name="l00390"></a>00390 <span class="keywordflow">return</span>;
416
+ <a name="l00391"></a>00391 }
417
+ <a name="l00392"></a>00392 <span class="keywordflow">if</span> (type == NAME) {
418
+ <a name="l00393"></a>00393 <span class="keywordflow">if</span> (!log-&gt;isNull()) {
419
+ <a name="l00394"></a>00394 <span class="keywordtype">string</span> message;
420
+ <a name="l00395"></a>00395 <span class="keyword">struct </span>rusage usage;
421
+ <a name="l00396"></a>00396
422
+ <a name="l00397"></a>00397 message.reserve(150);
423
+ <a name="l00398"></a>00398 <span class="keywordflow">if</span> (ok) {
424
+ <a name="l00399"></a>00399 message.append(<span class="stringliteral">&quot;END: &quot;</span>);
425
+ <a name="l00400"></a>00400 } <span class="keywordflow">else</span> {
426
+ <a name="l00401"></a>00401 message.append(<span class="stringliteral">&quot;FAIL: &quot;</span>);
427
+ <a name="l00402"></a>00402 }
428
+ <a name="l00403"></a>00403 message.append(data.name);
429
+ <a name="l00404"></a>00404 message.append(<span class="stringliteral">&quot; (&quot;</span>);
430
+ <a name="l00405"></a>00405 message.append(usecToString(SystemTime::getUsec()));
431
+ <a name="l00406"></a>00406 message.append(<span class="stringliteral">&quot;,&quot;</span>);
432
+ <a name="l00407"></a>00407 <span class="keywordflow">if</span> (getrusage(RUSAGE_SELF, &amp;usage) == -1) {
433
+ <a name="l00408"></a>00408 <span class="keywordtype">int</span> e = errno;
434
+ <a name="l00409"></a>00409 <span class="keywordflow">throw</span> SystemException(<span class="stringliteral">&quot;getrusage() failed&quot;</span>, e);
435
+ <a name="l00410"></a>00410 }
436
+ <a name="l00411"></a>00411 message.append(timevalToString(usage.ru_utime));
437
+ <a name="l00412"></a>00412 message.append(<span class="stringliteral">&quot;,&quot;</span>);
438
+ <a name="l00413"></a>00413 message.append(timevalToString(usage.ru_stime));
439
+ <a name="l00414"></a>00414 message.append(<span class="stringliteral">&quot;)&quot;</span>);
440
+ <a name="l00415"></a>00415 log-&gt;message(message);
441
+ <a name="l00416"></a>00416 }
442
+ <a name="l00417"></a>00417 } <span class="keywordflow">else</span> {
443
+ <a name="l00418"></a>00418 <span class="keywordflow">if</span> (ok) {
444
+ <a name="l00419"></a>00419 log-&gt;message(data.granular.endMessage);
445
+ <a name="l00420"></a>00420 } <span class="keywordflow">else</span> {
446
+ <a name="l00421"></a>00421 log-&gt;message(data.granular.abortMessage);
447
+ <a name="l00422"></a>00422 }
448
+ <a name="l00423"></a>00423 }
449
+ <a name="l00424"></a>00424 }
450
+ <a name="l00425"></a>00425
451
+ <a name="l00426"></a>00426 <span class="keywordtype">void</span> success() {
452
+ <a name="l00427"></a>00427 ok = <span class="keyword">true</span>;
453
+ <a name="l00428"></a>00428 }
454
+ <a name="l00429"></a>00429 };
455
+ <a name="l00430"></a>00430
456
+ <a name="l00431"></a>00431 <span class="keyword">class </span>AnalyticsLogger {
457
+ <a name="l00432"></a>00432 <span class="keyword">private</span>:
458
+ <a name="l00433"></a>00433 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> RETRY_SLEEP = 200000; <span class="comment">// microseconds</span>
459
+ <a name="l00434"></a>00434
460
+ <a name="l00435"></a>00435 <span class="keywordtype">string</span> serverAddress;
461
+ <a name="l00436"></a>00436 <span class="keywordtype">string</span> username;
462
+ <a name="l00437"></a>00437 <span class="keywordtype">string</span> password;
463
+ <a name="l00438"></a>00438 <span class="keywordtype">string</span> nodeName;
464
+ <a name="l00439"></a>00439 RandomGenerator randomGenerator;
465
+ <a name="l00440"></a>00440 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxConnectTries;
466
+ <a name="l00441"></a>00441 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> reconnectTimeout;
467
+ <a name="l00442"></a>00442 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> nextReconnectTime;
468
+ <a name="l00443"></a>00443 <span class="comment"></span>
469
+ <a name="l00444"></a>00444 <span class="comment"> /** @invariant sharedData != NULL */</span>
470
+ <a name="l00445"></a>00445 AnalyticsLoggerSharedDataPtr sharedData;
471
+ <a name="l00446"></a>00446
472
+ <a name="l00447"></a>00447 <span class="keywordtype">bool</span> connected()<span class="keyword"> const </span>{
473
+ <a name="l00448"></a>00448 <span class="keywordflow">return</span> sharedData-&gt;client.connected();
474
+ <a name="l00449"></a>00449 }
475
+ <a name="l00450"></a>00450
476
+ <a name="l00451"></a>00451 <span class="keywordtype">void</span> connect() {
477
+ <a name="l00452"></a>00452 TRACE_POINT();
478
+ <a name="l00453"></a>00453 vector&lt;string&gt; args;
479
+ <a name="l00454"></a>00454
480
+ <a name="l00455"></a>00455 sharedData-&gt;client.connect(serverAddress, username, password);
481
+ <a name="l00456"></a>00456 sharedData-&gt;client.write(<span class="stringliteral">&quot;init&quot;</span>, nodeName.c_str(), NULL);
482
+ <a name="l00457"></a>00457 <span class="keywordflow">if</span> (!sharedData-&gt;client.read(args)) {
483
+ <a name="l00458"></a>00458 <span class="keywordflow">throw</span> SystemException(<span class="stringliteral">&quot;Cannot connect to logging server&quot;</span>, ECONNREFUSED);
484
+ <a name="l00459"></a>00459 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (args.size() != 1) {
485
+ <a name="l00460"></a>00460 <span class="keywordflow">throw</span> IOException(<span class="stringliteral">&quot;Logging server returned an invalid reply for the &#39;init&#39; command&quot;</span>);
486
+ <a name="l00461"></a>00461 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (args[0] == <span class="stringliteral">&quot;server shutting down&quot;</span>) {
487
+ <a name="l00462"></a>00462 <span class="keywordflow">throw</span> SystemException(<span class="stringliteral">&quot;Cannot connect to server&quot;</span>, ECONNREFUSED);
488
+ <a name="l00463"></a>00463 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (args[0] != <span class="stringliteral">&quot;ok&quot;</span>) {
489
+ <a name="l00464"></a>00464 <span class="keywordflow">throw</span> IOException(<span class="stringliteral">&quot;Logging server returned an invalid reply for the &#39;init&#39; command&quot;</span>);
490
+ <a name="l00465"></a>00465 }
491
+ <a name="l00466"></a>00466
492
+ <a name="l00467"></a>00467 <span class="comment">// Upon a write() error we want to attempt to read() the error</span>
493
+ <a name="l00468"></a>00468 <span class="comment">// message before closing the socket.</span>
494
+ <a name="l00469"></a>00469 sharedData-&gt;client.setAutoDisconnect(<span class="keyword">false</span>);
495
+ <a name="l00470"></a>00470 }
496
+ <a name="l00471"></a>00471
497
+ <a name="l00472"></a>00472 <span class="keywordtype">void</span> disconnect(<span class="keywordtype">bool</span> checkErrorResponse = <span class="keyword">false</span>) {
498
+ <a name="l00473"></a>00473 sharedData-&gt;disconnect(checkErrorResponse);
499
+ <a name="l00474"></a>00474 <span class="comment">// We create a new SharedData here so that existing AnalyticsLog</span>
500
+ <a name="l00475"></a>00475 <span class="comment">// objects still refer to the old client object and don&#39;t interfere</span>
501
+ <a name="l00476"></a>00476 <span class="comment">// with any newly-established connections.</span>
502
+ <a name="l00477"></a>00477 sharedData.reset(<span class="keyword">new</span> AnalyticsLoggerSharedData());
503
+ <a name="l00478"></a>00478 }
504
+ <a name="l00479"></a>00479
505
+ <a name="l00480"></a>00480 <span class="keywordtype">bool</span> isNetworkError(<span class="keywordtype">int</span> code)<span class="keyword"> const </span>{
506
+ <a name="l00481"></a>00481 <span class="keywordflow">return</span> code == EPIPE || code == ECONNREFUSED || code == ECONNRESET
507
+ <a name="l00482"></a>00482 || code == EHOSTUNREACH || code == ENETDOWN || code == ENETUNREACH
508
+ <a name="l00483"></a>00483 || code == ETIMEDOUT;
509
+ <a name="l00484"></a>00484 }
510
+ <a name="l00485"></a>00485
511
+ <a name="l00486"></a>00486 <span class="keyword">public</span>:
512
+ <a name="l00487"></a>00487 AnalyticsLogger() { }
513
+ <a name="l00488"></a>00488
514
+ <a name="l00489"></a>00489 AnalyticsLogger(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;serverAddress, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;username,
515
+ <a name="l00490"></a>00490 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;password, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;nodeName = <span class="stringliteral">&quot;&quot;</span>)
516
+ <a name="l00491"></a>00491 {
517
+ <a name="l00492"></a>00492 this-&gt;serverAddress = serverAddress;
518
+ <a name="l00493"></a>00493 this-&gt;username = username;
519
+ <a name="l00494"></a>00494 this-&gt;password = password;
520
+ <a name="l00495"></a>00495 <span class="keywordflow">if</span> (nodeName.empty()) {
521
+ <a name="l00496"></a>00496 this-&gt;nodeName = <a class="code" href="namespacePassenger.html#a1d0a66b0e207c46dc6124ff3b2f331e6" title="Returns the system&amp;#39;s host name.">getHostName</a>();
522
+ <a name="l00497"></a>00497 } <span class="keywordflow">else</span> {
523
+ <a name="l00498"></a>00498 this-&gt;nodeName = nodeName;
524
+ <a name="l00499"></a>00499 }
525
+ <a name="l00500"></a>00500 <span class="keywordflow">if</span> (!serverAddress.empty()) {
526
+ <a name="l00501"></a>00501 sharedData.reset(<span class="keyword">new</span> AnalyticsLoggerSharedData());
527
+ <a name="l00502"></a>00502 }
528
+ <a name="l00503"></a>00503 <span class="keywordflow">if</span> (isLocalSocketAddress(serverAddress)) {
529
+ <a name="l00504"></a>00504 maxConnectTries = 10;
530
+ <a name="l00505"></a>00505 } <span class="keywordflow">else</span> {
531
+ <a name="l00506"></a>00506 maxConnectTries = 1;
532
+ <a name="l00507"></a>00507 }
533
+ <a name="l00508"></a>00508 maxConnectTries = 10;
534
+ <a name="l00509"></a>00509 reconnectTimeout = 60 * 1000000;
535
+ <a name="l00510"></a>00510 nextReconnectTime = 0;
536
+ <a name="l00511"></a>00511 }
537
+ <a name="l00512"></a>00512
538
+ <a name="l00513"></a>00513 AnalyticsLogPtr newTransaction(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;groupName, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;category = <span class="stringliteral">&quot;requests&quot;</span>,
539
+ <a name="l00514"></a>00514 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;unionStationKey = <span class="keywordtype">string</span>())
540
+ <a name="l00515"></a>00515 {
541
+ <a name="l00516"></a>00516 <span class="keywordflow">if</span> (serverAddress.empty()) {
542
+ <a name="l00517"></a>00517 <span class="keywordflow">return</span> <a class="code" href="group__Support.html#ga41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(<span class="keyword">new</span> AnalyticsLog());
543
+ <a name="l00518"></a>00518 }
544
+ <a name="l00519"></a>00519
545
+ <a name="l00520"></a>00520 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> timestamp = SystemTime::getUsec();
546
+ <a name="l00521"></a>00521 <span class="keywordtype">char</span> txnId[
547
+ <a name="l00522"></a>00522 2 * <span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> int) + <span class="comment">// max hex timestamp size</span>
548
+ <a name="l00523"></a>00523 11 + <span class="comment">// space for a random identifier</span>
549
+ <a name="l00524"></a>00524 1 <span class="comment">// null terminator</span>
550
+ <a name="l00525"></a>00525 ];
551
+ <a name="l00526"></a>00526 <span class="keywordtype">char</span> *end;
552
+ <a name="l00527"></a>00527 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> timestampSize;
553
+ <a name="l00528"></a>00528 <span class="keywordtype">char</span> timestampStr[2 * <span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> long) + 1];
554
+ <a name="l00529"></a>00529
555
+ <a name="l00530"></a>00530 <span class="comment">// &quot;[timestamp]&quot;</span>
556
+ <a name="l00531"></a>00531 <span class="comment">// Our timestamp is like a Unix timestamp but with minutes</span>
557
+ <a name="l00532"></a>00532 <span class="comment">// resolution instead of seconds. 32 bits will last us for</span>
558
+ <a name="l00533"></a>00533 <span class="comment">// about 8000 years.</span>
559
+ <a name="l00534"></a>00534 timestampSize = integerToHexatri&lt;unsigned int&gt;(timestamp / 1000000 / 60,
560
+ <a name="l00535"></a>00535 txnId);
561
+ <a name="l00536"></a>00536 end = txnId + timestampSize;
562
+ <a name="l00537"></a>00537
563
+ <a name="l00538"></a>00538 <span class="comment">// &quot;[timestamp]-&quot;</span>
564
+ <a name="l00539"></a>00539 *end = <span class="charliteral">&#39;-&#39;</span>;
565
+ <a name="l00540"></a>00540 end++;
566
+ <a name="l00541"></a>00541
567
+ <a name="l00542"></a>00542 <span class="comment">// &quot;[timestamp]-[random id]&quot;</span>
568
+ <a name="l00543"></a>00543 randomGenerator.generateAsciiString(end, 11);
569
+ <a name="l00544"></a>00544 end += 11;
570
+ <a name="l00545"></a>00545 *end = <span class="charliteral">&#39;\0&#39;</span>;
571
+ <a name="l00546"></a>00546
572
+ <a name="l00547"></a>00547 integerToHexatri&lt;unsigned long long&gt;(timestamp, timestampStr);
573
+ <a name="l00548"></a>00548
574
+ <a name="l00549"></a>00549 lock_guard&lt;boost::mutex&gt; l(sharedData-&gt;lock);
575
+ <a name="l00550"></a>00550
576
+ <a name="l00551"></a>00551 <span class="keywordflow">if</span> (SystemTime::getUsec() &gt;= nextReconnectTime) {
577
+ <a name="l00552"></a>00552 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tryCount = 0;
578
+ <a name="l00553"></a>00553
579
+ <a name="l00554"></a>00554 <span class="keywordflow">while</span> (tryCount &lt; maxConnectTries) {
580
+ <a name="l00555"></a>00555 <span class="keywordflow">try</span> {
581
+ <a name="l00556"></a>00556 <span class="keywordflow">if</span> (!connected()) {
582
+ <a name="l00557"></a>00557 TRACE_POINT();
583
+ <a name="l00558"></a>00558 connect();
584
+ <a name="l00559"></a>00559 }
585
+ <a name="l00560"></a>00560 sharedData-&gt;client.write(<span class="stringliteral">&quot;openTransaction&quot;</span>,
586
+ <a name="l00561"></a>00561 txnId,
587
+ <a name="l00562"></a>00562 groupName.c_str(),
588
+ <a name="l00563"></a>00563 <span class="stringliteral">&quot;&quot;</span>,
589
+ <a name="l00564"></a>00564 category.c_str(),
590
+ <a name="l00565"></a>00565 timestampStr,
591
+ <a name="l00566"></a>00566 unionStationKey.c_str(),
592
+ <a name="l00567"></a>00567 <span class="stringliteral">&quot;true&quot;</span>,
593
+ <a name="l00568"></a>00568 NULL);
594
+ <a name="l00569"></a>00569 <span class="keywordflow">return</span> <a class="code" href="group__Support.html#ga41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(<span class="keyword">new</span> AnalyticsLog(sharedData,
595
+ <a name="l00570"></a>00570 <span class="keywordtype">string</span>(txnId, end - txnId),
596
+ <a name="l00571"></a>00571 groupName, category,
597
+ <a name="l00572"></a>00572 unionStationKey));
598
+ <a name="l00573"></a>00573 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;e) {
599
+ <a name="l00574"></a>00574 TRACE_POINT();
600
+ <a name="l00575"></a>00575 <span class="keywordflow">if</span> (e.code() == ENOENT || isNetworkError(e.code())) {
601
+ <a name="l00576"></a>00576 tryCount++;
602
+ <a name="l00577"></a>00577 disconnect(<span class="keyword">true</span>);
603
+ <a name="l00578"></a>00578 <span class="keywordflow">if</span> (tryCount &lt; maxConnectTries) {
604
+ <a name="l00579"></a>00579 syscalls::usleep(RETRY_SLEEP);
605
+ <a name="l00580"></a>00580 }
606
+ <a name="l00581"></a>00581 } <span class="keywordflow">else</span> {
607
+ <a name="l00582"></a>00582 disconnect();
608
+ <a name="l00583"></a>00583 <span class="keywordflow">throw</span>;
609
+ <a name="l00584"></a>00584 }
610
+ <a name="l00585"></a>00585 }
611
+ <a name="l00586"></a>00586
612
+ <a name="l00587"></a>00587 <span class="comment">// Failed to connect.</span>
613
+ <a name="l00588"></a>00588 P_WARN(<span class="stringliteral">&quot;Cannot connect to the logging agent (&quot;</span> &lt;&lt; serverAddress &lt;&lt; <span class="stringliteral">&quot;); &quot;</span> &lt;&lt;
614
+ <a name="l00589"></a>00589 <span class="stringliteral">&quot;retrying in &quot;</span> &lt;&lt; reconnectTimeout / 1000000 &lt;&lt; <span class="stringliteral">&quot; seconds.&quot;</span>);
615
+ <a name="l00590"></a>00590 nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
616
+ <a name="l00591"></a>00591 }
617
+ <a name="l00592"></a>00592 }
618
+ <a name="l00593"></a>00593 <span class="keywordflow">return</span> <a class="code" href="group__Support.html#ga41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(<span class="keyword">new</span> AnalyticsLog());
619
+ <a name="l00594"></a>00594 }
620
+ <a name="l00595"></a>00595
621
+ <a name="l00596"></a>00596 AnalyticsLogPtr continueTransaction(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;txnId, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;groupName,
622
+ <a name="l00597"></a>00597 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;category = <span class="stringliteral">&quot;requests&quot;</span>, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;unionStationKey = <span class="keywordtype">string</span>())
623
+ <a name="l00598"></a>00598 {
624
+ <a name="l00599"></a>00599 <span class="keywordflow">if</span> (serverAddress.empty() || txnId.empty()) {
625
+ <a name="l00600"></a>00600 <span class="keywordflow">return</span> <a class="code" href="group__Support.html#ga41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(<span class="keyword">new</span> AnalyticsLog());
626
+ <a name="l00601"></a>00601 }
627
+ <a name="l00602"></a>00602
628
+ <a name="l00603"></a>00603 <span class="keywordtype">char</span> timestampStr[2 * <span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> long) + 1];
629
+ <a name="l00604"></a>00604 integerToHexatri&lt;unsigned long long&gt;(SystemTime::getUsec(), timestampStr);
630
+ <a name="l00605"></a>00605
631
+ <a name="l00606"></a>00606 lock_guard&lt;boost::mutex&gt; l(sharedData-&gt;lock);
632
+ <a name="l00607"></a>00607
633
+ <a name="l00608"></a>00608 <span class="keywordflow">if</span> (SystemTime::getUsec() &gt;= nextReconnectTime) {
634
+ <a name="l00609"></a>00609 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tryCount = 0;
635
+ <a name="l00610"></a>00610
636
+ <a name="l00611"></a>00611 <span class="keywordflow">while</span> (tryCount &lt; maxConnectTries) {
637
+ <a name="l00612"></a>00612 <span class="keywordflow">try</span> {
638
+ <a name="l00613"></a>00613 <span class="keywordflow">if</span> (!connected()) {
639
+ <a name="l00614"></a>00614 TRACE_POINT();
640
+ <a name="l00615"></a>00615 connect();
641
+ <a name="l00616"></a>00616 }
642
+ <a name="l00617"></a>00617 sharedData-&gt;client.write(<span class="stringliteral">&quot;openTransaction&quot;</span>,
643
+ <a name="l00618"></a>00618 txnId.c_str(),
644
+ <a name="l00619"></a>00619 groupName.c_str(),
645
+ <a name="l00620"></a>00620 <span class="stringliteral">&quot;&quot;</span>,
646
+ <a name="l00621"></a>00621 category.c_str(),
647
+ <a name="l00622"></a>00622 timestampStr,
648
+ <a name="l00623"></a>00623 unionStationKey.c_str(),
649
+ <a name="l00624"></a>00624 <span class="stringliteral">&quot;true&quot;</span>,
650
+ <a name="l00625"></a>00625 NULL);
651
+ <a name="l00626"></a>00626 <span class="keywordflow">return</span> <a class="code" href="group__Support.html#ga41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(<span class="keyword">new</span> AnalyticsLog(sharedData,
652
+ <a name="l00627"></a>00627 txnId, groupName, category,
653
+ <a name="l00628"></a>00628 unionStationKey));
654
+ <a name="l00629"></a>00629 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;e) {
655
+ <a name="l00630"></a>00630 TRACE_POINT();
656
+ <a name="l00631"></a>00631 <span class="keywordflow">if</span> (e.code() == EPIPE || isNetworkError(e.code())) {
657
+ <a name="l00632"></a>00632 tryCount++;
658
+ <a name="l00633"></a>00633 disconnect(<span class="keyword">true</span>);
659
+ <a name="l00634"></a>00634 <span class="keywordflow">if</span> (tryCount &lt; maxConnectTries) {
660
+ <a name="l00635"></a>00635 syscalls::usleep(RETRY_SLEEP);
661
+ <a name="l00636"></a>00636 }
662
+ <a name="l00637"></a>00637 } <span class="keywordflow">else</span> {
663
+ <a name="l00638"></a>00638 disconnect();
664
+ <a name="l00639"></a>00639 <span class="keywordflow">throw</span>;
665
+ <a name="l00640"></a>00640 }
666
+ <a name="l00641"></a>00641 }
667
+ <a name="l00642"></a>00642 }
668
+ <a name="l00643"></a>00643
669
+ <a name="l00644"></a>00644 <span class="comment">// Failed to connect.</span>
670
+ <a name="l00645"></a>00645 P_WARN(<span class="stringliteral">&quot;Cannot connect to the logging agent (&quot;</span> &lt;&lt; serverAddress &lt;&lt; <span class="stringliteral">&quot;); &quot;</span> &lt;&lt;
671
+ <a name="l00646"></a>00646 <span class="stringliteral">&quot;retrying in &quot;</span> &lt;&lt; reconnectTimeout / 1000000 &lt;&lt; <span class="stringliteral">&quot; seconds.&quot;</span>);
672
+ <a name="l00647"></a>00647 nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
673
+ <a name="l00648"></a>00648 }
674
+ <a name="l00649"></a>00649 <span class="keywordflow">return</span> <a class="code" href="group__Support.html#ga41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(<span class="keyword">new</span> AnalyticsLog());
675
+ <a name="l00650"></a>00650 }
676
+ <a name="l00651"></a>00651
677
+ <a name="l00652"></a>00652 <span class="keywordtype">void</span> setMaxConnectTries(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> value) {
678
+ <a name="l00653"></a>00653 lock_guard&lt;boost::mutex&gt; l(sharedData-&gt;lock);
679
+ <a name="l00654"></a>00654 maxConnectTries = value;
680
+ <a name="l00655"></a>00655 }
681
+ <a name="l00656"></a>00656
682
+ <a name="l00657"></a>00657 <span class="keywordtype">void</span> setReconnectTimeout(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> usec) {
683
+ <a name="l00658"></a>00658 lock_guard&lt;boost::mutex&gt; l(sharedData-&gt;lock);
684
+ <a name="l00659"></a>00659 reconnectTimeout = usec;
685
+ <a name="l00660"></a>00660 }
686
+ <a name="l00661"></a>00661
687
+ <a name="l00662"></a>00662 <span class="keywordtype">bool</span> isNull()<span class="keyword"> const </span>{
688
+ <a name="l00663"></a>00663 <span class="keywordflow">return</span> serverAddress.empty();
689
+ <a name="l00664"></a>00664 }
690
+ <a name="l00665"></a>00665
691
+ <a name="l00666"></a>00666 <span class="keywordtype">string</span> getAddress()<span class="keyword"> const </span>{
692
+ <a name="l00667"></a>00667 <span class="keywordflow">return</span> serverAddress;
693
+ <a name="l00668"></a>00668 }
694
+ <a name="l00669"></a>00669
695
+ <a name="l00670"></a>00670 <span class="keywordtype">string</span> getUsername()<span class="keyword"> const </span>{
696
+ <a name="l00671"></a>00671 <span class="keywordflow">return</span> username;
697
+ <a name="l00672"></a>00672 }
698
+ <a name="l00673"></a>00673
699
+ <a name="l00674"></a>00674 <span class="keywordtype">string</span> getPassword()<span class="keyword"> const </span>{
700
+ <a name="l00675"></a>00675 <span class="keywordflow">return</span> password;
701
+ <a name="l00676"></a>00676 }
702
+ <a name="l00677"></a>00677
703
+ <a name="l00678"></a>00678 FileDescriptor getConnection()<span class="keyword"> const </span>{
704
+ <a name="l00679"></a>00679 <span class="keywordflow">return</span> sharedData-&gt;client.getConnection();
705
+ <a name="l00680"></a>00680 }
706
+ <a name="l00681"></a>00681 <span class="comment"></span>
707
+ <a name="l00682"></a>00682 <span class="comment"> /**</span>
708
+ <a name="l00683"></a>00683 <span class="comment"> * @post !result.empty()</span>
709
+ <a name="l00684"></a>00684 <span class="comment"> */</span>
710
+ <a name="l00685"></a>00685 <span class="keywordtype">string</span> getNodeName()<span class="keyword"> const </span>{
711
+ <a name="l00686"></a>00686 <span class="keywordflow">return</span> nodeName;
712
+ <a name="l00687"></a>00687 }
713
+ <a name="l00688"></a>00688 };
714
+ <a name="l00689"></a>00689
715
+ <a name="l00690"></a>00690 <span class="keyword">typedef</span> shared_ptr&lt;AnalyticsLogger&gt; AnalyticsLoggerPtr;
716
+ <a name="l00691"></a>00691
717
+ <a name="l00692"></a>00692 } <span class="comment">// namespace Passenger</span>
718
+ <a name="l00693"></a>00693
719
+ <a name="l00694"></a>00694 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_LOGGING_H_ */</span>
720
+ <a name="l00695"></a>00695
721
+ </pre></div></div>
722
+ <hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
723
+ <a href="http://www.doxygen.org/index.html">
724
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
725
+ </body>
726
+ </html>