passenger 3.0.4 → 3.0.5

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 (571) hide show
  1. data/NEWS +27 -0
  2. data/build/common_library.rb +4 -0
  3. data/doc/ApplicationPool algorithm.txt +1 -1
  4. data/doc/cxxapi/AbstractSpawnManager_8h_source.html +141 -0
  5. data/doc/cxxapi/Account_8h_source.html +206 -0
  6. data/doc/cxxapi/AccountsDatabase_8h_source.html +161 -0
  7. data/doc/cxxapi/AgentBase_8h_source.html +70 -0
  8. data/doc/cxxapi/AgentsStarter_8h_source.html +112 -0
  9. data/doc/cxxapi/BCrypt_8h_source.html +104 -0
  10. data/doc/cxxapi/Blowfish_8h_source.html +134 -0
  11. data/doc/cxxapi/Bucket_8h_source.html +118 -0
  12. data/doc/cxxapi/Constants_8h_source.html +79 -0
  13. data/doc/cxxapi/ContentHandler_8h_source.html +95 -0
  14. data/doc/cxxapi/DirectoryMapper_8h_source.html +311 -0
  15. data/doc/cxxapi/EventedClient_8h_source.html +733 -0
  16. data/doc/cxxapi/EventedMessageServer_8h_source.html +358 -0
  17. data/doc/cxxapi/EventedServer_8h_source.html +326 -0
  18. data/doc/cxxapi/Exceptions_8h_source.html +393 -0
  19. data/doc/cxxapi/FileDescriptor_8h_source.html +324 -0
  20. data/doc/cxxapi/Hooks_8h_source.html +76 -0
  21. data/doc/cxxapi/HttpStatusExtractor_8h_source.html +382 -0
  22. data/doc/cxxapi/IniFile_8h_source.html +527 -0
  23. data/doc/cxxapi/Logging_8h_source.html +796 -0
  24. data/doc/cxxapi/MessageChannel_8h_source.html +776 -0
  25. data/doc/cxxapi/MessageClient_8h_source.html +328 -0
  26. data/doc/cxxapi/MessageReadersWriters_8h_source.html +539 -0
  27. data/doc/cxxapi/MessageServer_8h_source.html +612 -0
  28. data/doc/cxxapi/PoolOptions_8h_source.html +549 -0
  29. data/doc/cxxapi/Process_8h_source.html +286 -0
  30. data/doc/cxxapi/RandomGenerator_8h_source.html +191 -0
  31. data/doc/cxxapi/ResourceLocator_8h_source.html +166 -0
  32. data/doc/cxxapi/SafeLibev_8h_source.html +180 -0
  33. data/doc/cxxapi/ScgiRequestParser_8h_source.html +406 -0
  34. data/doc/cxxapi/ServerInstanceDir_8h_source.html +378 -0
  35. data/doc/cxxapi/Session_8h_source.html +501 -0
  36. data/doc/cxxapi/SpawnManager_8h_source.html +647 -0
  37. data/doc/cxxapi/StaticContentHandler_8h_source.html +68 -0
  38. data/doc/cxxapi/StaticString_8h_source.html +329 -0
  39. data/doc/cxxapi/StringListCreator_8h_source.html +114 -0
  40. data/doc/cxxapi/Utils_8h_source.html +459 -0
  41. data/doc/cxxapi/annotated.html +87 -0
  42. data/doc/cxxapi/apache2_2Configuration_8h_source.html +82 -0
  43. data/doc/cxxapi/classAgentWatcher-members.html +54 -0
  44. data/doc/cxxapi/classAgentWatcher.html +419 -0
  45. data/doc/cxxapi/classClient-members.html +38 -0
  46. data/doc/cxxapi/classClient.html +123 -0
  47. data/doc/cxxapi/classHooks-members.html +40 -0
  48. data/doc/cxxapi/classHooks.html +153 -0
  49. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +40 -0
  50. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +187 -0
  51. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.map +3 -0
  52. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.md5 +1 -0
  53. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.png +0 -0
  54. data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +36 -0
  55. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +56 -0
  56. data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +37 -0
  57. data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +113 -0
  58. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +38 -0
  59. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +112 -0
  60. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +36 -0
  61. data/doc/cxxapi/classPassenger_1_1BusyException.html +54 -0
  62. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +36 -0
  63. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +51 -0
  64. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +41 -0
  65. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +223 -0
  66. data/doc/cxxapi/classPassenger_1_1EOFException-members.html +36 -0
  67. data/doc/cxxapi/classPassenger_1_1EOFException.html +61 -0
  68. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.map +3 -0
  69. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.md5 +1 -0
  70. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.png +0 -0
  71. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +36 -0
  72. data/doc/cxxapi/classPassenger_1_1EventFd.html +52 -0
  73. data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +59 -0
  74. data/doc/cxxapi/classPassenger_1_1EventedClient.html +531 -0
  75. data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +37 -0
  76. data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +59 -0
  77. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +3 -0
  78. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +1 -0
  79. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
  80. data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +37 -0
  81. data/doc/cxxapi/classPassenger_1_1EventedServer.html +93 -0
  82. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +3 -0
  83. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +1 -0
  84. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
  85. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +41 -0
  86. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +178 -0
  87. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +36 -0
  88. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +52 -0
  89. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +36 -0
  90. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +58 -0
  91. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.map +3 -0
  92. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.md5 +1 -0
  93. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  94. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +41 -0
  95. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +66 -0
  96. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.map +3 -0
  97. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.md5 +1 -0
  98. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  99. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +39 -0
  100. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +128 -0
  101. data/doc/cxxapi/classPassenger_1_1IOException-members.html +36 -0
  102. data/doc/cxxapi/classPassenger_1_1IOException.html +61 -0
  103. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +4 -0
  104. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +1 -0
  105. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  106. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +57 -0
  107. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +839 -0
  108. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +49 -0
  109. data/doc/cxxapi/classPassenger_1_1MessageServer.html +407 -0
  110. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +36 -0
  111. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +58 -0
  112. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +3 -0
  113. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +1 -0
  114. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
  115. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +41 -0
  116. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +165 -0
  117. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +3 -0
  118. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +1 -0
  119. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
  120. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +39 -0
  121. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +173 -0
  122. data/doc/cxxapi/classPassenger_1_1Process-members.html +44 -0
  123. data/doc/cxxapi/classPassenger_1_1Process.html +290 -0
  124. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +37 -0
  125. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +79 -0
  126. data/doc/cxxapi/classPassenger_1_1ResourceLocator-members.html +36 -0
  127. data/doc/cxxapi/classPassenger_1_1ResourceLocator.html +51 -0
  128. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +36 -0
  129. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +54 -0
  130. data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +36 -0
  131. data/doc/cxxapi/classPassenger_1_1SafeLibev.html +51 -0
  132. data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +37 -0
  133. data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +76 -0
  134. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +50 -0
  135. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +285 -0
  136. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +36 -0
  137. data/doc/cxxapi/classPassenger_1_1SecurityException.html +56 -0
  138. data/doc/cxxapi/classPassenger_1_1Session-members.html +53 -0
  139. data/doc/cxxapi/classPassenger_1_1Session.html +556 -0
  140. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.map +3 -0
  141. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.md5 +1 -0
  142. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.png +0 -0
  143. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +39 -0
  144. data/doc/cxxapi/classPassenger_1_1SpawnException.html +101 -0
  145. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +42 -0
  146. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +292 -0
  147. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.map +3 -0
  148. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.md5 +1 -0
  149. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.png +0 -0
  150. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +54 -0
  151. data/doc/cxxapi/classPassenger_1_1StandardSession.html +394 -0
  152. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.map +3 -0
  153. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.md5 +1 -0
  154. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.png +0 -0
  155. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +36 -0
  156. data/doc/cxxapi/classPassenger_1_1StaticString.html +56 -0
  157. data/doc/cxxapi/classPassenger_1_1SyntaxError-members.html +36 -0
  158. data/doc/cxxapi/classPassenger_1_1SyntaxError.html +54 -0
  159. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +40 -0
  160. data/doc/cxxapi/classPassenger_1_1SystemException.html +155 -0
  161. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +4 -0
  162. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +1 -0
  163. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  164. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +40 -0
  165. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +61 -0
  166. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.map +3 -0
  167. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.md5 +1 -0
  168. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.png +0 -0
  169. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +36 -0
  170. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +54 -0
  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 +36 -0
  176. data/doc/cxxapi/classServer.html +49 -0
  177. data/doc/cxxapi/classServerInstanceDirToucher-members.html +36 -0
  178. data/doc/cxxapi/classServerInstanceDirToucher.html +47 -0
  179. data/doc/cxxapi/classes.html +52 -0
  180. data/doc/cxxapi/definitions_8h_source.html +36 -0
  181. data/doc/cxxapi/doxygen.css +532 -0
  182. data/doc/cxxapi/doxygen.png +0 -0
  183. data/doc/cxxapi/files.html +76 -0
  184. data/doc/cxxapi/ftv2blank.png +0 -0
  185. data/doc/cxxapi/ftv2doc.png +0 -0
  186. data/doc/cxxapi/ftv2folderclosed.png +0 -0
  187. data/doc/cxxapi/ftv2folderopen.png +0 -0
  188. data/doc/cxxapi/ftv2lastnode.png +0 -0
  189. data/doc/cxxapi/ftv2link.png +0 -0
  190. data/doc/cxxapi/ftv2mlastnode.png +0 -0
  191. data/doc/cxxapi/ftv2mnode.png +0 -0
  192. data/doc/cxxapi/ftv2node.png +0 -0
  193. data/doc/cxxapi/ftv2plastnode.png +0 -0
  194. data/doc/cxxapi/ftv2pnode.png +0 -0
  195. data/doc/cxxapi/ftv2vertline.png +0 -0
  196. data/doc/cxxapi/functions.html +103 -0
  197. data/doc/cxxapi/functions_0x62.html +82 -0
  198. data/doc/cxxapi/functions_0x63.html +102 -0
  199. data/doc/cxxapi/functions_0x64.html +102 -0
  200. data/doc/cxxapi/functions_0x65.html +88 -0
  201. data/doc/cxxapi/functions_0x66.html +100 -0
  202. data/doc/cxxapi/functions_0x67.html +167 -0
  203. data/doc/cxxapi/functions_0x68.html +88 -0
  204. data/doc/cxxapi/functions_0x69.html +96 -0
  205. data/doc/cxxapi/functions_0x6b.html +80 -0
  206. data/doc/cxxapi/functions_0x6c.html +88 -0
  207. data/doc/cxxapi/functions_0x6d.html +88 -0
  208. data/doc/cxxapi/functions_0x6e.html +86 -0
  209. data/doc/cxxapi/functions_0x6f.html +94 -0
  210. data/doc/cxxapi/functions_0x70.html +94 -0
  211. data/doc/cxxapi/functions_0x72.html +110 -0
  212. data/doc/cxxapi/functions_0x73.html +171 -0
  213. data/doc/cxxapi/functions_0x74.html +85 -0
  214. data/doc/cxxapi/functions_0x75.html +85 -0
  215. data/doc/cxxapi/functions_0x77.html +92 -0
  216. data/doc/cxxapi/functions_0x7e.html +79 -0
  217. data/doc/cxxapi/functions_enum.html +49 -0
  218. data/doc/cxxapi/functions_eval.html +67 -0
  219. data/doc/cxxapi/functions_func.html +531 -0
  220. data/doc/cxxapi/functions_vars.html +278 -0
  221. data/doc/cxxapi/graph_legend.dot +22 -0
  222. data/doc/cxxapi/graph_legend.html +92 -0
  223. data/doc/cxxapi/graph_legend.png +0 -0
  224. data/doc/cxxapi/group__Core.html +46 -0
  225. data/doc/cxxapi/group__Core.map +3 -0
  226. data/doc/cxxapi/group__Core.png +0 -0
  227. data/doc/cxxapi/group__Exceptions.html +53 -0
  228. data/doc/cxxapi/group__Hooks.html +42 -0
  229. data/doc/cxxapi/group__Hooks.map +3 -0
  230. data/doc/cxxapi/group__Hooks.png +0 -0
  231. data/doc/cxxapi/group__Support.html +538 -0
  232. data/doc/cxxapi/hierarchy.html +101 -0
  233. data/doc/cxxapi/index.html +16 -0
  234. data/doc/cxxapi/inherit__graph__0.map +3 -0
  235. data/doc/cxxapi/inherit__graph__0.md5 +1 -0
  236. data/doc/cxxapi/inherit__graph__0.png +0 -0
  237. data/doc/cxxapi/inherit__graph__1.map +3 -0
  238. data/doc/cxxapi/inherit__graph__1.md5 +1 -0
  239. data/doc/cxxapi/inherit__graph__1.png +0 -0
  240. data/doc/cxxapi/inherit__graph__10.map +3 -0
  241. data/doc/cxxapi/inherit__graph__10.md5 +1 -0
  242. data/doc/cxxapi/inherit__graph__10.png +0 -0
  243. data/doc/cxxapi/inherit__graph__11.map +4 -0
  244. data/doc/cxxapi/inherit__graph__11.md5 +1 -0
  245. data/doc/cxxapi/inherit__graph__11.png +0 -0
  246. data/doc/cxxapi/inherit__graph__12.map +3 -0
  247. data/doc/cxxapi/inherit__graph__12.md5 +1 -0
  248. data/doc/cxxapi/inherit__graph__12.png +0 -0
  249. data/doc/cxxapi/inherit__graph__13.map +3 -0
  250. data/doc/cxxapi/inherit__graph__13.md5 +1 -0
  251. data/doc/cxxapi/inherit__graph__13.png +0 -0
  252. data/doc/cxxapi/inherit__graph__14.map +3 -0
  253. data/doc/cxxapi/inherit__graph__14.md5 +1 -0
  254. data/doc/cxxapi/inherit__graph__14.png +0 -0
  255. data/doc/cxxapi/inherit__graph__15.map +3 -0
  256. data/doc/cxxapi/inherit__graph__15.md5 +1 -0
  257. data/doc/cxxapi/inherit__graph__15.png +0 -0
  258. data/doc/cxxapi/inherit__graph__16.map +5 -0
  259. data/doc/cxxapi/inherit__graph__16.md5 +1 -0
  260. data/doc/cxxapi/inherit__graph__16.png +0 -0
  261. data/doc/cxxapi/inherit__graph__17.map +3 -0
  262. data/doc/cxxapi/inherit__graph__17.md5 +1 -0
  263. data/doc/cxxapi/inherit__graph__17.png +0 -0
  264. data/doc/cxxapi/inherit__graph__18.map +3 -0
  265. data/doc/cxxapi/inherit__graph__18.md5 +1 -0
  266. data/doc/cxxapi/inherit__graph__18.png +0 -0
  267. data/doc/cxxapi/inherit__graph__19.map +4 -0
  268. data/doc/cxxapi/inherit__graph__19.md5 +1 -0
  269. data/doc/cxxapi/inherit__graph__19.png +0 -0
  270. data/doc/cxxapi/inherit__graph__2.map +3 -0
  271. data/doc/cxxapi/inherit__graph__2.md5 +1 -0
  272. data/doc/cxxapi/inherit__graph__2.png +0 -0
  273. data/doc/cxxapi/inherit__graph__20.map +3 -0
  274. data/doc/cxxapi/inherit__graph__20.md5 +1 -0
  275. data/doc/cxxapi/inherit__graph__20.png +0 -0
  276. data/doc/cxxapi/inherit__graph__21.map +3 -0
  277. data/doc/cxxapi/inherit__graph__21.md5 +1 -0
  278. data/doc/cxxapi/inherit__graph__21.png +0 -0
  279. data/doc/cxxapi/inherit__graph__22.map +3 -0
  280. data/doc/cxxapi/inherit__graph__22.md5 +1 -0
  281. data/doc/cxxapi/inherit__graph__22.png +0 -0
  282. data/doc/cxxapi/inherit__graph__23.map +3 -0
  283. data/doc/cxxapi/inherit__graph__23.md5 +1 -0
  284. data/doc/cxxapi/inherit__graph__23.png +0 -0
  285. data/doc/cxxapi/inherit__graph__24.map +3 -0
  286. data/doc/cxxapi/inherit__graph__24.md5 +1 -0
  287. data/doc/cxxapi/inherit__graph__24.png +0 -0
  288. data/doc/cxxapi/inherit__graph__25.map +3 -0
  289. data/doc/cxxapi/inherit__graph__25.md5 +1 -0
  290. data/doc/cxxapi/inherit__graph__25.png +0 -0
  291. data/doc/cxxapi/inherit__graph__26.map +3 -0
  292. data/doc/cxxapi/inherit__graph__26.md5 +1 -0
  293. data/doc/cxxapi/inherit__graph__26.png +0 -0
  294. data/doc/cxxapi/inherit__graph__27.map +3 -0
  295. data/doc/cxxapi/inherit__graph__27.md5 +1 -0
  296. data/doc/cxxapi/inherit__graph__27.png +0 -0
  297. data/doc/cxxapi/inherit__graph__28.map +3 -0
  298. data/doc/cxxapi/inherit__graph__28.md5 +1 -0
  299. data/doc/cxxapi/inherit__graph__28.png +0 -0
  300. data/doc/cxxapi/inherit__graph__29.map +3 -0
  301. data/doc/cxxapi/inherit__graph__29.md5 +1 -0
  302. data/doc/cxxapi/inherit__graph__29.png +0 -0
  303. data/doc/cxxapi/inherit__graph__3.map +4 -0
  304. data/doc/cxxapi/inherit__graph__3.md5 +1 -0
  305. data/doc/cxxapi/inherit__graph__3.png +0 -0
  306. data/doc/cxxapi/inherit__graph__30.map +3 -0
  307. data/doc/cxxapi/inherit__graph__30.md5 +1 -0
  308. data/doc/cxxapi/inherit__graph__30.png +0 -0
  309. data/doc/cxxapi/inherit__graph__31.map +4 -0
  310. data/doc/cxxapi/inherit__graph__31.md5 +1 -0
  311. data/doc/cxxapi/inherit__graph__31.png +0 -0
  312. data/doc/cxxapi/inherit__graph__32.map +3 -0
  313. data/doc/cxxapi/inherit__graph__32.md5 +1 -0
  314. data/doc/cxxapi/inherit__graph__32.png +0 -0
  315. data/doc/cxxapi/inherit__graph__33.map +3 -0
  316. data/doc/cxxapi/inherit__graph__33.md5 +1 -0
  317. data/doc/cxxapi/inherit__graph__33.png +0 -0
  318. data/doc/cxxapi/inherit__graph__34.map +3 -0
  319. data/doc/cxxapi/inherit__graph__34.md5 +1 -0
  320. data/doc/cxxapi/inherit__graph__34.png +0 -0
  321. data/doc/cxxapi/inherit__graph__35.map +3 -0
  322. data/doc/cxxapi/inherit__graph__35.md5 +1 -0
  323. data/doc/cxxapi/inherit__graph__35.png +0 -0
  324. data/doc/cxxapi/inherit__graph__36.map +5 -0
  325. data/doc/cxxapi/inherit__graph__36.md5 +1 -0
  326. data/doc/cxxapi/inherit__graph__36.png +0 -0
  327. data/doc/cxxapi/inherit__graph__37.map +3 -0
  328. data/doc/cxxapi/inherit__graph__37.md5 +1 -0
  329. data/doc/cxxapi/inherit__graph__37.png +0 -0
  330. data/doc/cxxapi/inherit__graph__38.map +3 -0
  331. data/doc/cxxapi/inherit__graph__38.md5 +1 -0
  332. data/doc/cxxapi/inherit__graph__38.png +0 -0
  333. data/doc/cxxapi/inherit__graph__39.map +3 -0
  334. data/doc/cxxapi/inherit__graph__39.md5 +1 -0
  335. data/doc/cxxapi/inherit__graph__39.png +0 -0
  336. data/doc/cxxapi/inherit__graph__4.map +3 -0
  337. data/doc/cxxapi/inherit__graph__4.md5 +1 -0
  338. data/doc/cxxapi/inherit__graph__4.png +0 -0
  339. data/doc/cxxapi/inherit__graph__40.map +3 -0
  340. data/doc/cxxapi/inherit__graph__40.md5 +1 -0
  341. data/doc/cxxapi/inherit__graph__40.png +0 -0
  342. data/doc/cxxapi/inherit__graph__41.map +3 -0
  343. data/doc/cxxapi/inherit__graph__41.md5 +1 -0
  344. data/doc/cxxapi/inherit__graph__41.png +0 -0
  345. data/doc/cxxapi/inherit__graph__5.map +3 -0
  346. data/doc/cxxapi/inherit__graph__5.md5 +1 -0
  347. data/doc/cxxapi/inherit__graph__5.png +0 -0
  348. data/doc/cxxapi/inherit__graph__6.map +3 -0
  349. data/doc/cxxapi/inherit__graph__6.md5 +1 -0
  350. data/doc/cxxapi/inherit__graph__6.png +0 -0
  351. data/doc/cxxapi/inherit__graph__7.map +3 -0
  352. data/doc/cxxapi/inherit__graph__7.md5 +1 -0
  353. data/doc/cxxapi/inherit__graph__7.png +0 -0
  354. data/doc/cxxapi/inherit__graph__8.map +3 -0
  355. data/doc/cxxapi/inherit__graph__8.md5 +1 -0
  356. data/doc/cxxapi/inherit__graph__8.png +0 -0
  357. data/doc/cxxapi/inherit__graph__9.map +3 -0
  358. data/doc/cxxapi/inherit__graph__9.md5 +1 -0
  359. data/doc/cxxapi/inherit__graph__9.png +0 -0
  360. data/doc/cxxapi/inherits.html +165 -0
  361. data/doc/cxxapi/main.html +28 -0
  362. data/doc/cxxapi/modules.html +36 -0
  363. data/doc/cxxapi/namespacePassenger.html +553 -0
  364. data/doc/cxxapi/namespacemembers.html +135 -0
  365. data/doc/cxxapi/namespacemembers_enum.html +48 -0
  366. data/doc/cxxapi/namespacemembers_eval.html +57 -0
  367. data/doc/cxxapi/namespacemembers_func.html +111 -0
  368. data/doc/cxxapi/namespacemembers_type.html +54 -0
  369. data/doc/cxxapi/namespaces.html +37 -0
  370. data/doc/cxxapi/nginx_2Configuration_8h_source.html +126 -0
  371. data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +94 -0
  372. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +36 -0
  373. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +51 -0
  374. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +67 -0
  375. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +647 -0
  376. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +36 -0
  377. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +51 -0
  378. data/doc/cxxapi/tab_b.gif +0 -0
  379. data/doc/cxxapi/tab_l.gif +0 -0
  380. data/doc/cxxapi/tab_r.gif +0 -0
  381. data/doc/cxxapi/tabs.css +105 -0
  382. data/doc/cxxapi/tree.html +249 -0
  383. data/doc/rdoc/classes/ConditionVariable.html +215 -0
  384. data/doc/rdoc/classes/Exception.html +120 -0
  385. data/doc/rdoc/classes/GC.html +113 -0
  386. data/doc/rdoc/classes/IO.html +221 -0
  387. data/doc/rdoc/classes/PhusionPassenger.html +397 -0
  388. data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +180 -0
  389. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +647 -0
  390. data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +654 -0
  391. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/InvalidPassword.html +92 -0
  392. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +97 -0
  393. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +96 -0
  394. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +97 -0
  395. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +96 -0
  396. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +619 -0
  397. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +142 -0
  398. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats.html +368 -0
  399. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats/Process.html +231 -0
  400. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance.html +588 -0
  401. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/CorruptedDirectoryError.html +92 -0
  402. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/GenerationsAbsentError.html +92 -0
  403. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Group.html +147 -0
  404. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Process.html +279 -0
  405. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/RoleDeniedError.html +92 -0
  406. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/StaleDirectoryError.html +92 -0
  407. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Stats.html +123 -0
  408. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/UnsupportedGenerationStructureVersionError.html +92 -0
  409. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger.html +368 -0
  410. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Lock.html +194 -0
  411. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Log.html +299 -0
  412. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/SharedData.html +206 -0
  413. data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +155 -0
  414. data/doc/rdoc/classes/PhusionPassenger/AppProcess.html +367 -0
  415. data/doc/rdoc/classes/PhusionPassenger/ClassicRails.html +95 -0
  416. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner.html +351 -0
  417. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner/Error.html +98 -0
  418. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/CGIFixed.html +200 -0
  419. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner.html +410 -0
  420. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner/Error.html +98 -0
  421. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/RequestHandler.html +156 -0
  422. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions.html +115 -0
  423. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions/AnalyticsLogging.html +202 -0
  424. data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +172 -0
  425. data/doc/rdoc/classes/PhusionPassenger/DebugLogging.html +273 -0
  426. data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +145 -0
  427. data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +162 -0
  428. data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +141 -0
  429. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
  430. data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +673 -0
  431. data/doc/rdoc/classes/PhusionPassenger/MessageChannel/InvalidHashError.html +92 -0
  432. data/doc/rdoc/classes/PhusionPassenger/MessageClient.html +415 -0
  433. data/doc/rdoc/classes/PhusionPassenger/NativeSupportLoader.html +134 -0
  434. data/doc/rdoc/classes/PhusionPassenger/Packaging.html +129 -0
  435. data/doc/rdoc/classes/PhusionPassenger/PlatformInfo.html +1972 -0
  436. data/doc/rdoc/classes/PhusionPassenger/Plugin.html +237 -0
  437. data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
  438. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +312 -0
  439. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner/Error.html +98 -0
  440. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +218 -0
  441. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions.html +114 -0
  442. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging.html +259 -0
  443. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ACExtension.html +139 -0
  444. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ASBenchmarkableExtension.html +118 -0
  445. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ExceptionLogger.html +135 -0
  446. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +378 -0
  447. data/doc/rdoc/classes/PhusionPassenger/Standalone.html +111 -0
  448. data/doc/rdoc/classes/PhusionPassenger/Standalone/AppFinder.html +252 -0
  449. data/doc/rdoc/classes/PhusionPassenger/Standalone/Command.html +161 -0
  450. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile.html +368 -0
  451. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile/DisallowedContextError.html +132 -0
  452. data/doc/rdoc/classes/PhusionPassenger/Standalone/HelpCommand.html +151 -0
  453. data/doc/rdoc/classes/PhusionPassenger/Standalone/Main.html +189 -0
  454. data/doc/rdoc/classes/PhusionPassenger/Standalone/PackageRuntimeCommand.html +177 -0
  455. data/doc/rdoc/classes/PhusionPassenger/Standalone/RuntimeInstaller.html +341 -0
  456. data/doc/rdoc/classes/PhusionPassenger/Standalone/StartCommand.html +203 -0
  457. data/doc/rdoc/classes/PhusionPassenger/Standalone/StatusCommand.html +156 -0
  458. data/doc/rdoc/classes/PhusionPassenger/Standalone/StopCommand.html +168 -0
  459. data/doc/rdoc/classes/PhusionPassenger/Standalone/Utils.html +86 -0
  460. data/doc/rdoc/classes/PhusionPassenger/Standalone/VersionCommand.html +135 -0
  461. data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +125 -0
  462. data/doc/rdoc/classes/PhusionPassenger/Utils.html +1543 -0
  463. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher.html +204 -0
  464. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/DirInfo.html +171 -0
  465. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/FileInfo.html +140 -0
  466. data/doc/rdoc/classes/PhusionPassenger/Utils/HostsFileParser.html +260 -0
  467. data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +194 -0
  468. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +265 -0
  469. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +120 -0
  470. data/doc/rdoc/classes/PhusionPassenger/Utils/UnseekableSocket.html +561 -0
  471. data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +140 -0
  472. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
  473. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +182 -0
  474. data/doc/rdoc/classes/Process.html +115 -0
  475. data/doc/rdoc/classes/Signal.html +139 -0
  476. data/doc/rdoc/created.rid +1 -0
  477. data/doc/rdoc/files/DEVELOPERS_TXT.html +280 -0
  478. data/doc/rdoc/files/README.html +157 -0
  479. data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +130 -0
  480. data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +135 -0
  481. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +126 -0
  482. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +128 -0
  483. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/memory_stats_rb.html +126 -0
  484. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/server_instance_rb.html +132 -0
  485. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +122 -0
  486. data/doc/rdoc/files/lib/phusion_passenger/analytics_logger_rb.html +129 -0
  487. data/doc/rdoc/files/lib/phusion_passenger/app_process_rb.html +127 -0
  488. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/application_spawner_rb.html +141 -0
  489. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/cgi_fixed_rb.html +126 -0
  490. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/framework_spawner_rb.html +146 -0
  491. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/request_handler_rb.html +125 -0
  492. data/doc/rdoc/files/lib/phusion_passenger/classic_rails_extensions/init_rb.html +132 -0
  493. data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +126 -0
  494. data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +122 -0
  495. data/doc/rdoc/files/lib/phusion_passenger/debug_logging_rb.html +122 -0
  496. data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +147 -0
  497. data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +122 -0
  498. data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +127 -0
  499. data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +120 -0
  500. data/doc/rdoc/files/lib/phusion_passenger/message_client_rb.html +127 -0
  501. data/doc/rdoc/files/lib/phusion_passenger/native_support_rb.html +132 -0
  502. data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +122 -0
  503. data/doc/rdoc/files/lib/phusion_passenger/platform_info/apache_rb.html +127 -0
  504. data/doc/rdoc/files/lib/phusion_passenger/platform_info/binary_compatibility_rb.html +129 -0
  505. data/doc/rdoc/files/lib/phusion_passenger/platform_info/compiler_rb.html +127 -0
  506. data/doc/rdoc/files/lib/phusion_passenger/platform_info/curl_rb.html +126 -0
  507. data/doc/rdoc/files/lib/phusion_passenger/platform_info/documentation_tools_rb.html +126 -0
  508. data/doc/rdoc/files/lib/phusion_passenger/platform_info/linux_rb.html +126 -0
  509. data/doc/rdoc/files/lib/phusion_passenger/platform_info/operating_system_rb.html +127 -0
  510. data/doc/rdoc/files/lib/phusion_passenger/platform_info/ruby_rb.html +128 -0
  511. data/doc/rdoc/files/lib/phusion_passenger/platform_info/zlib_rb.html +126 -0
  512. data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +122 -0
  513. data/doc/rdoc/files/lib/phusion_passenger/plugin_rb.html +127 -0
  514. data/doc/rdoc/files/lib/phusion_passenger/public_api_rb.html +127 -0
  515. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +137 -0
  516. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +125 -0
  517. data/doc/rdoc/files/lib/phusion_passenger/rails3_extensions/init_rb.html +127 -0
  518. data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +122 -0
  519. data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +160 -0
  520. data/doc/rdoc/files/lib/phusion_passenger/standalone/app_finder_rb.html +127 -0
  521. data/doc/rdoc/files/lib/phusion_passenger/standalone/command_rb.html +136 -0
  522. data/doc/rdoc/files/lib/phusion_passenger/standalone/config_file_rb.html +126 -0
  523. data/doc/rdoc/files/lib/phusion_passenger/standalone/help_command_rb.html +126 -0
  524. data/doc/rdoc/files/lib/phusion_passenger/standalone/main_rb.html +126 -0
  525. data/doc/rdoc/files/lib/phusion_passenger/standalone/package_runtime_command_rb.html +127 -0
  526. data/doc/rdoc/files/lib/phusion_passenger/standalone/runtime_installer_rb.html +133 -0
  527. data/doc/rdoc/files/lib/phusion_passenger/standalone/start_command_rb.html +136 -0
  528. data/doc/rdoc/files/lib/phusion_passenger/standalone/status_command_rb.html +126 -0
  529. data/doc/rdoc/files/lib/phusion_passenger/standalone/stop_command_rb.html +126 -0
  530. data/doc/rdoc/files/lib/phusion_passenger/standalone/utils_rb.html +126 -0
  531. data/doc/rdoc/files/lib/phusion_passenger/standalone/version_command_rb.html +127 -0
  532. data/doc/rdoc/files/lib/phusion_passenger/utils/file_system_watcher_rb.html +126 -0
  533. data/doc/rdoc/files/lib/phusion_passenger/utils/hosts_file_parser_rb.html +120 -0
  534. data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +100 -0
  535. data/doc/rdoc/files/lib/phusion_passenger/utils/tmpdir_rb.html +122 -0
  536. data/doc/rdoc/files/lib/phusion_passenger/utils/unseekable_socket_rb.html +126 -0
  537. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +179 -0
  538. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +132 -0
  539. data/doc/rdoc/fr_class_index.html +139 -0
  540. data/doc/rdoc/fr_file_index.html +108 -0
  541. data/doc/rdoc/fr_method_index.html +439 -0
  542. data/doc/rdoc/index.html +26 -0
  543. data/doc/rdoc/rdoc-style.css +187 -0
  544. data/ext/apache2/Configuration.cpp +6 -6
  545. data/ext/apache2/Configuration.hpp +3 -3
  546. data/ext/apache2/HelperAgent.cpp +1 -1
  547. data/ext/apache2/Hooks.cpp +3 -3
  548. data/ext/common/ApplicationPool/Pool.h +1 -1
  549. data/ext/common/ApplicationPool/Server.h +5 -2
  550. data/ext/common/Constants.h +1 -1
  551. data/ext/common/LoggingAgent/FilterSupport.cpp +66 -0
  552. data/ext/common/LoggingAgent/FilterSupport.h +262 -73
  553. data/ext/common/LoggingAgent/RemoteSender.h +13 -4
  554. data/ext/common/Utils/CachedFileStat.cpp +6 -12
  555. data/ext/common/Utils/CachedFileStat.h +4 -4
  556. data/ext/common/libboost_oxt/aggregate.cpp +10 -0
  557. data/ext/common/libpassenger_common/aggregate.cpp +16 -0
  558. data/ext/nginx/Configuration.c +77 -4
  559. data/ext/nginx/Configuration.h +2 -1
  560. data/ext/nginx/ContentHandler.c +32 -4
  561. data/ext/nginx/HelperAgent.cpp +5 -4
  562. data/ext/nginx/ngx_http_passenger_module.c +6 -6
  563. data/ext/nginx/ngx_http_passenger_module.h +5 -5
  564. data/lib/phusion_passenger.rb +1 -1
  565. data/lib/phusion_passenger/abstract_request_handler.rb +4 -1
  566. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_base_extension.rb +3 -1
  567. data/lib/phusion_passenger/standalone/runtime_installer.rb +1 -1
  568. data/lib/phusion_passenger/standalone/start_command.rb +6 -0
  569. data/lib/phusion_passenger/templates/standalone/config.erb +1 -1
  570. data/test/cxx/FilterSupportTest.cpp +135 -5
  571. metadata +547 -4
