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.
- data/NEWS +29 -0
- data/bin/passenger-install-nginx-module +1 -1
- data/doc/Users guide Apache.html +38 -7
- data/doc/Users guide Nginx.html +36 -5
- data/doc/cxxapi/AbstractSpawnManager_8h-source.html +1 -1
- data/doc/cxxapi/Account_8h-source.html +1 -1
- data/doc/cxxapi/AccountsDatabase_8h-source.html +1 -1
- data/doc/cxxapi/AgentsStarter_8h-source.html +1 -1
- data/doc/cxxapi/BCrypt_8h-source.html +1 -1
- data/doc/cxxapi/Blowfish_8h-source.html +1 -1
- data/doc/cxxapi/Bucket_8h-source.html +5 -4
- data/doc/cxxapi/Constants_8h-source.html +2 -2
- data/doc/cxxapi/ContentHandler_8h-source.html +1 -1
- data/doc/cxxapi/DirectoryMapper_8h-source.html +10 -9
- data/doc/cxxapi/EventedServer_8h-source.html +415 -0
- data/doc/cxxapi/Exceptions_8h-source.html +1 -1
- data/doc/cxxapi/FileDescriptor_8h-source.html +1 -1
- data/doc/cxxapi/Hooks_8h-source.html +3 -2
- data/doc/cxxapi/HttpStatusExtractor_8h-source.html +324 -323
- data/doc/cxxapi/Logging_8h-source.html +643 -546
- data/doc/cxxapi/MessageChannel_8h-source.html +429 -404
- data/doc/cxxapi/MessageClient_8h-source.html +1 -1
- data/doc/cxxapi/MessageReadersWriters_8h-source.html +451 -0
- data/doc/cxxapi/MessageServer_8h-source.html +1 -1
- data/doc/cxxapi/PoolOptions_8h-source.html +287 -279
- data/doc/cxxapi/Process_8h-source.html +178 -167
- data/doc/cxxapi/RandomGenerator_8h-source.html +45 -18
- data/doc/cxxapi/ResourceLocator_8h-source.html +3 -3
- data/doc/cxxapi/ScgiRequestParser_8h-source.html +344 -343
- data/doc/cxxapi/ServerInstanceDir_8h-source.html +1 -1
- data/doc/cxxapi/Session_8h-source.html +387 -374
- data/doc/cxxapi/SpawnManager_8h-source.html +547 -538
- data/doc/cxxapi/StaticContentHandler_8h-source.html +1 -1
- data/doc/cxxapi/StaticString_8h-source.html +1 -1
- data/doc/cxxapi/StringListCreator_8h-source.html +1 -1
- data/doc/cxxapi/Utils_8h-source.html +545 -520
- data/doc/cxxapi/annotated.html +11 -8
- data/doc/cxxapi/apache2_2Configuration_8h-source.html +1 -1
- data/doc/cxxapi/classAgentWatcher-members.html +1 -1
- data/doc/cxxapi/classAgentWatcher.html +1 -1
- data/doc/cxxapi/classClient-members.html +1 -1
- data/doc/cxxapi/classClient.html +1 -1
- data/doc/cxxapi/classHooks-members.html +16 -13
- data/doc/cxxapi/classHooks.html +69 -73
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ArgumentException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ArrayReader-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1ArrayReader.html +47 -0
- data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +1 -1
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1BusyException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +18 -15
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +89 -99
- data/doc/cxxapi/classPassenger_1_1EOFException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1EOFException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1EventFd-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1EventFd.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +2 -2
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1IOException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MemZeroGuard-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MemZeroGuard.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +1 -1
- data/doc/cxxapi/classPassenger_1_1Process-members.html +4 -3
- data/doc/cxxapi/classPassenger_1_1Process.html +40 -9
- data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +29 -2
- data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1RuntimeException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ScalarReader-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1ScalarReader.html +47 -0
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SecurityException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1Session-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1Session.html +2 -2
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -2
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +6 -18
- data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1StandardSession.html +1 -1
- data/doc/cxxapi/classPassenger_1_1StaticString-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1StaticString.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SystemException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1TimeoutException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1Uint16Reader-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1Uint16Reader.html +47 -0
- data/doc/cxxapi/classPassenger_1_1Uint32Reader-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1Uint32Reader.html +47 -0
- data/doc/cxxapi/classServer-members.html +1 -1
- data/doc/cxxapi/classServer.html +1 -1
- data/doc/cxxapi/classServerInstanceDirToucher-members.html +1 -1
- data/doc/cxxapi/classServerInstanceDirToucher.html +1 -1
- data/doc/cxxapi/classes.html +13 -10
- data/doc/cxxapi/definitions_8h-source.html +2 -1
- data/doc/cxxapi/doxygen.css +91 -0
- data/doc/cxxapi/files.html +16 -13
- data/doc/cxxapi/functions.html +32 -21
- data/doc/cxxapi/functions_enum.html +1 -1
- data/doc/cxxapi/functions_eval.html +1 -1
- data/doc/cxxapi/functions_func.html +32 -21
- data/doc/cxxapi/functions_vars.html +3 -1
- data/doc/cxxapi/graph_legend.html +20 -15
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Configuration.html +51 -64
- data/doc/cxxapi/group__Configuration.png +0 -0
- data/doc/cxxapi/group__Core.html +24 -26
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +1 -1
- data/doc/cxxapi/group__Hooks.html +17 -15
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +11 -9
- data/doc/cxxapi/hierarchy.html +6 -1
- data/doc/cxxapi/index.html +10 -5
- data/doc/cxxapi/inherit__graph__10.map +1 -1
- data/doc/cxxapi/inherit__graph__10.md5 +1 -1
- data/doc/cxxapi/inherit__graph__10.png +0 -0
- data/doc/cxxapi/inherit__graph__11.map +1 -1
- data/doc/cxxapi/inherit__graph__11.md5 +1 -1
- data/doc/cxxapi/inherit__graph__11.png +0 -0
- data/doc/cxxapi/inherit__graph__12.map +1 -1
- data/doc/cxxapi/inherit__graph__12.md5 +1 -1
- data/doc/cxxapi/inherit__graph__12.png +0 -0
- data/doc/cxxapi/inherit__graph__13.map +1 -1
- data/doc/cxxapi/inherit__graph__13.md5 +1 -1
- data/doc/cxxapi/inherit__graph__13.png +0 -0
- data/doc/cxxapi/inherit__graph__14.map +1 -3
- data/doc/cxxapi/inherit__graph__14.md5 +1 -1
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +1 -1
- data/doc/cxxapi/inherit__graph__15.md5 +1 -1
- data/doc/cxxapi/inherit__graph__15.png +0 -0
- data/doc/cxxapi/inherit__graph__16.map +3 -1
- data/doc/cxxapi/inherit__graph__16.md5 +1 -1
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.map +1 -1
- data/doc/cxxapi/inherit__graph__17.md5 +1 -1
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.map +1 -2
- data/doc/cxxapi/inherit__graph__18.md5 +1 -1
- data/doc/cxxapi/inherit__graph__18.png +0 -0
- data/doc/cxxapi/inherit__graph__19.map +1 -1
- data/doc/cxxapi/inherit__graph__19.md5 +1 -1
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +2 -1
- data/doc/cxxapi/inherit__graph__20.md5 +1 -1
- data/doc/cxxapi/inherit__graph__20.png +0 -0
- data/doc/cxxapi/inherit__graph__21.map +1 -1
- data/doc/cxxapi/inherit__graph__21.md5 +1 -1
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__22.map +1 -1
- data/doc/cxxapi/inherit__graph__22.md5 +1 -1
- data/doc/cxxapi/inherit__graph__22.png +0 -0
- data/doc/cxxapi/inherit__graph__23.map +1 -1
- data/doc/cxxapi/inherit__graph__23.md5 +1 -1
- data/doc/cxxapi/inherit__graph__23.png +0 -0
- data/doc/cxxapi/inherit__graph__24.map +1 -1
- data/doc/cxxapi/inherit__graph__24.md5 +1 -1
- data/doc/cxxapi/inherit__graph__24.png +0 -0
- data/doc/cxxapi/inherit__graph__25.map +1 -1
- data/doc/cxxapi/inherit__graph__25.md5 +1 -1
- data/doc/cxxapi/inherit__graph__25.png +0 -0
- data/doc/cxxapi/inherit__graph__26.map +1 -1
- data/doc/cxxapi/inherit__graph__26.md5 +1 -1
- data/doc/cxxapi/inherit__graph__26.png +0 -0
- data/doc/cxxapi/inherit__graph__27.map +1 -2
- data/doc/cxxapi/inherit__graph__27.md5 +1 -1
- data/doc/cxxapi/inherit__graph__27.png +0 -0
- data/doc/cxxapi/inherit__graph__28.map +1 -1
- data/doc/cxxapi/inherit__graph__28.md5 +1 -1
- data/doc/cxxapi/inherit__graph__28.png +0 -0
- data/doc/cxxapi/inherit__graph__29.map +1 -1
- data/doc/cxxapi/inherit__graph__29.md5 +1 -1
- data/doc/cxxapi/inherit__graph__29.png +0 -0
- data/doc/cxxapi/inherit__graph__30.map +2 -1
- data/doc/cxxapi/inherit__graph__30.md5 +1 -1
- data/doc/cxxapi/inherit__graph__30.png +0 -0
- data/doc/cxxapi/inherit__graph__31.map +1 -3
- data/doc/cxxapi/inherit__graph__31.md5 +1 -1
- data/doc/cxxapi/inherit__graph__31.png +0 -0
- data/doc/cxxapi/inherit__graph__32.map +1 -1
- data/doc/cxxapi/inherit__graph__32.md5 +1 -1
- data/doc/cxxapi/inherit__graph__32.png +0 -0
- data/doc/cxxapi/inherit__graph__33.map +1 -1
- data/doc/cxxapi/inherit__graph__33.md5 +1 -1
- data/doc/cxxapi/inherit__graph__33.png +0 -0
- data/doc/cxxapi/inherit__graph__34.map +3 -1
- data/doc/cxxapi/inherit__graph__34.md5 +1 -1
- data/doc/cxxapi/inherit__graph__34.png +0 -0
- data/doc/cxxapi/inherit__graph__35.map +1 -1
- data/doc/cxxapi/inherit__graph__35.md5 +1 -1
- data/doc/cxxapi/inherit__graph__35.png +0 -0
- data/doc/cxxapi/inherit__graph__36.map +1 -1
- data/doc/cxxapi/inherit__graph__36.md5 +1 -1
- data/doc/cxxapi/inherit__graph__36.png +0 -0
- data/doc/cxxapi/inherit__graph__37.map +1 -0
- data/doc/cxxapi/inherit__graph__37.md5 +1 -0
- data/doc/cxxapi/inherit__graph__37.png +0 -0
- data/doc/cxxapi/inherit__graph__38.map +1 -0
- data/doc/cxxapi/inherit__graph__38.md5 +1 -0
- data/doc/cxxapi/inherit__graph__38.png +0 -0
- data/doc/cxxapi/inherit__graph__39.map +1 -0
- data/doc/cxxapi/inherit__graph__39.md5 +1 -0
- data/doc/cxxapi/inherit__graph__39.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +1 -1
- data/doc/cxxapi/inherit__graph__5.md5 +1 -1
- data/doc/cxxapi/inherit__graph__5.png +0 -0
- data/doc/cxxapi/inherit__graph__6.map +1 -1
- data/doc/cxxapi/inherit__graph__6.md5 +1 -1
- data/doc/cxxapi/inherit__graph__6.png +0 -0
- data/doc/cxxapi/inherit__graph__7.map +1 -1
- data/doc/cxxapi/inherit__graph__7.md5 +1 -1
- data/doc/cxxapi/inherit__graph__7.png +0 -0
- data/doc/cxxapi/inherit__graph__8.map +1 -1
- data/doc/cxxapi/inherit__graph__8.md5 +1 -1
- data/doc/cxxapi/inherit__graph__8.png +0 -0
- data/doc/cxxapi/inherit__graph__9.map +1 -1
- data/doc/cxxapi/inherit__graph__9.md5 +1 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +46 -31
- data/doc/cxxapi/main.html +12 -11
- data/doc/cxxapi/modules.html +16 -13
- data/doc/cxxapi/namespacePassenger.html +82 -5
- data/doc/cxxapi/namespacemembers.html +5 -3
- data/doc/cxxapi/namespacemembers_enum.html +1 -1
- data/doc/cxxapi/namespacemembers_eval.html +1 -1
- data/doc/cxxapi/namespacemembers_func.html +5 -3
- data/doc/cxxapi/namespacemembers_type.html +1 -1
- data/doc/cxxapi/namespaces.html +2 -2
- data/doc/cxxapi/nginx_2Configuration_8h-source.html +43 -42
- data/doc/cxxapi/ngx__http__passenger__module_8h-source.html +1 -1
- data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -1
- data/doc/cxxapi/structPassenger_1_1AnythingToString.html +1 -1
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4-members.html +33 -0
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4.html +52 -0
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -1
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +1 -1
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +1 -1
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +1 -1
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +3 -2
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +25 -5
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +1 -1
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +1 -1
- data/doc/cxxapi/tabs.css +1 -1
- data/doc/cxxapi/tree.html +20 -17
- data/doc/users_guide_snippets/tips.txt +28 -0
- data/ext/apache2/Hooks.cpp +19 -2
- data/ext/common/Utils.cpp +15 -4
- data/ext/common/Version.h +1 -1
- data/ext/nginx/StaticContentHandler.c +6 -3
- data/ext/phusion_passenger/native_support.c +25 -0
- data/lib/phusion_passenger/abstract_request_handler.rb +1 -0
- data/lib/phusion_passenger/constants.rb +1 -1
- data/lib/phusion_passenger/events.rb +3 -0
- data/lib/phusion_passenger/platform_info.rb +2 -1
- data/lib/phusion_passenger/rack/application_spawner.rb +2 -0
- data/lib/phusion_passenger/railz/application_spawner.rb +8 -0
- data/lib/phusion_passenger/utils.rb +69 -9
- data/lib/phusion_passenger/utils/rewindable_input.rb +10 -6
- 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
|
|
data/doc/Users guide Apache.html
CHANGED
@@ -3123,7 +3123,38 @@ namespace :deploy do
|
|
3123
3123
|
end
|
3124
3124
|
end</tt></pre>
|
3125
3125
|
</div></div>
|
3126
|
-
<h3 id="
|
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’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’t
|
3149
|
+
have any negative effects.</p></div>
|
3150
|
+
<div class="paragraph"><p>Phusion Passenger assumes that you’re using Bundler >= 0.9.5. If you don’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’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.
|
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.
|
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’t
|
3177
3208
|
support code reloading, or when developing a web framework.</p></div>
|
@@ -3192,7 +3223,7 @@ or when you’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.
|
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’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.
|
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.
|
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’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-
|
3752
|
+
Last updated 2010-05-31 21:19:11 CEST
|
3722
3753
|
</div>
|
3723
3754
|
</div>
|
3724
3755
|
</body>
|
data/doc/Users guide Nginx.html
CHANGED
@@ -1909,7 +1909,38 @@ namespace :deploy do
|
|
1909
1909
|
end
|
1910
1910
|
end</tt></pre>
|
1911
1911
|
</div></div>
|
1912
|
-
<h3 id="
|
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’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’t
|
1935
|
+
have any negative effects.</p></div>
|
1936
|
+
<div class="paragraph"><p>Phusion Passenger assumes that you’re using Bundler >= 0.9.5. If you don’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’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.
|
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.
|
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’t
|
1963
1994
|
support code reloading, or when developing a web framework.</p></div>
|
@@ -1978,7 +2009,7 @@ or when you’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.
|
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-
|
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
|
134
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:55 2010 for Passenger by
|
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
|
198
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
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
|
154
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
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
|
75
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
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
|
97
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
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
|
127
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
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 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)
|
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 & 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 <boost/shared_ptr.hpp></span>
|
50
51
|
<a name="l00029"></a>00029 <span class="preprocessor">#include <apr_buckets.h></span>
|
51
|
-
<a name="l00030"></a>00030 <span class="preprocessor">#include "
|
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
|
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&#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
|
111
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
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.
|
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
|
67
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
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
|
88
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
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 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)
|
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 & 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 <oxt/backtrace.hpp></span>
|
54
55
|
<a name="l00033"></a>00033
|
55
|
-
<a name="l00034"></a>00034 <span class="preprocessor">#include "
|
56
|
-
<a name="l00035"></a>00035 <span class="preprocessor">#include "
|
57
|
-
<a name="l00036"></a>00036 <span class="preprocessor">#include "Utils.
|
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 && verifyRackDir(config->getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
|
196
|
+
<a name="l00174"></a>00174 && <a class="code" href="group__Support.html#g53969f8e3ee68d1d99ffe75af8db9be8" title="Check whether the specified directory is a valid Rack application root directory...">verifyRackDir</a>(config->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 && verifyRailsDir(config->getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
|
205
|
+
<a name="l00183"></a>00183 && <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->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 && verifyWSGIDir(config->getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
|
214
|
+
<a name="l00192"></a>00192 && <a class="code" href="group__Support.html#gaec51d2912999d611994c49341f36247" title="Check whether the specified directory is a valid WSGI application root directory...">verifyWSGIDir</a>(config->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
|
320
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
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 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 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 <ev++.h></span>
|
27
|
+
<a name="l00005"></a>00005 <span class="preprocessor">#include <boost/shared_ptr.hpp></span>
|
28
|
+
<a name="l00006"></a>00006 <span class="preprocessor">#include <boost/enable_shared_from_this.hpp></span>
|
29
|
+
<a name="l00007"></a>00007 <span class="preprocessor">#include <oxt/system_calls.hpp></span>
|
30
|
+
<a name="l00008"></a>00008 <span class="preprocessor">#include <oxt/macros.hpp></span>
|
31
|
+
<a name="l00009"></a>00009 <span class="preprocessor">#include <algorithm></span>
|
32
|
+
<a name="l00010"></a>00010 <span class="preprocessor">#include <string></span>
|
33
|
+
<a name="l00011"></a>00011 <span class="preprocessor">#include <set></span>
|
34
|
+
<a name="l00012"></a>00012 <span class="preprocessor">#include <sys/types.h></span>
|
35
|
+
<a name="l00013"></a>00013 <span class="preprocessor">#include <sys/un.h></span>
|
36
|
+
<a name="l00014"></a>00014 <span class="preprocessor">#include <sys/uio.h></span>
|
37
|
+
<a name="l00015"></a>00015 <span class="preprocessor">#include <netinet/in.h></span>
|
38
|
+
<a name="l00016"></a>00016 <span class="preprocessor">#include <unistd.h></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&#39;s point of view.">Client</a>: <span class="keyword">public</span> enable_shared_from_this<Client> {
|
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&#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->loop),
|
71
|
+
<a name="l00049"></a>00049 writeWatcher(_server->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 &w, <span class="keywordtype">int</span> revents) {
|
75
|
+
<a name="l00053"></a>00053 server->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 &w, <span class="keywordtype">int</span> revents) {
|
79
|
+
<a name="l00057"></a>00057 server->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<Client> 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 &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 &client, <span class="keyword">const</span> StaticString &data) {
|
90
|
+
<a name="l00068"></a>00068 write(client, &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 &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->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->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->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 < count; i++) {
|
110
|
+
<a name="l00088"></a>00088 client->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 < 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, &index, &offset);
|
119
|
+
<a name="l00097"></a>00097 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = index; i < count; i++) {
|
120
|
+
<a name="l00098"></a>00098 <span class="keywordflow">if</span> (i == index) {
|
121
|
+
<a name="l00099"></a>00099 client->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->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->outbox.data();
|
133
|
+
<a name="l00111"></a>00111 iov[0].iov_len = client->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->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->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->outbox.erase(0, outboxSent);
|
147
|
+
<a name="l00125"></a>00125 <span class="keywordflow">if</span> (client->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, &index, &offset);
|
151
|
+
<a name="l00129"></a>00129 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = index; i < count + 1; i++) {
|
152
|
+
<a name="l00130"></a>00130 <span class="keywordflow">if</span> (i == index) {
|
153
|
+
<a name="l00131"></a>00131 client->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->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 < count + 1; i++) {
|
167
|
+
<a name="l00145"></a>00145 client->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->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 <em>force</em> 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 &client, <span class="keywordtype">bool</span> force = <span class="keyword">false</span>) {
|
188
|
+
<a name="l00166"></a>00166 <span class="keywordflow">if</span> (client->state == Client::ES_CONNECTED
|
189
|
+
<a name="l00167"></a>00167 || (force && client->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->fd.close();
|
193
|
+
<a name="l00171"></a>00171 client->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->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->fd, SHUT_RD);
|
199
|
+
<a name="l00177"></a>00177 client->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&#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 &client) { }
|
208
|
+
<a name="l00186"></a>00186 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onClientReadable(<span class="keyword">const</span> ClientPtr &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<ClientPtr> 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 < 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 < 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 <= dataSize)) {
|
235
|
+
<a name="l00213"></a>00213 <span class="keywordflow">if</span> (dataSize < 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 &client) {
|
252
|
+
<a name="l00230"></a>00230 <span class="keywordflow">switch</span> (client->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->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->state = Client::ES_DISCONNECTED;
|
264
|
+
<a name="l00242"></a>00242 client->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 &client) {
|
274
|
+
<a name="l00252"></a>00252 <span class="keywordflow">switch</span> (client->state) {
|
275
|
+
<a name="l00253"></a>00253 <span class="keywordflow">case</span> Client::ES_CONNECTED:
|
276
|
+
<a name="l00254"></a>00254 client->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->outbox.size() < 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 &client, <span class="keywordtype">bool</span> enable = <span class="keyword">true</span>) {
|
294
|
+
<a name="l00272"></a>00272 <span class="keywordflow">if</span> (client->readWatcherStarted && !enable) {
|
295
|
+
<a name="l00273"></a>00273 client->readWatcherStarted = <span class="keyword">false</span>;
|
296
|
+
<a name="l00274"></a>00274 client->readWatcher.stop();
|
297
|
+
<a name="l00275"></a>00275 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!client->readWatcherStarted && enable) {
|
298
|
+
<a name="l00276"></a>00276 client->readWatcherStarted = <span class="keyword">true</span>;
|
299
|
+
<a name="l00277"></a>00277 client->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 &client, <span class="keywordtype">bool</span> enable = <span class="keyword">true</span>) {
|
304
|
+
<a name="l00282"></a>00282 <span class="keywordflow">if</span> (client->writeWatcherStarted && !enable) {
|
305
|
+
<a name="l00283"></a>00283 client->writeWatcherStarted = <span class="keyword">false</span>;
|
306
|
+
<a name="l00284"></a>00284 client->writeWatcher.stop();
|
307
|
+
<a name="l00285"></a>00285 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!client->writeWatcherStarted && enable) {
|
308
|
+
<a name="l00286"></a>00286 client->writeWatcherStarted = <span class="keyword">true</span>;
|
309
|
+
<a name="l00287"></a>00287 client->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 &client) {
|
314
|
+
<a name="l00292"></a>00292 <span class="keywordflow">if</span> (client->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->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->fd,
|
324
|
+
<a name="l00302"></a>00302 client->outbox.data() + sent,
|
325
|
+
<a name="l00303"></a>00303 client->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->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 > 0) {
|
337
|
+
<a name="l00315"></a>00315 client->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->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 &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 < 100 && !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 *) &addr, &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 && 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->state = Client::ES_CONNECTED;
|
374
|
+
<a name="l00352"></a>00352 client->fd = clientfdGuard;
|
375
|
+
<a name="l00353"></a>00353 client->readWatcher.set<<a class="code" href="classClient.html" title="A representation of a Client from the Server&#39;s point of view.">Client</a>, &Client::_onReadable>(client.get());
|
376
|
+
<a name="l00354"></a>00354 client->readWatcher.set(client->fd, ev::READ);
|
377
|
+
<a name="l00355"></a>00355 client->readWatcher.start();
|
378
|
+
<a name="l00356"></a>00356 client->readWatcherStarted = <span class="keyword">true</span>;
|
379
|
+
<a name="l00357"></a>00357 client->writeWatcher.set<<a class="code" href="classClient.html" title="A representation of a Client from the Server&#39;s point of view.">Client</a>, &Client::_onWritable>(client.get());
|
380
|
+
<a name="l00358"></a>00358 client->writeWatcher.set(client->fd, ev::WRITE);
|
381
|
+
<a name="l00359"></a>00359 client->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<EventedServer, &EventedServer::onAcceptable>(<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
|
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>
|