passenger 2.2.11 → 2.2.12

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 (287) hide show
  1. data/NEWS +29 -0
  2. data/bin/passenger-install-nginx-module +1 -1
  3. data/doc/Users guide Apache.html +38 -7
  4. data/doc/Users guide Nginx.html +36 -5
  5. data/doc/cxxapi/AbstractSpawnManager_8h-source.html +1 -1
  6. data/doc/cxxapi/Account_8h-source.html +1 -1
  7. data/doc/cxxapi/AccountsDatabase_8h-source.html +1 -1
  8. data/doc/cxxapi/AgentsStarter_8h-source.html +1 -1
  9. data/doc/cxxapi/BCrypt_8h-source.html +1 -1
  10. data/doc/cxxapi/Blowfish_8h-source.html +1 -1
  11. data/doc/cxxapi/Bucket_8h-source.html +5 -4
  12. data/doc/cxxapi/Constants_8h-source.html +2 -2
  13. data/doc/cxxapi/ContentHandler_8h-source.html +1 -1
  14. data/doc/cxxapi/DirectoryMapper_8h-source.html +10 -9
  15. data/doc/cxxapi/EventedServer_8h-source.html +415 -0
  16. data/doc/cxxapi/Exceptions_8h-source.html +1 -1
  17. data/doc/cxxapi/FileDescriptor_8h-source.html +1 -1
  18. data/doc/cxxapi/Hooks_8h-source.html +3 -2
  19. data/doc/cxxapi/HttpStatusExtractor_8h-source.html +324 -323
  20. data/doc/cxxapi/Logging_8h-source.html +643 -546
  21. data/doc/cxxapi/MessageChannel_8h-source.html +429 -404
  22. data/doc/cxxapi/MessageClient_8h-source.html +1 -1
  23. data/doc/cxxapi/MessageReadersWriters_8h-source.html +451 -0
  24. data/doc/cxxapi/MessageServer_8h-source.html +1 -1
  25. data/doc/cxxapi/PoolOptions_8h-source.html +287 -279
  26. data/doc/cxxapi/Process_8h-source.html +178 -167
  27. data/doc/cxxapi/RandomGenerator_8h-source.html +45 -18
  28. data/doc/cxxapi/ResourceLocator_8h-source.html +3 -3
  29. data/doc/cxxapi/ScgiRequestParser_8h-source.html +344 -343
  30. data/doc/cxxapi/ServerInstanceDir_8h-source.html +1 -1
  31. data/doc/cxxapi/Session_8h-source.html +387 -374
  32. data/doc/cxxapi/SpawnManager_8h-source.html +547 -538
  33. data/doc/cxxapi/StaticContentHandler_8h-source.html +1 -1
  34. data/doc/cxxapi/StaticString_8h-source.html +1 -1
  35. data/doc/cxxapi/StringListCreator_8h-source.html +1 -1
  36. data/doc/cxxapi/Utils_8h-source.html +545 -520
  37. data/doc/cxxapi/annotated.html +11 -8
  38. data/doc/cxxapi/apache2_2Configuration_8h-source.html +1 -1
  39. data/doc/cxxapi/classAgentWatcher-members.html +1 -1
  40. data/doc/cxxapi/classAgentWatcher.html +1 -1
  41. data/doc/cxxapi/classClient-members.html +1 -1
  42. data/doc/cxxapi/classClient.html +1 -1
  43. data/doc/cxxapi/classHooks-members.html +16 -13
  44. data/doc/cxxapi/classHooks.html +69 -73
  45. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +1 -1
  46. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +1 -1
  47. data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +1 -1
  48. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +1 -1
  49. data/doc/cxxapi/classPassenger_1_1ArrayReader-members.html +33 -0
  50. data/doc/cxxapi/classPassenger_1_1ArrayReader.html +47 -0
  51. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +1 -1
  52. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +1 -1
  53. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -1
  54. data/doc/cxxapi/classPassenger_1_1BusyException.html +1 -1
  55. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -1
  56. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +1 -1
  57. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +18 -15
  58. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +89 -99
  59. data/doc/cxxapi/classPassenger_1_1EOFException-members.html +1 -1
  60. data/doc/cxxapi/classPassenger_1_1EOFException.html +1 -1
  61. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +1 -1
  62. data/doc/cxxapi/classPassenger_1_1EventFd.html +1 -1
  63. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +1 -1
  64. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +1 -1
  65. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -1
  66. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +1 -1
  67. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +1 -1
  68. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +1 -1
  69. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +1 -1
  70. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +2 -2
  71. data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -1
  72. data/doc/cxxapi/classPassenger_1_1IOException.html +1 -1
  73. data/doc/cxxapi/classPassenger_1_1MemZeroGuard-members.html +1 -1
  74. data/doc/cxxapi/classPassenger_1_1MemZeroGuard.html +1 -1
  75. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +1 -1
  76. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +1 -1
  77. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +1 -1
  78. data/doc/cxxapi/classPassenger_1_1MessageServer.html +1 -1
  79. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +1 -1
  80. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +1 -1
  81. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +1 -1
  82. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +1 -1
  83. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +1 -1
  84. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +1 -1
  85. data/doc/cxxapi/classPassenger_1_1Process-members.html +4 -3
  86. data/doc/cxxapi/classPassenger_1_1Process.html +40 -9
  87. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +2 -1
  88. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +29 -2
  89. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +1 -1
  90. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +1 -1
  91. data/doc/cxxapi/classPassenger_1_1ScalarReader-members.html +33 -0
  92. data/doc/cxxapi/classPassenger_1_1ScalarReader.html +47 -0
  93. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +1 -1
  94. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +1 -1
  95. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +1 -1
  96. data/doc/cxxapi/classPassenger_1_1SecurityException.html +1 -1
  97. data/doc/cxxapi/classPassenger_1_1Session-members.html +1 -1
  98. data/doc/cxxapi/classPassenger_1_1Session.html +2 -2
  99. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -1
  100. data/doc/cxxapi/classPassenger_1_1SpawnException.html +1 -1
  101. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -2
  102. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +6 -18
  103. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +1 -1
  104. data/doc/cxxapi/classPassenger_1_1StandardSession.html +1 -1
  105. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +1 -1
  106. data/doc/cxxapi/classPassenger_1_1StaticString.html +1 -1
  107. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +1 -1
  108. data/doc/cxxapi/classPassenger_1_1SystemException.html +1 -1
  109. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +1 -1
  110. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +1 -1
  111. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +1 -1
  112. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +1 -1
  113. data/doc/cxxapi/classPassenger_1_1Uint16Reader-members.html +33 -0
  114. data/doc/cxxapi/classPassenger_1_1Uint16Reader.html +47 -0
  115. data/doc/cxxapi/classPassenger_1_1Uint32Reader-members.html +33 -0
  116. data/doc/cxxapi/classPassenger_1_1Uint32Reader.html +47 -0
  117. data/doc/cxxapi/classServer-members.html +1 -1
  118. data/doc/cxxapi/classServer.html +1 -1
  119. data/doc/cxxapi/classServerInstanceDirToucher-members.html +1 -1
  120. data/doc/cxxapi/classServerInstanceDirToucher.html +1 -1
  121. data/doc/cxxapi/classes.html +13 -10
  122. data/doc/cxxapi/definitions_8h-source.html +2 -1
  123. data/doc/cxxapi/doxygen.css +91 -0
  124. data/doc/cxxapi/files.html +16 -13
  125. data/doc/cxxapi/functions.html +32 -21
  126. data/doc/cxxapi/functions_enum.html +1 -1
  127. data/doc/cxxapi/functions_eval.html +1 -1
  128. data/doc/cxxapi/functions_func.html +32 -21
  129. data/doc/cxxapi/functions_vars.html +3 -1
  130. data/doc/cxxapi/graph_legend.html +20 -15
  131. data/doc/cxxapi/graph_legend.png +0 -0
  132. data/doc/cxxapi/group__Configuration.html +51 -64
  133. data/doc/cxxapi/group__Configuration.png +0 -0
  134. data/doc/cxxapi/group__Core.html +24 -26
  135. data/doc/cxxapi/group__Core.png +0 -0
  136. data/doc/cxxapi/group__Exceptions.html +1 -1
  137. data/doc/cxxapi/group__Hooks.html +17 -15
  138. data/doc/cxxapi/group__Hooks.png +0 -0
  139. data/doc/cxxapi/group__Support.html +11 -9
  140. data/doc/cxxapi/hierarchy.html +6 -1
  141. data/doc/cxxapi/index.html +10 -5
  142. data/doc/cxxapi/inherit__graph__10.map +1 -1
  143. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  144. data/doc/cxxapi/inherit__graph__10.png +0 -0
  145. data/doc/cxxapi/inherit__graph__11.map +1 -1
  146. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  147. data/doc/cxxapi/inherit__graph__11.png +0 -0
  148. data/doc/cxxapi/inherit__graph__12.map +1 -1
  149. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  150. data/doc/cxxapi/inherit__graph__12.png +0 -0
  151. data/doc/cxxapi/inherit__graph__13.map +1 -1
  152. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  153. data/doc/cxxapi/inherit__graph__13.png +0 -0
  154. data/doc/cxxapi/inherit__graph__14.map +1 -3
  155. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  156. data/doc/cxxapi/inherit__graph__14.png +0 -0
  157. data/doc/cxxapi/inherit__graph__15.map +1 -1
  158. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  159. data/doc/cxxapi/inherit__graph__15.png +0 -0
  160. data/doc/cxxapi/inherit__graph__16.map +3 -1
  161. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  162. data/doc/cxxapi/inherit__graph__16.png +0 -0
  163. data/doc/cxxapi/inherit__graph__17.map +1 -1
  164. data/doc/cxxapi/inherit__graph__17.md5 +1 -1
  165. data/doc/cxxapi/inherit__graph__17.png +0 -0
  166. data/doc/cxxapi/inherit__graph__18.map +1 -2
  167. data/doc/cxxapi/inherit__graph__18.md5 +1 -1
  168. data/doc/cxxapi/inherit__graph__18.png +0 -0
  169. data/doc/cxxapi/inherit__graph__19.map +1 -1
  170. data/doc/cxxapi/inherit__graph__19.md5 +1 -1
  171. data/doc/cxxapi/inherit__graph__19.png +0 -0
  172. data/doc/cxxapi/inherit__graph__20.map +2 -1
  173. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  174. data/doc/cxxapi/inherit__graph__20.png +0 -0
  175. data/doc/cxxapi/inherit__graph__21.map +1 -1
  176. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  177. data/doc/cxxapi/inherit__graph__21.png +0 -0
  178. data/doc/cxxapi/inherit__graph__22.map +1 -1
  179. data/doc/cxxapi/inherit__graph__22.md5 +1 -1
  180. data/doc/cxxapi/inherit__graph__22.png +0 -0
  181. data/doc/cxxapi/inherit__graph__23.map +1 -1
  182. data/doc/cxxapi/inherit__graph__23.md5 +1 -1
  183. data/doc/cxxapi/inherit__graph__23.png +0 -0
  184. data/doc/cxxapi/inherit__graph__24.map +1 -1
  185. data/doc/cxxapi/inherit__graph__24.md5 +1 -1
  186. data/doc/cxxapi/inherit__graph__24.png +0 -0
  187. data/doc/cxxapi/inherit__graph__25.map +1 -1
  188. data/doc/cxxapi/inherit__graph__25.md5 +1 -1
  189. data/doc/cxxapi/inherit__graph__25.png +0 -0
  190. data/doc/cxxapi/inherit__graph__26.map +1 -1
  191. data/doc/cxxapi/inherit__graph__26.md5 +1 -1
  192. data/doc/cxxapi/inherit__graph__26.png +0 -0
  193. data/doc/cxxapi/inherit__graph__27.map +1 -2
  194. data/doc/cxxapi/inherit__graph__27.md5 +1 -1
  195. data/doc/cxxapi/inherit__graph__27.png +0 -0
  196. data/doc/cxxapi/inherit__graph__28.map +1 -1
  197. data/doc/cxxapi/inherit__graph__28.md5 +1 -1
  198. data/doc/cxxapi/inherit__graph__28.png +0 -0
  199. data/doc/cxxapi/inherit__graph__29.map +1 -1
  200. data/doc/cxxapi/inherit__graph__29.md5 +1 -1
  201. data/doc/cxxapi/inherit__graph__29.png +0 -0
  202. data/doc/cxxapi/inherit__graph__30.map +2 -1
  203. data/doc/cxxapi/inherit__graph__30.md5 +1 -1
  204. data/doc/cxxapi/inherit__graph__30.png +0 -0
  205. data/doc/cxxapi/inherit__graph__31.map +1 -3
  206. data/doc/cxxapi/inherit__graph__31.md5 +1 -1
  207. data/doc/cxxapi/inherit__graph__31.png +0 -0
  208. data/doc/cxxapi/inherit__graph__32.map +1 -1
  209. data/doc/cxxapi/inherit__graph__32.md5 +1 -1
  210. data/doc/cxxapi/inherit__graph__32.png +0 -0
  211. data/doc/cxxapi/inherit__graph__33.map +1 -1
  212. data/doc/cxxapi/inherit__graph__33.md5 +1 -1
  213. data/doc/cxxapi/inherit__graph__33.png +0 -0
  214. data/doc/cxxapi/inherit__graph__34.map +3 -1
  215. data/doc/cxxapi/inherit__graph__34.md5 +1 -1
  216. data/doc/cxxapi/inherit__graph__34.png +0 -0
  217. data/doc/cxxapi/inherit__graph__35.map +1 -1
  218. data/doc/cxxapi/inherit__graph__35.md5 +1 -1
  219. data/doc/cxxapi/inherit__graph__35.png +0 -0
  220. data/doc/cxxapi/inherit__graph__36.map +1 -1
  221. data/doc/cxxapi/inherit__graph__36.md5 +1 -1
  222. data/doc/cxxapi/inherit__graph__36.png +0 -0
  223. data/doc/cxxapi/inherit__graph__37.map +1 -0
  224. data/doc/cxxapi/inherit__graph__37.md5 +1 -0
  225. data/doc/cxxapi/inherit__graph__37.png +0 -0
  226. data/doc/cxxapi/inherit__graph__38.map +1 -0
  227. data/doc/cxxapi/inherit__graph__38.md5 +1 -0
  228. data/doc/cxxapi/inherit__graph__38.png +0 -0
  229. data/doc/cxxapi/inherit__graph__39.map +1 -0
  230. data/doc/cxxapi/inherit__graph__39.md5 +1 -0
  231. data/doc/cxxapi/inherit__graph__39.png +0 -0
  232. data/doc/cxxapi/inherit__graph__5.map +1 -1
  233. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  234. data/doc/cxxapi/inherit__graph__5.png +0 -0
  235. data/doc/cxxapi/inherit__graph__6.map +1 -1
  236. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  237. data/doc/cxxapi/inherit__graph__6.png +0 -0
  238. data/doc/cxxapi/inherit__graph__7.map +1 -1
  239. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  240. data/doc/cxxapi/inherit__graph__7.png +0 -0
  241. data/doc/cxxapi/inherit__graph__8.map +1 -1
  242. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  243. data/doc/cxxapi/inherit__graph__8.png +0 -0
  244. data/doc/cxxapi/inherit__graph__9.map +1 -1
  245. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  246. data/doc/cxxapi/inherit__graph__9.png +0 -0
  247. data/doc/cxxapi/inherits.html +46 -31
  248. data/doc/cxxapi/main.html +12 -11
  249. data/doc/cxxapi/modules.html +16 -13
  250. data/doc/cxxapi/namespacePassenger.html +82 -5
  251. data/doc/cxxapi/namespacemembers.html +5 -3
  252. data/doc/cxxapi/namespacemembers_enum.html +1 -1
  253. data/doc/cxxapi/namespacemembers_eval.html +1 -1
  254. data/doc/cxxapi/namespacemembers_func.html +5 -3
  255. data/doc/cxxapi/namespacemembers_type.html +1 -1
  256. data/doc/cxxapi/namespaces.html +2 -2
  257. data/doc/cxxapi/nginx_2Configuration_8h-source.html +43 -42
  258. data/doc/cxxapi/ngx__http__passenger__module_8h-source.html +1 -1
  259. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -1
  260. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +1 -1
  261. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4-members.html +33 -0
  262. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4.html +52 -0
  263. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -1
  264. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +1 -1
  265. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +1 -1
  266. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +1 -1
  267. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +3 -2
  268. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +25 -5
  269. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +1 -1
  270. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +1 -1
  271. data/doc/cxxapi/tabs.css +1 -1
  272. data/doc/cxxapi/tree.html +20 -17
  273. data/doc/users_guide_snippets/tips.txt +28 -0
  274. data/ext/apache2/Hooks.cpp +19 -2
  275. data/ext/common/Utils.cpp +15 -4
  276. data/ext/common/Version.h +1 -1
  277. data/ext/nginx/StaticContentHandler.c +6 -3
  278. data/ext/phusion_passenger/native_support.c +25 -0
  279. data/lib/phusion_passenger/abstract_request_handler.rb +1 -0
  280. data/lib/phusion_passenger/constants.rb +1 -1
  281. data/lib/phusion_passenger/events.rb +3 -0
  282. data/lib/phusion_passenger/platform_info.rb +2 -1
  283. data/lib/phusion_passenger/rack/application_spawner.rb +2 -0
  284. data/lib/phusion_passenger/railz/application_spawner.rb +8 -0
  285. data/lib/phusion_passenger/utils.rb +69 -9
  286. data/lib/phusion_passenger/utils/rewindable_input.rb +10 -6
  287. metadata +55 -17
