passenger 3.0.7 → 3.0.8

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 (439) hide show
  1. data/NEWS +27 -0
  2. data/README +1 -1
  3. data/bin/passenger-install-nginx-module +3 -1
  4. data/build/config.rb +2 -1
  5. data/build/cxx_tests.rb +7 -3
  6. data/build/documentation.rb +5 -40
  7. data/build/nginx.rb +0 -1
  8. data/build/packaging.rb +0 -6
  9. data/build/rake_extensions.rb +5 -0
  10. data/doc/Architectural overview.html +344 -77
  11. data/doc/Security of user switching support.html +338 -71
  12. data/doc/Users guide Apache with comments.html +4830 -0
  13. data/doc/Users guide Apache.html +695 -428
  14. data/doc/Users guide Apache.idmap.txt +80 -0
  15. data/doc/Users guide Apache.txt +5 -5
  16. data/doc/Users guide Nginx.html +591 -313
  17. data/doc/Users guide Nginx.txt +9 -3
  18. data/doc/Users guide Standalone.html +344 -77
  19. data/ext/boost/src/pthread/thread.cpp +1 -1
  20. data/ext/common/AccountsDatabase.h +1 -1
  21. data/ext/common/Constants.h +2 -2
  22. data/ext/common/Logging.h +2 -1
  23. data/ext/common/LoggingAgent/FilterSupport.h +107 -3
  24. data/ext/common/Session.h +1 -1
  25. data/ext/common/Utils.cpp +2 -0
  26. data/ext/common/Utils/Dechunker.h +232 -0
  27. data/ext/common/Utils/HttpHeaderBufferer.h +165 -0
  28. data/ext/common/Utils/StrIntUtils.cpp +51 -15
  29. data/ext/common/Utils/StrIntUtils.h +3 -0
  30. data/ext/common/Utils/StreamBoyerMooreHorspool.h +506 -0
  31. data/ext/nginx/Configuration.c +36 -282
  32. data/ext/nginx/ContentHandler.c +17 -0
  33. data/ext/nginx/HelperAgent.cpp +397 -39
  34. data/ext/oxt/tracable_exception.cpp +3 -1
  35. data/ext/ruby/extconf.rb +1 -0
  36. data/ext/ruby/passenger_native_support.c +3 -0
  37. data/helper-scripts/prespawn +113 -31
  38. data/lib/phusion_passenger.rb +2 -2
  39. data/lib/phusion_passenger/standalone/runtime_installer.rb +3 -2
  40. data/lib/phusion_passenger/standalone/start_command.rb +12 -12
  41. data/test/cxx/DechunkerTest.cpp +216 -0
  42. data/test/cxx/FilterSupportTest.cpp +31 -4
  43. data/test/cxx/HttpHeaderBuffererTest.cpp +203 -0
  44. data/test/cxx/UtilsTest.cpp +46 -3
  45. data/test/integration_tests/hello_world_rack_spec.rb +7 -0
  46. data/test/stub/rack/config.ru +6 -1
  47. data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +1 -1
  48. data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +1 -1
  49. data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +1 -1
  50. data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +1 -1
  51. data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +1 -1
  52. data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +1 -1
  53. data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +1 -1
  54. data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +1 -1
  55. data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +1 -1
  56. metadata +20 -403
  57. data/doc/Doxyfile +0 -241
  58. data/doc/cxxapi/AbstractSpawnManager_8h_source.html +0 -141
  59. data/doc/cxxapi/Account_8h_source.html +0 -206
  60. data/doc/cxxapi/AccountsDatabase_8h_source.html +0 -161
  61. data/doc/cxxapi/AgentBase_8h_source.html +0 -70
  62. data/doc/cxxapi/AgentsStarter_8h_source.html +0 -112
  63. data/doc/cxxapi/BCrypt_8h_source.html +0 -104
  64. data/doc/cxxapi/Blowfish_8h_source.html +0 -134
  65. data/doc/cxxapi/Bucket_8h_source.html +0 -118
  66. data/doc/cxxapi/Constants_8h_source.html +0 -79
  67. data/doc/cxxapi/ContentHandler_8h_source.html +0 -95
  68. data/doc/cxxapi/DirectoryMapper_8h_source.html +0 -311
  69. data/doc/cxxapi/EventedClient_8h_source.html +0 -733
  70. data/doc/cxxapi/EventedMessageServer_8h_source.html +0 -358
  71. data/doc/cxxapi/EventedServer_8h_source.html +0 -326
  72. data/doc/cxxapi/Exceptions_8h_source.html +0 -393
  73. data/doc/cxxapi/FileDescriptor_8h_source.html +0 -324
  74. data/doc/cxxapi/Hooks_8h_source.html +0 -76
  75. data/doc/cxxapi/HttpStatusExtractor_8h_source.html +0 -382
  76. data/doc/cxxapi/IniFile_8h_source.html +0 -527
  77. data/doc/cxxapi/Logging_8h_source.html +0 -796
  78. data/doc/cxxapi/MessageChannel_8h_source.html +0 -776
  79. data/doc/cxxapi/MessageClient_8h_source.html +0 -328
  80. data/doc/cxxapi/MessageReadersWriters_8h_source.html +0 -539
  81. data/doc/cxxapi/MessageServer_8h_source.html +0 -612
  82. data/doc/cxxapi/PoolOptions_8h_source.html +0 -549
  83. data/doc/cxxapi/Process_8h_source.html +0 -286
  84. data/doc/cxxapi/RandomGenerator_8h_source.html +0 -191
  85. data/doc/cxxapi/ResourceLocator_8h_source.html +0 -166
  86. data/doc/cxxapi/SafeLibev_8h_source.html +0 -180
  87. data/doc/cxxapi/ScgiRequestParser_8h_source.html +0 -406
  88. data/doc/cxxapi/ServerInstanceDir_8h_source.html +0 -378
  89. data/doc/cxxapi/Session_8h_source.html +0 -501
  90. data/doc/cxxapi/SpawnManager_8h_source.html +0 -647
  91. data/doc/cxxapi/StaticContentHandler_8h_source.html +0 -69
  92. data/doc/cxxapi/StaticString_8h_source.html +0 -329
  93. data/doc/cxxapi/StringListCreator_8h_source.html +0 -114
  94. data/doc/cxxapi/Utils_8h_source.html +0 -469
  95. data/doc/cxxapi/annotated.html +0 -87
  96. data/doc/cxxapi/apache2_2Configuration_8h_source.html +0 -82
  97. data/doc/cxxapi/classAgentWatcher-members.html +0 -54
  98. data/doc/cxxapi/classAgentWatcher.html +0 -419
  99. data/doc/cxxapi/classClient-members.html +0 -38
  100. data/doc/cxxapi/classClient.html +0 -123
  101. data/doc/cxxapi/classHooks-members.html +0 -40
  102. data/doc/cxxapi/classHooks.html +0 -153
  103. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +0 -40
  104. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +0 -187
  105. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.map +0 -3
  106. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.md5 +0 -1
  107. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.png +0 -0
  108. data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +0 -36
  109. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +0 -56
  110. data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +0 -37
  111. data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +0 -113
  112. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +0 -38
  113. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +0 -112
  114. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +0 -36
  115. data/doc/cxxapi/classPassenger_1_1BusyException.html +0 -54
  116. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +0 -36
  117. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +0 -51
  118. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +0 -41
  119. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +0 -223
  120. data/doc/cxxapi/classPassenger_1_1EOFException-members.html +0 -36
  121. data/doc/cxxapi/classPassenger_1_1EOFException.html +0 -61
  122. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.map +0 -3
  123. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.md5 +0 -1
  124. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.png +0 -0
  125. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +0 -36
  126. data/doc/cxxapi/classPassenger_1_1EventFd.html +0 -52
  127. data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +0 -59
  128. data/doc/cxxapi/classPassenger_1_1EventedClient.html +0 -531
  129. data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +0 -37
  130. data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +0 -59
  131. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +0 -3
  132. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +0 -1
  133. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
  134. data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +0 -37
  135. data/doc/cxxapi/classPassenger_1_1EventedServer.html +0 -93
  136. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +0 -3
  137. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +0 -1
  138. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
  139. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +0 -41
  140. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +0 -178
  141. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +0 -36
  142. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +0 -52
  143. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +0 -36
  144. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +0 -58
  145. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.map +0 -3
  146. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.md5 +0 -1
  147. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  148. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +0 -41
  149. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +0 -66
  150. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.map +0 -3
  151. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.md5 +0 -1
  152. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  153. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +0 -39
  154. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +0 -128
  155. data/doc/cxxapi/classPassenger_1_1IOException-members.html +0 -36
  156. data/doc/cxxapi/classPassenger_1_1IOException.html +0 -61
  157. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +0 -4
  158. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +0 -1
  159. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  160. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +0 -57
  161. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +0 -839
  162. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +0 -49
  163. data/doc/cxxapi/classPassenger_1_1MessageServer.html +0 -407
  164. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +0 -36
  165. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +0 -58
  166. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +0 -3
  167. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +0 -1
  168. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
  169. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +0 -41
  170. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +0 -165
  171. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +0 -3
  172. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +0 -1
  173. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
  174. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +0 -39
  175. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +0 -173
  176. data/doc/cxxapi/classPassenger_1_1Process-members.html +0 -44
  177. data/doc/cxxapi/classPassenger_1_1Process.html +0 -290
  178. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +0 -37
  179. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +0 -79
  180. data/doc/cxxapi/classPassenger_1_1ResourceLocator-members.html +0 -36
  181. data/doc/cxxapi/classPassenger_1_1ResourceLocator.html +0 -51
  182. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +0 -36
  183. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +0 -54
  184. data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +0 -36
  185. data/doc/cxxapi/classPassenger_1_1SafeLibev.html +0 -51
  186. data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +0 -37
  187. data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +0 -76
  188. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +0 -50
  189. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +0 -285
  190. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +0 -36
  191. data/doc/cxxapi/classPassenger_1_1SecurityException.html +0 -56
  192. data/doc/cxxapi/classPassenger_1_1Session-members.html +0 -53
  193. data/doc/cxxapi/classPassenger_1_1Session.html +0 -556
  194. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.map +0 -3
  195. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.md5 +0 -1
  196. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.png +0 -0
  197. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +0 -39
  198. data/doc/cxxapi/classPassenger_1_1SpawnException.html +0 -101
  199. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +0 -42
  200. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +0 -292
  201. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.map +0 -3
  202. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.md5 +0 -1
  203. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.png +0 -0
  204. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +0 -54
  205. data/doc/cxxapi/classPassenger_1_1StandardSession.html +0 -394
  206. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.map +0 -3
  207. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.md5 +0 -1
  208. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.png +0 -0
  209. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +0 -36
  210. data/doc/cxxapi/classPassenger_1_1StaticString.html +0 -56
  211. data/doc/cxxapi/classPassenger_1_1SyntaxError-members.html +0 -36
  212. data/doc/cxxapi/classPassenger_1_1SyntaxError.html +0 -54
  213. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +0 -40
  214. data/doc/cxxapi/classPassenger_1_1SystemException.html +0 -155
  215. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +0 -4
  216. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +0 -1
  217. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  218. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +0 -40
  219. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +0 -61
  220. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.map +0 -3
  221. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.md5 +0 -1
  222. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.png +0 -0
  223. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +0 -36
  224. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +0 -54
  225. data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +0 -36
  226. data/doc/cxxapi/classPassenger_1_1Uint16Message.html +0 -51
  227. data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +0 -36
  228. data/doc/cxxapi/classPassenger_1_1Uint32Message.html +0 -51
  229. data/doc/cxxapi/classServer-members.html +0 -36
  230. data/doc/cxxapi/classServer.html +0 -49
  231. data/doc/cxxapi/classServerInstanceDirToucher-members.html +0 -36
  232. data/doc/cxxapi/classServerInstanceDirToucher.html +0 -47
  233. data/doc/cxxapi/classes.html +0 -52
  234. data/doc/cxxapi/definitions_8h_source.html +0 -36
  235. data/doc/cxxapi/doxygen.css +0 -532
  236. data/doc/cxxapi/doxygen.png +0 -0
  237. data/doc/cxxapi/files.html +0 -76
  238. data/doc/cxxapi/ftv2blank.png +0 -0
  239. data/doc/cxxapi/ftv2doc.png +0 -0
  240. data/doc/cxxapi/ftv2folderclosed.png +0 -0
  241. data/doc/cxxapi/ftv2folderopen.png +0 -0
  242. data/doc/cxxapi/ftv2lastnode.png +0 -0
  243. data/doc/cxxapi/ftv2link.png +0 -0
  244. data/doc/cxxapi/ftv2mlastnode.png +0 -0
  245. data/doc/cxxapi/ftv2mnode.png +0 -0
  246. data/doc/cxxapi/ftv2node.png +0 -0
  247. data/doc/cxxapi/ftv2plastnode.png +0 -0
  248. data/doc/cxxapi/ftv2pnode.png +0 -0
  249. data/doc/cxxapi/ftv2vertline.png +0 -0
  250. data/doc/cxxapi/functions.html +0 -103
  251. data/doc/cxxapi/functions_0x62.html +0 -82
  252. data/doc/cxxapi/functions_0x63.html +0 -102
  253. data/doc/cxxapi/functions_0x64.html +0 -102
  254. data/doc/cxxapi/functions_0x65.html +0 -88
  255. data/doc/cxxapi/functions_0x66.html +0 -100
  256. data/doc/cxxapi/functions_0x67.html +0 -167
  257. data/doc/cxxapi/functions_0x68.html +0 -88
  258. data/doc/cxxapi/functions_0x69.html +0 -96
  259. data/doc/cxxapi/functions_0x6b.html +0 -80
  260. data/doc/cxxapi/functions_0x6c.html +0 -88
  261. data/doc/cxxapi/functions_0x6d.html +0 -88
  262. data/doc/cxxapi/functions_0x6e.html +0 -86
  263. data/doc/cxxapi/functions_0x6f.html +0 -94
  264. data/doc/cxxapi/functions_0x70.html +0 -94
  265. data/doc/cxxapi/functions_0x72.html +0 -110
  266. data/doc/cxxapi/functions_0x73.html +0 -171
  267. data/doc/cxxapi/functions_0x74.html +0 -85
  268. data/doc/cxxapi/functions_0x75.html +0 -85
  269. data/doc/cxxapi/functions_0x77.html +0 -92
  270. data/doc/cxxapi/functions_0x7e.html +0 -79
  271. data/doc/cxxapi/functions_enum.html +0 -49
  272. data/doc/cxxapi/functions_eval.html +0 -67
  273. data/doc/cxxapi/functions_func.html +0 -531
  274. data/doc/cxxapi/functions_vars.html +0 -278
  275. data/doc/cxxapi/graph_legend.dot +0 -22
  276. data/doc/cxxapi/graph_legend.html +0 -92
  277. data/doc/cxxapi/graph_legend.png +0 -0
  278. data/doc/cxxapi/group__Core.html +0 -46
  279. data/doc/cxxapi/group__Core.map +0 -3
  280. data/doc/cxxapi/group__Core.png +0 -0
  281. data/doc/cxxapi/group__Exceptions.html +0 -53
  282. data/doc/cxxapi/group__Hooks.html +0 -42
  283. data/doc/cxxapi/group__Hooks.map +0 -3
  284. data/doc/cxxapi/group__Hooks.png +0 -0
  285. data/doc/cxxapi/group__Support.html +0 -538
  286. data/doc/cxxapi/hierarchy.html +0 -101
  287. data/doc/cxxapi/index.html +0 -16
  288. data/doc/cxxapi/inherit__graph__0.map +0 -3
  289. data/doc/cxxapi/inherit__graph__0.md5 +0 -1
  290. data/doc/cxxapi/inherit__graph__0.png +0 -0
  291. data/doc/cxxapi/inherit__graph__1.map +0 -3
  292. data/doc/cxxapi/inherit__graph__1.md5 +0 -1
  293. data/doc/cxxapi/inherit__graph__1.png +0 -0
  294. data/doc/cxxapi/inherit__graph__10.map +0 -3
  295. data/doc/cxxapi/inherit__graph__10.md5 +0 -1
  296. data/doc/cxxapi/inherit__graph__10.png +0 -0
  297. data/doc/cxxapi/inherit__graph__11.map +0 -4
  298. data/doc/cxxapi/inherit__graph__11.md5 +0 -1
  299. data/doc/cxxapi/inherit__graph__11.png +0 -0
  300. data/doc/cxxapi/inherit__graph__12.map +0 -3
  301. data/doc/cxxapi/inherit__graph__12.md5 +0 -1
  302. data/doc/cxxapi/inherit__graph__12.png +0 -0
  303. data/doc/cxxapi/inherit__graph__13.map +0 -3
  304. data/doc/cxxapi/inherit__graph__13.md5 +0 -1
  305. data/doc/cxxapi/inherit__graph__13.png +0 -0
  306. data/doc/cxxapi/inherit__graph__14.map +0 -3
  307. data/doc/cxxapi/inherit__graph__14.md5 +0 -1
  308. data/doc/cxxapi/inherit__graph__14.png +0 -0
  309. data/doc/cxxapi/inherit__graph__15.map +0 -3
  310. data/doc/cxxapi/inherit__graph__15.md5 +0 -1
  311. data/doc/cxxapi/inherit__graph__15.png +0 -0
  312. data/doc/cxxapi/inherit__graph__16.map +0 -5
  313. data/doc/cxxapi/inherit__graph__16.md5 +0 -1
  314. data/doc/cxxapi/inherit__graph__16.png +0 -0
  315. data/doc/cxxapi/inherit__graph__17.map +0 -3
  316. data/doc/cxxapi/inherit__graph__17.md5 +0 -1
  317. data/doc/cxxapi/inherit__graph__17.png +0 -0
  318. data/doc/cxxapi/inherit__graph__18.map +0 -3
  319. data/doc/cxxapi/inherit__graph__18.md5 +0 -1
  320. data/doc/cxxapi/inherit__graph__18.png +0 -0
  321. data/doc/cxxapi/inherit__graph__19.map +0 -4
  322. data/doc/cxxapi/inherit__graph__19.md5 +0 -1
  323. data/doc/cxxapi/inherit__graph__19.png +0 -0
  324. data/doc/cxxapi/inherit__graph__2.map +0 -3
  325. data/doc/cxxapi/inherit__graph__2.md5 +0 -1
  326. data/doc/cxxapi/inherit__graph__2.png +0 -0
  327. data/doc/cxxapi/inherit__graph__20.map +0 -3
  328. data/doc/cxxapi/inherit__graph__20.md5 +0 -1
  329. data/doc/cxxapi/inherit__graph__20.png +0 -0
  330. data/doc/cxxapi/inherit__graph__21.map +0 -3
  331. data/doc/cxxapi/inherit__graph__21.md5 +0 -1
  332. data/doc/cxxapi/inherit__graph__21.png +0 -0
  333. data/doc/cxxapi/inherit__graph__22.map +0 -3
  334. data/doc/cxxapi/inherit__graph__22.md5 +0 -1
  335. data/doc/cxxapi/inherit__graph__22.png +0 -0
  336. data/doc/cxxapi/inherit__graph__23.map +0 -3
  337. data/doc/cxxapi/inherit__graph__23.md5 +0 -1
  338. data/doc/cxxapi/inherit__graph__23.png +0 -0
  339. data/doc/cxxapi/inherit__graph__24.map +0 -3
  340. data/doc/cxxapi/inherit__graph__24.md5 +0 -1
  341. data/doc/cxxapi/inherit__graph__24.png +0 -0
  342. data/doc/cxxapi/inherit__graph__25.map +0 -3
  343. data/doc/cxxapi/inherit__graph__25.md5 +0 -1
  344. data/doc/cxxapi/inherit__graph__25.png +0 -0
  345. data/doc/cxxapi/inherit__graph__26.map +0 -3
  346. data/doc/cxxapi/inherit__graph__26.md5 +0 -1
  347. data/doc/cxxapi/inherit__graph__26.png +0 -0
  348. data/doc/cxxapi/inherit__graph__27.map +0 -3
  349. data/doc/cxxapi/inherit__graph__27.md5 +0 -1
  350. data/doc/cxxapi/inherit__graph__27.png +0 -0
  351. data/doc/cxxapi/inherit__graph__28.map +0 -3
  352. data/doc/cxxapi/inherit__graph__28.md5 +0 -1
  353. data/doc/cxxapi/inherit__graph__28.png +0 -0
  354. data/doc/cxxapi/inherit__graph__29.map +0 -3
  355. data/doc/cxxapi/inherit__graph__29.md5 +0 -1
  356. data/doc/cxxapi/inherit__graph__29.png +0 -0
  357. data/doc/cxxapi/inherit__graph__3.map +0 -4
  358. data/doc/cxxapi/inherit__graph__3.md5 +0 -1
  359. data/doc/cxxapi/inherit__graph__3.png +0 -0
  360. data/doc/cxxapi/inherit__graph__30.map +0 -3
  361. data/doc/cxxapi/inherit__graph__30.md5 +0 -1
  362. data/doc/cxxapi/inherit__graph__30.png +0 -0
  363. data/doc/cxxapi/inherit__graph__31.map +0 -4
  364. data/doc/cxxapi/inherit__graph__31.md5 +0 -1
  365. data/doc/cxxapi/inherit__graph__31.png +0 -0
  366. data/doc/cxxapi/inherit__graph__32.map +0 -3
  367. data/doc/cxxapi/inherit__graph__32.md5 +0 -1
  368. data/doc/cxxapi/inherit__graph__32.png +0 -0
  369. data/doc/cxxapi/inherit__graph__33.map +0 -3
  370. data/doc/cxxapi/inherit__graph__33.md5 +0 -1
  371. data/doc/cxxapi/inherit__graph__33.png +0 -0
  372. data/doc/cxxapi/inherit__graph__34.map +0 -3
  373. data/doc/cxxapi/inherit__graph__34.md5 +0 -1
  374. data/doc/cxxapi/inherit__graph__34.png +0 -0
  375. data/doc/cxxapi/inherit__graph__35.map +0 -3
  376. data/doc/cxxapi/inherit__graph__35.md5 +0 -1
  377. data/doc/cxxapi/inherit__graph__35.png +0 -0
  378. data/doc/cxxapi/inherit__graph__36.map +0 -5
  379. data/doc/cxxapi/inherit__graph__36.md5 +0 -1
  380. data/doc/cxxapi/inherit__graph__36.png +0 -0
  381. data/doc/cxxapi/inherit__graph__37.map +0 -3
  382. data/doc/cxxapi/inherit__graph__37.md5 +0 -1
  383. data/doc/cxxapi/inherit__graph__37.png +0 -0
  384. data/doc/cxxapi/inherit__graph__38.map +0 -3
  385. data/doc/cxxapi/inherit__graph__38.md5 +0 -1
  386. data/doc/cxxapi/inherit__graph__38.png +0 -0
  387. data/doc/cxxapi/inherit__graph__39.map +0 -3
  388. data/doc/cxxapi/inherit__graph__39.md5 +0 -1
  389. data/doc/cxxapi/inherit__graph__39.png +0 -0
  390. data/doc/cxxapi/inherit__graph__4.map +0 -3
  391. data/doc/cxxapi/inherit__graph__4.md5 +0 -1
  392. data/doc/cxxapi/inherit__graph__4.png +0 -0
  393. data/doc/cxxapi/inherit__graph__40.map +0 -3
  394. data/doc/cxxapi/inherit__graph__40.md5 +0 -1
  395. data/doc/cxxapi/inherit__graph__40.png +0 -0
  396. data/doc/cxxapi/inherit__graph__41.map +0 -3
  397. data/doc/cxxapi/inherit__graph__41.md5 +0 -1
  398. data/doc/cxxapi/inherit__graph__41.png +0 -0
  399. data/doc/cxxapi/inherit__graph__5.map +0 -3
  400. data/doc/cxxapi/inherit__graph__5.md5 +0 -1
  401. data/doc/cxxapi/inherit__graph__5.png +0 -0
  402. data/doc/cxxapi/inherit__graph__6.map +0 -3
  403. data/doc/cxxapi/inherit__graph__6.md5 +0 -1
  404. data/doc/cxxapi/inherit__graph__6.png +0 -0
  405. data/doc/cxxapi/inherit__graph__7.map +0 -3
  406. data/doc/cxxapi/inherit__graph__7.md5 +0 -1
  407. data/doc/cxxapi/inherit__graph__7.png +0 -0
  408. data/doc/cxxapi/inherit__graph__8.map +0 -3
  409. data/doc/cxxapi/inherit__graph__8.md5 +0 -1
  410. data/doc/cxxapi/inherit__graph__8.png +0 -0
  411. data/doc/cxxapi/inherit__graph__9.map +0 -3
  412. data/doc/cxxapi/inherit__graph__9.md5 +0 -1
  413. data/doc/cxxapi/inherit__graph__9.png +0 -0
  414. data/doc/cxxapi/inherits.html +0 -165
  415. data/doc/cxxapi/main.html +0 -28
  416. data/doc/cxxapi/modules.html +0 -36
  417. data/doc/cxxapi/namespacePassenger.html +0 -585
  418. data/doc/cxxapi/namespacemembers.html +0 -190
  419. data/doc/cxxapi/namespacemembers_enum.html +0 -48
  420. data/doc/cxxapi/namespacemembers_eval.html +0 -57
  421. data/doc/cxxapi/namespacemembers_func.html +0 -114
  422. data/doc/cxxapi/namespacemembers_type.html +0 -54
  423. data/doc/cxxapi/namespaces.html +0 -37
  424. data/doc/cxxapi/nginx_2Configuration_8h_source.html +0 -126
  425. data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +0 -95
  426. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +0 -36
  427. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +0 -51
  428. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +0 -67
  429. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +0 -647
  430. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +0 -36
  431. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +0 -51
  432. data/doc/cxxapi/tab_b.gif +0 -0
  433. data/doc/cxxapi/tab_l.gif +0 -0
  434. data/doc/cxxapi/tab_r.gif +0 -0
  435. data/doc/cxxapi/tabs.css +0 -105
  436. data/doc/cxxapi/tree.html +0 -249
  437. data/doc/template/horo.rb +0 -613
  438. data/ext/libev/config.h +0 -122
  439. data/ext/nginx/HttpStatusExtractor.h +0 -351