@@ -0,0 +1,328 @@
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: MessageClient.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>MessageClient.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_MESSAGE_CLIENT_H_</span>
51
+ <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_MESSAGE_CLIENT_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;string&gt;</span>
55
+ <a name="l00030"></a>00030
56
+ <a name="l00031"></a>00031 <span class="preprocessor">#include &quot;StaticString.h&quot;</span>
57
+ <a name="l00032"></a>00032 <span class="preprocessor">#include &quot;MessageChannel.h&quot;</span>
58
+ <a name="l00033"></a>00033 <span class="preprocessor">#include &quot;Exceptions.h&quot;</span>
59
+ <a name="l00034"></a>00034 <span class="preprocessor">#include &quot;Utils/IOUtils.h&quot;</span>
60
+ <a name="l00035"></a>00035
61
+ <a name="l00036"></a>00036
62
+ <a name="l00037"></a>00037 <span class="keyword">namespace </span>Passenger {
63
+ <a name="l00038"></a>00038
64
+ <a name="l00039"></a>00039 <span class="keyword">using namespace </span>std;
65
+ <a name="l00040"></a>00040 <span class="keyword">using namespace </span>boost;
66
+ <a name="l00041"></a>00041
67
+ <a name="l00042"></a>00042 <span class="keyword">class </span>MessageClient {
68
+ <a name="l00043"></a>00043 <span class="keyword">protected</span>:
69
+ <a name="l00044"></a>00044 FileDescriptor fd;
70
+ <a name="l00045"></a>00045 MessageChannel channel;
71
+ <a name="l00046"></a>00046 <span class="keywordtype">bool</span> shouldAutoDisconnect;
72
+ <a name="l00047"></a>00047
73
+ <a name="l00048"></a>00048 <span class="comment">/* sendUsername() and sendPassword() exist and are virtual in order to facilitate unit testing. */</span>
74
+ <a name="l00049"></a>00049
75
+ <a name="l00050"></a>00050 <span class="keyword">virtual</span> <span class="keywordtype">void</span> sendUsername(MessageChannel &amp;channel, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;username) {
76
+ <a name="l00051"></a>00051 channel.writeScalar(username);
77
+ <a name="l00052"></a>00052 }
78
+ <a name="l00053"></a>00053
79
+ <a name="l00054"></a>00054 <span class="keyword">virtual</span> <span class="keywordtype">void</span> sendPassword(MessageChannel &amp;channel, <span class="keyword">const</span> StaticString &amp;userSuppliedPassword) {
80
+ <a name="l00055"></a>00055 channel.writeScalar(userSuppliedPassword.c_str(), userSuppliedPassword.size());
81
+ <a name="l00056"></a>00056 }
82
+ <a name="l00057"></a>00057 <span class="comment"></span>
83
+ <a name="l00058"></a>00058 <span class="comment"> /**</span>
84
+ <a name="l00059"></a>00059 <span class="comment"> * Authenticate to the server with the given username and password.</span>
85
+ <a name="l00060"></a>00060 <span class="comment"> *</span>
86
+ <a name="l00061"></a>00061 <span class="comment"> * @throws SystemException An error occurred while reading data from or sending data to the server.</span>
87
+ <a name="l00062"></a>00062 <span class="comment"> * @throws IOException An error occurred while reading data from or sending data to the server.</span>
88
+ <a name="l00063"></a>00063 <span class="comment"> * @throws SecurityException The server denied authentication.</span>
89
+ <a name="l00064"></a>00064 <span class="comment"> * @throws boost::thread_interrupted</span>
90
+ <a name="l00065"></a>00065 <span class="comment"> * @pre &lt;tt&gt;channel&lt;/tt&gt; is connected.</span>
91
+ <a name="l00066"></a>00066 <span class="comment"> */</span>
92
+ <a name="l00067"></a>00067 <span class="keywordtype">void</span> authenticate(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;username, <span class="keyword">const</span> StaticString &amp;userSuppliedPassword) {
93
+ <a name="l00068"></a>00068 vector&lt;string&gt; args;
94
+ <a name="l00069"></a>00069
95
+ <a name="l00070"></a>00070 sendUsername(channel, username);
96
+ <a name="l00071"></a>00071 sendPassword(channel, userSuppliedPassword);
97
+ <a name="l00072"></a>00072
98
+ <a name="l00073"></a>00073 <span class="keywordflow">if</span> (!channel.read(args)) {
99
+ <a name="l00074"></a>00074 <span class="keywordflow">throw</span> IOException(<span class="stringliteral">&quot;The message server did not send an authentication response.&quot;</span>);
100
+ <a name="l00075"></a>00075 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (args.size() != 1) {
101
+ <a name="l00076"></a>00076 <span class="keywordflow">throw</span> IOException(<span class="stringliteral">&quot;The authentication response that the message server sent is not valid.&quot;</span>);
102
+ <a name="l00077"></a>00077 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (args[0] != <span class="stringliteral">&quot;ok&quot;</span>) {
103
+ <a name="l00078"></a>00078 <span class="keywordflow">throw</span> SecurityException(<span class="stringliteral">&quot;The message server denied authentication: &quot;</span> + args[0]);
104
+ <a name="l00079"></a>00079 }
105
+ <a name="l00080"></a>00080 }
106
+ <a name="l00081"></a>00081
107
+ <a name="l00082"></a>00082 <span class="keywordtype">void</span> autoDisconnect() {
108
+ <a name="l00083"></a>00083 <span class="keywordflow">if</span> (shouldAutoDisconnect) {
109
+ <a name="l00084"></a>00084 <span class="comment">// Closes the connection without throwing close exceptions.</span>
110
+ <a name="l00085"></a>00085 fd = FileDescriptor();
111
+ <a name="l00086"></a>00086 channel = MessageChannel();
112
+ <a name="l00087"></a>00087 }
113
+ <a name="l00088"></a>00088 }
114
+ <a name="l00089"></a>00089
115
+ <a name="l00090"></a>00090 <span class="keyword">public</span>:<span class="comment"></span>
116
+ <a name="l00091"></a>00091 <span class="comment"> /**</span>
117
+ <a name="l00092"></a>00092 <span class="comment"> * Create a new MessageClient object. It doesn&#39;t actually connect to the server until</span>
118
+ <a name="l00093"></a>00093 <span class="comment"> * you call connect().</span>
119
+ <a name="l00094"></a>00094 <span class="comment"> */</span>
120
+ <a name="l00095"></a>00095 MessageClient() {
121
+ <a name="l00096"></a>00096 <span class="comment">/* The reason why we don&#39;t connect right away is because we want to make</span>
122
+ <a name="l00097"></a>00097 <span class="comment"> * certain methods virtual for unit testing purposes. We can&#39;t call</span>
123
+ <a name="l00098"></a>00098 <span class="comment"> * virtual methods in the constructor. :-(</span>
124
+ <a name="l00099"></a>00099 <span class="comment"> */</span>
125
+ <a name="l00100"></a>00100 shouldAutoDisconnect = <span class="keyword">true</span>;
126
+ <a name="l00101"></a>00101 }
127
+ <a name="l00102"></a>00102
128
+ <a name="l00103"></a>00103 <span class="keyword">virtual</span> ~MessageClient() { }
129
+ <a name="l00104"></a>00104 <span class="comment"></span>
130
+ <a name="l00105"></a>00105 <span class="comment"> /**</span>
131
+ <a name="l00106"></a>00106 <span class="comment"> * Connect to the given MessageServer. If a connection was already established,</span>
132
+ <a name="l00107"></a>00107 <span class="comment"> * then the old connection will be closed and a new connection will be established.</span>
133
+ <a name="l00108"></a>00108 <span class="comment"> *</span>
134
+ <a name="l00109"></a>00109 <span class="comment"> * If this MessageClient was in a connected state, and this method throws an exception,</span>
135
+ <a name="l00110"></a>00110 <span class="comment"> * then old connection will be broken.</span>
136
+ <a name="l00111"></a>00111 <span class="comment"> *</span>
137
+ <a name="l00112"></a>00112 <span class="comment"> * @param serverAddress The address of the server to connect to, in the format</span>
138
+ <a name="l00113"></a>00113 <span class="comment"> * as specified by getSocketAddressType().</span>
139
+ <a name="l00114"></a>00114 <span class="comment"> * @param username The username to use for authenticating with the server.</span>
140
+ <a name="l00115"></a>00115 <span class="comment"> * @param userSuppliedPassword The password to use for authenticating with the server.</span>
141
+ <a name="l00116"></a>00116 <span class="comment"> * @return this</span>
142
+ <a name="l00117"></a>00117 <span class="comment"> * @throws SystemException Something went wrong while connecting to the server.</span>
143
+ <a name="l00118"></a>00118 <span class="comment"> * @throws IOException Something went wrong while connecting to the server.</span>
144
+ <a name="l00119"></a>00119 <span class="comment"> * @throws RuntimeException Something went wrong.</span>
145
+ <a name="l00120"></a>00120 <span class="comment"> * @throws SecurityException Unable to authenticate to the server with the given username and password.</span>
146
+ <a name="l00121"></a>00121 <span class="comment"> * You may call connect() again with a different username/password.</span>
147
+ <a name="l00122"></a>00122 <span class="comment"> * @throws boost::thread_interrupted</span>
148
+ <a name="l00123"></a>00123 <span class="comment"> * @post connected()</span>
149
+ <a name="l00124"></a>00124 <span class="comment"> */</span>
150
+ <a name="l00125"></a>00125 MessageClient *connect(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;serverAddress, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;username,
151
+ <a name="l00126"></a>00126 <span class="keyword">const</span> StaticString &amp;userSuppliedPassword)
152
+ <a name="l00127"></a>00127 {
153
+ <a name="l00128"></a>00128 TRACE_POINT();
154
+ <a name="l00129"></a>00129 <span class="keywordflow">try</span> {
155
+ <a name="l00130"></a>00130 fd = connectToServer(serverAddress.c_str());
156
+ <a name="l00131"></a>00131 channel = MessageChannel(fd);
157
+ <a name="l00132"></a>00132
158
+ <a name="l00133"></a>00133 vector&lt;string&gt; args;
159
+ <a name="l00134"></a>00134 <span class="keywordflow">if</span> (!read(args)) {
160
+ <a name="l00135"></a>00135 <span class="keywordflow">throw</span> IOException(<span class="stringliteral">&quot;The message server closed the connection before sending a version identifier.&quot;</span>);
161
+ <a name="l00136"></a>00136 }
162
+ <a name="l00137"></a>00137 <span class="keywordflow">if</span> (args.size() != 2 || args[0] != <span class="stringliteral">&quot;version&quot;</span>) {
163
+ <a name="l00138"></a>00138 <span class="keywordflow">throw</span> IOException(<span class="stringliteral">&quot;The message server didn&#39;t sent a valid version identifier.&quot;</span>);
164
+ <a name="l00139"></a>00139 }
165
+ <a name="l00140"></a>00140 <span class="keywordflow">if</span> (args[1] != <span class="stringliteral">&quot;1&quot;</span>) {
166
+ <a name="l00141"></a>00141 <span class="keywordtype">string</span> message = string(<span class="stringliteral">&quot;Unsupported message server protocol version &quot;</span>) +
167
+ <a name="l00142"></a>00142 args[1] + <span class="stringliteral">&quot;.&quot;</span>;
168
+ <a name="l00143"></a>00143 <span class="keywordflow">throw</span> IOException(message);
169
+ <a name="l00144"></a>00144 }
170
+ <a name="l00145"></a>00145
171
+ <a name="l00146"></a>00146 authenticate(username, userSuppliedPassword);
172
+ <a name="l00147"></a>00147 <span class="keywordflow">return</span> <span class="keyword">this</span>;
173
+ <a name="l00148"></a>00148 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> RuntimeException &amp;) {
174
+ <a name="l00149"></a>00149 autoDisconnect();
175
+ <a name="l00150"></a>00150 <span class="keywordflow">throw</span>;
176
+ <a name="l00151"></a>00151 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;) {
177
+ <a name="l00152"></a>00152 autoDisconnect();
178
+ <a name="l00153"></a>00153 <span class="keywordflow">throw</span>;
179
+ <a name="l00154"></a>00154 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> IOException &amp;) {
180
+ <a name="l00155"></a>00155 autoDisconnect();
181
+ <a name="l00156"></a>00156 <span class="keywordflow">throw</span>;
182
+ <a name="l00157"></a>00157 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> boost::thread_interrupted &amp;) {
183
+ <a name="l00158"></a>00158 autoDisconnect();
184
+ <a name="l00159"></a>00159 <span class="keywordflow">throw</span>;
185
+ <a name="l00160"></a>00160 }
186
+ <a name="l00161"></a>00161 }
187
+ <a name="l00162"></a>00162
188
+ <a name="l00163"></a>00163 <span class="keywordtype">void</span> disconnect() {
189
+ <a name="l00164"></a>00164 fd.close();
190
+ <a name="l00165"></a>00165 fd = FileDescriptor();
191
+ <a name="l00166"></a>00166 channel = MessageChannel();
192
+ <a name="l00167"></a>00167 }
193
+ <a name="l00168"></a>00168
194
+ <a name="l00169"></a>00169 <span class="keywordtype">bool</span> connected()<span class="keyword"> const </span>{
195
+ <a name="l00170"></a>00170 <span class="keywordflow">return</span> fd != -1;
196
+ <a name="l00171"></a>00171 }
197
+ <a name="l00172"></a>00172
198
+ <a name="l00173"></a>00173 <span class="keywordtype">void</span> setAutoDisconnect(<span class="keywordtype">bool</span> value) {
199
+ <a name="l00174"></a>00174 shouldAutoDisconnect = value;
200
+ <a name="l00175"></a>00175 }
201
+ <a name="l00176"></a>00176
202
+ <a name="l00177"></a>00177 FileDescriptor getConnection()<span class="keyword"> const </span>{
203
+ <a name="l00178"></a>00178 <span class="keywordflow">return</span> fd;
204
+ <a name="l00179"></a>00179 }
205
+ <a name="l00180"></a>00180 <span class="comment"></span>
206
+ <a name="l00181"></a>00181 <span class="comment"> /**</span>
207
+ <a name="l00182"></a>00182 <span class="comment"> * @throws SystemException</span>
208
+ <a name="l00183"></a>00183 <span class="comment"> * @throws boost::thread_interrupted</span>
209
+ <a name="l00184"></a>00184 <span class="comment"> */</span>
210
+ <a name="l00185"></a>00185 <span class="keywordtype">bool</span> read(vector&lt;string&gt; &amp;args) {
211
+ <a name="l00186"></a>00186 <span class="keywordflow">try</span> {
212
+ <a name="l00187"></a>00187 <span class="keywordflow">return</span> channel.read(args);
213
+ <a name="l00188"></a>00188 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;e) {
214
+ <a name="l00189"></a>00189 autoDisconnect();
215
+ <a name="l00190"></a>00190 <span class="keywordflow">throw</span>;
216
+ <a name="l00191"></a>00191 }
217
+ <a name="l00192"></a>00192 }
218
+ <a name="l00193"></a>00193 <span class="comment"></span>
219
+ <a name="l00194"></a>00194 <span class="comment"> /**</span>
220
+ <a name="l00195"></a>00195 <span class="comment"> * @throws SystemException</span>
221
+ <a name="l00196"></a>00196 <span class="comment"> * @throws SecurityException</span>
222
+ <a name="l00197"></a>00197 <span class="comment"> * @throws TimeoutException</span>
223
+ <a name="l00198"></a>00198 <span class="comment"> * @throws boost::thread_interrupted</span>
224
+ <a name="l00199"></a>00199 <span class="comment"> */</span>
225
+ <a name="l00200"></a>00200 <span class="keywordtype">bool</span> readScalar(<span class="keywordtype">string</span> &amp;output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxSize = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> *timeout = NULL) {
226
+ <a name="l00201"></a>00201 <span class="keywordflow">try</span> {
227
+ <a name="l00202"></a>00202 <span class="keywordflow">return</span> channel.readScalar(output, maxSize, timeout);
228
+ <a name="l00203"></a>00203 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;) {
229
+ <a name="l00204"></a>00204 autoDisconnect();
230
+ <a name="l00205"></a>00205 <span class="keywordflow">throw</span>;
231
+ <a name="l00206"></a>00206 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SecurityException &amp;) {
232
+ <a name="l00207"></a>00207 autoDisconnect();
233
+ <a name="l00208"></a>00208 <span class="keywordflow">throw</span>;
234
+ <a name="l00209"></a>00209 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> TimeoutException &amp;) {
235
+ <a name="l00210"></a>00210 autoDisconnect();
236
+ <a name="l00211"></a>00211 <span class="keywordflow">throw</span>;
237
+ <a name="l00212"></a>00212 }
238
+ <a name="l00213"></a>00213 }
239
+ <a name="l00214"></a>00214 <span class="comment"></span>
240
+ <a name="l00215"></a>00215 <span class="comment"> /**</span>
241
+ <a name="l00216"></a>00216 <span class="comment"> * @throws SystemExeption</span>
242
+ <a name="l00217"></a>00217 <span class="comment"> * @throws IOException</span>
243
+ <a name="l00218"></a>00218 <span class="comment"> * @throws boost::thread_interrupted</span>
244
+ <a name="l00219"></a>00219 <span class="comment"> */</span>
245
+ <a name="l00220"></a>00220 <span class="keywordtype">int</span> readFileDescriptor(<span class="keywordtype">bool</span> negotiate = <span class="keyword">true</span>) {
246
+ <a name="l00221"></a>00221 <span class="keywordflow">try</span> {
247
+ <a name="l00222"></a>00222 <span class="keywordflow">return</span> channel.readFileDescriptor(negotiate);
248
+ <a name="l00223"></a>00223 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;) {
249
+ <a name="l00224"></a>00224 autoDisconnect();
250
+ <a name="l00225"></a>00225 <span class="keywordflow">throw</span>;
251
+ <a name="l00226"></a>00226 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> IOException &amp;) {
252
+ <a name="l00227"></a>00227 autoDisconnect();
253
+ <a name="l00228"></a>00228 <span class="keywordflow">throw</span>;
254
+ <a name="l00229"></a>00229 }
255
+ <a name="l00230"></a>00230 }
256
+ <a name="l00231"></a>00231 <span class="comment"></span>
257
+ <a name="l00232"></a>00232 <span class="comment"> /**</span>
258
+ <a name="l00233"></a>00233 <span class="comment"> * @throws SystemException</span>
259
+ <a name="l00234"></a>00234 <span class="comment"> * @throws boost::thread_interrupted</span>
260
+ <a name="l00235"></a>00235 <span class="comment"> */</span>
261
+ <a name="l00236"></a>00236 <span class="keywordtype">void</span> write(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, ...) {
262
+ <a name="l00237"></a>00237 va_list ap;
263
+ <a name="l00238"></a>00238 va_start(ap, name);
264
+ <a name="l00239"></a>00239 <span class="keywordflow">try</span> {
265
+ <a name="l00240"></a>00240 <span class="keywordflow">try</span> {
266
+ <a name="l00241"></a>00241 channel.write(name, ap);
267
+ <a name="l00242"></a>00242 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;) {
268
+ <a name="l00243"></a>00243 autoDisconnect();
269
+ <a name="l00244"></a>00244 <span class="keywordflow">throw</span>;
270
+ <a name="l00245"></a>00245 }
271
+ <a name="l00246"></a>00246 va_end(ap);
272
+ <a name="l00247"></a>00247 } <span class="keywordflow">catch</span> (...) {
273
+ <a name="l00248"></a>00248 va_end(ap);
274
+ <a name="l00249"></a>00249 <span class="keywordflow">throw</span>;
275
+ <a name="l00250"></a>00250 }
276
+ <a name="l00251"></a>00251 }
277
+ <a name="l00252"></a>00252 <span class="comment"></span>
278
+ <a name="l00253"></a>00253 <span class="comment"> /**</span>
279
+ <a name="l00254"></a>00254 <span class="comment"> * @throws SystemException</span>
280
+ <a name="l00255"></a>00255 <span class="comment"> * @throws boost::thread_interrupted</span>
281
+ <a name="l00256"></a>00256 <span class="comment"> */</span>
282
+ <a name="l00257"></a>00257 <span class="keywordtype">void</span> writeScalar(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size) {
283
+ <a name="l00258"></a>00258 <span class="keywordflow">try</span> {
284
+ <a name="l00259"></a>00259 channel.writeScalar(data, size);
285
+ <a name="l00260"></a>00260 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;) {
286
+ <a name="l00261"></a>00261 autoDisconnect();
287
+ <a name="l00262"></a>00262 <span class="keywordflow">throw</span>;
288
+ <a name="l00263"></a>00263 }
289
+ <a name="l00264"></a>00264 }
290
+ <a name="l00265"></a>00265 <span class="comment"></span>
291
+ <a name="l00266"></a>00266 <span class="comment"> /**</span>
292
+ <a name="l00267"></a>00267 <span class="comment"> * @throws SystemException</span>
293
+ <a name="l00268"></a>00268 <span class="comment"> * @throws boost::thread_interrupted</span>
294
+ <a name="l00269"></a>00269 <span class="comment"> */</span>
295
+ <a name="l00270"></a>00270 <span class="keywordtype">void</span> writeScalar(<span class="keyword">const</span> StaticString &amp;data) {
296
+ <a name="l00271"></a>00271 <span class="keywordflow">try</span> {
297
+ <a name="l00272"></a>00272 channel.writeScalar(data.c_str(), data.size());
298
+ <a name="l00273"></a>00273 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;) {
299
+ <a name="l00274"></a>00274 autoDisconnect();
300
+ <a name="l00275"></a>00275 <span class="keywordflow">throw</span>;
301
+ <a name="l00276"></a>00276 }
302
+ <a name="l00277"></a>00277 }
303
+ <a name="l00278"></a>00278 <span class="comment"></span>
304
+ <a name="l00279"></a>00279 <span class="comment"> /**</span>
305
+ <a name="l00280"></a>00280 <span class="comment"> * @throws SystemException</span>
306
+ <a name="l00281"></a>00281 <span class="comment"> * @throws boost::thread_interrupted</span>
307
+ <a name="l00282"></a>00282 <span class="comment"> */</span>
308
+ <a name="l00283"></a>00283 <span class="keywordtype">void</span> writeFileDescriptor(<span class="keywordtype">int</span> fileDescriptor, <span class="keywordtype">bool</span> negotiate = <span class="keyword">true</span>) {
309
+ <a name="l00284"></a>00284 <span class="keywordflow">try</span> {
310
+ <a name="l00285"></a>00285 channel.writeFileDescriptor(fileDescriptor, negotiate);
311
+ <a name="l00286"></a>00286 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> SystemException &amp;) {
312
+ <a name="l00287"></a>00287 autoDisconnect();
313
+ <a name="l00288"></a>00288 <span class="keywordflow">throw</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="keyword">typedef</span> shared_ptr&lt;MessageClient&gt; MessageClientPtr;
319
+ <a name="l00294"></a>00294
320
+ <a name="l00295"></a>00295 } <span class="comment">// namespace Passenger</span>
321
+ <a name="l00296"></a>00296
322
+ <a name="l00297"></a>00297 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_MESSAGE_CLIENT_H_ */</span>
323
+ </pre></div></div>
324
+ <hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
325
+ <a href="http://www.doxygen.org/index.html">
326
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
327
+ </body>
328
+ </html>
@@ -0,0 +1,539 @@
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: MessageReadersWriters.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>MessageReadersWriters.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_MESSAGE_READERS_WRITERS_H_</span>
51
+ <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_MESSAGE_READERS_WRITERS_H_</span>
52
+ <a name="l00027"></a>00027 <span class="preprocessor"></span>
53
+ <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;boost/cstdint.hpp&gt;</span>
54
+ <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;oxt/macros.hpp&gt;</span>
55
+ <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;algorithm&gt;</span>
56
+ <a name="l00031"></a>00031 <span class="preprocessor">#include &lt;vector&gt;</span>
57
+ <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;string&gt;</span>
58
+ <a name="l00033"></a>00033 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
59
+ <a name="l00034"></a>00034 <span class="preprocessor">#include &lt;cstring&gt;</span>
60
+ <a name="l00035"></a>00035 <span class="preprocessor">#include &lt;arpa/inet.h&gt;</span>
61
+ <a name="l00036"></a>00036 <span class="preprocessor">#include &quot;StaticString.h&quot;</span>
62
+ <a name="l00037"></a>00037 <span class="preprocessor">#include &quot;Exceptions.h&quot;</span>
63
+ <a name="l00038"></a>00038 <span class="preprocessor">#include &quot;Utils/MemZeroGuard.h&quot;</span>
64
+ <a name="l00039"></a>00039 <span class="comment"></span>
65
+ <a name="l00040"></a>00040 <span class="comment">/**</span>
66
+ <a name="l00041"></a>00041 <span class="comment"> * This file provides a bunch of classes for reading and writing messages in the</span>
67
+ <a name="l00042"></a>00042 <span class="comment"> * MessageChannel format. Unlike MessageChannel, whose operations take control over</span>
68
+ <a name="l00043"></a>00043 <span class="comment"> * the I/O handle and may block, these classes act like parsers and data generators.</span>
69
+ <a name="l00044"></a>00044 <span class="comment"> * To read messages one must feed data to them. To write messages one must instruct</span>
70
+ <a name="l00045"></a>00045 <span class="comment"> * the classes to generate a bunch of data. These classes will never block, making</span>
71
+ <a name="l00046"></a>00046 <span class="comment"> * them ideal for use in evented servers.</span>
72
+ <a name="l00047"></a>00047 <span class="comment"> *</span>
73
+ <a name="l00048"></a>00048 <span class="comment"> * &lt;h2&gt;Reading messages&lt;/h2&gt;</span>
74
+ <a name="l00049"></a>00049 <span class="comment"> * To read a single message, one must instantiate a message object and feed network</span>
75
+ <a name="l00050"></a>00050 <span class="comment"> * data to it with the feed() method. This method returns the number of bytes</span>
76
+ <a name="l00051"></a>00051 <span class="comment"> * actually processed by the message object (i.e. the number of bytes that it has</span>
77
+ <a name="l00052"></a>00052 <span class="comment"> * recognized as part of the message).</span>
78
+ <a name="l00053"></a>00053 <span class="comment"> *</span>
79
+ <a name="l00054"></a>00054 <span class="comment"> * When the message object has either successfully parsed the data or encountered</span>
80
+ <a name="l00055"></a>00055 <span class="comment"> * an error, it will indicate so via the done() method. With hasError() one can</span>
81
+ <a name="l00056"></a>00056 <span class="comment"> * check whether an error was encountered or whether the reader succeeded, and</span>
82
+ <a name="l00057"></a>00057 <span class="comment"> * with errorCode() one can obtain the exact error reason. Not all message objects</span>
83
+ <a name="l00058"></a>00058 <span class="comment"> * support hasError() and errorCode() because some of them can never encounter</span>
84
+ <a name="l00059"></a>00059 <span class="comment"> * errors and some of them can only fail for a single reason.</span>
85
+ <a name="l00060"></a>00060 <span class="comment"> *</span>
86
+ <a name="l00061"></a>00061 <span class="comment"> * When successful, the parsed message can be obtained with value(). This method</span>
87
+ <a name="l00062"></a>00062 <span class="comment"> * may only be called when done() is true and there is no error, otherwise the</span>
88
+ <a name="l00063"></a>00063 <span class="comment"> * return value is undefined.</span>
89
+ <a name="l00064"></a>00064 <span class="comment"> *</span>
90
+ <a name="l00065"></a>00065 <span class="comment"> * At this point, the message object cannot process any more data and feed() will</span>
91
+ <a name="l00066"></a>00066 <span class="comment"> * always return 0. To reuse the object for processing another message, one must</span>
92
+ <a name="l00067"></a>00067 <span class="comment"> * reset its state by calling reset().</span>
93
+ <a name="l00068"></a>00068 <span class="comment"> *</span>
94
+ <a name="l00069"></a>00069 <span class="comment"> * The following example demonstrates how to read a continuous stream of 32-bit</span>
95
+ <a name="l00070"></a>00070 <span class="comment"> * integers:</span>
96
+ <a name="l00071"></a>00071 <span class="comment"> * @code</span>
97
+ <a name="l00072"></a>00072 <span class="comment"> Uint32Message intMessage;</span>
98
+ <a name="l00073"></a>00073 <span class="comment"> while (true) {</span>
99
+ <a name="l00074"></a>00074 <span class="comment"> // Read a bunch of network data...</span>
100
+ <a name="l00075"></a>00075 <span class="comment"> char buf[1024];</span>
101
+ <a name="l00076"></a>00076 <span class="comment"> ssize_t size = recv(fd, buf, sizeof(buf));</span>
102
+ <a name="l00077"></a>00077 <span class="comment"> size_t consumed = 0;</span>
103
+ <a name="l00078"></a>00078 <span class="comment"> </span>
104
+ <a name="l00079"></a>00079 <span class="comment"> // ...and process it all. We only feed data to the message object</span>
105
+ <a name="l00080"></a>00080 <span class="comment"> // that hasn&#39;t already been fed.</span>
106
+ <a name="l00081"></a>00081 <span class="comment"> while (consumed &lt; size) {</span>
107
+ <a name="l00082"></a>00082 <span class="comment"> consumed += intReader.feed(buf + consumed, size - consumed);</span>
108
+ <a name="l00083"></a>00083 <span class="comment"> if (intMessage.done()) {</span>
109
+ <a name="l00084"></a>00084 <span class="comment"> printf(&quot;Integer: %d\n&quot;, (int) intMessage.value());</span>
110
+ <a name="l00085"></a>00085 <span class="comment"> // The state must be reset before the reader can be reused.</span>
111
+ <a name="l00086"></a>00086 <span class="comment"> intMessage.reset();</span>
112
+ <a name="l00087"></a>00087 <span class="comment"> }</span>
113
+ <a name="l00088"></a>00088 <span class="comment"> }</span>
114
+ <a name="l00089"></a>00089 <span class="comment"> }</span>
115
+ <a name="l00090"></a>00090 <span class="comment"> * @endcode</span>
116
+ <a name="l00091"></a>00091 <span class="comment"> *</span>
117
+ <a name="l00092"></a>00092 <span class="comment"> * Some message objects return non-primitive values in their value() methods, such as</span>
118
+ <a name="l00093"></a>00093 <span class="comment"> * ArrayMessage and ScalarMessage which return &lt;tt&gt;const vector&lt;StaticString&gt; &amp;&lt;/tt&gt;</span>
119
+ <a name="l00094"></a>00094 <span class="comment"> * and &lt;tt&gt;StaticString&lt;/tt&gt;, respectively. These values are only valid until either</span>
120
+ <a name="l00095"></a>00095 <span class="comment"> * of the following things occur:</span>
121
+ <a name="l00096"></a>00096 <span class="comment"> *</span>
122
+ <a name="l00097"></a>00097 <span class="comment"> * - The buffer containing last the fed data has been destroyed or modified.</span>
123
+ <a name="l00098"></a>00098 <span class="comment"> * - The message object itself has been destroyed.</span>
124
+ <a name="l00099"></a>00099 <span class="comment"> *</span>
125
+ <a name="l00100"></a>00100 <span class="comment"> * This is because the message objects try to apply copy-zero optimizations whenever</span>
126
+ <a name="l00101"></a>00101 <span class="comment"> * possible. For example, in case of ScalarMessage, it&#39;ll check whether the data</span>
127
+ <a name="l00102"></a>00102 <span class="comment"> * that has been fed in the first feed() call already contains a full scalar message.</span>
128
+ <a name="l00103"></a>00103 <span class="comment"> * If so then it&#39;ll just return a StaticString that points to the scalar message</span>
129
+ <a name="l00104"></a>00104 <span class="comment"> * in the fed data; it will not copy the fed data. In this case it is important</span>
130
+ <a name="l00105"></a>00105 <span class="comment"> * that the buffer containing the fed data is not modified or destroyed while the</span>
131
+ <a name="l00106"></a>00106 <span class="comment"> * StaticString is in use.</span>
132
+ <a name="l00107"></a>00107 <span class="comment"> * If the first feed() call does not supply a full scalar message then it will</span>
133
+ <a name="l00108"></a>00108 <span class="comment"> * buffer all fed data until the buffer contains a full scalar message, and the</span>
134
+ <a name="l00109"></a>00109 <span class="comment"> * result will point to this buffer. Because the buffer is owned by the message</span>
135
+ <a name="l00110"></a>00110 <span class="comment"> * object, the result will be invalidated as soon as the message object is destroyed.</span>
136
+ <a name="l00111"></a>00111 <span class="comment"> */</span>
137
+ <a name="l00112"></a>00112
138
+ <a name="l00113"></a>00113 <span class="keyword">namespace </span>Passenger {
139
+ <a name="l00114"></a>00114
140
+ <a name="l00115"></a>00115 <span class="keyword">using namespace </span>std;
141
+ <a name="l00116"></a>00116 <span class="comment"></span>
142
+ <a name="l00117"></a>00117 <span class="comment">/**</span>
143
+ <a name="l00118"></a>00118 <span class="comment"> * For 16-bit big-endian integers.</span>
144
+ <a name="l00119"></a>00119 <span class="comment"> */</span>
145
+ <a name="l00120"></a><a class="code" href="classPassenger_1_1Uint16Message.html">00120</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1Uint16Message.html" title="For 16-bit big-endian integers.">Uint16Message</a> {
146
+ <a name="l00121"></a>00121 <span class="keyword">private</span>:
147
+ <a name="l00122"></a>00122 uint16_t val;
148
+ <a name="l00123"></a>00123 uint8_t consumed;
149
+ <a name="l00124"></a>00124
150
+ <a name="l00125"></a>00125 <span class="keyword">public</span>:
151
+ <a name="l00126"></a>00126 <a class="code" href="classPassenger_1_1Uint16Message.html" title="For 16-bit big-endian integers.">Uint16Message</a>() {
152
+ <a name="l00127"></a>00127 consumed = 0;
153
+ <a name="l00128"></a>00128 }
154
+ <a name="l00129"></a>00129
155
+ <a name="l00130"></a>00130 <span class="keywordtype">void</span> reset() {
156
+ <a name="l00131"></a>00131 consumed = 0;
157
+ <a name="l00132"></a>00132 }
158
+ <a name="l00133"></a>00133
159
+ <a name="l00134"></a>00134 <span class="keywordtype">size_t</span> feed(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
160
+ <a name="l00135"></a>00135 <span class="keywordtype">size_t</span> locallyConsumed;
161
+ <a name="l00136"></a>00136
162
+ <a name="l00137"></a>00137 locallyConsumed = std::min(size, <span class="keyword">sizeof</span>(uint16_t) - consumed);
163
+ <a name="l00138"></a>00138 memcpy((<span class="keywordtype">char</span> *) &amp;val + consumed, data, locallyConsumed);
164
+ <a name="l00139"></a>00139 consumed += locallyConsumed;
165
+ <a name="l00140"></a>00140 <span class="keywordflow">if</span> (locallyConsumed &gt; 0 &amp;&amp; done()) {
166
+ <a name="l00141"></a>00141 val = ntohs(val);
167
+ <a name="l00142"></a>00142 }
168
+ <a name="l00143"></a>00143 <span class="keywordflow">return</span> locallyConsumed;
169
+ <a name="l00144"></a>00144 }
170
+ <a name="l00145"></a>00145
171
+ <a name="l00146"></a>00146 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
172
+ <a name="l00147"></a>00147 <span class="keywordflow">return</span> consumed == <span class="keyword">sizeof</span>(uint16_t);
173
+ <a name="l00148"></a>00148 }
174
+ <a name="l00149"></a>00149
175
+ <a name="l00150"></a>00150 uint16_t value()<span class="keyword"> const </span>{
176
+ <a name="l00151"></a>00151 <span class="keywordflow">return</span> val;
177
+ <a name="l00152"></a>00152 }
178
+ <a name="l00153"></a>00153
179
+ <a name="l00154"></a>00154 <span class="keyword">static</span> <span class="keywordtype">void</span> generate(<span class="keywordtype">void</span> *buf, uint16_t val) {
180
+ <a name="l00155"></a>00155 val = htons(val);
181
+ <a name="l00156"></a>00156 memcpy(buf, &amp;val, <span class="keyword">sizeof</span>(val));
182
+ <a name="l00157"></a>00157 }
183
+ <a name="l00158"></a>00158 };
184
+ <a name="l00159"></a>00159 <span class="comment"></span>
185
+ <a name="l00160"></a>00160 <span class="comment">/**</span>
186
+ <a name="l00161"></a>00161 <span class="comment"> * For 32-bit big-endian integers.</span>
187
+ <a name="l00162"></a>00162 <span class="comment"> */</span>
188
+ <a name="l00163"></a><a class="code" href="classPassenger_1_1Uint32Message.html">00163</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1Uint32Message.html" title="For 32-bit big-endian integers.">Uint32Message</a> {
189
+ <a name="l00164"></a>00164 <span class="keyword">private</span>:
190
+ <a name="l00165"></a>00165 uint32_t val;
191
+ <a name="l00166"></a>00166 uint8_t consumed;
192
+ <a name="l00167"></a>00167
193
+ <a name="l00168"></a>00168 <span class="keyword">public</span>:
194
+ <a name="l00169"></a>00169 <a class="code" href="classPassenger_1_1Uint32Message.html" title="For 32-bit big-endian integers.">Uint32Message</a>() {
195
+ <a name="l00170"></a>00170 consumed = 0;
196
+ <a name="l00171"></a>00171 }
197
+ <a name="l00172"></a>00172
198
+ <a name="l00173"></a>00173 <span class="keywordtype">void</span> reset() {
199
+ <a name="l00174"></a>00174 consumed = 0;
200
+ <a name="l00175"></a>00175 }
201
+ <a name="l00176"></a>00176
202
+ <a name="l00177"></a>00177 <span class="keywordtype">size_t</span> feed(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
203
+ <a name="l00178"></a>00178 <span class="keywordtype">size_t</span> locallyConsumed;
204
+ <a name="l00179"></a>00179
205
+ <a name="l00180"></a>00180 locallyConsumed = std::min(size, <span class="keyword">sizeof</span>(uint32_t) - consumed);
206
+ <a name="l00181"></a>00181 memcpy((<span class="keywordtype">char</span> *) &amp;val + consumed, data, locallyConsumed);
207
+ <a name="l00182"></a>00182 consumed += locallyConsumed;
208
+ <a name="l00183"></a>00183 <span class="keywordflow">if</span> (locallyConsumed &gt; 0 &amp;&amp; done()) {
209
+ <a name="l00184"></a>00184 val = ntohl(val);
210
+ <a name="l00185"></a>00185 }
211
+ <a name="l00186"></a>00186 <span class="keywordflow">return</span> locallyConsumed;
212
+ <a name="l00187"></a>00187 }
213
+ <a name="l00188"></a>00188
214
+ <a name="l00189"></a>00189 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
215
+ <a name="l00190"></a>00190 <span class="keywordflow">return</span> consumed == <span class="keyword">sizeof</span>(uint32_t);
216
+ <a name="l00191"></a>00191 }
217
+ <a name="l00192"></a>00192
218
+ <a name="l00193"></a>00193 uint32_t value()<span class="keyword"> const </span>{
219
+ <a name="l00194"></a>00194 <span class="keywordflow">return</span> val;
220
+ <a name="l00195"></a>00195 }
221
+ <a name="l00196"></a>00196
222
+ <a name="l00197"></a>00197 <span class="keyword">static</span> <span class="keywordtype">void</span> generate(<span class="keywordtype">void</span> *buf, uint32_t val) {
223
+ <a name="l00198"></a>00198 val = htonl(val);
224
+ <a name="l00199"></a>00199 memcpy(buf, &amp;val, <span class="keyword">sizeof</span>(val));
225
+ <a name="l00200"></a>00200 }
226
+ <a name="l00201"></a>00201 };
227
+ <a name="l00202"></a>00202 <span class="comment"></span>
228
+ <a name="l00203"></a>00203 <span class="comment">/**</span>
229
+ <a name="l00204"></a>00204 <span class="comment"> * For array messages.</span>
230
+ <a name="l00205"></a>00205 <span class="comment"> */</span>
231
+ <a name="l00206"></a><a class="code" href="classPassenger_1_1ArrayMessage.html">00206</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1ArrayMessage.html" title="For array messages.">ArrayMessage</a> {
232
+ <a name="l00207"></a>00207 <span class="keyword">public</span>:
233
+ <a name="l00208"></a>00208 <span class="keyword">enum</span> Error {
234
+ <a name="l00209"></a>00209 TOO_LARGE
235
+ <a name="l00210"></a>00210 };
236
+ <a name="l00211"></a>00211
237
+ <a name="l00212"></a>00212 <span class="keyword">private</span>:
238
+ <a name="l00213"></a>00213 <span class="keyword">enum</span> State {
239
+ <a name="l00214"></a>00214 READING_HEADER,
240
+ <a name="l00215"></a>00215 READING_BODY,
241
+ <a name="l00216"></a>00216 DONE,
242
+ <a name="l00217"></a>00217 ERROR
243
+ <a name="l00218"></a>00218 };
244
+ <a name="l00219"></a>00219
245
+ <a name="l00220"></a>00220 uint16_t toReserve;
246
+ <a name="l00221"></a>00221 uint16_t maxSize;
247
+ <a name="l00222"></a>00222 <a class="code" href="classPassenger_1_1Uint16Message.html" title="For 16-bit big-endian integers.">Uint16Message</a> headerReader;
248
+ <a name="l00223"></a>00223 uint8_t state;
249
+ <a name="l00224"></a>00224 uint8_t error;
250
+ <a name="l00225"></a>00225 <span class="keywordtype">string</span> buffer;
251
+ <a name="l00226"></a>00226 vector&lt;StaticString&gt; result;
252
+ <a name="l00227"></a>00227
253
+ <a name="l00228"></a>00228 <span class="keywordtype">void</span> parseBody(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
254
+ <a name="l00229"></a>00229 <span class="keyword">const</span> <span class="keywordtype">char</span> *start = data;
255
+ <a name="l00230"></a>00230 <span class="keyword">const</span> <span class="keywordtype">char</span> *terminator;
256
+ <a name="l00231"></a>00231 <span class="keywordtype">size_t</span> rest = size;
257
+ <a name="l00232"></a>00232
258
+ <a name="l00233"></a>00233 <span class="keywordflow">while</span> ((terminator = (<span class="keyword">const</span> <span class="keywordtype">char</span> *) memchr(start, <span class="charliteral">&#39;\0&#39;</span>, rest)) != NULL) {
259
+ <a name="l00234"></a>00234 <span class="keywordtype">size_t</span> len = terminator - start;
260
+ <a name="l00235"></a>00235 result.push_back(<a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a>(start, len));
261
+ <a name="l00236"></a>00236 start = terminator + 1;
262
+ <a name="l00237"></a>00237 rest = size - (start - data);
263
+ <a name="l00238"></a>00238 }
264
+ <a name="l00239"></a>00239 }
265
+ <a name="l00240"></a>00240
266
+ <a name="l00241"></a>00241 <span class="keyword">public</span>:
267
+ <a name="l00242"></a>00242 <a class="code" href="classPassenger_1_1ArrayMessage.html" title="For array messages.">ArrayMessage</a>() {
268
+ <a name="l00243"></a>00243 state = READING_HEADER;
269
+ <a name="l00244"></a>00244 toReserve = 0;
270
+ <a name="l00245"></a>00245 maxSize = 0;
271
+ <a name="l00246"></a>00246 }
272
+ <a name="l00247"></a>00247
273
+ <a name="l00248"></a>00248 <span class="keywordtype">void</span> reserve(uint16_t size) {
274
+ <a name="l00249"></a>00249 toReserve = size;
275
+ <a name="l00250"></a>00250 result.reserve(size);
276
+ <a name="l00251"></a>00251 }
277
+ <a name="l00252"></a>00252
278
+ <a name="l00253"></a>00253 <span class="keywordtype">void</span> setMaxSize(uint16_t size) {
279
+ <a name="l00254"></a>00254 maxSize = size;
280
+ <a name="l00255"></a>00255 }
281
+ <a name="l00256"></a>00256
282
+ <a name="l00257"></a>00257 <span class="keywordtype">void</span> reset() {
283
+ <a name="l00258"></a>00258 state = READING_HEADER;
284
+ <a name="l00259"></a>00259 headerReader.reset();
285
+ <a name="l00260"></a>00260 buffer.clear();
286
+ <a name="l00261"></a>00261 result.clear();
287
+ <a name="l00262"></a>00262 <span class="keywordflow">if</span> (toReserve &gt; 0) {
288
+ <a name="l00263"></a>00263 result.reserve(toReserve);
289
+ <a name="l00264"></a>00264 }
290
+ <a name="l00265"></a>00265 }
291
+ <a name="l00266"></a>00266
292
+ <a name="l00267"></a>00267 <span class="keywordtype">size_t</span> feed(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
293
+ <a name="l00268"></a>00268 <span class="keywordtype">size_t</span> consumed = 0;
294
+ <a name="l00269"></a>00269
295
+ <a name="l00270"></a>00270 <span class="keywordflow">while</span> (consumed &lt; size &amp;&amp; !done()) {
296
+ <a name="l00271"></a>00271 <span class="keyword">const</span> <span class="keywordtype">char</span> *current = data + consumed;
297
+ <a name="l00272"></a>00272 <span class="keywordtype">size_t</span> rest = size - consumed;
298
+ <a name="l00273"></a>00273
299
+ <a name="l00274"></a>00274 <span class="keywordflow">switch</span> (state) {
300
+ <a name="l00275"></a>00275 <span class="keywordflow">case</span> READING_HEADER:
301
+ <a name="l00276"></a>00276 consumed += headerReader.feed(current, rest);
302
+ <a name="l00277"></a>00277 <span class="keywordflow">if</span> (headerReader.done()) {
303
+ <a name="l00278"></a>00278 <span class="keywordflow">if</span> (maxSize &gt; 0 &amp;&amp; headerReader.value() &gt; maxSize) {
304
+ <a name="l00279"></a>00279 state = ERROR;
305
+ <a name="l00280"></a>00280 error = TOO_LARGE;
306
+ <a name="l00281"></a>00281 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (headerReader.value() == 0) {
307
+ <a name="l00282"></a>00282 state = DONE;
308
+ <a name="l00283"></a>00283 } <span class="keywordflow">else</span> {
309
+ <a name="l00284"></a>00284 state = READING_BODY;
310
+ <a name="l00285"></a>00285 }
311
+ <a name="l00286"></a>00286 }
312
+ <a name="l00287"></a>00287 <span class="keywordflow">break</span>;
313
+ <a name="l00288"></a>00288 <span class="keywordflow">case</span> READING_BODY:
314
+ <a name="l00289"></a>00289 <span class="keywordflow">if</span> (buffer.empty() &amp;&amp; rest &gt;= headerReader.value()) {
315
+ <a name="l00290"></a>00290 parseBody(current, headerReader.value());
316
+ <a name="l00291"></a>00291 state = DONE;
317
+ <a name="l00292"></a>00292 consumed += headerReader.value();
318
+ <a name="l00293"></a>00293 } <span class="keywordflow">else</span> {
319
+ <a name="l00294"></a>00294 <span class="keywordtype">size_t</span> toConsume = std::min(rest,
320
+ <a name="l00295"></a>00295 headerReader.value() - buffer.size());
321
+ <a name="l00296"></a>00296 <span class="keywordflow">if</span> (buffer.capacity() &lt; headerReader.value()) {
322
+ <a name="l00297"></a>00297 buffer.reserve(headerReader.value());
323
+ <a name="l00298"></a>00298 }
324
+ <a name="l00299"></a>00299 buffer.append(current, toConsume);
325
+ <a name="l00300"></a>00300 consumed += toConsume;
326
+ <a name="l00301"></a>00301 <span class="keywordflow">if</span> (buffer.size() == headerReader.value()) {
327
+ <a name="l00302"></a>00302 parseBody(buffer.data(), buffer.size());
328
+ <a name="l00303"></a>00303 state = DONE;
329
+ <a name="l00304"></a>00304 }
330
+ <a name="l00305"></a>00305 }
331
+ <a name="l00306"></a>00306 <span class="keywordflow">break</span>;
332
+ <a name="l00307"></a>00307 <span class="keywordflow">default</span>:
333
+ <a name="l00308"></a>00308 <span class="comment">// Never reached.</span>
334
+ <a name="l00309"></a>00309 abort();
335
+ <a name="l00310"></a>00310 }
336
+ <a name="l00311"></a>00311 }
337
+ <a name="l00312"></a>00312 <span class="keywordflow">return</span> consumed;
338
+ <a name="l00313"></a>00313 }
339
+ <a name="l00314"></a>00314
340
+ <a name="l00315"></a>00315 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
341
+ <a name="l00316"></a>00316 <span class="keywordflow">return</span> state == DONE || state == ERROR;
342
+ <a name="l00317"></a>00317 }
343
+ <a name="l00318"></a>00318
344
+ <a name="l00319"></a>00319 <span class="keywordtype">bool</span> hasError()<span class="keyword"> const </span>{
345
+ <a name="l00320"></a>00320 <span class="keywordflow">return</span> state == ERROR;
346
+ <a name="l00321"></a>00321 }
347
+ <a name="l00322"></a>00322
348
+ <a name="l00323"></a>00323 Error errorCode()<span class="keyword"> const </span>{
349
+ <a name="l00324"></a>00324 <span class="keywordflow">return</span> (Error) error;
350
+ <a name="l00325"></a>00325 }
351
+ <a name="l00326"></a>00326
352
+ <a name="l00327"></a>00327 <span class="keyword">const</span> vector&lt;StaticString&gt; &amp;value()<span class="keyword"> const </span>{
353
+ <a name="l00328"></a>00328 <span class="keywordflow">return</span> result;
354
+ <a name="l00329"></a>00329 }
355
+ <a name="l00330"></a>00330 <span class="comment"></span>
356
+ <a name="l00331"></a>00331 <span class="comment"> /**</span>
357
+ <a name="l00332"></a>00332 <span class="comment"> * Given a bunch of array items, generates an array message. The message is</span>
358
+ <a name="l00333"></a>00333 <span class="comment"> * generated in the form of an array of StaticStrings which must all be written</span>
359
+ <a name="l00334"></a>00334 <span class="comment"> * out (e.g. with writev()) in the given order. These StaticStrings point</span>
360
+ <a name="l00335"></a>00335 <span class="comment"> * to the buffers pointed to by &lt;em&gt;args&lt;/em&gt; as well as &lt;em&gt;headerBuf&lt;/em&gt;,</span>
361
+ <a name="l00336"></a>00336 <span class="comment"> * so &lt;em&gt;args&lt;/em&gt; and &lt;em&gt;headerBuf&lt;/em&gt; must stay valid until the message</span>
362
+ <a name="l00337"></a>00337 <span class="comment"> * has been written out or copied.</span>
363
+ <a name="l00338"></a>00338 <span class="comment"> *</span>
364
+ <a name="l00339"></a>00339 <span class="comment"> * @param args An array of array items to be included in the array message.</span>
365
+ <a name="l00340"></a>00340 <span class="comment"> * @param argsCount The number of items in &lt;em&gt;args&lt;/em&gt;.</span>
366
+ <a name="l00341"></a>00341 <span class="comment"> * @param headerBuf A pointer to a buffer in which the array message header</span>
367
+ <a name="l00342"></a>00342 <span class="comment"> * is to be stored.</span>
368
+ <a name="l00343"></a>00343 <span class="comment"> * @param out A pointer to a StaticString array in which the generated array</span>
369
+ <a name="l00344"></a>00344 <span class="comment"> * message data will be stored. Exactly &lt;tt&gt;outputSize(argsCount)&lt;/tt&gt;</span>
370
+ <a name="l00345"></a>00345 <span class="comment"> * items will be stored in this array.</span>
371
+ <a name="l00346"></a>00346 <span class="comment"> * @param outCount The number of items in &lt;em&gt;out&lt;/em&gt;.</span>
372
+ <a name="l00347"></a>00347 <span class="comment"> */</span>
373
+ <a name="l00348"></a><a class="code" href="classPassenger_1_1ArrayMessage.html#a25603619576f11f0d76286a17a014a92">00348</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1ArrayMessage.html#a25603619576f11f0d76286a17a014a92" title="Given a bunch of array items, generates an array message.">generate</a>(<a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a> args[], <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> argsCount,
374
+ <a name="l00349"></a>00349 <span class="keywordtype">char</span> headerBuf[<span class="keyword">sizeof</span>(uint16_t)], <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a> *out, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outCount)
375
+ <a name="l00350"></a>00350 {
376
+ <a name="l00351"></a>00351 <span class="keywordflow">if</span> (OXT_UNLIKELY(outCount &lt; outputSize(argsCount))) {
377
+ <a name="l00352"></a>00352 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1ArgumentException.html" title="Indicates that a specified argument is incorrect or violates a requirement.">ArgumentException</a>(<span class="stringliteral">&quot;outCount too small.&quot;</span>);
378
+ <a name="l00353"></a>00353 }
379
+ <a name="l00354"></a>00354
380
+ <a name="l00355"></a>00355 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size = 0;
381
+ <a name="l00356"></a>00356 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
382
+ <a name="l00357"></a>00357
383
+ <a name="l00358"></a>00358 <span class="keywordflow">for</span> (i = 0; i &lt; argsCount; i++) {
384
+ <a name="l00359"></a>00359 size += args[i].size() + 1;
385
+ <a name="l00360"></a>00360 }
386
+ <a name="l00361"></a>00361 <span class="keywordflow">if</span> (OXT_UNLIKELY(size &gt; 0xFFFF)) {
387
+ <a name="l00362"></a>00362 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1ArgumentException.html" title="Indicates that a specified argument is incorrect or violates a requirement.">ArgumentException</a>(<span class="stringliteral">&quot;Data size exceeds maximum size for array messages.&quot;</span>);
388
+ <a name="l00363"></a>00363 }
389
+ <a name="l00364"></a>00364
390
+ <a name="l00365"></a>00365 <a class="code" href="classPassenger_1_1ArrayMessage.html#a25603619576f11f0d76286a17a014a92" title="Given a bunch of array items, generates an array message.">Uint16Message::generate</a>(headerBuf, size);
391
+ <a name="l00366"></a>00366 out[0] = <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a>(headerBuf, <span class="keyword">sizeof</span>(uint16_t));
392
+ <a name="l00367"></a>00367 <span class="keywordflow">for</span> (i = 0; i &lt; argsCount; i++) {
393
+ <a name="l00368"></a>00368 out[1 + 2 * i] = args[i];
394
+ <a name="l00369"></a>00369 out[1 + 2 * i + 1] = <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a>(<span class="stringliteral">&quot;\0&quot;</span>, 1);
395
+ <a name="l00370"></a>00370 }
396
+ <a name="l00371"></a>00371 }
397
+ <a name="l00372"></a>00372
398
+ <a name="l00373"></a>00373 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputSize(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> argsCount) {
399
+ <a name="l00374"></a>00374 <span class="keywordflow">return</span> argsCount * 2 + 1;
400
+ <a name="l00375"></a>00375 }
401
+ <a name="l00376"></a>00376 };
402
+ <a name="l00377"></a>00377 <span class="comment"></span>
403
+ <a name="l00378"></a>00378 <span class="comment">/**</span>
404
+ <a name="l00379"></a>00379 <span class="comment"> * Class for reading a scalar message.</span>
405
+ <a name="l00380"></a>00380 <span class="comment"> */</span>
406
+ <a name="l00381"></a><a class="code" href="classPassenger_1_1ScalarMessage.html">00381</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1ScalarMessage.html" title="Class for reading a scalar message.">ScalarMessage</a> {
407
+ <a name="l00382"></a>00382 <span class="keyword">public</span>:
408
+ <a name="l00383"></a>00383 <span class="keyword">enum</span> Error {
409
+ <a name="l00384"></a>00384 TOO_LARGE
410
+ <a name="l00385"></a>00385 };
411
+ <a name="l00386"></a>00386
412
+ <a name="l00387"></a>00387 <span class="keyword">private</span>:
413
+ <a name="l00388"></a>00388 <span class="keyword">enum</span> State {
414
+ <a name="l00389"></a>00389 READING_HEADER,
415
+ <a name="l00390"></a>00390 READING_BODY,
416
+ <a name="l00391"></a>00391 DONE,
417
+ <a name="l00392"></a>00392 ERROR
418
+ <a name="l00393"></a>00393 };
419
+ <a name="l00394"></a>00394
420
+ <a name="l00395"></a>00395 uint8_t state;
421
+ <a name="l00396"></a>00396 uint8_t error;
422
+ <a name="l00397"></a>00397 uint32_t maxSize;
423
+ <a name="l00398"></a>00398 <a class="code" href="classPassenger_1_1Uint32Message.html" title="For 32-bit big-endian integers.">Uint32Message</a> headerReader;
424
+ <a name="l00399"></a>00399 <span class="keywordtype">string</span> buffer;
425
+ <a name="l00400"></a>00400 <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a> result;
426
+ <a name="l00401"></a>00401
427
+ <a name="l00402"></a>00402 <span class="keyword">public</span>:
428
+ <a name="l00403"></a>00403 <a class="code" href="classPassenger_1_1ScalarMessage.html" title="Class for reading a scalar message.">ScalarMessage</a>(uint32_t maxSize = 0) {
429
+ <a name="l00404"></a>00404 state = READING_HEADER;
430
+ <a name="l00405"></a>00405 this-&gt;maxSize = maxSize;
431
+ <a name="l00406"></a>00406 }
432
+ <a name="l00407"></a>00407
433
+ <a name="l00408"></a>00408 <span class="keywordtype">void</span> setMaxSize(uint32_t maxSize) {
434
+ <a name="l00409"></a>00409 this-&gt;maxSize = maxSize;
435
+ <a name="l00410"></a>00410 }
436
+ <a name="l00411"></a>00411 <span class="comment"></span>
437
+ <a name="l00412"></a>00412 <span class="comment"> /**</span>
438
+ <a name="l00413"></a>00413 <span class="comment"> * Resets the internal state so that this object can be used for processing</span>
439
+ <a name="l00414"></a>00414 <span class="comment"> * another scalar message.</span>
440
+ <a name="l00415"></a>00415 <span class="comment"> *</span>
441
+ <a name="l00416"></a>00416 <span class="comment"> * If &lt;em&gt;zeroBuffer&lt;/em&gt; is true, then the contents of the internal buffer</span>
442
+ <a name="l00417"></a>00417 <span class="comment"> * will be securely filled with zeroes. This is useful if e.g. the buffer</span>
443
+ <a name="l00418"></a>00418 <span class="comment"> * might contain sensitive password data.</span>
444
+ <a name="l00419"></a>00419 <span class="comment"> */</span>
445
+ <a name="l00420"></a><a class="code" href="classPassenger_1_1ScalarMessage.html#aadcc25dfe89d8acbf308bf951cc5bf32">00420</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1ScalarMessage.html#aadcc25dfe89d8acbf308bf951cc5bf32" title="Resets the internal state so that this object can be used for processing another...">reset</a>(<span class="keywordtype">bool</span> zeroBuffer = <span class="keyword">false</span>) {
446
+ <a name="l00421"></a>00421 state = READING_HEADER;
447
+ <a name="l00422"></a>00422 <span class="keywordflow">if</span> (zeroBuffer) {
448
+ <a name="l00423"></a>00423 MemZeroGuard guard(buffer);
449
+ <a name="l00424"></a>00424 }
450
+ <a name="l00425"></a>00425 headerReader.reset();
451
+ <a name="l00426"></a>00426 buffer.clear();
452
+ <a name="l00427"></a>00427 }
453
+ <a name="l00428"></a>00428
454
+ <a name="l00429"></a>00429 <span class="keywordtype">size_t</span> feed(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
455
+ <a name="l00430"></a>00430 <span class="keywordtype">size_t</span> consumed = 0;
456
+ <a name="l00431"></a>00431
457
+ <a name="l00432"></a>00432 <span class="keywordflow">while</span> (consumed &lt; size &amp;&amp; !done()) {
458
+ <a name="l00433"></a>00433 <span class="keyword">const</span> <span class="keywordtype">char</span> *current = data + consumed;
459
+ <a name="l00434"></a>00434 <span class="keywordtype">size_t</span> rest = size - consumed;
460
+ <a name="l00435"></a>00435
461
+ <a name="l00436"></a>00436 <span class="keywordflow">switch</span> (state) {
462
+ <a name="l00437"></a>00437 <span class="keywordflow">case</span> READING_HEADER:
463
+ <a name="l00438"></a>00438 consumed += headerReader.feed(current, rest);
464
+ <a name="l00439"></a>00439 <span class="keywordflow">if</span> (headerReader.done()) {
465
+ <a name="l00440"></a>00440 <span class="keywordflow">if</span> (maxSize &gt; 0 &amp;&amp; headerReader.value() &gt; maxSize) {
466
+ <a name="l00441"></a>00441 state = ERROR;
467
+ <a name="l00442"></a>00442 error = TOO_LARGE;
468
+ <a name="l00443"></a>00443 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (headerReader.value() == 0) {
469
+ <a name="l00444"></a>00444 state = DONE;
470
+ <a name="l00445"></a>00445 } <span class="keywordflow">else</span> {
471
+ <a name="l00446"></a>00446 state = READING_BODY;
472
+ <a name="l00447"></a>00447 }
473
+ <a name="l00448"></a>00448 }
474
+ <a name="l00449"></a>00449 <span class="keywordflow">break</span>;
475
+ <a name="l00450"></a>00450 <span class="keywordflow">case</span> READING_BODY:
476
+ <a name="l00451"></a>00451 <span class="keywordflow">if</span> (buffer.empty() &amp;&amp; rest &gt;= headerReader.value()) {
477
+ <a name="l00452"></a>00452 result = StaticString(current, headerReader.value());
478
+ <a name="l00453"></a>00453 state = DONE;
479
+ <a name="l00454"></a>00454 consumed += headerReader.value();
480
+ <a name="l00455"></a>00455 } <span class="keywordflow">else</span> {
481
+ <a name="l00456"></a>00456 <span class="keywordtype">size_t</span> toConsume = std::min(rest,
482
+ <a name="l00457"></a>00457 headerReader.value() - buffer.size());
483
+ <a name="l00458"></a>00458 <span class="keywordflow">if</span> (buffer.capacity() &lt; headerReader.value()) {
484
+ <a name="l00459"></a>00459 buffer.reserve(headerReader.value());
485
+ <a name="l00460"></a>00460 }
486
+ <a name="l00461"></a>00461 buffer.append(current, toConsume);
487
+ <a name="l00462"></a>00462 consumed += toConsume;
488
+ <a name="l00463"></a>00463 <span class="keywordflow">if</span> (buffer.size() == headerReader.value()) {
489
+ <a name="l00464"></a>00464 result = StaticString(buffer);
490
+ <a name="l00465"></a>00465 state = DONE;
491
+ <a name="l00466"></a>00466 }
492
+ <a name="l00467"></a>00467 }
493
+ <a name="l00468"></a>00468 <span class="keywordflow">break</span>;
494
+ <a name="l00469"></a>00469 <span class="keywordflow">default</span>:
495
+ <a name="l00470"></a>00470 <span class="comment">// Never reached.</span>
496
+ <a name="l00471"></a>00471 abort();
497
+ <a name="l00472"></a>00472 };
498
+ <a name="l00473"></a>00473 }
499
+ <a name="l00474"></a>00474 <span class="keywordflow">return</span> consumed;
500
+ <a name="l00475"></a>00475 }
501
+ <a name="l00476"></a>00476
502
+ <a name="l00477"></a>00477 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
503
+ <a name="l00478"></a>00478 <span class="keywordflow">return</span> state == DONE || state == ERROR;
504
+ <a name="l00479"></a>00479 }
505
+ <a name="l00480"></a>00480
506
+ <a name="l00481"></a>00481 <span class="keywordtype">bool</span> hasError()<span class="keyword"> const </span>{
507
+ <a name="l00482"></a>00482 <span class="keywordflow">return</span> state == ERROR;
508
+ <a name="l00483"></a>00483 }
509
+ <a name="l00484"></a>00484
510
+ <a name="l00485"></a>00485 Error errorCode()<span class="keyword"> const </span>{
511
+ <a name="l00486"></a>00486 <span class="keywordflow">return</span> (Error) error;
512
+ <a name="l00487"></a>00487 }
513
+ <a name="l00488"></a>00488
514
+ <a name="l00489"></a>00489 <span class="keyword">const</span> StaticString &amp;value()<span class="keyword"> const </span>{
515
+ <a name="l00490"></a>00490 <span class="keywordflow">return</span> result;
516
+ <a name="l00491"></a>00491 }
517
+ <a name="l00492"></a>00492
518
+ <a name="l00493"></a>00493 <span class="keyword">static</span> <span class="keywordtype">void</span> generate(<span class="keyword">const</span> StaticString &amp;data, <span class="keywordtype">char</span> headerBuf[<span class="keyword">sizeof</span>(uint32_t)],
519
+ <a name="l00494"></a>00494 StaticString output[2])
520
+ <a name="l00495"></a>00495 {
521
+ <a name="l00496"></a>00496 <span class="keywordflow">if</span> (OXT_UNLIKELY(data.size() &gt; 0xFFFFFFFF)) {
522
+ <a name="l00497"></a>00497 <span class="keywordflow">throw</span> ArgumentException(<span class="stringliteral">&quot;Data size exceeds maximum size for scalar messages.&quot;</span>);
523
+ <a name="l00498"></a>00498 }
524
+ <a name="l00499"></a>00499
525
+ <a name="l00500"></a>00500 Uint32Message::generate(headerBuf, data.size());
526
+ <a name="l00501"></a>00501 output[0] = StaticString(headerBuf, <span class="keyword">sizeof</span>(uint32_t));
527
+ <a name="l00502"></a>00502 output[1] = data;
528
+ <a name="l00503"></a>00503 }
529
+ <a name="l00504"></a>00504 };
530
+ <a name="l00505"></a>00505
531
+ <a name="l00506"></a>00506 } <span class="comment">// namespace Passenger</span>
532
+ <a name="l00507"></a>00507
533
+ <a name="l00508"></a>00508 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_MESSAGE_READERS_WRITERS_H_ */</span>
534
+ </pre></div></div>
535
+ <hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
536
+ <a href="http://www.doxygen.org/index.html">
537
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
538
+ </body>
539
+ </html>