data/NEWS CHANGED
@@ -1,3 +1,32 @@
1
+ Release 2.2.12
2
+ --------------
3
+
4
+ * Improved Bundler support.
5
+ Previous versions might not be able to correctly load gems bundled
6
+ by Bundler. We've also documented how our Bundler support works and
7
+ how to override our support if you need special behavior.
8
+ Please refer to the Phusion Passenger Users Guide, section
9
+ "Bundler support".
10
+ * Worked around some user account handling bugs in Ruby. Issue #192.
11
+ * Fixed some Ruby 1.9 tempfile.rb compatibility problems.
12
+ * Fixed some compilation problems on some ARM Linux platforms.
13
+ * [Apache] Suppress bogus mod_xsendfile-related error messages.
14
+ When mod_xsendfile is being used, Phusion Passenger might print
15
+ bogus error messages like "EPIPE" or "Apache stopped forwarding
16
+ the backend's response" to the log file. These messages are
17
+ normal, are harmless and can be safely ignored, but they pollute
18
+ the log file. So in this release we've added code to suppress
19
+ these messages when mod_xsendfile is being used. Issue #474.
20
+ * [Nginx] Fixed "passenger_user_switching off" permission problems
21
+ If Nginx is running as root and passenger_user_switching is turned
22
+ off, then Phusion Passenger would fail to initialize because of
23
+ a permission problem. This has been fixed. Issue #458.
24
+ * [Nginx] Nginx >= 0.8.38 is now supported.
25
+ Thanks to Sergey A. Osokin for reporting the problem.
26
+ * [Nginx] passenger-install-nginx-module upgraded
27
+ It now defaults to installing Nginx 0.7.65 instead of 0.7.64.
28
+
29
+
1
30
  Release 2.2.11
2
31
  --------------
3
32
 
@@ -36,7 +36,7 @@ include PlatformInfo
36
36
  class Installer < PhusionPassenger::AbstractInstaller
37
37
  include PhusionPassenger
38
38
 
39
- NGINX_VERSION = "0.7.64"
39
+ NGINX_VERSION = "0.7.65"
40
40
 
41
41
  def dependencies