@@ -1,358 +0,0 @@
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: EventedMessageServer.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>EventedMessageServer.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_EVENTED_MESSAGE_SERVER_H_</span>
51
- <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_EVENTED_MESSAGE_SERVER_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;ev++.h&gt;</span>
55
- <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;cstdarg&gt;</span>
56
- <a name="l00031"></a>00031 <span class="preprocessor">#include &quot;EventedServer.h&quot;</span>
57
- <a name="l00032"></a>00032 <span class="preprocessor">#include &quot;MessageReadersWriters.h&quot;</span>
58
- <a name="l00033"></a>00033 <span class="preprocessor">#include &quot;AccountsDatabase.h&quot;</span>
59
- <a name="l00034"></a>00034 <span class="preprocessor">#include &quot;Constants.h&quot;</span>
60
- <a name="l00035"></a>00035 <span class="preprocessor">#include &quot;Utils.h&quot;</span>
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>boost;
65
- <a name="l00040"></a>00040
66
- <a name="l00041"></a>00041 <span class="comment">/* This source file follows the security guidelines written in Account.h. */</span>
67
- <a name="l00042"></a>00042
68
- <a name="l00043"></a>00043 <span class="keyword">struct </span>EventedMessageClientContext {
69
- <a name="l00044"></a>00044 <span class="keyword">enum</span> State {
70
- <a name="l00045"></a>00045 MS_READING_USERNAME,
71
- <a name="l00046"></a>00046 MS_READING_PASSWORD,
72
- <a name="l00047"></a>00047 MS_READING_MESSAGE,
73
- <a name="l00048"></a>00048 MS_PROCESSING_MESSAGE
74
- <a name="l00049"></a>00049 };
75
- <a name="l00050"></a>00050
76
- <a name="l00051"></a>00051 State state;
77
- <a name="l00052"></a>00052 AccountPtr account;
78
- <a name="l00053"></a>00053
79
- <a name="l00054"></a>00054 ev::timer authenticationTimer;
80
- <a name="l00055"></a>00055 ScalarMessage scalarReader;
81
- <a name="l00056"></a>00056 ArrayMessage arrayReader;
82
- <a name="l00057"></a>00057 <span class="keywordtype">string</span> username;
83
- <a name="l00058"></a>00058
84
- <a name="l00059"></a>00059 EventedMessageClientContext() {
85
- <a name="l00060"></a>00060 state = MS_READING_USERNAME;
86
- <a name="l00061"></a>00061 }
87
- <a name="l00062"></a>00062
88
- <a name="l00063"></a>00063 ~EventedMessageClientContext() {
89
- <a name="l00064"></a>00064 <span class="comment">/* Its buffer might contain password data so make sure</span>
90
- <a name="l00065"></a>00065 <span class="comment"> * it&#39;s properly zeroed out. */</span>
91
- <a name="l00066"></a>00066 scalarReader.reset(<span class="keyword">true</span>);
92
- <a name="l00067"></a>00067 }
93
- <a name="l00068"></a>00068 };
94
- <a name="l00069"></a>00069
95
- <a name="l00070"></a>00070 <span class="keyword">class </span>EventedMessageClient: <span class="keyword">public</span> EventedClient {
96
- <a name="l00071"></a>00071 <span class="keyword">public</span>:
97
- <a name="l00072"></a>00072 EventedMessageClientContext messageServer;
98
- <a name="l00073"></a>00073
99
- <a name="l00074"></a>00074 EventedMessageClient(<span class="keyword">struct</span> ev_loop *loop, <span class="keyword">const</span> FileDescriptor &amp;fd)
100
- <a name="l00075"></a>00075 : <a class="code" href="classPassenger_1_1EventedClient.html#ac3c45bfa7ac30b6d59ef08dc296f3c4e" title="Creates a new EventedClient with the given libev loop and file descriptor.">EventedClient</a>(loop, fd)
101
- <a name="l00076"></a>00076 {
102
- <a name="l00077"></a>00077 messageServer.authenticationTimer.set(loop);
103
- <a name="l00078"></a>00078 }
104
- <a name="l00079"></a>00079
105
- <a name="l00080"></a>00080 <span class="keywordtype">void</span> writeArrayMessage(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, ...) {
106
- <a name="l00081"></a>00081 va_list ap;
107
- <a name="l00082"></a>00082 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count = 0;
108
- <a name="l00083"></a>00083
109
- <a name="l00084"></a>00084 va_start(ap, name);
110
- <a name="l00085"></a>00085 <span class="keywordflow">while</span> (va_arg(ap, <span class="keyword">const</span> <span class="keywordtype">char</span> *) != NULL) {
111
- <a name="l00086"></a>00086 count++;
112
- <a name="l00087"></a>00087 }
113
- <a name="l00088"></a>00088 va_end(ap);
114
- <a name="l00089"></a>00089
115
- <a name="l00090"></a>00090 StaticString args[count + 1];
116
- <a name="l00091"></a>00091 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 1;
117
- <a name="l00092"></a>00092
118
- <a name="l00093"></a>00093 args[0] = name;
119
- <a name="l00094"></a>00094 va_start(ap, name);
120
- <a name="l00095"></a>00095 <span class="keywordflow">while</span> (<span class="keyword">true</span>) {
121
- <a name="l00096"></a>00096 <span class="keyword">const</span> <span class="keywordtype">char</span> *arg = va_arg(ap, <span class="keyword">const</span> <span class="keywordtype">char</span> *);
122
- <a name="l00097"></a>00097 <span class="keywordflow">if</span> (arg != NULL) {
123
- <a name="l00098"></a>00098 args[i] = arg;
124
- <a name="l00099"></a>00099 i++;
125
- <a name="l00100"></a>00100 } <span class="keywordflow">else</span> {
126
- <a name="l00101"></a>00101 <span class="keywordflow">break</span>;
127
- <a name="l00102"></a>00102 }
128
- <a name="l00103"></a>00103 }
129
- <a name="l00104"></a>00104 va_end(ap);
130
- <a name="l00105"></a>00105
131
- <a name="l00106"></a>00106 writeArrayMessage(args, count + 1);
132
- <a name="l00107"></a>00107 }
133
- <a name="l00108"></a>00108
134
- <a name="l00109"></a>00109 <span class="keywordtype">void</span> writeArrayMessage(StaticString args[], <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count) {
135
- <a name="l00110"></a>00110 <span class="keywordtype">char</span> headerBuf[<span class="keyword">sizeof</span>(uint16_t)];
136
- <a name="l00111"></a>00111 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outSize = ArrayMessage::outputSize(count);
137
- <a name="l00112"></a>00112 StaticString out[outSize];
138
- <a name="l00113"></a>00113
139
- <a name="l00114"></a>00114 <a class="code" href="classPassenger_1_1ArrayMessage.html#a25603619576f11f0d76286a17a014a92" title="Given a bunch of array items, generates an array message.">ArrayMessage::generate</a>(args, count, headerBuf, out, outSize);
140
- <a name="l00115"></a>00115 write(out, outSize);
141
- <a name="l00116"></a>00116 }
142
- <a name="l00117"></a>00117 };
143
- <a name="l00118"></a>00118 <span class="comment"></span>
144
- <a name="l00119"></a>00119 <span class="comment">/**</span>
145
- <a name="l00120"></a><a class="code" href="classPassenger_1_1EventedMessageServer.html">00120</a> <span class="comment"> * Note when overriding onNewClient: call the parent method first! It does</span>
146
- <a name="l00121"></a>00121 <span class="comment"> * some initialization but might disconnect the client if that initialization</span>
147
- <a name="l00122"></a>00122 <span class="comment"> * fails. The override should check for this.</span>
148
- <a name="l00123"></a>00123 <span class="comment"> */</span>
149
- <a name="l00124"></a>00124 <span class="keyword">class </span><a class="code" href="classPassenger_1_1EventedMessageServer.html" title="Note when overriding onNewClient: call the parent method first! It does some initialization...">EventedMessageServer</a>: <span class="keyword">public</span> <a class="code" href="classPassenger_1_1EventedServer.html" title="A base class for writing single-threaded, evented servers that use non-blocking I/O...">EventedServer</a> {
150
- <a name="l00125"></a>00125 <span class="keyword">protected</span>:
151
- <a name="l00126"></a>00126 AccountsDatabasePtr accountsDatabase;
152
- <a name="l00127"></a>00127
153
- <a name="l00128"></a>00128
154
- <a name="l00129"></a>00129 <span class="comment">/******** Overrided hooks and methods ********/</span>
155
- <a name="l00130"></a>00130
156
- <a name="l00131"></a>00131 <span class="keyword">virtual</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *createClient(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> &amp;fd) {
157
- <a name="l00132"></a>00132 <span class="keywordflow">return</span> <span class="keyword">new</span> EventedMessageClient(getLoop(), fd);
158
- <a name="l00133"></a>00133 }
159
- <a name="l00134"></a>00134
160
- <a name="l00135"></a>00135 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onNewClient(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *_client) {
161
- <a name="l00136"></a>00136 EventedMessageClient *client = (EventedMessageClient *) _client;
162
- <a name="l00137"></a>00137 EventedMessageClientContext *context = &amp;client-&gt;messageServer;
163
- <a name="l00138"></a>00138
164
- <a name="l00139"></a>00139 context-&gt;authenticationTimer.set
165
- <a name="l00140"></a>00140 &lt;&amp;EventedMessageServer::onAuthenticationTimeout&gt;(client);
166
- <a name="l00141"></a>00141 context-&gt;authenticationTimer.start(10);
167
- <a name="l00142"></a>00142
168
- <a name="l00143"></a>00143 context-&gt;arrayReader.reserve(5);
169
- <a name="l00144"></a>00144 context-&gt;scalarReader.setMaxSize(MESSAGE_SERVER_MAX_USERNAME_SIZE);
170
- <a name="l00145"></a>00145
171
- <a name="l00146"></a>00146 client-&gt;writeArrayMessage(<span class="stringliteral">&quot;version&quot;</span>, protocolVersion(), NULL);
172
- <a name="l00147"></a>00147 }
173
- <a name="l00148"></a>00148
174
- <a name="l00149"></a>00149 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onClientReadable(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *_client) {
175
- <a name="l00150"></a>00150 EventedMessageClient *client = (EventedMessageClient *) _client;
176
- <a name="l00151"></a>00151 this_thread::disable_syscall_interruption dsi;
177
- <a name="l00152"></a>00152 <span class="keywordtype">int</span> i = 0;
178
- <a name="l00153"></a>00153 <span class="keywordtype">bool</span> done = <span class="keyword">false</span>;
179
- <a name="l00154"></a>00154
180
- <a name="l00155"></a>00155 <span class="comment">// read() from the client at most 10 times on every read readiness event</span>
181
- <a name="l00156"></a>00156 <span class="comment">// in order to give other events the chance to be processed.</span>
182
- <a name="l00157"></a>00157 <span class="keywordflow">while</span> (i &lt; 10 &amp;&amp; !done) {
183
- <a name="l00158"></a>00158 <span class="keywordtype">char</span> buf[1024 * 8];
184
- <a name="l00159"></a>00159 ssize_t ret;
185
- <a name="l00160"></a>00160
186
- <a name="l00161"></a>00161 ret = syscalls::read(client-&gt;fd, buf, <span class="keyword">sizeof</span>(buf));
187
- <a name="l00162"></a>00162 <span class="keywordflow">if</span> (ret == -1) {
188
- <a name="l00163"></a>00163 <span class="keywordflow">if</span> (errno != EAGAIN) {
189
- <a name="l00164"></a>00164 <span class="keywordtype">int</span> e = errno;
190
- <a name="l00165"></a>00165 client-&gt;disconnect(<span class="keyword">true</span>);
191
- <a name="l00166"></a>00166 logSystemError(client, <span class="stringliteral">&quot;Cannot read data from client&quot;</span>, e);
192
- <a name="l00167"></a>00167 }
193
- <a name="l00168"></a>00168 done = <span class="keyword">true</span>;
194
- <a name="l00169"></a>00169 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ret == 0) {
195
- <a name="l00170"></a>00170 done = <span class="keyword">true</span>;
196
- <a name="l00171"></a>00171 ScopeGuard guard(boost::bind(&amp;<a class="code" href="classPassenger_1_1EventedClient.html#a5b1a3011165ea9a47f6fe668a5010a20" title="Disconnects the client.">EventedClient::disconnect</a>,
197
- <a name="l00172"></a>00172 client, <span class="keyword">false</span>));
198
- <a name="l00173"></a>00173 onEndOfStream(client);
199
- <a name="l00174"></a>00174 } <span class="keywordflow">else</span> {
200
- <a name="l00175"></a>00175 onDataReceived(client, buf, ret);
201
- <a name="l00176"></a>00176 }
202
- <a name="l00177"></a>00177 i++;
203
- <a name="l00178"></a>00178 done = done || !client-&gt;ioAllowed();
204
- <a name="l00179"></a>00179 }
205
- <a name="l00180"></a>00180 }
206
- <a name="l00181"></a>00181
207
- <a name="l00182"></a>00182
208
- <a name="l00183"></a>00183 <span class="comment">/******** New EventedMessageServer overridable hooks and API methods ********/</span>
209
- <a name="l00184"></a>00184
210
- <a name="l00185"></a>00185 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onClientAuthenticated(EventedMessageClient *client) {
211
- <a name="l00186"></a>00186 <span class="comment">// Do nothing.</span>
212
- <a name="l00187"></a>00187 }
213
- <a name="l00188"></a>00188
214
- <a name="l00189"></a>00189 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> onMessageReceived(EventedMessageClient *client, <span class="keyword">const</span> vector&lt;StaticString&gt; &amp;args) {
215
- <a name="l00190"></a>00190 <span class="keywordflow">return</span> <span class="keyword">true</span>;
216
- <a name="l00191"></a>00191 }
217
- <a name="l00192"></a>00192
218
- <a name="l00193"></a>00193 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onEndOfStream(EventedMessageClient *client) {
219
- <a name="l00194"></a>00194 <span class="comment">// Do nothing.</span>
220
- <a name="l00195"></a>00195 }
221
- <a name="l00196"></a>00196
222
- <a name="l00197"></a>00197 <span class="keyword">virtual</span> pair&lt;size_t, bool&gt; onOtherDataReceived(EventedMessageClient *client,
223
- <a name="l00198"></a>00198 <span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size)
224
- <a name="l00199"></a>00199 {
225
- <a name="l00200"></a>00200 abort();
226
- <a name="l00201"></a>00201 }
227
- <a name="l00202"></a>00202
228
- <a name="l00203"></a>00203 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *protocolVersion()<span class="keyword"> const </span>{
229
- <a name="l00204"></a>00204 <span class="keywordflow">return</span> <span class="stringliteral">&quot;1&quot;</span>;
230
- <a name="l00205"></a>00205 }
231
- <a name="l00206"></a>00206
232
- <a name="l00207"></a>00207 <span class="keywordtype">void</span> discardReadData() {
233
- <a name="l00208"></a>00208 readDataDiscarded = <span class="keyword">true</span>;
234
- <a name="l00209"></a>00209 }
235
- <a name="l00210"></a>00210
236
- <a name="l00211"></a>00211 <span class="keyword">private</span>:
237
- <a name="l00212"></a>00212 <span class="keywordtype">bool</span> readDataDiscarded;
238
- <a name="l00213"></a>00213
239
- <a name="l00214"></a>00214 <span class="keyword">static</span> <span class="keywordtype">void</span> onAuthenticationTimeout(ev::timer &amp;t, <span class="keywordtype">int</span> revents) {
240
- <a name="l00215"></a>00215 EventedMessageClient *client = (EventedMessageClient *) t.data;
241
- <a name="l00216"></a>00216 client-&gt;disconnect();
242
- <a name="l00217"></a>00217 }
243
- <a name="l00218"></a>00218
244
- <a name="l00219"></a>00219 <span class="keywordtype">void</span> onDataReceived(EventedMessageClient *client, <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
245
- <a name="l00220"></a>00220 EventedMessageClientContext *context = &amp;client-&gt;messageServer;
246
- <a name="l00221"></a>00221 <span class="keywordtype">size_t</span> consumed = 0;
247
- <a name="l00222"></a>00222
248
- <a name="l00223"></a>00223 readDataDiscarded = <span class="keyword">false</span>;
249
- <a name="l00224"></a>00224 <span class="keywordflow">while</span> (consumed &lt; size &amp;&amp; client-&gt;ioAllowed() &amp;&amp; !readDataDiscarded) {
250
- <a name="l00225"></a>00225 <span class="keywordtype">char</span> *current = data + consumed;
251
- <a name="l00226"></a>00226 <span class="keywordtype">size_t</span> rest = size - consumed;
252
- <a name="l00227"></a>00227
253
- <a name="l00228"></a>00228 <span class="keywordflow">switch</span> (context-&gt;state) {
254
- <a name="l00229"></a>00229 <span class="keywordflow">case</span> EventedMessageClientContext::MS_READING_USERNAME:
255
- <a name="l00230"></a>00230 consumed += context-&gt;scalarReader.feed(current, rest);
256
- <a name="l00231"></a>00231 <span class="keywordflow">if</span> (context-&gt;scalarReader.hasError()) {
257
- <a name="l00232"></a>00232 client-&gt;writeArrayMessage(
258
- <a name="l00233"></a>00233 <span class="stringliteral">&quot;The supplied username is too long.&quot;</span>,
259
- <a name="l00234"></a>00234 NULL);
260
- <a name="l00235"></a>00235 client-&gt;disconnect();
261
- <a name="l00236"></a>00236 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (context-&gt;scalarReader.done()) {
262
- <a name="l00237"></a>00237 context-&gt;username = context-&gt;scalarReader.value();
263
- <a name="l00238"></a>00238 context-&gt;scalarReader.reset();
264
- <a name="l00239"></a>00239 context-&gt;scalarReader.setMaxSize(MESSAGE_SERVER_MAX_PASSWORD_SIZE);
265
- <a name="l00240"></a>00240 context-&gt;state = EventedMessageClientContext::MS_READING_PASSWORD;
266
- <a name="l00241"></a>00241 }
267
- <a name="l00242"></a>00242 <span class="keywordflow">break</span>;
268
- <a name="l00243"></a>00243
269
- <a name="l00244"></a>00244 <span class="keywordflow">case</span> EventedMessageClientContext::MS_READING_PASSWORD: {
270
- <a name="l00245"></a>00245 <span class="keywordtype">size_t</span> locallyConsumed;
271
- <a name="l00246"></a>00246
272
- <a name="l00247"></a>00247 locallyConsumed = context-&gt;scalarReader.feed(current, rest);
273
- <a name="l00248"></a>00248 consumed += locallyConsumed;
274
- <a name="l00249"></a>00249
275
- <a name="l00250"></a>00250 <span class="comment">// The buffer contains password data so make sure we zero</span>
276
- <a name="l00251"></a>00251 <span class="comment">// it out when we&#39;re done.</span>
277
- <a name="l00252"></a>00252 MemZeroGuard passwordGuard(current, locallyConsumed);
278
- <a name="l00253"></a>00253
279
- <a name="l00254"></a>00254 <span class="keywordflow">if</span> (context-&gt;scalarReader.hasError()) {
280
- <a name="l00255"></a>00255 context-&gt;scalarReader.reset(<span class="keyword">true</span>);
281
- <a name="l00256"></a>00256 client-&gt;writeArrayMessage(
282
- <a name="l00257"></a>00257 <span class="stringliteral">&quot;The supplied password is too long.&quot;</span>,
283
- <a name="l00258"></a>00258 NULL);
284
- <a name="l00259"></a>00259 client-&gt;disconnect();
285
- <a name="l00260"></a>00260 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (context-&gt;scalarReader.done()) {
286
- <a name="l00261"></a>00261 context-&gt;authenticationTimer.stop();
287
- <a name="l00262"></a>00262 context-&gt;account = accountsDatabase-&gt;authenticate(
288
- <a name="l00263"></a>00263 context-&gt;username, context-&gt;scalarReader.value());
289
- <a name="l00264"></a>00264 passwordGuard.zeroNow();
290
- <a name="l00265"></a>00265 context-&gt;username.clear();
291
- <a name="l00266"></a>00266 <span class="keywordflow">if</span> (context-&gt;account) {
292
- <a name="l00267"></a>00267 context-&gt;scalarReader.reset(<span class="keyword">true</span>);
293
- <a name="l00268"></a>00268 context-&gt;state = EventedMessageClientContext::MS_READING_MESSAGE;
294
- <a name="l00269"></a>00269 client-&gt;writeArrayMessage(<span class="stringliteral">&quot;ok&quot;</span>, NULL);
295
- <a name="l00270"></a>00270 onClientAuthenticated(client);
296
- <a name="l00271"></a>00271 } <span class="keywordflow">else</span> {
297
- <a name="l00272"></a>00272 context-&gt;scalarReader.reset(<span class="keyword">true</span>);
298
- <a name="l00273"></a>00273 client-&gt;writeArrayMessage(
299
- <a name="l00274"></a>00274 <span class="stringliteral">&quot;Invalid username or password.&quot;</span>,
300
- <a name="l00275"></a>00275 NULL);
301
- <a name="l00276"></a>00276 client-&gt;disconnect();
302
- <a name="l00277"></a>00277 }
303
- <a name="l00278"></a>00278 }
304
- <a name="l00279"></a>00279 <span class="keywordflow">break</span>;
305
- <a name="l00280"></a>00280 }
306
- <a name="l00281"></a>00281
307
- <a name="l00282"></a>00282 <span class="keywordflow">case</span> EventedMessageClientContext::MS_READING_MESSAGE:
308
- <a name="l00283"></a>00283 consumed += context-&gt;arrayReader.feed(current, rest);
309
- <a name="l00284"></a>00284 <span class="keywordflow">if</span> (context-&gt;arrayReader.hasError()) {
310
- <a name="l00285"></a>00285 client-&gt;disconnect();
311
- <a name="l00286"></a>00286 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (context-&gt;arrayReader.done()) {
312
- <a name="l00287"></a>00287 context-&gt;state = EventedMessageClientContext::MS_PROCESSING_MESSAGE;
313
- <a name="l00288"></a>00288 <span class="keywordflow">if</span> (context-&gt;arrayReader.value().empty()) {
314
- <a name="l00289"></a>00289 logError(client, <span class="stringliteral">&quot;Client sent an empty message.&quot;</span>);
315
- <a name="l00290"></a>00290 client-&gt;disconnect();
316
- <a name="l00291"></a>00291 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (onMessageReceived(client, context-&gt;arrayReader.value())
317
- <a name="l00292"></a>00292 &amp;&amp; context-&gt;state == EventedMessageClientContext::MS_PROCESSING_MESSAGE) {
318
- <a name="l00293"></a>00293 context-&gt;state = EventedMessageClientContext::MS_READING_MESSAGE;
319
- <a name="l00294"></a>00294 }
320
- <a name="l00295"></a>00295 context-&gt;arrayReader.reset();
321
- <a name="l00296"></a>00296 }
322
- <a name="l00297"></a>00297 <span class="keywordflow">break</span>;
323
- <a name="l00298"></a>00298
324
- <a name="l00299"></a>00299 <span class="keywordflow">case</span> EventedMessageClientContext::MS_PROCESSING_MESSAGE: {
325
- <a name="l00300"></a>00300 pair&lt;size_t, bool&gt; ret = onOtherDataReceived(client, current, rest);
326
- <a name="l00301"></a>00301 consumed += ret.first;
327
- <a name="l00302"></a>00302 <span class="keywordflow">if</span> (ret.second &amp;&amp; context-&gt;state == EventedMessageClientContext::MS_PROCESSING_MESSAGE) {
328
- <a name="l00303"></a>00303 context-&gt;state = EventedMessageClientContext::MS_READING_MESSAGE;
329
- <a name="l00304"></a>00304 }
330
- <a name="l00305"></a>00305 <span class="keywordflow">break</span>;
331
- <a name="l00306"></a>00306 }
332
- <a name="l00307"></a>00307
333
- <a name="l00308"></a>00308 <span class="keywordflow">default</span>:
334
- <a name="l00309"></a>00309 <span class="comment">// Never reached.</span>
335
- <a name="l00310"></a>00310 abort();
336
- <a name="l00311"></a>00311 }
337
- <a name="l00312"></a>00312 }
338
- <a name="l00313"></a>00313 }
339
- <a name="l00314"></a>00314
340
- <a name="l00315"></a>00315 <span class="keyword">public</span>:
341
- <a name="l00316"></a>00316 <a class="code" href="classPassenger_1_1EventedMessageServer.html" title="Note when overriding onNewClient: call the parent method first! It does some initialization...">EventedMessageServer</a>(<span class="keyword">struct</span> ev_loop *loop, <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> fd,
342
- <a name="l00317"></a>00317 <span class="keyword">const</span> AccountsDatabasePtr &amp;accountsDatabase)
343
- <a name="l00318"></a>00318 : <a class="code" href="classPassenger_1_1EventedServer.html" title="A base class for writing single-threaded, evented servers that use non-blocking I/O...">EventedServer</a>(loop, fd)
344
- <a name="l00319"></a>00319 {
345
- <a name="l00320"></a>00320 this-&gt;accountsDatabase = accountsDatabase;
346
- <a name="l00321"></a>00321 }
347
- <a name="l00322"></a>00322 };
348
- <a name="l00323"></a>00323
349
- <a name="l00324"></a>00324
350
- <a name="l00325"></a>00325 } <span class="comment">// namespace Passenger</span>
351
- <a name="l00326"></a>00326
352
- <a name="l00327"></a>00327 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_EVENTED_MESSAGE_SERVER_H_ */</span>
353
- </pre></div></div>
354
- <hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
355
- <a href="http://www.doxygen.org/index.html">
356
- <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
357
- </body>
358
- </html>
@@ -1,326 +0,0 @@
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: EventedServer.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>EventedServer.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_EVENTED_SERVER_H_</span>
51
- <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_EVENTED_SERVER_H_</span>
52
- <a name="l00027"></a>00027 <span class="preprocessor"></span>
53
- <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;ev++.h&gt;</span>
54
- <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;boost/shared_ptr.hpp&gt;</span>
55
- <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;boost/enable_shared_from_this.hpp&gt;</span>
56
- <a name="l00031"></a>00031 <span class="preprocessor">#include &lt;oxt/system_calls.hpp&gt;</span>
57
- <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;oxt/macros.hpp&gt;</span>
58
- <a name="l00033"></a>00033 <span class="preprocessor">#include &lt;algorithm&gt;</span>
59
- <a name="l00034"></a>00034 <span class="preprocessor">#include &lt;string&gt;</span>
60
- <a name="l00035"></a>00035 <span class="preprocessor">#include &lt;set&gt;</span>
61
- <a name="l00036"></a>00036 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
62
- <a name="l00037"></a>00037 <span class="preprocessor">#include &lt;sys/un.h&gt;</span>
63
- <a name="l00038"></a>00038 <span class="preprocessor">#include &lt;sys/uio.h&gt;</span>
64
- <a name="l00039"></a>00039 <span class="preprocessor">#include &lt;netinet/in.h&gt;</span>
65
- <a name="l00040"></a>00040 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
66
- <a name="l00041"></a>00041 <span class="preprocessor">#include &lt;cerrno&gt;</span>
67
- <a name="l00042"></a>00042 <span class="preprocessor">#include &quot;EventedClient.h&quot;</span>
68
- <a name="l00043"></a>00043 <span class="preprocessor">#include &quot;FileDescriptor.h&quot;</span>
69
- <a name="l00044"></a>00044 <span class="preprocessor">#include &quot;StaticString.h&quot;</span>
70
- <a name="l00045"></a>00045 <span class="preprocessor">#include &quot;Logging.h&quot;</span>
71
- <a name="l00046"></a>00046 <span class="preprocessor">#include &quot;Utils/ScopeGuard.h&quot;</span>
72
- <a name="l00047"></a>00047 <span class="preprocessor">#include &quot;Utils/StrIntUtils.h&quot;</span>
73
- <a name="l00048"></a>00048
74
- <a name="l00049"></a>00049 <span class="keyword">namespace </span>Passenger {
75
- <a name="l00050"></a>00050
76
- <a name="l00051"></a>00051 <span class="keyword">using namespace </span>std;
77
- <a name="l00052"></a>00052 <span class="keyword">using namespace </span>boost;
78
- <a name="l00053"></a>00053 <span class="keyword">using namespace </span>oxt;
79
- <a name="l00054"></a>00054
80
- <a name="l00055"></a>00055 <span class="comment"></span>
81
- <a name="l00056"></a>00056 <span class="comment">/**</span>
82
- <a name="l00057"></a>00057 <span class="comment"> * A base class for writing single-threaded, evented servers that use non-blocking I/O.</span>
83
- <a name="l00058"></a>00058 <span class="comment"> * It uses libev for its event loop. EventedServer handles much of the situps regarding</span>
84
- <a name="l00059"></a>00059 <span class="comment"> * client connection management and output buffering and tries to make it easy to</span>
85
- <a name="l00060"></a>00060 <span class="comment"> * implement a zero-copy architecture.</span>
86
- <a name="l00061"></a>00061 <span class="comment"> *</span>
87
- <a name="l00062"></a>00062 <span class="comment"> * &lt;h2&gt;Basic usage&lt;/h2&gt;</span>
88
- <a name="l00063"></a>00063 <span class="comment"> * Derived classes can override the onClientReadable() method, which is called every time</span>
89
- <a name="l00064"></a>00064 <span class="comment"> * a specific client becomes readable. It is passed a Client object which contains information</span>
90
- <a name="l00065"></a>00065 <span class="comment"> * about the client, such as its file descriptor. One can use the read() system call in</span>
91
- <a name="l00066"></a>00066 <span class="comment"> * that method to receive data from the client. Please note that client file descriptors</span>
92
- <a name="l00067"></a>00067 <span class="comment"> * are always set to non-blocking mode so you need to handle this gracefully.</span>
93
- <a name="l00068"></a>00068 <span class="comment"> *</span>
94
- <a name="l00069"></a>00069 <span class="comment"> * EventedServer provides the write() method for sending data to the client. This method</span>
95
- <a name="l00070"></a>00070 <span class="comment"> * will attempt to send the data to the client immediately; if it fails with EAGAIN then</span>
96
- <a name="l00071"></a>00071 <span class="comment"> * EventedServer will take care of scheduling the send at a later time when the client</span>
97
- <a name="l00072"></a>00072 <span class="comment"> * is ready again to receive data.</span>
98
- <a name="l00073"></a>00073 <span class="comment"> *</span>
99
- <a name="l00074"></a>00074 <span class="comment"> * To disconnect the client, call disconnect(). The connection might not be actually</span>
100
- <a name="l00075"></a>00075 <span class="comment"> * closed until all pending outgoing data have been sent out, but all the gory details</span>
101
- <a name="l00076"></a>00076 <span class="comment"> * is taken care of for you.</span>
102
- <a name="l00077"></a>00077 <span class="comment"> *</span>
103
- <a name="l00078"></a>00078 <span class="comment"> * &lt;h2&gt;Keeping per-client information&lt;/h2&gt;</span>
104
- <a name="l00079"></a>00079 <span class="comment"> * If you need to keep per-client information then you can override the createClient()</span>
105
- <a name="l00080"></a>00080 <span class="comment"> * method and make it return an object that&#39;s a subclass of EventedServer::Client. This</span>
106
- <a name="l00081"></a>00081 <span class="comment"> * object is passed to onClientReadable(), so in there you can just cast the client object</span>
107
- <a name="l00082"></a>00082 <span class="comment"> * to your subclass.</span>
108
- <a name="l00083"></a>00083 <span class="comment"> *</span>
109
- <a name="l00084"></a>00084 <span class="comment"> * &lt;h2&gt;Client object life times&lt;/h2&gt;</span>
110
- <a name="l00085"></a>00085 <span class="comment"> * All client objects are destroyed along with the EventedServer. Disconnecting</span>
111
- <a name="l00086"></a>00086 <span class="comment"> * a client also causes it to be destroyed after the current event handler has</span>
112
- <a name="l00087"></a>00087 <span class="comment"> * run or a short period of time after that.</span>
113
- <a name="l00088"></a>00088 <span class="comment"> */</span>
114
- <a name="l00089"></a><a class="code" href="classPassenger_1_1EventedServer.html">00089</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1EventedServer.html" title="A base class for writing single-threaded, evented servers that use non-blocking I/O...">EventedServer</a> {
115
- <a name="l00090"></a>00090 <span class="keyword">protected</span>:
116
- <a name="l00091"></a>00091 <span class="keyword">typedef</span> set&lt;EventedClient *&gt; ClientSet;
117
- <a name="l00092"></a>00092
118
- <a name="l00093"></a>00093 <span class="keyword">const</span> ClientSet &amp;getClients()<span class="keyword"> const </span>{
119
- <a name="l00094"></a>00094 <span class="keywordflow">return</span> clients;
120
- <a name="l00095"></a>00095 }
121
- <a name="l00096"></a>00096
122
- <a name="l00097"></a>00097 <span class="keywordtype">string</span> getClientName(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client)<span class="keyword"> const </span>{
123
- <a name="l00098"></a>00098 <span class="keywordflow">return</span> toString(client);
124
- <a name="l00099"></a>00099 }
125
- <a name="l00100"></a>00100
126
- <a name="l00101"></a>00101 <span class="keywordtype">void</span> logError(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;message) {
127
- <a name="l00102"></a>00102 P_ERROR(<span class="stringliteral">&quot;Error in client &quot;</span> &lt;&lt; getClientName(client) &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt; message);
128
- <a name="l00103"></a>00103 }
129
- <a name="l00104"></a>00104
130
- <a name="l00105"></a>00105 <span class="keywordtype">void</span> logSystemError(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;message, <span class="keywordtype">int</span> errorCode) {
131
- <a name="l00106"></a>00106 P_ERROR(<span class="stringliteral">&quot;Error in client &quot;</span> &lt;&lt; getClientName(client) &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt;
132
- <a name="l00107"></a>00107 message &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt; strerror(errorCode) &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; errorCode &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>);
133
- <a name="l00108"></a>00108 }
134
- <a name="l00109"></a>00109
135
- <a name="l00110"></a>00110 <span class="keywordtype">void</span> logSystemError(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;message, <span class="keywordtype">int</span> errorCode) {
136
- <a name="l00111"></a>00111 P_ERROR(message &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt; strerror(errorCode) &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; errorCode &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>);
137
- <a name="l00112"></a>00112 }
138
- <a name="l00113"></a>00113
139
- <a name="l00114"></a>00114 <span class="keyword">virtual</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *createClient(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> &amp;fd) {
140
- <a name="l00115"></a>00115 <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a>(loop, fd);
141
- <a name="l00116"></a>00116 }
142
- <a name="l00117"></a>00117
143
- <a name="l00118"></a>00118 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onNewClient(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client) { }
144
- <a name="l00119"></a>00119 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onClientReadable(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client) { }
145
- <a name="l00120"></a>00120 <span class="comment"></span>
146
- <a name="l00121"></a>00121 <span class="comment"> /**</span>
147
- <a name="l00122"></a>00122 <span class="comment"> * Called when a client has been disconnected. This may either be triggered</span>
148
- <a name="l00123"></a>00123 <span class="comment"> * immediately by disconnect() or triggered after pending data has been sent</span>
149
- <a name="l00124"></a>00124 <span class="comment"> * out. This means that if you call disconnect() from onClientReadable() you</span>
150
- <a name="l00125"></a>00125 <span class="comment"> * need take care of the possibility that control returns to onClientReadable()</span>
151
- <a name="l00126"></a>00126 <span class="comment"> * after this method is done.</span>
152
- <a name="l00127"></a>00127 <span class="comment"> *</span>
153
- <a name="l00128"></a>00128 <span class="comment"> * Please note that when EventedServer is being destroyed,</span>
154
- <a name="l00129"></a>00129 <span class="comment"> * onClientDisconnected() is *not* triggered.</span>
155
- <a name="l00130"></a>00130 <span class="comment"> */</span>
156
- <a name="l00131"></a><a class="code" href="classPassenger_1_1EventedServer.html#a7db4c8d0ad8aa77bcb40344e53319f11">00131</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1EventedServer.html#a7db4c8d0ad8aa77bcb40344e53319f11" title="Called when a client has been disconnected.">onClientDisconnected</a>(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client) { }
157
- <a name="l00132"></a>00132
158
- <a name="l00133"></a>00133 <span class="keyword">private</span>:
159
- <a name="l00134"></a>00134 <span class="keyword">struct </span>ev_loop *loop;
160
- <a name="l00135"></a>00135 <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> fd;
161
- <a name="l00136"></a>00136 ev::io acceptWatcher;
162
- <a name="l00137"></a>00137 ClientSet clients;
163
- <a name="l00138"></a>00138
164
- <a name="l00139"></a>00139 <span class="keywordtype">void</span> removeClient(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client) {
165
- <a name="l00140"></a>00140 clients.erase(client);
166
- <a name="l00141"></a>00141 }
167
- <a name="l00142"></a>00142
168
- <a name="l00143"></a>00143 <span class="keywordtype">void</span> freeAllClients() {
169
- <a name="l00144"></a>00144 ClientSet::iterator it;
170
- <a name="l00145"></a>00145 ClientSet::iterator end = clients.end();
171
- <a name="l00146"></a>00146
172
- <a name="l00147"></a>00147 <span class="keywordflow">for</span> (it = clients.begin(); it != clients.end(); it++) {
173
- <a name="l00148"></a>00148 (*it)-&gt;unref();
174
- <a name="l00149"></a>00149 }
175
- <a name="l00150"></a>00150 clients.clear();
176
- <a name="l00151"></a>00151 }
177
- <a name="l00152"></a>00152
178
- <a name="l00153"></a>00153 <span class="keyword">static</span> <span class="keywordtype">void</span> _onReadable(EventedClient *client) {
179
- <a name="l00154"></a>00154 EventedServer *server = (EventedServer *) client-&gt;userData;
180
- <a name="l00155"></a>00155 client-&gt;ref();
181
- <a name="l00156"></a>00156 ScopeGuard guard(boost::bind(&amp;<a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">EventedClient::unref</a>, client));
182
- <a name="l00157"></a>00157 server-&gt;onClientReadable((EventedClient *) client);
183
- <a name="l00158"></a>00158 }
184
- <a name="l00159"></a>00159
185
- <a name="l00160"></a>00160 <span class="keyword">static</span> <span class="keywordtype">void</span> _onDisconnect(EventedClient *client) {
186
- <a name="l00161"></a>00161 EventedServer *server = (EventedServer *) client-&gt;userData;
187
- <a name="l00162"></a>00162 ScopeGuard guard1(boost::bind(&amp;<a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">EventedClient::unref</a>, client));
188
- <a name="l00163"></a>00163
189
- <a name="l00164"></a>00164 client-&gt;ref();
190
- <a name="l00165"></a>00165 ScopeGuard guard2(boost::bind(&amp;<a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">EventedClient::unref</a>, client));
191
- <a name="l00166"></a>00166
192
- <a name="l00167"></a>00167 server-&gt;removeClient(client);
193
- <a name="l00168"></a>00168 server-&gt;onClientDisconnected((EventedClient *) client);
194
- <a name="l00169"></a>00169 }
195
- <a name="l00170"></a>00170
196
- <a name="l00171"></a>00171 <span class="keyword">static</span> <span class="keywordtype">void</span> _onDetach(EventedClient *client) {
197
- <a name="l00172"></a>00172 EventedServer *server = (EventedServer *) client-&gt;userData;
198
- <a name="l00173"></a>00173 ScopeGuard guard1(boost::bind(&amp;<a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">EventedClient::unref</a>, client));
199
- <a name="l00174"></a>00174
200
- <a name="l00175"></a>00175 client-&gt;ref();
201
- <a name="l00176"></a>00176 ScopeGuard guard2(boost::bind(&amp;<a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">EventedClient::unref</a>, client));
202
- <a name="l00177"></a>00177
203
- <a name="l00178"></a>00178 server-&gt;removeClient(client);
204
- <a name="l00179"></a>00179 }
205
- <a name="l00180"></a>00180
206
- <a name="l00181"></a>00181 <span class="keyword">static</span> <span class="keywordtype">void</span> _onSystemError(EventedClient *client, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;message, <span class="keywordtype">int</span> code) {
207
- <a name="l00182"></a>00182 EventedServer *server = (EventedServer *) client-&gt;userData;
208
- <a name="l00183"></a>00183 server-&gt;logSystemError(client, message, code);
209
- <a name="l00184"></a>00184 }
210
- <a name="l00185"></a>00185
211
- <a name="l00186"></a>00186 <span class="keywordtype">void</span> exceptionThrownWhileInitializingClient(EventedClient *client, ClientSet::iterator it) {
212
- <a name="l00187"></a>00187 <span class="keywordflow">if</span> (!client-&gt;ioAllowed()) {
213
- <a name="l00188"></a>00188 <span class="comment">// onNewClient() disconnected or detached the</span>
214
- <a name="l00189"></a>00189 <span class="comment">// client, so client refcount == 1</span>
215
- <a name="l00190"></a>00190 client-&gt;unref();
216
- <a name="l00191"></a>00191 } <span class="keywordflow">else</span> {
217
- <a name="l00192"></a>00192 <span class="comment">// client refcount == 2</span>
218
- <a name="l00193"></a>00193 client-&gt;unref();
219
- <a name="l00194"></a>00194 client-&gt;unref();
220
- <a name="l00195"></a>00195 clients.erase(it);
221
- <a name="l00196"></a>00196 }
222
- <a name="l00197"></a>00197 <span class="comment">// Now client refcount == 0</span>
223
- <a name="l00198"></a>00198 }
224
- <a name="l00199"></a>00199
225
- <a name="l00200"></a>00200 <span class="keywordtype">void</span> onAcceptable(ev::io &amp;w, <span class="keywordtype">int</span> revents) {
226
- <a name="l00201"></a>00201 this_thread::disable_syscall_interruption dsi;
227
- <a name="l00202"></a>00202 <span class="keywordtype">int</span> i = 0;
228
- <a name="l00203"></a>00203 <span class="keywordtype">bool</span> done = <span class="keyword">false</span>;
229
- <a name="l00204"></a>00204
230
- <a name="l00205"></a>00205 <span class="comment">// Accept at most 10 connections on every accept readiness event</span>
231
- <a name="l00206"></a>00206 <span class="comment">// in order to give other events the chance to be processed.</span>
232
- <a name="l00207"></a>00207 <span class="keywordflow">while</span> (i &lt; 10 &amp;&amp; !done) {
233
- <a name="l00208"></a>00208 <span class="comment">// Reserve enough space to hold both a Unix domain socket</span>
234
- <a name="l00209"></a>00209 <span class="comment">// address and an IP socket address.</span>
235
- <a name="l00210"></a>00210 <span class="keyword">union </span>{
236
- <a name="l00211"></a>00211 <span class="keyword">struct </span>sockaddr_un local;
237
- <a name="l00212"></a>00212 <span class="keyword">struct </span>sockaddr_in inet;
238
- <a name="l00213"></a>00213 } addr;
239
- <a name="l00214"></a>00214 socklen_t len = <span class="keyword">sizeof</span>(addr);
240
- <a name="l00215"></a>00215
241
- <a name="l00216"></a>00216 <span class="keywordtype">int</span> clientfd = syscalls::accept(fd, (<span class="keyword">struct</span> sockaddr *) &amp;addr, &amp;len);
242
- <a name="l00217"></a>00217 <span class="keywordflow">if</span> (clientfd == -1) {
243
- <a name="l00218"></a>00218 <span class="keywordflow">if</span> (errno != EAGAIN &amp;&amp; errno != EWOULDBLOCK) {
244
- <a name="l00219"></a>00219 <span class="keywordtype">int</span> e = errno;
245
- <a name="l00220"></a>00220 logSystemError(<span class="stringliteral">&quot;Cannot accept new client&quot;</span>, e);
246
- <a name="l00221"></a>00221 }
247
- <a name="l00222"></a>00222 done = <span class="keyword">true</span>;
248
- <a name="l00223"></a>00223 } <span class="keywordflow">else</span> {
249
- <a name="l00224"></a>00224 FileDescriptor clientfdGuard = clientfd;
250
- <a name="l00225"></a>00225 <span class="keywordtype">int</span> optval = 1;
251
- <a name="l00226"></a>00226
252
- <a name="l00227"></a>00227 setNonBlocking(clientfdGuard);
253
- <a name="l00228"></a>00228 syscalls::setsockopt(clientfd, SOL_SOCKET, SO_KEEPALIVE,
254
- <a name="l00229"></a>00229 &amp;optval, <span class="keyword">sizeof</span>(optval));
255
- <a name="l00230"></a>00230
256
- <a name="l00231"></a>00231 EventedClient *client = createClient(clientfdGuard);
257
- <a name="l00232"></a>00232 client-&gt;onReadable = _onReadable;
258
- <a name="l00233"></a>00233 client-&gt;onDisconnect = _onDisconnect;
259
- <a name="l00234"></a>00234 client-&gt;onDetach = _onDetach;
260
- <a name="l00235"></a>00235 client-&gt;onSystemError = _onSystemError;
261
- <a name="l00236"></a>00236 client-&gt;userData = <span class="keyword">this</span>;
262
- <a name="l00237"></a>00237 client-&gt;notifyReads(<span class="keyword">true</span>);
263
- <a name="l00238"></a>00238
264
- <a name="l00239"></a>00239 pair&lt;ClientSet::iterator, bool&gt; p = clients.insert(client);
265
- <a name="l00240"></a>00240
266
- <a name="l00241"></a>00241 client-&gt;ref();
267
- <a name="l00242"></a>00242 <span class="comment">// client refcount == 2</span>
268
- <a name="l00243"></a>00243 {
269
- <a name="l00244"></a>00244 ScopeGuard g(boost::bind(
270
- <a name="l00245"></a>00245 &amp;EventedServer::exceptionThrownWhileInitializingClient,
271
- <a name="l00246"></a>00246 <span class="keyword">this</span>,
272
- <a name="l00247"></a>00247 client,
273
- <a name="l00248"></a>00248 p.first));
274
- <a name="l00249"></a>00249 onNewClient(client);
275
- <a name="l00250"></a>00250 g.clear();
276
- <a name="l00251"></a>00251 <span class="comment">// If exception occurred: client refcount == 0</span>
277
- <a name="l00252"></a>00252 }
278
- <a name="l00253"></a>00253
279
- <a name="l00254"></a>00254 <span class="comment">/* No exception occured.</span>
280
- <a name="l00255"></a>00255 <span class="comment"> * If onNewClient() disconnected or detached the client:</span>
281
- <a name="l00256"></a>00256 <span class="comment"> * client refcount == 1</span>
282
- <a name="l00257"></a>00257 <span class="comment"> * We want the refcount to become 0.</span>
283
- <a name="l00258"></a>00258 <span class="comment"> * If not:</span>
284
- <a name="l00259"></a>00259 <span class="comment"> * client refcount == 2</span>
285
- <a name="l00260"></a>00260 <span class="comment"> * We want the refcount to become 1.</span>
286
- <a name="l00261"></a>00261 <span class="comment"> */</span>
287
- <a name="l00262"></a>00262 client-&gt;unref();
288
- <a name="l00263"></a>00263 }
289
- <a name="l00264"></a>00264 i++;
290
- <a name="l00265"></a>00265 }
291
- <a name="l00266"></a>00266 }
292
- <a name="l00267"></a>00267
293
- <a name="l00268"></a>00268 <span class="keyword">public</span>:
294
- <a name="l00269"></a>00269 EventedServer(<span class="keyword">struct</span> ev_loop *_loop, FileDescriptor serverFd)
295
- <a name="l00270"></a>00270 : loop(_loop),
296
- <a name="l00271"></a>00271 acceptWatcher(_loop)
297
- <a name="l00272"></a>00272 {
298
- <a name="l00273"></a>00273 fd = serverFd;
299
- <a name="l00274"></a>00274 setNonBlocking(serverFd);
300
- <a name="l00275"></a>00275 acceptWatcher.set&lt;EventedServer, &amp;EventedServer::onAcceptable&gt;(<span class="keyword">this</span>);
301
- <a name="l00276"></a>00276 acceptWatcher.start(fd, ev::READ);
302
- <a name="l00277"></a>00277 }
303
- <a name="l00278"></a>00278
304
- <a name="l00279"></a>00279 <span class="keyword">virtual</span> ~EventedServer() {
305
- <a name="l00280"></a>00280 freeAllClients();
306
- <a name="l00281"></a>00281 }
307
- <a name="l00282"></a>00282
308
- <a name="l00283"></a>00283 <span class="keyword">struct </span>ev_loop *getLoop()<span class="keyword"> const </span>{
309
- <a name="l00284"></a>00284 <span class="keywordflow">return</span> loop;
310
- <a name="l00285"></a>00285 }
311
- <a name="l00286"></a>00286
312
- <a name="l00287"></a>00287 FileDescriptor getServerFd()<span class="keyword"> const </span>{
313
- <a name="l00288"></a>00288 <span class="keywordflow">return</span> fd;
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="comment">// namespace Passenger</span>
319
- <a name="l00294"></a>00294
320
- <a name="l00295"></a>00295 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_EVENTED_SERVER_H_ */</span>
321
- </pre></div></div>
322
- <hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
323
- <a href="http://www.doxygen.org/index.html">
324
- <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
325
- </body>
326
- </html>