42
42
  result = [
@@ -3123,7 +3123,38 @@ namespace :deploy do
3123
3123
  end
3124
3124
  end</tt></pre>
3125
3125
  </div></div>
3126
- <h3 id="moving_phusion_passenger">8.4. Moving Phusion Passenger to a different directory</h3><div style="clear:left"></div>
3126
+ <h3 id="bundler_support">8.4. Bundler support</h3><div style="clear:left"></div>
3127
+ <div class="paragraph"><p>Phusion Passenger has automatic support for <a href="http://gembundler.com/git.html">Bundler</a>.
3128
+ It works as follows:</p></div>
3129
+ <div class="ulist"><ul>
3130
+ <li>
3131
+ <p>
3132
+ If you have a <em>.bundle/environment.rb</em> in your application root, then Phusion
3133
+ Passenger will require that file before loading your application.
3134
+ </p>
3135
+ </li>
3136
+ <li>
3137
+ <p>
3138
+ Otherwise, if you have a <em>Gemfile</em>, then Phusion Passenger will automatically call
3139
+ <tt>Bundler.setup()</tt> before loading your application.
3140
+ </p>
3141
+ </li>
3142
+ </ul></div>
3143
+ <div class="paragraph"><p>It&#8217;s possible that your application also calls <tt>Bundler.setup</tt> during loading, e.g. in
3144
+ <em>config.ru</em> or in <em>config/boot.rb</em>. This is the case with Rails 3, and is also the case if you
3145
+ modified your <em>config/boot.rb</em> according to the
3146
+ <a href="http://gembundler.com/rails23.html">Bundler Rails 2.3 instructions</a>.
3147
+ This leads to <tt>Bundler.setup</tt> being called twice, once before the application startup file
3148
+ is required and once during application startup. However this is harmless and doesn&#8217;t
3149
+ have any negative effects.</p></div>
3150
+ <div class="paragraph"><p>Phusion Passenger assumes that you&#8217;re using Bundler &gt;= 0.9.5. If you don&#8217;t want Phusion
3151
+ Passenger to run its Bundler support code, e.g. because you need to use an older version
3152
+ of Bundler with an incompatible API or because you use a system other than Bundler, then
3153
+ you can override Phusion Passenger&#8217;s Bundler support code by creating a file
3154
+ <em>config/setup_load_paths.rb</em>. If this file exists then it will be required before loading
3155
+ the application startup file. In this file you can do whatever you need to setup Bundler
3156
+ or a similar system.</p></div>
3157
+ <h3 id="moving_phusion_passenger">8.5. Moving Phusion Passenger to a different directory</h3><div style="clear:left"></div>
3127
3158
  <div class="paragraph"><p>It is possible to relocate the Phusion Passenger files to a different directory. It
3128
3159
  involves two steps:</p></div>
3129
3160
  <div class="olist arabic"><ol class="arabic">
@@ -3160,7 +3191,7 @@ Edit your Apache configuration file, and set:
3160
3191
  </div></div>
3161
3192
  </li>
3162
3193
  </ol></div>
3163
- <h3 id="_installing_multiple_ruby_on_rails_versions">8.5. Installing multiple Ruby on Rails versions</h3><div style="clear:left"></div>
3194
+ <h3 id="_installing_multiple_ruby_on_rails_versions">8.6. Installing multiple Ruby on Rails versions</h3><div style="clear:left"></div>
3164
3195
  <div class="paragraph"><p>Each Ruby on Rails applications that are going to be deployed may require a
3165
3196
  specific Ruby on Rails version. You can install a specific version with
3166
3197
  this command:</p></div>
@@ -3171,7 +3202,7 @@ this command:</p></div>
3171
3202
  <div class="paragraph"><p>where <em>X.X.X</em> is the version number of Ruby on Rails.</p></div>
3172
3203
  <div class="paragraph"><p>All of these versions will exist in parallel, and will not conflict with each
3173
3204
  other. Phusion Passenger will automatically make use of the correct version.</p></div>
3174
- <h3 id="_making_the_application_restart_after_each_request">8.6. Making the application restart after each request</h3><div style="clear:left"></div>
3205
+ <h3 id="_making_the_application_restart_after_each_request">8.7. Making the application restart after each request</h3><div style="clear:left"></div>
3175
3206
  <div class="paragraph"><p>In some situations it might be desirable to restart the web application after
3176
3207
  each request, for example when developing a non-Rails application that doesn&#8217;t
3177
3208
  support code reloading, or when developing a web framework.</p></div>
@@ -3192,7 +3223,7 @@ or when you&#8217;re not developing a Rails application and your web framework
3192
3223
  does not support code reloading.</td>
3193
3224
  </tr></table>
3194
3225
  </div>
3195
- <h3 id="sub_uri_deployment_uri_fix">8.7. How to fix broken images/CSS/JavaScript URIs in sub-URI deployments</h3><div style="clear:left"></div>
3226
+ <h3 id="sub_uri_deployment_uri_fix">8.8. How to fix broken images/CSS/JavaScript URIs in sub-URI deployments</h3><div style="clear:left"></div>
3196
3227
  <div class="paragraph"><p>Some people experience broken images and other broken static assets when they
3197
3228
  deploy their application to a sub-URI (i.e. <em>http://mysite.com/railsapp/</em>).
3198
3229
  The reason for this usually is that you used a
@@ -3227,10 +3258,10 @@ so that your images will always work no matter what sub-URI you&#8217;ve deploye
3227
3258
  append a timestamp to the URI to better facilitate HTTP caching. For more information,
3228
3259
  please refer to
3229
3260
  <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html">the Rails API docs</a>.</p></div>
3230
- <h3 id="_x_sendfile_support">8.8. X-Sendfile support</h3><div style="clear:left"></div>
3261
+ <h3 id="_x_sendfile_support">8.9. X-Sendfile support</h3><div style="clear:left"></div>
3231
3262
  <div class="paragraph"><p>Phusion Passenger does not provide X-Sendfile support by itself. Please install
3232
3263
  <a href="http://tn123.ath.cx/mod_xsendfile/">mod_xsendfile</a> for X-Sendfile support.</p></div>
3233
- <h3 id="_upload_progress">8.9. Upload progress</h3><div style="clear:left"></div>
3264
+ <h3 id="_upload_progress">8.10. Upload progress</h3><div style="clear:left"></div>
3234
3265
  <div class="paragraph"><p>Phusion Passenger does not provide upload progress support by itself. Please
3235
3266
  try drogus&#8217;s <a href="http://github.com/drogus/apache-upload-progress-module/tree/master">
3236
3267
  Apache upload progress module</a> instead.</p></div>
@@ -3718,7 +3749,7 @@ has no effect.</p></div>
3718
3749
  <div id="footnotes"><hr /></div>
3719
3750
  <div id="footer">
3720
3751
  <div id="footer-text">
3721
- Last updated 2010-03-05 10:35:16 CEST
3752
+ Last updated 2010-05-31 21:19:11 CEST
3722
3753
  </div>
3723
3754
  </div>
3724
3755
  </body>
@@ -1909,7 +1909,38 @@ namespace :deploy do
1909
1909
  end
1910
1910
  end</tt></pre>
1911
1911
  </div></div>
1912
- <h3 id="moving_phusion_passenger">7.4. Moving Phusion Passenger to a different directory</h3><div style="clear:left"></div>
1912
+ <h3 id="bundler_support">7.4. Bundler support</h3><div style="clear:left"></div>
1913
+ <div class="paragraph"><p>Phusion Passenger has automatic support for <a href="http://gembundler.com/git.html">Bundler</a>.
1914
+ It works as follows:</p></div>
1915
+ <div class="ulist"><ul>
1916
+ <li>
1917
+ <p>
1918
+ If you have a <em>.bundle/environment.rb</em> in your application root, then Phusion
1919
+ Passenger will require that file before loading your application.
1920
+ </p>
1921
+ </li>
1922
+ <li>
1923
+ <p>
1924
+ Otherwise, if you have a <em>Gemfile</em>, then Phusion Passenger will automatically call
1925
+ <tt>Bundler.setup()</tt> before loading your application.
1926
+ </p>
1927
+ </li>
1928
+ </ul></div>
1929
+ <div class="paragraph"><p>It&#8217;s possible that your application also calls <tt>Bundler.setup</tt> during loading, e.g. in
1930
+ <em>config.ru</em> or in <em>config/boot.rb</em>. This is the case with Rails 3, and is also the case if you
1931
+ modified your <em>config/boot.rb</em> according to the
1932
+ <a href="http://gembundler.com/rails23.html">Bundler Rails 2.3 instructions</a>.
1933
+ This leads to <tt>Bundler.setup</tt> being called twice, once before the application startup file
1934
+ is required and once during application startup. However this is harmless and doesn&#8217;t
1935
+ have any negative effects.</p></div>
1936
+ <div class="paragraph"><p>Phusion Passenger assumes that you&#8217;re using Bundler &gt;= 0.9.5. If you don&#8217;t want Phusion
1937
+ Passenger to run its Bundler support code, e.g. because you need to use an older version
1938
+ of Bundler with an incompatible API or because you use a system other than Bundler, then
1939
+ you can override Phusion Passenger&#8217;s Bundler support code by creating a file
1940
+ <em>config/setup_load_paths.rb</em>. If this file exists then it will be required before loading
1941
+ the application startup file. In this file you can do whatever you need to setup Bundler
1942
+ or a similar system.</p></div>
1943
+ <h3 id="moving_phusion_passenger">7.5. Moving Phusion Passenger to a different directory</h3><div style="clear:left"></div>
1913
1944
  <div class="paragraph"><p>It is possible to relocate the Phusion Passenger files to a different directory. It
1914
1945
  involves two steps:</p></div>
1915
1946
  <div class="olist arabic"><ol class="arabic">
@@ -1946,7 +1977,7 @@ Edit your Apache configuration file, and set:
1946
1977
  </div></div>
1947
1978
  </li>
1948
1979
  </ol></div>
1949
- <h3 id="_installing_multiple_ruby_on_rails_versions">7.5. Installing multiple Ruby on Rails versions</h3><div style="clear:left"></div>
1980
+ <h3 id="_installing_multiple_ruby_on_rails_versions">7.6. Installing multiple Ruby on Rails versions</h3><div style="clear:left"></div>
1950
1981
  <div class="paragraph"><p>Each Ruby on Rails applications that are going to be deployed may require a
1951
1982
  specific Ruby on Rails version. You can install a specific version with
1952
1983
  this command:</p></div>
@@ -1957,7 +1988,7 @@ this command:</p></div>
1957
1988
  <div class="paragraph"><p>where <em>X.X.X</em> is the version number of Ruby on Rails.</p></div>
1958
1989
  <div class="paragraph"><p>All of these versions will exist in parallel, and will not conflict with each
1959
1990
  other. Phusion Passenger will automatically make use of the correct version.</p></div>
1960
- <h3 id="_making_the_application_restart_after_each_request">7.6. Making the application restart after each request</h3><div style="clear:left"></div>
1991
+ <h3 id="_making_the_application_restart_after_each_request">7.7. Making the application restart after each request</h3><div style="clear:left"></div>
1961
1992
  <div class="paragraph"><p>In some situations it might be desirable to restart the web application after
1962
1993
  each request, for example when developing a non-Rails application that doesn&#8217;t
1963
1994
  support code reloading, or when developing a web framework.</p></div>
@@ -1978,7 +2009,7 @@ or when you&#8217;re not developing a Rails application and your web framework
1978
2009
  does not support code reloading.</td>
1979
2010
  </tr></table>
1980
2011
  </div>
1981
- <h3 id="sub_uri_deployment_uri_fix">7.7. How to fix broken images/CSS/JavaScript URIs in sub-URI deployments</h3><div style="clear:left"></div>
2012
+ <h3 id="sub_uri_deployment_uri_fix">7.8. How to fix broken images/CSS/JavaScript URIs in sub-URI deployments</h3><div style="clear:left"></div>
1982
2013
  <div class="paragraph"><p>Some people experience broken images and other broken static assets when they
1983
2014
  deploy their application to a sub-URI (i.e. <em>http://mysite.com/railsapp/</em>).
1984
2015
  The reason for this usually is that you used a
@@ -2396,7 +2427,7 @@ has no effect.</p></div>
2396
2427
  <div id="footnotes"><hr /></div>
2397
2428
  <div id="footer">
2398
2429
  <div id="footer-text">
2399
- Last updated 2010-03-05 10:35:16 CEST
2430
+ Last updated 2010-05-31 21:19:11 CEST
2400
2431
  </div>
2401
2432
  </div>
2402
2433
  </body>
@@ -131,7 +131,7 @@
131
131
  <a name="l00109"></a>00109
132
132
  <a name="l00110"></a>00110 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_ABSTRACT_SPAWN_MANAGER_H_ */</span>
133
133
  </pre></div></div>
134
- <hr size="1"><address style="text-align: right;"><small>Generated on Sun Feb 21 12:22:45 2010 for Passenger by&nbsp;
134
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:55 2010 for Passenger by&nbsp;
135
135
  <a href="http://www.doxygen.org/index.html">
136
136
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
137
137
  </body>
@@ -195,7 +195,7 @@
195
195
  <a name="l00173"></a>00173
196
196
  <a name="l00174"></a>00174 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_ACCOUNT_H_ */</span>
197
197
  </pre></div></div>
198
- <hr size="1"><address style="text-align: right;"><small>Generated on Sun Feb 21 12:22:45 2010 for Passenger by&nbsp;
198
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
199
199
  <a href="http://www.doxygen.org/index.html">
200
200
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
201
201
  </body>
@@ -151,7 +151,7 @@
151
151
  <a name="l00129"></a>00129
152
152
  <a name="l00130"></a>00130 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_ACCOUNTS_DATABASE_H_ */</span>
153
153
  </pre></div></div>
154
- <hr size="1"><address style="text-align: right;"><small>Generated on Sun Feb 21 12:22:45 2010 for Passenger by&nbsp;
154
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
155
155
  <a href="http://www.doxygen.org/index.html">
156
156
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
157
157
  </body>
@@ -72,7 +72,7 @@
72
72
  <a name="l00050"></a>00050 <span class="preprocessor"></span>
73
73
  <a name="l00051"></a>00051 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_AGENTS_STARTER_H_ */</span>
74
74
  </pre></div></div>
75
- <hr size="1"><address style="text-align: right;"><small>Generated on Sun Feb 21 12:22:45 2010 for Passenger by&nbsp;
75
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
76
76
  <a href="http://www.doxygen.org/index.html">
77
77
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
78
78
  </body>
@@ -94,7 +94,7 @@
94
94
  <a name="l00072"></a>00072
95
95
  <a name="l00073"></a>00073 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_BCRYPT_H_ */</span>
96
96
  </pre></div></div>
97
- <hr size="1"><address style="text-align: right;"><small>Generated on Sun Feb 21 12:22:45 2010 for Passenger by&nbsp;
97
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
98
98
  <a href="http://www.doxygen.org/index.html">
99
99
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
100
100
  </body>
@@ -124,7 +124,7 @@
124
124
  <a name="l00102"></a>00102
125
125
  <a name="l00103"></a>00103 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_BLOWFISH_H_ */</span>
126
126
  </pre></div></div>
127
- <hr size="1"><address style="text-align: right;"><small>Generated on Sun Feb 21 12:22:45 2010 for Passenger by&nbsp;
127
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
128
128
  <a href="http://www.doxygen.org/index.html">
129
129
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
130
130
  </body>
@@ -10,6 +10,7 @@
10
10
  <ul>
11
11
  <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
12
12
  <li><a href="modules.html"><span>Modules</span></a></li>
13
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
13
14
  <li><a href="annotated.html"><span>Classes</span></a></li>
14
15
  <li class="current"><a href="files.html"><span>Files</span></a></li>
15
16
  </ul>
@@ -21,7 +22,7 @@
21
22
  </div>
22
23
  <h1>Bucket.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
23
24
  <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
24
- <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2008, 2009 Phusion</span>
25
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
25
26
  <a name="l00004"></a>00004 <span class="comment"> *</span>
26
27
  <a name="l00005"></a>00005 <span class="comment"> * "Phusion Passenger" is a trademark of Hongli Lai &amp; Ninh Bui.</span>
27
28
  <a name="l00006"></a>00006 <span class="comment"> *</span>
@@ -48,7 +49,7 @@
48
49
  <a name="l00027"></a>00027 <span class="preprocessor"></span>
49
50
  <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;boost/shared_ptr.hpp&gt;</span>
50
51
  <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;apr_buckets.h&gt;</span>
51
- <a name="l00030"></a>00030 <span class="preprocessor">#include "Application.h"</span>
52
+ <a name="l00030"></a>00030 <span class="preprocessor">#include "Session.h"</span>
52
53
  <a name="l00031"></a>00031
53
54
  <a name="l00032"></a>00032 <span class="keyword">namespace </span>Passenger {
54
55
  <a name="l00033"></a>00033
@@ -99,7 +100,7 @@
99
100
  <a name="l00078"></a>00078 <span class="comment"> * strange I/O problems.</span>
100
101
  <a name="l00079"></a>00079 <span class="comment"> * - It can store its current state in a PassengerBucketState data structure.</span>
101
102
  <a name="l00080"></a>00080 <span class="comment"> */</span>
102
- <a name="l00081"></a>00081 apr_bucket *passenger_bucket_create(Passenger::Application::SessionPtr session,
103
+ <a name="l00081"></a>00081 apr_bucket *<a class="code" href="namespacePassenger.html#35b11c8ce90e90d01380f182d82f8cac" title="We used to use an apr_bucket_pipe for forwarding the backend process&amp;#39;s response...">passenger_bucket_create</a>(SessionPtr session,
103
104
  <a name="l00082"></a>00082 PassengerBucketStatePtr state,
104
105
  <a name="l00083"></a>00083 apr_bucket_alloc_t *list);
105
106
  <a name="l00084"></a>00084
@@ -107,7 +108,7 @@
107
108
  <a name="l00086"></a>00086
108
109
  <a name="l00087"></a>00087 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_BUCKET_H_ */</span>
109
110
  </pre></div></div>
110
- <hr size="1"><address style="text-align: right;"><small>Generated on Fri Mar 5 11:13:03 2010 for Passenger by&nbsp;
111
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
111
112
  <a href="http://www.doxygen.org/index.html">
112
113
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
113
114
  </body>
@@ -48,7 +48,7 @@
48
48
  <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_CONSTANTS_H_</span>
49
49
  <a name="l00027"></a>00027 <span class="preprocessor"></span>
50
50
  <a name="l00028"></a>00028 <span class="comment">/* Don't forget to update lib/phusion_passenger.rb too. */</span>
51
- <a name="l00029"></a>00029 <span class="preprocessor">#define PASSENGER_VERSION "2.9.1"</span>
51
+ <a name="l00029"></a>00029 <span class="preprocessor">#define PASSENGER_VERSION "2.9.2"</span>
52
52
  <a name="l00030"></a>00030 <span class="preprocessor"></span>
53
53
  <a name="l00031"></a>00031 <span class="preprocessor">#define DEFAULT_LOG_LEVEL 0</span>
54
54
  <a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_MAX_POOL_SIZE 6</span>
@@ -64,7 +64,7 @@
64
64
  <a name="l00042"></a>00042 <span class="preprocessor"></span>
65
65
  <a name="l00043"></a>00043 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_CONSTANTS_H */</span>
66
66
  </pre></div></div>
67
- <hr size="1"><address style="text-align: right;"><small>Generated on Sun Feb 21 12:22:45 2010 for Passenger by&nbsp;
67
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
68
68
  <a href="http://www.doxygen.org/index.html">
69
69
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
70
70
  </body>
@@ -85,7 +85,7 @@
85
85
  <a name="l00063"></a>00063 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_NGINX_CONTENT_HANDLER_H_ */</span>
86
86
  <a name="l00064"></a>00064
87
87
  </pre></div></div>
88
- <hr size="1"><address style="text-align: right;"><small>Generated on Sun Feb 21 12:22:45 2010 for Passenger by&nbsp;
88
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
89
89
  <a href="http://www.doxygen.org/index.html">
90
90
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
91
91
  </body>
@@ -10,6 +10,7 @@
10
10
  <ul>
11
11
  <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
12
12
  <li><a href="modules.html"><span>Modules</span></a></li>
13
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
13
14
  <li><a href="annotated.html"><span>Classes</span></a></li>
14
15
  <li class="current"><a href="files.html"><span>Files</span></a></li>
15
16
  </ul>
@@ -21,7 +22,7 @@
21
22
  </div>
22
23
  <h1>DirectoryMapper.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
23
24
  <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
24
- <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2008, 2009 Phusion</span>
25
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
25
26
  <a name="l00004"></a>00004 <span class="comment"> *</span>
26
27
  <a name="l00005"></a>00005 <span class="comment"> * "Phusion Passenger" is a trademark of Hongli Lai &amp; Ninh Bui.</span>
27
28
  <a name="l00006"></a>00006 <span class="comment"> *</span>
@@ -52,9 +53,9 @@
52
53
  <a name="l00031"></a>00031
53
54
  <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;oxt/backtrace.hpp&gt;</span>
54
55
  <a name="l00033"></a>00033
55
- <a name="l00034"></a>00034 <span class="preprocessor">#include "CachedFileStat.hpp"</span>
56
- <a name="l00035"></a>00035 <span class="preprocessor">#include "Configuration.h"</span>
57
- <a name="l00036"></a>00036 <span class="preprocessor">#include "Utils.h"</span>
56
+ <a name="l00034"></a>00034 <span class="preprocessor">#include "Configuration.hpp"</span>
57
+ <a name="l00035"></a>00035 <span class="preprocessor">#include "Utils.h"</span>
58
+ <a name="l00036"></a>00036 <span class="preprocessor">#include "Utils/CachedFileStat.hpp"</span>
58
59
  <a name="l00037"></a>00037
59
60
  <a name="l00038"></a>00038 <span class="comment">// The Apache/APR headers *must* come after the Boost headers, otherwise</span>
60
61
  <a name="l00039"></a>00039 <span class="comment">// compilation will fail on OpenBSD.</span>
@@ -192,7 +193,7 @@
192
193
  <a name="l00171"></a>00171
193
194
  <a name="l00172"></a>00172 UPDATE_TRACE_POINT();
194
195
  <a name="l00173"></a>00173 <span class="keywordflow">if</span> (shouldAutoDetectRack()
195
- <a name="l00174"></a>00174 &amp;&amp; verifyRackDir(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
196
+ <a name="l00174"></a>00174 &amp;&amp; <a class="code" href="group__Support.html#g53969f8e3ee68d1d99ffe75af8db9be8" title="Check whether the specified directory is a valid Rack application root directory...">verifyRackDir</a>(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
196
197
  <a name="l00175"></a>00175 baseURIKnown = <span class="keyword">true</span>;
197
198
  <a name="l00176"></a>00176 baseURI = <span class="stringliteral">"/"</span>;
198
199
  <a name="l00177"></a>00177 appType = RACK;
@@ -201,7 +202,7 @@
201
202
  <a name="l00180"></a>00180
202
203
  <a name="l00181"></a>00181 UPDATE_TRACE_POINT();
203
204
  <a name="l00182"></a>00182 <span class="keywordflow">if</span> (shouldAutoDetectRails()
204
- <a name="l00183"></a>00183 &amp;&amp; verifyRailsDir(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
205
+ <a name="l00183"></a>00183 &amp;&amp; <a class="code" href="group__Support.html#g5e6bc7ff22b7c61238d7913521936f71" title="Check whether the specified directory is a valid Ruby on Rails application root directory...">verifyRailsDir</a>(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
205
206
  <a name="l00184"></a>00184 baseURIKnown = <span class="keyword">true</span>;
206
207
  <a name="l00185"></a>00185 baseURI = <span class="stringliteral">"/"</span>;
207
208
  <a name="l00186"></a>00186 appType = RAILS;
@@ -210,7 +211,7 @@
210
211
  <a name="l00189"></a>00189
211
212
  <a name="l00190"></a>00190 UPDATE_TRACE_POINT();
212
213
  <a name="l00191"></a>00191 <span class="keywordflow">if</span> (shouldAutoDetectWSGI()
213
- <a name="l00192"></a>00192 &amp;&amp; verifyWSGIDir(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
214
+ <a name="l00192"></a>00192 &amp;&amp; <a class="code" href="group__Support.html#gaec51d2912999d611994c49341f36247" title="Check whether the specified directory is a valid WSGI application root directory...">verifyWSGIDir</a>(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
214
215
  <a name="l00193"></a>00193 baseURIKnown = <span class="keyword">true</span>;
215
216
  <a name="l00194"></a>00194 baseURI = <span class="stringliteral">"/"</span>;
216
217
  <a name="l00195"></a>00195 appType = WSGI;
@@ -252,7 +253,7 @@
252
253
  <a name="l00231"></a>00231 <span class="comment"> * This is probably a symlink, so let's resolve it.</span>
253
254
  <a name="l00232"></a>00232 <span class="comment"> */</span>
254
255
  <a name="l00233"></a>00233 path.append(baseURI);
255
- <a name="l00234"></a>00234 path = resolveSymlink(path);
256
+ <a name="l00234"></a>00234 path = <a class="code" href="group__Support.html#gc3d2b3d608188527d888e63d22c5163c" title="If path refers to a symlink, then this function resolves the symlink for 1 level...">resolveSymlink</a>(path);
256
257
  <a name="l00235"></a>00235 }
257
258
  <a name="l00236"></a>00236 <span class="keywordflow">return</span> path;
258
259
  <a name="l00237"></a>00237 } <span class="keywordflow">else</span> {
@@ -316,7 +317,7 @@
316
317
  <a name="l00295"></a>00295 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_DIRECTORY_MAPPER_H_ */</span>
317
318
  <a name="l00296"></a>00296
318
319
  </pre></div></div>
319
- <hr size="1"><address style="text-align: right;"><small>Generated on Fri Mar 5 11:13:03 2010 for Passenger by&nbsp;
320
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
320
321
  <a href="http://www.doxygen.org/index.html">
321
322
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
322
323
  </body>
@@ -0,0 +1,415 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
+ <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
3
+ <title>Passenger: EventedServer.h Source File</title>
4
+ <link href="tabs.css" rel="stylesheet" type="text/css">
5
+ <link href="doxygen.css" rel="stylesheet" type="text/css">
6
+ </head><body>
7
+ <!-- Generated by Doxygen 1.5.8 -->
8
+ <div class="navigation" id="top">
9
+ <div class="tabs">
10
+ <ul>
11
+ <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
12
+ <li><a href="modules.html"><span>Modules</span></a></li>
13
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
14
+ <li><a href="annotated.html"><span>Classes</span></a></li>
15
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
16
+ </ul>
17
+ </div>
18
+ <div class="tabs">
19
+ <ul>
20
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
21
+ </ul>
22
+ </div>
23
+ <h1>EventedServer.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef _PASSENGER_EVENTED_SERVER_H_</span>
24
+ <a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_EVENTED_SERVER_H_</span>
25
+ <a name="l00003"></a>00003 <span class="preprocessor"></span>
26
+ <a name="l00004"></a>00004 <span class="preprocessor">#include &lt;ev++.h&gt;</span>
27
+ <a name="l00005"></a>00005 <span class="preprocessor">#include &lt;boost/shared_ptr.hpp&gt;</span>
28
+ <a name="l00006"></a>00006 <span class="preprocessor">#include &lt;boost/enable_shared_from_this.hpp&gt;</span>
29
+ <a name="l00007"></a>00007 <span class="preprocessor">#include &lt;oxt/system_calls.hpp&gt;</span>
30
+ <a name="l00008"></a>00008 <span class="preprocessor">#include &lt;oxt/macros.hpp&gt;</span>
31
+ <a name="l00009"></a>00009 <span class="preprocessor">#include &lt;algorithm&gt;</span>
32
+ <a name="l00010"></a>00010 <span class="preprocessor">#include &lt;string&gt;</span>
33
+ <a name="l00011"></a>00011 <span class="preprocessor">#include &lt;set&gt;</span>
34
+ <a name="l00012"></a>00012 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
35
+ <a name="l00013"></a>00013 <span class="preprocessor">#include &lt;sys/un.h&gt;</span>
36
+ <a name="l00014"></a>00014 <span class="preprocessor">#include &lt;sys/uio.h&gt;</span>
37
+ <a name="l00015"></a>00015 <span class="preprocessor">#include &lt;netinet/in.h&gt;</span>
38
+ <a name="l00016"></a>00016 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
39
+ <a name="l00017"></a>00017 <span class="preprocessor">#include "MessageReadersWriters.h"</span>
40
+ <a name="l00018"></a>00018 <span class="preprocessor">#include "FileDescriptor.h"</span>
41
+ <a name="l00019"></a>00019 <span class="preprocessor">#include "StaticString.h"</span>
42
+ <a name="l00020"></a>00020 <span class="preprocessor">#include "Utils.h"</span>
43
+ <a name="l00021"></a>00021
44
+ <a name="l00022"></a>00022 <span class="keyword">namespace </span>Passenger {
45
+ <a name="l00023"></a>00023
46
+ <a name="l00024"></a>00024 <span class="keyword">using namespace </span>std;
47
+ <a name="l00025"></a>00025 <span class="keyword">using namespace </span>boost;
48
+ <a name="l00026"></a>00026 <span class="keyword">using namespace </span>oxt;
49
+ <a name="l00027"></a>00027
50
+ <a name="l00028"></a>00028 <span class="keyword">class </span>EventedServer {
51
+ <a name="l00029"></a>00029 <span class="keyword">protected</span>:
52
+ <a name="l00030"></a>00030 <span class="keyword">struct </span><a class="code" href="classClient.html" title="A representation of a Client from the Server&amp;#39;s point of view.">Client</a>: <span class="keyword">public</span> enable_shared_from_this&lt;Client&gt; {
53
+ <a name="l00031"></a>00031 <span class="keyword">enum</span> {
54
+ <a name="l00032"></a>00032 ES_CONNECTED,
55
+ <a name="l00033"></a>00033 ES_WRITES_PENDING,
56
+ <a name="l00034"></a>00034 ES_DISCONNECTING_WITH_WRITES_PENDING,
57
+ <a name="l00035"></a>00035 ES_DISCONNECTED
58
+ <a name="l00036"></a>00036 } state;
59
+ <a name="l00037"></a>00037
60
+ <a name="l00038"></a>00038 EventedServer *server;
61
+ <a name="l00039"></a>00039 FileDescriptor fd;
62
+ <a name="l00040"></a>00040 ev::io readWatcher;
63
+ <a name="l00041"></a>00041 ev::io writeWatcher;
64
+ <a name="l00042"></a>00042 <span class="keywordtype">bool</span> readWatcherStarted;
65
+ <a name="l00043"></a>00043 <span class="keywordtype">bool</span> writeWatcherStarted;
66
+ <a name="l00044"></a>00044 <span class="keywordtype">string</span> outbox;
67
+ <a name="l00045"></a>00045
68
+ <a name="l00046"></a>00046 <a class="code" href="classClient.html" title="A representation of a Client from the Server&amp;#39;s point of view.">Client</a>(EventedServer *_server)
69
+ <a name="l00047"></a>00047 : server(_server),
70
+ <a name="l00048"></a>00048 readWatcher(_server-&gt;loop),
71
+ <a name="l00049"></a>00049 writeWatcher(_server-&gt;loop)
72
+ <a name="l00050"></a>00050 { }
73
+ <a name="l00051"></a>00051
74
+ <a name="l00052"></a>00052 <span class="keywordtype">void</span> _onReadable(ev::io &amp;w, <span class="keywordtype">int</span> revents) {
75
+ <a name="l00053"></a>00053 server-&gt;onClientReadable(shared_from_this());
76
+ <a name="l00054"></a>00054 }
77
+ <a name="l00055"></a>00055
78
+ <a name="l00056"></a>00056 <span class="keywordtype">void</span> _onWritable(ev::io &amp;w, <span class="keywordtype">int</span> revents) {
79
+ <a name="l00057"></a>00057 server-&gt;onClientWritable(shared_from_this());
80
+ <a name="l00058"></a>00058 }
81
+ <a name="l00059"></a>00059 };
82
+ <a name="l00060"></a>00060
83
+ <a name="l00061"></a>00061 <span class="keyword">typedef</span> shared_ptr&lt;Client&gt; ClientPtr;
84
+ <a name="l00062"></a>00062
85
+ <a name="l00063"></a>00063 <span class="keywordtype">void</span> write(<span class="keyword">const</span> ClientPtr &amp;client, <span class="keyword">const</span> <span class="keywordtype">char</span> *data) {
86
+ <a name="l00064"></a>00064 write(client, StaticString(data));
87
+ <a name="l00065"></a>00065 }
88
+ <a name="l00066"></a>00066
89
+ <a name="l00067"></a>00067 <span class="keywordtype">void</span> write(<span class="keyword">const</span> ClientPtr &amp;client, <span class="keyword">const</span> StaticString &amp;data) {
90
+ <a name="l00068"></a>00068 write(client, &amp;data, 1);
91
+ <a name="l00069"></a>00069 }
92
+ <a name="l00070"></a>00070
93
+ <a name="l00071"></a>00071 <span class="keyword">virtual</span> <span class="keywordtype">void</span> write(<span class="keyword">const</span> ClientPtr &amp;client, <span class="keyword">const</span> StaticString data[], <span class="keywordtype">size_t</span> count) {
94
+ <a name="l00072"></a>00072 <span class="keywordflow">if</span> (client-&gt;state == Client::ES_DISCONNECTED) {
95
+ <a name="l00073"></a>00073 <span class="keywordflow">return</span>;
96
+ <a name="l00074"></a>00074 }
97
+ <a name="l00075"></a>00075
98
+ <a name="l00076"></a>00076 ssize_t ret;
99
+ <a name="l00077"></a>00077 <span class="keywordtype">size_t</span> totalSize;
100
+ <a name="l00078"></a>00078 this_thread::disable_syscall_interruption dsi;
101
+ <a name="l00079"></a>00079
102
+ <a name="l00080"></a>00080 <span class="keywordflow">if</span> (client-&gt;outbox.empty()) {
103
+ <a name="l00081"></a>00081 <span class="keyword">struct </span>iovec iov[count];
104
+ <a name="l00082"></a>00082
105
+ <a name="l00083"></a>00083 totalSize = staticStringArrayToIoVec(data, count, iov);
106
+ <a name="l00084"></a>00084 ret = syscalls::writev(client-&gt;fd, iov, count);
107
+ <a name="l00085"></a>00085 <span class="keywordflow">if</span> (ret == -1) {
108
+ <a name="l00086"></a>00086 <span class="keywordflow">if</span> (errno == EAGAIN) {
109
+ <a name="l00087"></a>00087 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; count; i++) {
110
+ <a name="l00088"></a>00088 client-&gt;outbox.append(data[i].data(), data[i].size());
111
+ <a name="l00089"></a>00089 }
112
+ <a name="l00090"></a>00090 } <span class="keywordflow">else</span> {
113
+ <a name="l00091"></a>00091 printf(<span class="stringliteral">"write error\n"</span>);
114
+ <a name="l00092"></a>00092 }
115
+ <a name="l00093"></a>00093 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((<span class="keywordtype">size_t</span>) ret &lt; totalSize) {
116
+ <a name="l00094"></a>00094 <span class="keywordtype">size_t</span> index, offset;
117
+ <a name="l00095"></a>00095
118
+ <a name="l00096"></a>00096 findEndOfDataInVectors(iov, count + 1, ret, &amp;index, &amp;offset);
119
+ <a name="l00097"></a>00097 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = index; i &lt; count; i++) {
120
+ <a name="l00098"></a>00098 <span class="keywordflow">if</span> (i == index) {
121
+ <a name="l00099"></a>00099 client-&gt;outbox.append(data[i].data() + offset,
122
+ <a name="l00100"></a>00100 data[i].size() - offset);
123
+ <a name="l00101"></a>00101 } <span class="keywordflow">else</span> {
124
+ <a name="l00102"></a>00102 client-&gt;outbox.append(data[i].data(),
125
+ <a name="l00103"></a>00103 data[i].size());
126
+ <a name="l00104"></a>00104 }
127
+ <a name="l00105"></a>00105 }
128
+ <a name="l00106"></a>00106 }
129
+ <a name="l00107"></a>00107 } <span class="keywordflow">else</span> {
130
+ <a name="l00108"></a>00108 <span class="keyword">struct </span>iovec iov[count + 1];
131
+ <a name="l00109"></a>00109
132
+ <a name="l00110"></a>00110 iov[0].iov_base = (<span class="keywordtype">char</span> *) client-&gt;outbox.data();
133
+ <a name="l00111"></a>00111 iov[0].iov_len = client-&gt;outbox.size();
134
+ <a name="l00112"></a>00112 totalSize = staticStringArrayToIoVec(data, count, iov + 1);
135
+ <a name="l00113"></a>00113
136
+ <a name="l00114"></a>00114 ret = syscalls::writev(client-&gt;fd, iov, count + 1);
137
+ <a name="l00115"></a>00115 <span class="keywordflow">if</span> (ret == -1) {
138
+ <a name="l00116"></a>00116 <span class="keywordflow">if</span> (errno != EAGAIN) {
139
+ <a name="l00117"></a>00117 printf(<span class="stringliteral">"write error\n"</span>);
140
+ <a name="l00118"></a>00118 }
141
+ <a name="l00119"></a>00119 <span class="comment">// else: wait until next writable event.</span>
142
+ <a name="l00120"></a>00120 } <span class="keywordflow">else</span> {
143
+ <a name="l00121"></a>00121 string::size_type outboxSize = client-&gt;outbox.size();
144
+ <a name="l00122"></a>00122 <span class="keywordtype">size_t</span> outboxSent = std::min((<span class="keywordtype">size_t</span>) ret, outboxSize);
145
+ <a name="l00123"></a>00123
146
+ <a name="l00124"></a>00124 client-&gt;outbox.erase(0, outboxSent);
147
+ <a name="l00125"></a>00125 <span class="keywordflow">if</span> (client-&gt;outbox.empty()) {
148
+ <a name="l00126"></a>00126 <span class="keywordtype">size_t</span> index, offset;
149
+ <a name="l00127"></a>00127
150
+ <a name="l00128"></a>00128 findEndOfDataInVectors(iov, count + 1, ret, &amp;index, &amp;offset);
151
+ <a name="l00129"></a>00129 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = index; i &lt; count + 1; i++) {
152
+ <a name="l00130"></a>00130 <span class="keywordflow">if</span> (i == index) {
153
+ <a name="l00131"></a>00131 client-&gt;outbox.append(
154
+ <a name="l00132"></a>00132 data[i - 1].data() + offset,
155
+ <a name="l00133"></a>00133 data[i - 1].size() - offset);
156
+ <a name="l00134"></a>00134 } <span class="keywordflow">else</span> {
157
+ <a name="l00135"></a>00135 client-&gt;outbox.append(
158
+ <a name="l00136"></a>00136 data[i - 1].data(),
159
+ <a name="l00137"></a>00137 data[i - 1].size());
160
+ <a name="l00138"></a>00138 }
161
+ <a name="l00139"></a>00139 }
162
+ <a name="l00140"></a>00140 } <span class="keywordflow">else</span> {
163
+ <a name="l00141"></a>00141 <span class="comment">// the outbox could only be partially written, so nothing</span>
164
+ <a name="l00142"></a>00142 <span class="comment">// in 'data' could be written. add everything in 'data'</span>
165
+ <a name="l00143"></a>00143 <span class="comment">// into the outbox...</span>
166
+ <a name="l00144"></a>00144 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1; i &lt; count + 1; i++) {
167
+ <a name="l00145"></a>00145 client-&gt;outbox.append(data[i - 1].data(),
168
+ <a name="l00146"></a>00146 data[i - 1].size());
169
+ <a name="l00147"></a>00147 }
170
+ <a name="l00148"></a>00148 }
171
+ <a name="l00149"></a>00149 }
172
+ <a name="l00150"></a>00150 }
173
+ <a name="l00151"></a>00151 <span class="keywordflow">if</span> (client-&gt;outbox.empty()) {
174
+ <a name="l00152"></a>00152 outboxFlushed(client);
175
+ <a name="l00153"></a>00153 } <span class="keywordflow">else</span> {
176
+ <a name="l00154"></a>00154 outboxNotFlushed(client);
177
+ <a name="l00155"></a>00155 }
178
+ <a name="l00156"></a>00156 }
179
+ <a name="l00157"></a>00157 <span class="comment"></span>
180
+ <a name="l00158"></a>00158 <span class="comment"> /**</span>
181
+ <a name="l00159"></a>00159 <span class="comment"> * Disconnects the client. If &lt;em&gt;force&lt;/em&gt; is true then the client will</span>
182
+ <a name="l00160"></a>00160 <span class="comment"> * be disconnected immediately, and any pending outgoing data will be</span>
183
+ <a name="l00161"></a>00161 <span class="comment"> * discarded. Otherwise the client will be disconnected after all pending</span>
184
+ <a name="l00162"></a>00162 <span class="comment"> * outgoing data have been sent; in the mean time no new data can be</span>
185
+ <a name="l00163"></a>00163 <span class="comment"> * received from the client.</span>
186
+ <a name="l00164"></a>00164 <span class="comment"> */</span>
187
+ <a name="l00165"></a>00165 <span class="keyword">virtual</span> <span class="keywordtype">void</span> disconnect(<span class="keyword">const</span> ClientPtr &amp;client, <span class="keywordtype">bool</span> force = <span class="keyword">false</span>) {
188
+ <a name="l00166"></a>00166 <span class="keywordflow">if</span> (client-&gt;state == Client::ES_CONNECTED
189
+ <a name="l00167"></a>00167 || (force &amp;&amp; client-&gt;state != Client::ES_DISCONNECTED)) {
190
+ <a name="l00168"></a>00168 watchReadEvents(client, <span class="keyword">false</span>);
191
+ <a name="l00169"></a>00169 watchWriteEvents(client, <span class="keyword">false</span>);
192
+ <a name="l00170"></a>00170 client-&gt;fd.close();
193
+ <a name="l00171"></a>00171 client-&gt;state = Client::ES_DISCONNECTED;
194
+ <a name="l00172"></a>00172 clients.erase(client);
195
+ <a name="l00173"></a>00173 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (client-&gt;state == Client::ES_WRITES_PENDING) {
196
+ <a name="l00174"></a>00174 watchReadEvents(client, <span class="keyword">false</span>);
197
+ <a name="l00175"></a>00175 watchWriteEvents(client, <span class="keyword">true</span>);
198
+ <a name="l00176"></a>00176 shutdown(client-&gt;fd, SHUT_RD);
199
+ <a name="l00177"></a>00177 client-&gt;state = Client::ES_DISCONNECTING_WITH_WRITES_PENDING;
200
+ <a name="l00178"></a>00178 }
201
+ <a name="l00179"></a>00179 }
202
+ <a name="l00180"></a>00180
203
+ <a name="l00181"></a>00181 <span class="keyword">virtual</span> ClientPtr createClient() {
204
+ <a name="l00182"></a>00182 <span class="keywordflow">return</span> ClientPtr(<span class="keyword">new</span> <a class="code" href="classClient.html" title="A representation of a Client from the Server&amp;#39;s point of view.">Client</a>(<span class="keyword">this</span>));
205
+ <a name="l00183"></a>00183 }
206
+ <a name="l00184"></a>00184
207
+ <a name="l00185"></a>00185 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onNewClient(<span class="keyword">const</span> ClientPtr &amp;client) { }
208
+ <a name="l00186"></a>00186 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onClientReadable(<span class="keyword">const</span> ClientPtr &amp;client) { }
209
+ <a name="l00187"></a>00187
210
+ <a name="l00188"></a>00188 <span class="keyword">private</span>:
211
+ <a name="l00189"></a>00189 <span class="keyword">struct </span>ev_loop *loop;
212
+ <a name="l00190"></a>00190 FileDescriptor fd;
213
+ <a name="l00191"></a>00191 ev::io acceptWatcher;
214
+ <a name="l00192"></a>00192 set&lt;ClientPtr&gt; clients;
215
+ <a name="l00193"></a>00193
216
+ <a name="l00194"></a>00194 <span class="keywordtype">size_t</span> staticStringArrayToIoVec(<span class="keyword">const</span> StaticString ary[], <span class="keywordtype">size_t</span> count, <span class="keyword">struct</span> iovec *vec) {
217
+ <a name="l00195"></a>00195 <span class="keywordtype">size_t</span> total = 0;
218
+ <a name="l00196"></a>00196 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; count; i++) {
219
+ <a name="l00197"></a>00197 vec[i].iov_base = (<span class="keywordtype">char</span> *) ary[i].data();
220
+ <a name="l00198"></a>00198 vec[i].iov_len = ary[i].size();
221
+ <a name="l00199"></a>00199 total += ary[i].size();
222
+ <a name="l00200"></a>00200 }
223
+ <a name="l00201"></a>00201 <span class="keywordflow">return</span> total;
224
+ <a name="l00202"></a>00202 }
225
+ <a name="l00203"></a>00203
226
+ <a name="l00204"></a>00204 <span class="keywordtype">void</span> findEndOfDataInVectors(<span class="keyword">struct</span> iovec iov[], <span class="keywordtype">size_t</span> count, <span class="keywordtype">size_t</span> dataSize,
227
+ <a name="l00205"></a>00205 <span class="keywordtype">size_t</span> *index, <span class="keywordtype">size_t</span> *offset)
228
+ <a name="l00206"></a>00206 {
229
+ <a name="l00207"></a>00207 <span class="keywordtype">size_t</span> i, begin;
230
+ <a name="l00208"></a>00208
231
+ <a name="l00209"></a>00209 begin = 0;
232
+ <a name="l00210"></a>00210 <span class="keywordflow">for</span> (i = 0; OXT_LIKELY(i &lt; count); i++) {
233
+ <a name="l00211"></a>00211 <span class="keywordtype">size_t</span> end = begin + iov[i].iov_len;
234
+ <a name="l00212"></a>00212 <span class="keywordflow">if</span> (OXT_LIKELY(begin &lt;= dataSize)) {
235
+ <a name="l00213"></a>00213 <span class="keywordflow">if</span> (dataSize &lt; end) {
236
+ <a name="l00214"></a>00214 *index = i;
237
+ <a name="l00215"></a>00215 *offset = dataSize - begin;
238
+ <a name="l00216"></a>00216 <span class="keywordflow">return</span>;
239
+ <a name="l00217"></a>00217 } <span class="keywordflow">else</span> {
240
+ <a name="l00218"></a>00218 begin = end;
241
+ <a name="l00219"></a>00219 }
242
+ <a name="l00220"></a>00220 } <span class="keywordflow">else</span> {
243
+ <a name="l00221"></a>00221 <span class="comment">// Never reached.</span>
244
+ <a name="l00222"></a>00222 abort();
245
+ <a name="l00223"></a>00223 }
246
+ <a name="l00224"></a>00224 }
247
+ <a name="l00225"></a>00225 <span class="comment">// Never reached.</span>
248
+ <a name="l00226"></a>00226 abort();
249
+ <a name="l00227"></a>00227 }
250
+ <a name="l00228"></a>00228
251
+ <a name="l00229"></a>00229 <span class="keywordtype">void</span> outboxFlushed(<span class="keyword">const</span> ClientPtr &amp;client) {
252
+ <a name="l00230"></a>00230 <span class="keywordflow">switch</span> (client-&gt;state) {
253
+ <a name="l00231"></a>00231 <span class="keywordflow">case</span> Client::ES_CONNECTED:
254
+ <a name="l00232"></a>00232 watchReadEvents(client, <span class="keyword">true</span>);
255
+ <a name="l00233"></a>00233 watchWriteEvents(client, <span class="keyword">false</span>);
256
+ <a name="l00234"></a>00234 <span class="keywordflow">break</span>;
257
+ <a name="l00235"></a>00235 <span class="keywordflow">case</span> Client::ES_WRITES_PENDING:
258
+ <a name="l00236"></a>00236 client-&gt;state = Client::ES_CONNECTED;
259
+ <a name="l00237"></a>00237 watchReadEvents(client, <span class="keyword">true</span>);
260
+ <a name="l00238"></a>00238 watchWriteEvents(client, <span class="keyword">false</span>);
261
+ <a name="l00239"></a>00239 <span class="keywordflow">break</span>;
262
+ <a name="l00240"></a>00240 <span class="keywordflow">case</span> Client::ES_DISCONNECTING_WITH_WRITES_PENDING:
263
+ <a name="l00241"></a>00241 client-&gt;state = Client::ES_DISCONNECTED;
264
+ <a name="l00242"></a>00242 client-&gt;fd.close();
265
+ <a name="l00243"></a>00243 clients.erase(client);
266
+ <a name="l00244"></a>00244 <span class="keywordflow">break</span>;
267
+ <a name="l00245"></a>00245 <span class="keywordflow">default</span>:
268
+ <a name="l00246"></a>00246 <span class="comment">// Never reached.</span>
269
+ <a name="l00247"></a>00247 abort();
270
+ <a name="l00248"></a>00248 }
271
+ <a name="l00249"></a>00249 }
272
+ <a name="l00250"></a>00250
273
+ <a name="l00251"></a>00251 <span class="keywordtype">void</span> outboxNotFlushed(<span class="keyword">const</span> ClientPtr &amp;client) {
274
+ <a name="l00252"></a>00252 <span class="keywordflow">switch</span> (client-&gt;state) {
275
+ <a name="l00253"></a>00253 <span class="keywordflow">case</span> Client::ES_CONNECTED:
276
+ <a name="l00254"></a>00254 client-&gt;state = Client::ES_WRITES_PENDING;
277
+ <a name="l00255"></a>00255 <span class="comment">// If we have way too much stuff in the outbox then</span>
278
+ <a name="l00256"></a>00256 <span class="comment">// suspend reading until we've sent out the entire outbox.</span>
279
+ <a name="l00257"></a>00257 watchReadEvents(client, client-&gt;outbox.size() &lt; 1024 * 32);
280
+ <a name="l00258"></a>00258 watchWriteEvents(client, <span class="keyword">true</span>);
281
+ <a name="l00259"></a>00259 <span class="keywordflow">break</span>;
282
+ <a name="l00260"></a>00260 <span class="keywordflow">case</span> Client::ES_WRITES_PENDING:
283
+ <a name="l00261"></a>00261 <span class="keywordflow">case</span> Client::ES_DISCONNECTING_WITH_WRITES_PENDING:
284
+ <a name="l00262"></a>00262 watchReadEvents(client, <span class="keyword">false</span>);
285
+ <a name="l00263"></a>00263 watchWriteEvents(client, <span class="keyword">true</span>);
286
+ <a name="l00264"></a>00264 <span class="keywordflow">break</span>;
287
+ <a name="l00265"></a>00265 <span class="keywordflow">default</span>:
288
+ <a name="l00266"></a>00266 <span class="comment">// Never reached.</span>
289
+ <a name="l00267"></a>00267 abort();
290
+ <a name="l00268"></a>00268 }
291
+ <a name="l00269"></a>00269 }
292
+ <a name="l00270"></a>00270
293
+ <a name="l00271"></a>00271 <span class="keywordtype">void</span> watchReadEvents(<span class="keyword">const</span> ClientPtr &amp;client, <span class="keywordtype">bool</span> enable = <span class="keyword">true</span>) {
294
+ <a name="l00272"></a>00272 <span class="keywordflow">if</span> (client-&gt;readWatcherStarted &amp;&amp; !enable) {
295
+ <a name="l00273"></a>00273 client-&gt;readWatcherStarted = <span class="keyword">false</span>;
296
+ <a name="l00274"></a>00274 client-&gt;readWatcher.stop();
297
+ <a name="l00275"></a>00275 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!client-&gt;readWatcherStarted &amp;&amp; enable) {
298
+ <a name="l00276"></a>00276 client-&gt;readWatcherStarted = <span class="keyword">true</span>;
299
+ <a name="l00277"></a>00277 client-&gt;readWatcher.start();
300
+ <a name="l00278"></a>00278 }
301
+ <a name="l00279"></a>00279 }
302
+ <a name="l00280"></a>00280
303
+ <a name="l00281"></a>00281 <span class="keywordtype">void</span> watchWriteEvents(<span class="keyword">const</span> ClientPtr &amp;client, <span class="keywordtype">bool</span> enable = <span class="keyword">true</span>) {
304
+ <a name="l00282"></a>00282 <span class="keywordflow">if</span> (client-&gt;writeWatcherStarted &amp;&amp; !enable) {
305
+ <a name="l00283"></a>00283 client-&gt;writeWatcherStarted = <span class="keyword">false</span>;
306
+ <a name="l00284"></a>00284 client-&gt;writeWatcher.stop();
307
+ <a name="l00285"></a>00285 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!client-&gt;writeWatcherStarted &amp;&amp; enable) {
308
+ <a name="l00286"></a>00286 client-&gt;writeWatcherStarted = <span class="keyword">true</span>;
309
+ <a name="l00287"></a>00287 client-&gt;writeWatcher.start();
310
+ <a name="l00288"></a>00288 }
311
+ <a name="l00289"></a>00289 }
312
+ <a name="l00290"></a>00290
313
+ <a name="l00291"></a>00291 <span class="keywordtype">void</span> onClientWritable(<span class="keyword">const</span> ClientPtr &amp;client) {
314
+ <a name="l00292"></a>00292 <span class="keywordflow">if</span> (client-&gt;state == Client::ES_DISCONNECTED) {
315
+ <a name="l00293"></a>00293 <span class="keywordflow">return</span>;
316
+ <a name="l00294"></a>00294 }
317
+ <a name="l00295"></a>00295
318
+ <a name="l00296"></a>00296 this_thread::disable_syscall_interruption dsi;
319
+ <a name="l00297"></a>00297 <span class="keywordtype">size_t</span> sent = 0;
320
+ <a name="l00298"></a>00298 <span class="keywordtype">bool</span> done = client-&gt;outbox.empty();
321
+ <a name="l00299"></a>00299
322
+ <a name="l00300"></a>00300 <span class="keywordflow">while</span> (!done) {
323
+ <a name="l00301"></a>00301 ssize_t ret = syscalls::write(client-&gt;fd,
324
+ <a name="l00302"></a>00302 client-&gt;outbox.data() + sent,
325
+ <a name="l00303"></a>00303 client-&gt;outbox.size() - sent);
326
+ <a name="l00304"></a>00304 <span class="keywordflow">if</span> (ret == -1) {
327
+ <a name="l00305"></a>00305 <span class="keywordflow">if</span> (errno != EAGAIN) {
328
+ <a name="l00306"></a>00306 printf(<span class="stringliteral">"write error\n"</span>);
329
+ <a name="l00307"></a>00307 }
330
+ <a name="l00308"></a>00308 done = <span class="keyword">true</span>;
331
+ <a name="l00309"></a>00309 } <span class="keywordflow">else</span> {
332
+ <a name="l00310"></a>00310 sent += ret;
333
+ <a name="l00311"></a>00311 done = sent == client-&gt;outbox.size();
334
+ <a name="l00312"></a>00312 }
335
+ <a name="l00313"></a>00313 }
336
+ <a name="l00314"></a>00314 <span class="keywordflow">if</span> (sent &gt; 0) {
337
+ <a name="l00315"></a>00315 client-&gt;outbox.erase(0, sent);
338
+ <a name="l00316"></a>00316 }
339
+ <a name="l00317"></a>00317
340
+ <a name="l00318"></a>00318 <span class="keywordflow">if</span> (client-&gt;outbox.empty()) {
341
+ <a name="l00319"></a>00319 outboxFlushed(client);
342
+ <a name="l00320"></a>00320 } <span class="keywordflow">else</span> {
343
+ <a name="l00321"></a>00321 outboxNotFlushed(client);
344
+ <a name="l00322"></a>00322 }
345
+ <a name="l00323"></a>00323 }
346
+ <a name="l00324"></a>00324
347
+ <a name="l00325"></a>00325 <span class="keywordtype">void</span> onAcceptable(ev::io &amp;w, <span class="keywordtype">int</span> revents) {
348
+ <a name="l00326"></a>00326 this_thread::disable_syscall_interruption dsi;
349
+ <a name="l00327"></a>00327 <span class="keywordtype">int</span> i = 0;
350
+ <a name="l00328"></a>00328 <span class="keywordtype">bool</span> done = <span class="keyword">false</span>;
351
+ <a name="l00329"></a>00329
352
+ <a name="l00330"></a>00330 <span class="comment">// Accept at most 100 connections on every accept readiness event.</span>
353
+ <a name="l00331"></a>00331 <span class="keywordflow">while</span> (i &lt; 100 &amp;&amp; !done) {
354
+ <a name="l00332"></a>00332 <span class="comment">// Reserve enough space to hold both a Unix domain socket</span>
355
+ <a name="l00333"></a>00333 <span class="comment">// address and an IP socket address.</span>
356
+ <a name="l00334"></a>00334 <span class="keyword">union </span>{
357
+ <a name="l00335"></a>00335 <span class="keyword">struct </span>sockaddr_un local;
358
+ <a name="l00336"></a>00336 <span class="keyword">struct </span>sockaddr_in inet;
359
+ <a name="l00337"></a>00337 } addr;
360
+ <a name="l00338"></a>00338 socklen_t len = <span class="keyword">sizeof</span>(addr);
361
+ <a name="l00339"></a>00339
362
+ <a name="l00340"></a>00340 <span class="keywordtype">int</span> clientfd = syscalls::accept(fd, (<span class="keyword">struct</span> sockaddr *) &amp;addr, &amp;len);
363
+ <a name="l00341"></a>00341 <span class="keywordflow">if</span> (clientfd == -1) {
364
+ <a name="l00342"></a>00342 <span class="keywordflow">if</span> (errno != EAGAIN &amp;&amp; errno != EWOULDBLOCK) {
365
+ <a name="l00343"></a>00343 printf(<span class="stringliteral">"accept error!\n"</span>);
366
+ <a name="l00344"></a>00344 }
367
+ <a name="l00345"></a>00345 done = <span class="keyword">true</span>;
368
+ <a name="l00346"></a>00346 } <span class="keywordflow">else</span> {
369
+ <a name="l00347"></a>00347 FileDescriptor clientfdGuard = clientfd;
370
+ <a name="l00348"></a>00348 <a class="code" href="group__Support.html#g7e3fdc923bdf6efeab407cdd325883a8" title="Sets a socket in non-blocking mode.">setNonBlocking</a>(clientfdGuard);
371
+ <a name="l00349"></a>00349
372
+ <a name="l00350"></a>00350 ClientPtr client = createClient();
373
+ <a name="l00351"></a>00351 client-&gt;state = Client::ES_CONNECTED;
374
+ <a name="l00352"></a>00352 client-&gt;fd = clientfdGuard;
375
+ <a name="l00353"></a>00353 client-&gt;readWatcher.set&lt;<a class="code" href="classClient.html" title="A representation of a Client from the Server&amp;#39;s point of view.">Client</a>, &amp;Client::_onReadable&gt;(client.get());
376
+ <a name="l00354"></a>00354 client-&gt;readWatcher.set(client-&gt;fd, ev::READ);
377
+ <a name="l00355"></a>00355 client-&gt;readWatcher.start();
378
+ <a name="l00356"></a>00356 client-&gt;readWatcherStarted = <span class="keyword">true</span>;
379
+ <a name="l00357"></a>00357 client-&gt;writeWatcher.set&lt;<a class="code" href="classClient.html" title="A representation of a Client from the Server&amp;#39;s point of view.">Client</a>, &amp;Client::_onWritable&gt;(client.get());
380
+ <a name="l00358"></a>00358 client-&gt;writeWatcher.set(client-&gt;fd, ev::WRITE);
381
+ <a name="l00359"></a>00359 client-&gt;writeWatcherStarted = <span class="keyword">false</span>;
382
+ <a name="l00360"></a>00360 clients.insert(client);
383
+ <a name="l00361"></a>00361 onNewClient(client);
384
+ <a name="l00362"></a>00362 }
385
+ <a name="l00363"></a>00363 i++;
386
+ <a name="l00364"></a>00364 }
387
+ <a name="l00365"></a>00365 }
388
+ <a name="l00366"></a>00366
389
+ <a name="l00367"></a>00367 <span class="keyword">public</span>:
390
+ <a name="l00368"></a>00368 EventedServer(<span class="keyword">struct</span> ev_loop *_loop, FileDescriptor serverFd)
391
+ <a name="l00369"></a>00369 : loop(_loop),
392
+ <a name="l00370"></a>00370 acceptWatcher(_loop)
393
+ <a name="l00371"></a>00371 {
394
+ <a name="l00372"></a>00372 fd = serverFd;
395
+ <a name="l00373"></a>00373 <a class="code" href="group__Support.html#g7e3fdc923bdf6efeab407cdd325883a8" title="Sets a socket in non-blocking mode.">setNonBlocking</a>(serverFd);
396
+ <a name="l00374"></a>00374 acceptWatcher.set&lt;EventedServer, &amp;EventedServer::onAcceptable&gt;(<span class="keyword">this</span>);
397
+ <a name="l00375"></a>00375 acceptWatcher.start(fd, ev::READ);
398
+ <a name="l00376"></a>00376 }
399
+ <a name="l00377"></a>00377
400
+ <a name="l00378"></a>00378 <span class="keyword">virtual</span> ~EventedServer() { }
401
+ <a name="l00379"></a>00379
402
+ <a name="l00380"></a>00380 <span class="keyword">struct </span>ev_loop *getLoop()<span class="keyword"> const </span>{
403
+ <a name="l00381"></a>00381 <span class="keywordflow">return</span> loop;
404
+ <a name="l00382"></a>00382 }
405
+ <a name="l00383"></a>00383 };
406
+ <a name="l00384"></a>00384
407
+ <a name="l00385"></a>00385 } <span class="comment">// namespace Passenger</span>
408
+ <a name="l00386"></a>00386
409
+ <a name="l00387"></a>00387 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_EVENTED_SERVER_H_ */</span>
410
+ </pre></div></div>
411
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
412
+ <a href="http://www.doxygen.org/index.html">
413
+ <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
414
+ </body>
415
+ </html>