passenger 2.2.15 → 3.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- data/DEVELOPERS.TXT +21 -12
- data/LICENSE +1 -1
- data/NEWS +8 -1
- data/PACKAGING.TXT +25 -0
- data/Rakefile +28 -891
- data/bin/passenger +32 -0
- data/bin/passenger-config +5 -5
- data/bin/passenger-install-apache2-module +37 -24
- data/bin/passenger-install-nginx-module +48 -46
- data/bin/passenger-make-enterprisey +8 -9
- data/bin/passenger-memory-stats +20 -150
- data/bin/passenger-status +130 -44
- data/bin/passenger-stress-test +5 -4
- data/build/agents.rb +73 -0
- data/build/apache2.rb +165 -0
- data/build/basics.rb +81 -0
- data/build/common_library.rb +198 -0
- data/build/config.rb +35 -0
- data/{misc/rake/cplusplus.rb → build/cplusplus_support.rb} +1 -1
- data/build/cxx_tests.rb +205 -0
- data/build/documentation.rb +77 -0
- data/{misc/rake → build}/gempackagetask.rb +1 -1
- data/build/integration_tests.rb +57 -0
- data/build/misc.rb +146 -0
- data/build/nginx.rb +64 -0
- data/build/oxt_tests.rb +52 -0
- data/{misc/rake → build}/packagetask.rb +0 -0
- data/build/packaging.rb +189 -0
- data/{misc/rake/extensions.rb → build/rake_extensions.rb} +1 -1
- data/{misc/rake → build}/rdoctask.rb +0 -0
- data/build/ruby_extension.rb +46 -0
- data/build/ruby_tests.rb +42 -0
- data/build/test_basics.rb +31 -0
- data/doc/ApplicationPool algorithm.txt +447 -234
- data/doc/Architectural overview.html +47 -56
- data/doc/Doxyfile +1 -1
- data/doc/Security of user switching support.html +46 -57
- data/doc/Users guide Apache.html +1033 -306
- data/doc/Users guide Apache.txt +419 -99
- data/doc/Users guide Nginx.html +1252 -253
- data/doc/Users guide Nginx.txt +711 -87
- data/doc/Users guide Standalone.html +603 -0
- data/doc/Users guide Standalone.txt +40 -0
- data/doc/cxxapi/AbstractSpawnManager_8h_source.html +141 -0
- data/doc/cxxapi/Account_8h_source.html +206 -0
- data/doc/cxxapi/AccountsDatabase_8h_source.html +161 -0
- data/doc/cxxapi/AgentBase_8h_source.html +70 -0
- data/doc/cxxapi/AgentsStarter_8h_source.html +112 -0
- data/doc/cxxapi/BCrypt_8h_source.html +104 -0
- data/doc/cxxapi/Blowfish_8h_source.html +134 -0
- data/doc/cxxapi/Bucket_8h_source.html +4 -3
- data/doc/cxxapi/Constants_8h_source.html +79 -0
- data/doc/cxxapi/ContentHandler_8h_source.html +95 -0
- data/doc/cxxapi/DirectoryMapper_8h_source.html +9 -8
- data/doc/cxxapi/EventedClient_8h_source.html +629 -0
- data/doc/cxxapi/EventedMessageServer_8h_source.html +358 -0
- data/doc/cxxapi/EventedServer_8h_source.html +326 -0
- data/doc/cxxapi/Exceptions_8h_source.html +366 -0
- data/doc/cxxapi/FileDescriptor_8h_source.html +260 -0
- data/doc/cxxapi/Hooks_8h_source.html +2 -1
- data/doc/cxxapi/HttpStatusExtractor_8h_source.html +382 -0
- data/doc/cxxapi/Logging_8h_source.html +726 -0
- data/doc/cxxapi/MessageChannel_8h_source.html +852 -0
- data/doc/cxxapi/MessageClient_8h_source.html +328 -0
- data/doc/cxxapi/MessageReadersWriters_8h_source.html +539 -0
- data/doc/cxxapi/MessageServer_8h_source.html +606 -0
- data/doc/cxxapi/PoolOptions_8h_source.html +548 -0
- data/doc/cxxapi/Process_8h_source.html +286 -0
- data/doc/cxxapi/RandomGenerator_8h_source.html +191 -0
- data/doc/cxxapi/ResourceLocator_8h_source.html +115 -0
- data/doc/cxxapi/ScgiRequestParser_8h_source.html +406 -0
- data/doc/cxxapi/ServerInstanceDir_8h_source.html +374 -0
- data/doc/cxxapi/Session_8h_source.html +501 -0
- data/doc/cxxapi/SpawnManager_8h_source.html +647 -0
- data/doc/cxxapi/StaticContentHandler_8h_source.html +68 -0
- data/doc/cxxapi/StaticString_8h_source.html +254 -0
- data/doc/cxxapi/StringListCreator_8h_source.html +114 -0
- data/doc/cxxapi/Utils_8h_source.html +442 -0
- data/doc/cxxapi/annotated.html +46 -0
- data/doc/cxxapi/apache2_2Configuration_8h_source.html +82 -0
- data/doc/cxxapi/classAgentWatcher-members.html +30 -26
- data/doc/cxxapi/classAgentWatcher.html +168 -194
- data/doc/cxxapi/classClient-members.html +14 -11
- data/doc/cxxapi/classClient.html +35 -35
- data/doc/cxxapi/classHooks-members.html +2 -0
- data/doc/cxxapi/classHooks.html +2 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +16 -13
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +78 -82
- data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1ArgumentException.html +26 -22
- data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +113 -0
- data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +14 -11
- data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +41 -42
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1BusyException.html +24 -20
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +23 -19
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +2 -0
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +8 -6
- data/doc/cxxapi/classPassenger_1_1EOFException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1EOFException.html +27 -23
- data/doc/cxxapi/classPassenger_1_1EventFd-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1EventFd.html +24 -21
- data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +54 -0
- data/doc/cxxapi/classPassenger_1_1EventedClient.html +436 -0
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +59 -0
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer.html +93 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +16 -13
- data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +63 -70
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +26 -22
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +17 -14
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +32 -30
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +15 -12
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +59 -59
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1IOException.html +27 -23
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +36 -33
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +326 -344
- data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +25 -22
- data/doc/cxxapi/classPassenger_1_1MessageServer.html +160 -191
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +29 -27
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +3 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +17 -14
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +69 -79
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +3 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +15 -12
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +60 -63
- data/doc/cxxapi/classPassenger_1_1Process-members.html +20 -17
- data/doc/cxxapi/classPassenger_1_1Process.html +88 -95
- data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +13 -10
- data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +36 -35
- data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1RuntimeException.html +24 -20
- data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +76 -0
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +26 -23
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +121 -138
- data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1SecurityException.html +26 -22
- data/doc/cxxapi/classPassenger_1_1Session-members.html +29 -26
- data/doc/cxxapi/classPassenger_1_1Session.html +219 -240
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +14 -11
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +36 -37
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +18 -15
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +115 -110
- data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +30 -27
- data/doc/cxxapi/classPassenger_1_1StandardSession.html +163 -184
- data/doc/cxxapi/classPassenger_1_1StaticString-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1StaticString.html +27 -25
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +16 -13
- data/doc/cxxapi/classPassenger_1_1SystemException.html +65 -67
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +16 -13
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +27 -23
- data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1TimeoutException.html +24 -20
- data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1Uint16Message.html +51 -0
- data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1Uint32Message.html +51 -0
- data/doc/cxxapi/classServer-members.html +12 -9
- data/doc/cxxapi/classServer.html +23 -20
- data/doc/cxxapi/classServerInstanceDirToucher-members.html +12 -9
- data/doc/cxxapi/classServerInstanceDirToucher.html +21 -17
- data/doc/cxxapi/classes.html +18 -4
- data/doc/cxxapi/definitions_8h_source.html +1 -0
- data/doc/cxxapi/files.html +36 -1
- data/doc/cxxapi/functions.html +53 -21
- data/doc/cxxapi/functions_0x62.html +82 -0
- data/doc/cxxapi/functions_0x63.html +99 -0
- data/doc/cxxapi/functions_0x64.html +95 -0
- data/doc/cxxapi/functions_0x65.html +88 -0
- data/doc/cxxapi/functions_0x66.html +100 -0
- data/doc/cxxapi/functions_0x67.html +170 -0
- data/doc/cxxapi/functions_0x68.html +88 -0
- data/doc/cxxapi/functions_0x69.html +93 -0
- data/doc/cxxapi/functions_0x6b.html +80 -0
- data/doc/cxxapi/functions_0x6c.html +88 -0
- data/doc/cxxapi/functions_0x6d.html +88 -0
- data/doc/cxxapi/functions_0x6e.html +86 -0
- data/doc/cxxapi/functions_0x6f.html +94 -0
- data/doc/cxxapi/functions_0x70.html +94 -0
- data/doc/cxxapi/functions_0x72.html +110 -0
- data/doc/cxxapi/functions_0x73.html +171 -0
- data/doc/cxxapi/functions_0x74.html +85 -0
- data/doc/cxxapi/functions_0x75.html +85 -0
- data/doc/cxxapi/functions_0x77.html +92 -0
- data/doc/cxxapi/functions_0x7e.html +79 -0
- data/doc/cxxapi/functions_enum.html +14 -12
- data/doc/cxxapi/functions_eval.html +22 -16
- data/doc/cxxapi/functions_func.html +460 -1
- data/doc/cxxapi/functions_vars.html +163 -63
- data/doc/cxxapi/graph_legend.html +1 -0
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Core.html +2 -2
- data/doc/cxxapi/group__Core.map +1 -2
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +32 -40
- data/doc/cxxapi/group__Hooks.html +2 -1
- data/doc/cxxapi/group__Hooks.map +1 -1
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +509 -0
- data/doc/cxxapi/hierarchy.html +66 -62
- data/doc/cxxapi/inherit__graph__10.map +3 -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 +4 -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 +3 -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 +3 -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 +3 -1
- 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 +5 -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 -3
- 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 +3 -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 +4 -1
- 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 +3 -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 +3 -2
- 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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -1
- 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 +4 -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 +3 -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 +3 -2
- 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 +3 -1
- 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 +5 -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 +3 -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 -3
- 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 +3 -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 +3 -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 +3 -1
- data/doc/cxxapi/inherit__graph__37.md5 +1 -1
- data/doc/cxxapi/inherit__graph__37.png +0 -0
- data/doc/cxxapi/inherit__graph__4.map +3 -1
- data/doc/cxxapi/inherit__graph__4.md5 +1 -1
- data/doc/cxxapi/inherit__graph__4.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +3 -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 +3 -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 +3 -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 +3 -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 +3 -1
- data/doc/cxxapi/inherit__graph__9.md5 +1 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +123 -126
- data/doc/cxxapi/main.html +1 -0
- data/doc/cxxapi/modules.html +2 -1
- data/doc/cxxapi/namespacePassenger.html +263 -492
- data/doc/cxxapi/namespacemembers.html +68 -96
- data/doc/cxxapi/namespacemembers_enum.html +14 -12
- data/doc/cxxapi/namespacemembers_eval.html +20 -15
- data/doc/cxxapi/namespacemembers_func.html +52 -88
- data/doc/cxxapi/namespacemembers_type.html +18 -14
- data/doc/cxxapi/namespaces.html +12 -9
- data/doc/cxxapi/nginx_2Configuration_8h_source.html +125 -0
- data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +94 -0
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +12 -9
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +24 -22
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +43 -38
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +275 -325
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +12 -9
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +24 -22
- data/doc/cxxapi/tree.html +152 -7
- data/doc/users_guide_snippets/{analysis_and_system_maintenance_tools.txt → analysis_and_system_maintenance.txt} +58 -1
- data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +1 -2
- data/doc/users_guide_snippets/global_queueing_explained.txt +1 -5
- data/doc/users_guide_snippets/{rails_spawn_method.txt → passenger_spawn_method.txt} +9 -8
- data/doc/users_guide_snippets/tips.txt +12 -6
- data/doc/users_guide_snippets/under_the_hood/page_caching_support.txt +22 -0
- data/ext/apache2/Bucket.cpp +4 -4
- data/ext/apache2/Bucket.h +3 -3
- data/ext/apache2/Configuration.cpp +278 -381
- data/ext/apache2/Configuration.h +3 -357
- data/ext/apache2/Configuration.hpp +461 -0
- data/ext/apache2/DirectoryMapper.h +3 -3
- data/ext/apache2/HelperAgent.cpp +359 -0
- data/ext/apache2/Hooks.cpp +339 -226
- data/ext/apache2/Hooks.h +1 -1
- data/ext/apache2/mod_passenger.c +10 -4
- data/ext/boost/algorithm/string/case_conv.hpp +4 -4
- data/ext/boost/algorithm/string/concept.hpp +2 -2
- data/ext/boost/algorithm/string/detail/case_conv.hpp +18 -9
- data/ext/boost/algorithm/string/detail/find_format.hpp +44 -43
- data/ext/boost/algorithm/string/detail/find_format_all.hpp +56 -56
- data/ext/boost/algorithm/string/detail/find_format_store.hpp +7 -0
- data/ext/boost/algorithm/string/detail/finder.hpp +14 -14
- data/ext/boost/algorithm/string/detail/formatter.hpp +2 -2
- data/ext/boost/algorithm/string/detail/replace_storage.hpp +3 -3
- data/ext/boost/algorithm/string/detail/sequence.hpp +3 -3
- data/ext/boost/algorithm/string/erase.hpp +98 -98
- data/ext/boost/algorithm/string/find_format.hpp +56 -38
- data/ext/boost/algorithm/string/finder.hpp +6 -6
- data/ext/boost/algorithm/string/formatter.hpp +1 -1
- data/ext/boost/algorithm/string/replace.hpp +99 -99
- data/ext/boost/bind.hpp +5 -1670
- data/ext/boost/bind/bind.hpp +1751 -0
- data/ext/boost/bind/bind_mf2_cc.hpp +228 -0
- data/ext/boost/bind/mem_fn.hpp +389 -0
- data/ext/boost/bind/mem_fn_template.hpp +54 -27
- data/ext/boost/bind/placeholders.hpp +3 -2
- data/ext/boost/concept_check.hpp +10 -0
- data/ext/boost/config/abi/msvc_prefix.hpp +15 -1
- data/ext/boost/config/abi_prefix.hpp +1 -1
- data/ext/boost/config/abi_suffix.hpp +3 -2
- data/ext/boost/config/auto_link.hpp +6 -1
- data/ext/boost/config/compiler/borland.hpp +75 -17
- data/ext/boost/config/compiler/codegear.hpp +163 -0
- data/ext/boost/config/compiler/common_edg.hpp +35 -0
- data/ext/boost/config/compiler/digitalmars.hpp +26 -0
- data/ext/boost/config/compiler/gcc.hpp +69 -14
- data/ext/boost/config/compiler/hp_acc.hpp +32 -0
- data/ext/boost/config/compiler/intel.hpp +13 -2
- data/ext/boost/config/compiler/kai.hpp +0 -2
- data/ext/boost/config/compiler/metrowerks.hpp +29 -1
- data/ext/boost/config/compiler/mpw.hpp +30 -0
- data/ext/boost/config/compiler/pgi.hpp +37 -0
- data/ext/boost/config/compiler/sgi_mipspro.hpp +1 -0
- data/ext/boost/config/compiler/sunpro_cc.hpp +39 -7
- data/ext/boost/config/compiler/vacpp.hpp +31 -3
- data/ext/boost/config/compiler/visualc.hpp +72 -5
- data/ext/boost/config/no_tr1/cmath.hpp +28 -0
- data/ext/boost/config/platform/bsd.hpp +16 -3
- data/ext/boost/config/platform/hpux.hpp +3 -0
- data/ext/boost/config/platform/macos.hpp +8 -0
- data/ext/boost/config/platform/solaris.hpp +7 -0
- data/ext/boost/config/platform/vxworks.hpp +31 -0
- data/ext/boost/config/select_compiler_config.hpp +4 -0
- data/ext/boost/config/select_platform_config.hpp +6 -2
- data/ext/boost/config/select_stdlib_config.hpp +17 -8
- data/ext/boost/config/stdlib/dinkumware.hpp +34 -2
- data/ext/boost/config/stdlib/libcomo.hpp +25 -0
- data/ext/boost/config/stdlib/libstdcpp3.hpp +56 -2
- data/ext/boost/config/stdlib/modena.hpp +25 -0
- data/ext/boost/config/stdlib/msl.hpp +24 -0
- data/ext/boost/config/stdlib/roguewave.hpp +26 -0
- data/ext/boost/config/stdlib/sgi.hpp +25 -0
- data/ext/boost/config/stdlib/stlport.hpp +36 -1
- data/ext/boost/config/stdlib/vacpp.hpp +25 -0
- data/ext/boost/config/suffix.hpp +67 -32
- data/ext/boost/config/warning_disable.hpp +47 -0
- data/ext/boost/cstdint.hpp +62 -36
- data/ext/boost/date_time/c_time.hpp +28 -12
- data/ext/boost/date_time/compiler_config.hpp +27 -5
- data/ext/boost/date_time/constrained_value.hpp +36 -13
- data/ext/boost/date_time/date.hpp +44 -33
- data/ext/boost/date_time/date_duration.hpp +13 -14
- data/ext/boost/date_time/date_facet.hpp +215 -226
- data/ext/boost/date_time/date_generator_formatter.hpp +22 -20
- data/ext/boost/date_time/date_generator_parser.hpp +52 -51
- data/ext/boost/date_time/date_generators.hpp +16 -16
- data/ext/boost/date_time/date_parsing.hpp +115 -98
- data/ext/boost/date_time/filetime_functions.hpp +133 -41
- data/ext/boost/date_time/format_date_parser.hpp +22 -10
- data/ext/boost/date_time/gregorian/conversion.hpp +32 -39
- data/ext/boost/date_time/gregorian/greg_calendar.hpp +15 -14
- data/ext/boost/date_time/gregorian/greg_date.hpp +19 -18
- data/ext/boost/date_time/gregorian/greg_duration.hpp +106 -10
- data/ext/boost/date_time/gregorian/greg_duration_types.hpp +16 -7
- data/ext/boost/date_time/gregorian/greg_weekday.hpp +2 -2
- data/ext/boost/date_time/gregorian/gregorian_io.hpp +11 -4
- data/ext/boost/date_time/gregorian_calendar.hpp +8 -8
- data/ext/boost/date_time/gregorian_calendar.ipp +30 -30
- data/ext/boost/date_time/int_adapter.hpp +4 -2
- data/ext/boost/date_time/microsec_time_clock.hpp +39 -117
- data/ext/boost/date_time/period_parser.hpp +17 -15
- data/ext/boost/date_time/posix_time/conversion.hpp +28 -29
- data/ext/boost/date_time/posix_time/posix_time_config.hpp +19 -19
- data/ext/boost/date_time/posix_time/posix_time_io.hpp +31 -38
- data/ext/boost/date_time/posix_time/time_formatters.hpp +32 -32
- data/ext/boost/date_time/string_parse_tree.hpp +46 -46
- data/ext/boost/date_time/strings_from_facet.hpp +7 -5
- data/ext/boost/date_time/time.hpp +7 -6
- data/ext/boost/date_time/time_defs.hpp +12 -2
- data/ext/boost/date_time/time_duration.hpp +27 -26
- data/ext/boost/date_time/time_facet.hpp +386 -321
- data/ext/boost/date_time/time_formatting_streams.hpp +8 -5
- data/ext/boost/date_time/time_resolution_traits.hpp +29 -25
- data/ext/boost/date_time/time_system_split.hpp +7 -13
- data/ext/boost/date_time/wrapping_int.hpp +21 -15
- data/ext/boost/detail/call_traits.hpp +1 -1
- data/ext/boost/detail/endian.hpp +4 -4
- data/ext/boost/detail/no_exceptions_support.hpp +87 -0
- data/ext/boost/detail/sp_typeinfo.hpp +50 -4
- data/ext/boost/detail/workaround.hpp +63 -3
- data/ext/boost/enable_shared_from_this.hpp +4 -59
- data/ext/boost/exception/current_exception_cast.hpp +43 -0
- data/ext/boost/exception/detail/attribute_noreturn.hpp +17 -0
- data/ext/boost/exception/detail/error_info_impl.hpp +75 -0
- data/ext/boost/exception/detail/exception_ptr.hpp +490 -0
- data/ext/boost/exception/detail/is_output_streamable.hpp +47 -0
- data/ext/boost/exception/detail/object_hex_dump.hpp +50 -0
- data/ext/boost/exception/detail/type_info.hpp +79 -0
- data/ext/boost/exception/diagnostic_information.hpp +182 -0
- data/ext/boost/exception/exception.hpp +422 -0
- data/ext/boost/exception/get_error_info.hpp +130 -0
- data/ext/boost/exception/info.hpp +167 -0
- data/ext/boost/exception/to_string.hpp +83 -0
- data/ext/boost/exception/to_string_stub.hpp +109 -0
- data/ext/boost/exception_ptr.hpp +11 -0
- data/ext/boost/function/detail/prologue.hpp +2 -1
- data/ext/boost/function/function_base.hpp +270 -128
- data/ext/boost/function/function_fwd.hpp +70 -0
- data/ext/boost/function/function_template.hpp +319 -130
- data/ext/boost/get_pointer.hpp +5 -1
- data/ext/boost/integer.hpp +253 -0
- data/ext/boost/integer_fwd.hpp +174 -0
- data/ext/boost/integer_traits.hpp +26 -1
- data/ext/boost/io/ios_state.hpp +8 -0
- data/ext/boost/iterator/detail/config_def.hpp +4 -2
- data/ext/boost/iterator/iterator_adaptor.hpp +7 -2
- data/ext/boost/iterator/iterator_facade.hpp +1 -2
- data/ext/boost/lexical_cast.hpp +113 -105
- data/ext/boost/limits.hpp +1 -1
- data/ext/boost/mem_fn.hpp +5 -370
- data/ext/boost/memory_order.hpp +53 -0
- data/ext/boost/mpl/always.hpp +3 -3
- data/ext/boost/mpl/and.hpp +3 -3
- data/ext/boost/mpl/apply.hpp +3 -3
- data/ext/boost/mpl/apply_fwd.hpp +3 -3
- data/ext/boost/mpl/apply_wrap.hpp +37 -6
- data/ext/boost/mpl/arg.hpp +3 -3
- data/ext/boost/mpl/arg_fwd.hpp +3 -3
- data/ext/boost/mpl/assert.hpp +6 -6
- data/ext/boost/mpl/aux_/adl_barrier.hpp +3 -3
- data/ext/boost/mpl/aux_/arg_typedef.hpp +3 -3
- data/ext/boost/mpl/aux_/arity.hpp +3 -3
- data/ext/boost/mpl/aux_/arity_spec.hpp +3 -3
- data/ext/boost/mpl/aux_/common_name_wknd.hpp +3 -3
- data/ext/boost/mpl/aux_/config/adl.hpp +4 -4
- data/ext/boost/mpl/aux_/config/arrays.hpp +4 -4
- data/ext/boost/mpl/aux_/config/bcc.hpp +28 -0
- data/ext/boost/mpl/aux_/config/bind.hpp +4 -4
- data/ext/boost/mpl/aux_/config/compiler.hpp +8 -6
- data/ext/boost/mpl/aux_/config/ctps.hpp +3 -3
- data/ext/boost/mpl/aux_/config/dtp.hpp +5 -5
- data/ext/boost/mpl/aux_/config/eti.hpp +3 -3
- data/ext/boost/mpl/aux_/config/gcc.hpp +3 -3
- data/ext/boost/mpl/aux_/config/has_apply.hpp +3 -3
- data/ext/boost/mpl/aux_/config/has_xxx.hpp +3 -3
- data/ext/boost/mpl/aux_/config/integral.hpp +4 -4
- data/ext/boost/mpl/aux_/config/intel.hpp +3 -3
- data/ext/boost/mpl/aux_/config/lambda.hpp +3 -3
- data/ext/boost/mpl/aux_/config/msvc.hpp +3 -3
- data/ext/boost/mpl/aux_/config/msvc_typename.hpp +3 -3
- data/ext/boost/mpl/aux_/config/nttp.hpp +3 -3
- data/ext/boost/mpl/aux_/config/overload_resolution.hpp +3 -3
- data/ext/boost/mpl/aux_/config/pp_counter.hpp +3 -3
- data/ext/boost/mpl/aux_/config/preprocessor.hpp +4 -4
- data/ext/boost/mpl/aux_/config/static_constant.hpp +3 -3
- data/ext/boost/mpl/aux_/config/ttp.hpp +4 -4
- data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +3 -3
- data/ext/boost/mpl/aux_/config/workaround.hpp +3 -3
- data/ext/boost/mpl/aux_/full_lambda.hpp +3 -3
- data/ext/boost/mpl/aux_/has_apply.hpp +3 -3
- data/ext/boost/mpl/aux_/has_type.hpp +3 -3
- data/ext/boost/mpl/aux_/include_preprocessed.hpp +3 -3
- data/ext/boost/mpl/aux_/integral_wrapper.hpp +3 -3
- data/ext/boost/mpl/aux_/lambda_arity_param.hpp +3 -3
- data/ext/boost/mpl/aux_/lambda_support.hpp +4 -4
- data/ext/boost/mpl/aux_/msvc_never_true.hpp +3 -3
- data/ext/boost/mpl/aux_/na.hpp +3 -3
- data/ext/boost/mpl/aux_/na_assert.hpp +3 -3
- data/ext/boost/mpl/aux_/na_fwd.hpp +3 -3
- data/ext/boost/mpl/aux_/na_spec.hpp +3 -3
- data/ext/boost/mpl/aux_/nested_type_wknd.hpp +3 -3
- data/ext/boost/mpl/aux_/nttp_decl.hpp +3 -3
- data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +3 -3
- data/ext/boost/mpl/aux_/preprocessor/enum.hpp +3 -3
- data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +3 -3
- data/ext/boost/mpl/aux_/preprocessor/params.hpp +3 -3
- data/ext/boost/mpl/aux_/preprocessor/sub.hpp +3 -3
- data/ext/boost/mpl/aux_/static_cast.hpp +3 -3
- data/ext/boost/mpl/aux_/template_arity.hpp +3 -3
- data/ext/boost/mpl/aux_/template_arity_fwd.hpp +3 -3
- data/ext/boost/mpl/aux_/type_wrapper.hpp +3 -3
- data/ext/boost/mpl/aux_/value_wknd.hpp +3 -3
- data/ext/boost/mpl/aux_/yes_no.hpp +3 -3
- data/ext/boost/mpl/bind.hpp +3 -3
- data/ext/boost/mpl/bind_fwd.hpp +3 -3
- data/ext/boost/mpl/bool.hpp +3 -3
- data/ext/boost/mpl/bool_fwd.hpp +3 -3
- data/ext/boost/mpl/eval_if.hpp +3 -3
- data/ext/boost/mpl/has_xxx.hpp +10 -8
- data/ext/boost/mpl/identity.hpp +3 -3
- data/ext/boost/mpl/if.hpp +3 -3
- data/ext/boost/mpl/int.hpp +3 -3
- data/ext/boost/mpl/int_fwd.hpp +3 -3
- data/ext/boost/mpl/integral_c.hpp +3 -3
- data/ext/boost/mpl/integral_c_fwd.hpp +3 -3
- data/ext/boost/mpl/integral_c_tag.hpp +3 -3
- data/ext/boost/mpl/lambda.hpp +3 -3
- data/ext/boost/mpl/lambda_fwd.hpp +3 -3
- data/ext/boost/mpl/limits/arity.hpp +3 -3
- data/ext/boost/mpl/logical.hpp +3 -3
- data/ext/boost/mpl/next.hpp +3 -3
- data/ext/boost/mpl/next_prior.hpp +3 -3
- data/ext/boost/mpl/not.hpp +3 -3
- data/ext/boost/mpl/or.hpp +3 -3
- data/ext/boost/mpl/placeholders.hpp +3 -3
- data/ext/boost/mpl/protect.hpp +3 -3
- data/ext/boost/mpl/quote.hpp +18 -7
- data/ext/boost/mpl/size_t.hpp +3 -3
- data/ext/boost/mpl/size_t_fwd.hpp +3 -3
- data/ext/boost/mpl/void.hpp +3 -3
- data/ext/boost/mpl/void_fwd.hpp +3 -3
- data/ext/boost/non_type.hpp +27 -27
- data/ext/boost/operators.hpp +51 -18
- data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
- data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
- data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
- data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
- data/ext/boost/preprocessor/logical/not.hpp +30 -0
- data/ext/boost/preprocessor/seq/cat.hpp +48 -0
- data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
- data/ext/boost/preprocessor/seq/transform.hpp +48 -0
- data/ext/boost/range/as_literal.hpp +10 -14
- data/ext/boost/range/begin.hpp +4 -4
- data/ext/boost/range/detail/implementation_help.hpp +4 -0
- data/ext/boost/range/end.hpp +4 -4
- data/ext/boost/range/iterator_range.hpp +31 -15
- data/ext/boost/ref.hpp +12 -1
- data/ext/boost/scoped_array.hpp +16 -0
- data/ext/boost/scoped_ptr.hpp +16 -0
- data/ext/boost/shared_ptr.hpp +2 -602
- data/ext/boost/{detail → smart_ptr}/bad_weak_ptr.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count.hpp +14 -19
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc.hpp +13 -9
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc_x86.hpp +5 -12
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_pthreads.hpp +5 -5
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_solaris.hpp +3 -3
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_sync.hpp +9 -5
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_win32.hpp +3 -3
- data/ext/boost/smart_ptr/detail/operator_bool.hpp +56 -0
- data/ext/boost/{detail → smart_ptr/detail}/shared_count.hpp +86 -17
- data/ext/boost/smart_ptr/detail/sp_convertible.hpp +76 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +70 -0
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_acc_ia64.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_ppc.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_x86.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ia64.hpp +4 -4
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +172 -0
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ppc.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_sparc.hpp +7 -7
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_x86.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_nt.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_pt.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_solaris.hpp +4 -4
- data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +131 -0
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_sync.hpp +8 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_w32.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_impl.hpp +5 -5
- data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +49 -0
- data/ext/boost/smart_ptr/detail/spinlock.hpp +53 -0
- data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +85 -0
- data/ext/boost/smart_ptr/detail/spinlock_nt.hpp +89 -0
- data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +87 -0
- data/ext/boost/smart_ptr/detail/spinlock_pt.hpp +79 -0
- data/ext/boost/smart_ptr/detail/spinlock_sync.hpp +87 -0
- data/ext/boost/smart_ptr/detail/yield_k.hpp +149 -0
- data/ext/boost/smart_ptr/enable_shared_from_this.hpp +79 -0
- data/ext/boost/smart_ptr/scoped_array.hpp +107 -0
- data/ext/boost/smart_ptr/scoped_ptr.hpp +131 -0
- data/ext/boost/smart_ptr/shared_ptr.hpp +701 -0
- data/ext/boost/smart_ptr/weak_ptr.hpp +230 -0
- data/ext/boost/src/pthread/thread.cpp +115 -203
- data/ext/boost/src/tss_null.cpp +1 -1
- data/ext/boost/static_assert.hpp +14 -4
- data/ext/boost/thread.hpp +7 -2
- data/ext/boost/thread/barrier.hpp +63 -0
- data/ext/boost/thread/detail/force_cast.hpp +39 -0
- data/ext/boost/thread/detail/move.hpp +29 -2
- data/ext/boost/thread/detail/platform.hpp +3 -3
- data/ext/boost/thread/detail/singleton.hpp +59 -0
- data/ext/boost/thread/detail/thread.hpp +496 -0
- data/ext/boost/thread/detail/thread_group.hpp +105 -0
- data/ext/boost/thread/detail/thread_heap_alloc.hpp +23 -0
- data/ext/boost/thread/detail/thread_interruption.hpp +35 -0
- data/ext/boost/thread/detail/tss_hooks.hpp +82 -0
- data/ext/boost/thread/exceptions.hpp +174 -60
- data/ext/boost/thread/future.hpp +1364 -0
- data/ext/boost/thread/locks.hpp +899 -32
- data/ext/boost/thread/once.hpp +4 -0
- data/ext/boost/thread/pthread/condition_variable.hpp +16 -21
- data/ext/boost/thread/pthread/condition_variable_fwd.hpp +37 -3
- data/ext/boost/thread/pthread/mutex.hpp +20 -7
- data/ext/boost/thread/pthread/once.hpp +7 -2
- data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +5 -1
- data/ext/boost/thread/pthread/recursive_mutex.hpp +22 -5
- data/ext/boost/thread/pthread/shared_mutex.hpp +303 -0
- data/ext/boost/thread/pthread/thread_data.hpp +37 -10
- data/ext/boost/thread/pthread/thread_heap_alloc.hpp +242 -0
- data/ext/boost/thread/pthread/timespec.hpp +11 -3
- data/ext/boost/thread/shared_mutex.hpp +21 -0
- data/ext/boost/thread/thread.hpp +8 -3
- data/ext/boost/thread/thread_time.hpp +4 -0
- data/ext/boost/thread/tss.hpp +106 -13
- data/ext/boost/thread/xtime.hpp +6 -2
- data/ext/boost/throw_exception.hpp +36 -7
- data/ext/boost/token_functions.hpp +1 -1
- data/ext/boost/tokenizer.hpp +1 -1
- data/ext/boost/type_traits/add_pointer.hpp +1 -1
- data/ext/boost/type_traits/add_volatile.hpp +47 -0
- data/ext/boost/type_traits/alignment_of.hpp +29 -1
- data/ext/boost/type_traits/config.hpp +1 -1
- data/ext/boost/type_traits/conversion_traits.hpp +1 -1
- data/ext/boost/type_traits/has_trivial_destructor.hpp +42 -0
- data/ext/boost/type_traits/intrinsics.hpp +88 -1
- data/ext/boost/type_traits/is_abstract.hpp +14 -5
- data/ext/boost/type_traits/is_arithmetic.hpp +8 -0
- data/ext/boost/type_traits/is_array.hpp +3 -2
- data/ext/boost/type_traits/is_base_and_derived.hpp +254 -0
- data/ext/boost/type_traits/is_base_of.hpp +51 -0
- data/ext/boost/type_traits/is_class.hpp +12 -0
- data/ext/boost/type_traits/is_const.hpp +6 -2
- data/ext/boost/type_traits/is_convertible.hpp +14 -2
- data/ext/boost/type_traits/is_enum.hpp +10 -1
- data/ext/boost/type_traits/is_function.hpp +11 -3
- data/ext/boost/type_traits/is_fundamental.hpp +45 -0
- data/ext/boost/type_traits/is_integral.hpp +5 -0
- data/ext/boost/type_traits/is_member_function_pointer.hpp +5 -3
- data/ext/boost/type_traits/is_member_pointer.hpp +4 -2
- data/ext/boost/type_traits/is_pointer.hpp +3 -1
- data/ext/boost/type_traits/is_reference.hpp +4 -2
- data/ext/boost/type_traits/is_signed.hpp +135 -0
- data/ext/boost/type_traits/is_unsigned.hpp +130 -0
- data/ext/boost/type_traits/is_void.hpp +5 -0
- data/ext/boost/type_traits/is_volatile.hpp +4 -2
- data/ext/boost/type_traits/make_unsigned.hpp +137 -0
- data/ext/boost/type_traits/remove_reference.hpp +1 -1
- data/ext/boost/type_traits/type_with_alignment.hpp +106 -1
- data/ext/boost/utility.hpp +2 -1
- data/ext/boost/utility/addressof.hpp +61 -17
- data/ext/boost/utility/binary.hpp +708 -0
- data/ext/boost/utility/enable_if.hpp +2 -2
- data/ext/boost/weak_ptr.hpp +4 -174
- data/ext/common/AbstractSpawnManager.h +110 -0
- data/ext/common/Account.h +175 -0
- data/ext/common/AccountsDatabase.cpp +81 -0
- data/ext/common/AccountsDatabase.h +130 -0
- data/ext/common/AgentBase.cpp +323 -0
- data/ext/common/{Version.h → AgentBase.h} +14 -6
- data/ext/common/AgentsStarter.cpp +154 -0
- data/ext/common/AgentsStarter.h +81 -0
- data/ext/common/AgentsStarter.hpp +619 -0
- data/ext/common/ApplicationPool/Client.h +796 -0
- data/ext/common/{ApplicationPool.h → ApplicationPool/Interface.h} +108 -18
- data/ext/common/ApplicationPool/Pool.h +1315 -0
- data/ext/common/ApplicationPool/Server.h +475 -0
- data/ext/common/BCrypt.cpp +343 -0
- data/ext/common/BCrypt.h +73 -0
- data/ext/common/Blowfish.c +685 -0
- data/ext/common/Blowfish.h +103 -0
- data/ext/common/Constants.h +48 -0
- data/ext/common/EventedClient.h +598 -0
- data/ext/common/EventedMessageServer.h +327 -0
- data/ext/common/EventedServer.h +295 -0
- data/ext/common/Exceptions.h +78 -1
- data/ext/common/FileDescriptor.h +229 -0
- data/ext/common/HelperAgent/BacktracesServer.h +59 -0
- data/ext/common/Logging.cpp +8 -9
- data/ext/common/Logging.h +593 -21
- data/ext/common/LoggingAgent/ChangeNotifier.h +63 -0
- data/ext/common/LoggingAgent/DataStoreId.h +177 -0
- data/ext/common/LoggingAgent/LoggingServer.h +1343 -0
- data/ext/common/LoggingAgent/Main.cpp +278 -0
- data/ext/common/LoggingAgent/RemoteSender.h +457 -0
- data/ext/common/MessageChannel.h +196 -34
- data/ext/common/MessageClient.h +297 -0
- data/ext/common/MessageReadersWriters.h +508 -0
- data/ext/common/MessageServer.h +575 -0
- data/ext/common/PoolOptions.h +279 -117
- data/ext/common/Process.h +255 -0
- data/ext/common/RandomGenerator.h +160 -0
- data/ext/common/ResourceLocator.h +84 -0
- data/ext/common/ServerInstanceDir.h +343 -0
- data/ext/common/Session.h +470 -0
- data/ext/common/SpawnManager.h +256 -201
- data/ext/common/StaticString.h +79 -4
- data/ext/common/StringListCreator.h +2 -2
- data/ext/common/Utils.cpp +385 -397
- data/ext/common/Utils.h +79 -165
- data/ext/common/{Base64.cpp → Utils/Base64.cpp} +0 -0
- data/ext/common/{Base64.h → Utils/Base64.h} +27 -1
- data/ext/common/Utils/BlockingQueue.h +136 -0
- data/ext/common/Utils/BlockingScalar.h +50 -0
- data/ext/common/{CachedFileStat.cpp → Utils/CachedFileStat.cpp} +1 -1
- data/ext/common/{CachedFileStat.h → Utils/CachedFileStat.h} +1 -1
- data/ext/common/{CachedFileStat.hpp → Utils/CachedFileStat.hpp} +1 -1
- data/ext/common/{FileChangeChecker.h → Utils/FileChangeChecker.h} +1 -1
- data/ext/common/Utils/FileHandleGuard.h +81 -0
- data/ext/common/Utils/IOUtils.cpp +754 -0
- data/ext/common/Utils/IOUtils.h +253 -0
- data/ext/common/Utils/MD5.cpp +406 -0
- data/ext/common/Utils/MD5.h +98 -0
- data/ext/common/Utils/MemZeroGuard.h +103 -0
- data/ext/common/Utils/ProcessMetricsCollector.h +462 -0
- data/ext/common/Utils/ScopeGuard.h +72 -0
- data/ext/common/Utils/StrIntUtils.cpp +329 -0
- data/ext/common/Utils/StrIntUtils.h +228 -0
- data/ext/common/{SystemTime.cpp → Utils/SystemTime.cpp} +5 -1
- data/ext/common/Utils/SystemTime.h +201 -0
- data/ext/common/{Timer.h → Utils/Timer.h} +58 -18
- data/ext/common/Utils/VariantMap.h +363 -0
- data/ext/common/Utils/foo.cpp +10 -0
- data/ext/common/Watchdog.cpp +1034 -0
- data/ext/google/COPYING +28 -0
- data/ext/google/ChangeLog +167 -0
- data/ext/google/dense_hash_map +310 -0
- data/ext/google/dense_hash_set +287 -0
- data/ext/google/sparse_hash_map +294 -0
- data/ext/google/sparse_hash_set +275 -0
- data/ext/google/sparsehash/densehashtable.h +1062 -0
- data/ext/google/sparsehash/sparseconfig.h +55 -0
- data/ext/google/sparsehash/sparsehashtable.h +1015 -0
- data/ext/google/sparsetable +1468 -0
- data/ext/google/type_traits.h +250 -0
- data/ext/libev/Changes +302 -0
- data/ext/libev/LICENSE +36 -0
- data/ext/libev/Makefile.am +18 -0
- data/ext/libev/Makefile.in +685 -0
- data/ext/libev/README +58 -0
- data/ext/libev/aclocal.m4 +7549 -0
- data/ext/libev/autogen.sh +6 -0
- data/ext/libev/config.guess +1526 -0
- data/ext/libev/config.h +122 -0
- data/ext/libev/config.h.in +121 -0
- data/ext/libev/config.sub +1658 -0
- data/ext/libev/configure +22156 -0
- data/ext/libev/configure.ac +18 -0
- data/ext/libev/ev++.h +800 -0
- data/ext/libev/ev.c +3694 -0
- data/ext/libev/ev.h +705 -0
- data/ext/libev/ev_epoll.c +228 -0
- data/ext/libev/ev_kqueue.c +196 -0
- data/ext/libev/ev_poll.c +144 -0
- data/ext/libev/ev_port.c +165 -0
- data/ext/libev/ev_select.c +308 -0
- data/ext/libev/ev_vars.h +187 -0
- data/ext/libev/ev_win32.c +153 -0
- data/ext/libev/ev_wrap.h +178 -0
- data/ext/libev/event.c +401 -0
- data/ext/libev/event.h +158 -0
- data/ext/libev/install-sh +294 -0
- data/ext/libev/libev.m4 +38 -0
- data/ext/libev/ltmain.sh +6871 -0
- data/ext/libev/missing +336 -0
- data/ext/libev/mkinstalldirs +111 -0
- data/ext/nginx/Configuration.c +532 -182
- data/ext/nginx/Configuration.h +33 -10
- data/ext/nginx/ContentHandler.c +188 -53
- data/ext/nginx/ContentHandler.h +1 -1
- data/ext/nginx/{HelperServer.cpp → HelperAgent.cpp} +433 -299
- data/ext/nginx/HttpStatusExtractor.h +1 -1
- data/ext/nginx/ScgiRequestParser.h +68 -11
- data/ext/nginx/StaticContentHandler.c +4 -1
- data/ext/nginx/StaticContentHandler.h +1 -1
- data/ext/nginx/config +5 -5
- data/ext/nginx/ngx_http_passenger_module.c +315 -469
- data/ext/nginx/ngx_http_passenger_module.h +8 -17
- data/ext/oxt/backtrace.cpp +49 -41
- data/ext/oxt/backtrace.hpp +1 -1
- data/ext/oxt/detail/backtrace_disabled.hpp +1 -1
- data/ext/oxt/detail/backtrace_enabled.hpp +16 -15
- data/ext/oxt/detail/spin_lock_darwin.hpp +69 -0
- data/ext/oxt/detail/spin_lock_gcc_x86.hpp +3 -4
- data/ext/oxt/detail/spin_lock_portable.hpp +1 -1
- data/ext/oxt/detail/spin_lock_pthreads.hpp +1 -1
- data/ext/oxt/detail/tracable_exception_disabled.hpp +1 -1
- data/ext/oxt/detail/tracable_exception_enabled.hpp +1 -1
- data/ext/oxt/dynamic_thread_group.hpp +195 -0
- data/ext/oxt/macros.hpp +1 -1
- data/ext/oxt/spin_lock.hpp +4 -2
- data/ext/oxt/system_calls.cpp +129 -13
- data/ext/oxt/system_calls.hpp +16 -2
- data/ext/oxt/thread.cpp +1 -1
- data/ext/oxt/thread.hpp +49 -14
- data/ext/oxt/tracable_exception.cpp +5 -5
- data/ext/oxt/tracable_exception.hpp +1 -1
- data/ext/phusion_passenger/extconf.rb +7 -2
- data/ext/phusion_passenger/native_support.c +733 -33
- data/{bin → helper-scripts}/passenger-spawn-server +50 -12
- data/helper-scripts/prespawn +63 -0
- data/lib/phusion_passenger.rb +113 -0
- data/lib/phusion_passenger/abstract_installer.rb +50 -12
- data/lib/phusion_passenger/abstract_request_handler.rb +432 -171
- data/lib/phusion_passenger/abstract_server.rb +125 -122
- data/lib/phusion_passenger/abstract_server_collection.rb +51 -22
- data/lib/phusion_passenger/admin_tools.rb +1 -1
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +299 -0
- data/lib/phusion_passenger/admin_tools/server_instance.rb +334 -0
- data/lib/phusion_passenger/analytics_logger.rb +342 -0
- data/lib/phusion_passenger/{application.rb → app_process.rb} +73 -24
- data/lib/phusion_passenger/classic_rails/application_spawner.rb +344 -0
- data/lib/phusion_passenger/{railz → classic_rails}/cgi_fixed.rb +2 -2
- data/lib/phusion_passenger/{railz → classic_rails}/framework_spawner.rb +75 -98
- data/lib/phusion_passenger/{railz → classic_rails}/request_handler.rb +8 -6
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_base_extension.rb +65 -0
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_benchmarking_extension.rb +48 -0
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_rescue_extension.rb +59 -0
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ar_abstract_adapter_extension.rb +54 -0
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/as_cache_extension.rb +130 -0
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/av_benchmark_helper_extension.rb +47 -0
- data/lib/phusion_passenger/classic_rails_extensions/init.rb +123 -0
- data/lib/phusion_passenger/console_text_template.rb +1 -1
- data/lib/phusion_passenger/constants.rb +9 -5
- data/lib/phusion_passenger/debug_logging.rb +104 -0
- data/lib/phusion_passenger/dependencies.rb +187 -4
- data/lib/phusion_passenger/exceptions.rb +4 -4
- data/lib/phusion_passenger/html_template.rb +6 -8
- data/lib/phusion_passenger/message_channel.rb +137 -21
- data/lib/phusion_passenger/message_client.rb +173 -0
- data/lib/phusion_passenger/native_support.rb +108 -0
- data/lib/phusion_passenger/packaging.rb +82 -13
- data/lib/phusion_passenger/platform_info.rb +84 -475
- data/lib/phusion_passenger/platform_info/apache.rb +329 -0
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +187 -0
- data/lib/phusion_passenger/platform_info/compiler.rb +154 -0
- data/lib/phusion_passenger/{events.rb → platform_info/curl.rb} +26 -23
- data/lib/phusion_passenger/platform_info/documentation_tools.rb +35 -0
- data/lib/phusion_passenger/platform_info/linux.rb +77 -0
- data/lib/phusion_passenger/platform_info/operating_system.rb +51 -0
- data/lib/phusion_passenger/platform_info/ruby.rb +198 -0
- data/lib/phusion_passenger/platform_info/zlib.rb +38 -0
- data/lib/phusion_passenger/plugin.rb +96 -0
- data/lib/phusion_passenger/public_api.rb +112 -0
- data/lib/phusion_passenger/rack/application_spawner.rb +146 -71
- data/lib/phusion_passenger/rack/request_handler.rb +36 -13
- data/lib/phusion_passenger/rails3_extensions/init.rb +204 -0
- data/lib/phusion_passenger/simple_benchmarking.rb +1 -1
- data/lib/phusion_passenger/spawn_manager.rb +137 -141
- data/lib/phusion_passenger/standalone/app_finder.rb +153 -0
- data/lib/phusion_passenger/standalone/command.rb +237 -0
- data/lib/phusion_passenger/standalone/config_file.rb +119 -0
- data/lib/phusion_passenger/standalone/help_command.rb +57 -0
- data/lib/phusion_passenger/standalone/main.rb +101 -0
- data/lib/phusion_passenger/standalone/package_runtime_command.rb +92 -0
- data/lib/phusion_passenger/standalone/runtime_installer.rb +466 -0
- data/lib/phusion_passenger/standalone/start_command.rb +510 -0
- data/lib/phusion_passenger/standalone/status_command.rb +62 -0
- data/lib/phusion_passenger/standalone/stop_command.rb +74 -0
- data/lib/phusion_passenger/standalone/utils.rb +42 -0
- data/lib/phusion_passenger/standalone/version_command.rb +42 -0
- data/lib/phusion_passenger/templates/framework_init_error.html.erb +1 -1
- data/lib/phusion_passenger/templates/standalone/cannot_write_to_dir.txt.erb +11 -0
- data/lib/phusion_passenger/templates/standalone/config.erb +69 -0
- data/lib/phusion_passenger/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +17 -0
- data/lib/phusion_passenger/templates/standalone/run_installer_as_root.txt.erb +8 -0
- data/lib/phusion_passenger/templates/standalone/welcome.txt.erb +8 -0
- data/lib/phusion_passenger/templates/standalone_default_root/index.html +1 -0
- data/lib/phusion_passenger/templates/version_not_found.html.erb +2 -2
- data/lib/phusion_passenger/utils.rb +476 -125
- data/lib/phusion_passenger/utils/file_system_watcher.rb +186 -0
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +130 -0
- data/lib/phusion_passenger/utils/tmpdir.rb +70 -0
- data/lib/phusion_passenger/utils/unseekable_socket.rb +196 -0
- data/lib/phusion_passenger/wsgi/application_spawner.rb +24 -20
- data/lib/phusion_passenger/wsgi/request_handler.py +1 -1
- data/misc/copy_boost_headers.rb +36 -9
- data/misc/find_owner_pipe_leaks.rb +1 -1
- data/misc/render_error_pages.rb +1 -1
- data/misc/union_station_gateway.crt +32 -0
- data/test/config.yml.example +24 -13
- data/test/cxx/ApplicationPool_PoolTest.cpp +33 -0
- data/test/cxx/ApplicationPool_PoolTestCases.cpp +1029 -0
- data/test/cxx/ApplicationPool_ServerTest.cpp +308 -0
- data/test/cxx/ApplicationPool_Server_PoolTest.cpp +80 -0
- data/test/{Base64Test.cpp → cxx/Base64Test.cpp} +4 -2
- data/test/{CachedFileStatTest.cpp → cxx/CachedFileStatTest.cpp} +3 -3
- data/test/{CxxTestMain.cpp → cxx/CxxTestMain.cpp} +6 -27
- data/test/cxx/EventedClientTest.cpp +386 -0
- data/test/{FileChangeCheckerTest.cpp → cxx/FileChangeCheckerTest.cpp} +3 -5
- data/test/cxx/FileDescriptorTest.cpp +69 -0
- data/test/{HttpStatusExtractorTest.cpp → cxx/HttpStatusExtractorTest.cpp} +1 -1
- data/test/cxx/IOUtilsTest.cpp +398 -0
- data/test/cxx/LoggingTest.cpp +914 -0
- data/test/cxx/MessageChannelTest.cpp +672 -0
- data/test/cxx/MessageReadersWritersTest.cpp +574 -0
- data/test/cxx/MessageServerTest.cpp +383 -0
- data/test/{PoolOptionsTest.cpp → cxx/PoolOptionsTest.cpp} +2 -3
- data/test/{ScgiRequestParserTest.cpp → cxx/ScgiRequestParserTest.cpp} +53 -1
- data/test/cxx/ServerInstanceDirTest.cpp +186 -0
- data/test/cxx/SpawnManagerTest.cpp +161 -0
- data/test/cxx/StaticStringTest.cpp +86 -0
- data/test/{SystemTimeTest.cpp → cxx/SystemTimeTest.cpp} +2 -2
- data/test/cxx/TestSupport.cpp +166 -0
- data/test/cxx/TestSupport.h +254 -0
- data/test/cxx/UtilsTest.cpp +521 -0
- data/test/cxx/VariantMapTest.cpp +179 -0
- data/test/integration_tests/apache2_tests.rb +198 -127
- data/test/integration_tests/cgi_environment_spec.rb +26 -0
- data/test/integration_tests/mycook_spec.rb +2 -28
- data/test/integration_tests/nginx_tests.rb +125 -16
- data/test/integration_tests/spec_helper.rb +19 -0
- data/test/oxt/backtrace_test.cpp +19 -59
- data/test/oxt/counter.hpp +55 -0
- data/test/oxt/dynamic_thread_group_test.cpp +131 -0
- data/test/oxt/oxt_test_main.cpp +2 -2
- data/test/oxt/spin_lock_test.cpp +59 -0
- data/test/oxt/syscall_interruption_test.cpp +1 -1
- data/test/ruby/abstract_request_handler_spec.rb +346 -25
- data/test/ruby/abstract_server_collection_spec.rb +4 -3
- data/test/ruby/abstract_server_spec.rb +37 -27
- data/test/ruby/admin_tools_spec.rb +362 -0
- data/test/ruby/analytics_logger_spec.rb +253 -0
- data/test/ruby/{application_spec.rb → app_process_spec.rb} +14 -14
- data/test/ruby/classic_rails/application_spawner_spec.rb +89 -0
- data/test/ruby/classic_rails/framework_spawner_spec.rb +92 -0
- data/test/ruby/debug_logging_spec.rb +141 -0
- data/test/ruby/message_channel_spec.rb +51 -25
- data/test/ruby/rack/application_spawner_spec.rb +99 -82
- data/test/ruby/shared/abstract_server_spec.rb +23 -0
- data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +375 -0
- data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +38 -0
- data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +19 -0
- data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +15 -0
- data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +27 -0
- data/test/ruby/shared/spawners/preloading_spawner_spec.rb +29 -0
- data/test/ruby/shared/spawners/reload_all_spec.rb +36 -0
- data/test/ruby/shared/spawners/reload_single_spec.rb +52 -0
- data/test/ruby/shared/spawners/spawn_server_spec.rb +28 -0
- data/test/ruby/shared/spawners/spawner_spec.rb +273 -0
- data/test/ruby/shared/utils/pseudo_io_spec.rb +60 -0
- data/test/ruby/spawn_manager_spec.rb +104 -175
- data/test/ruby/spec_helper.rb +104 -0
- data/test/ruby/utils/file_system_watcher_spec.rb +221 -0
- data/test/ruby/utils/hosts_file_parser.rb +258 -0
- data/test/ruby/utils/unseekable_socket_spec.rb +66 -0
- data/test/ruby/utils_spec.rb +410 -59
- data/test/ruby/wsgi/application_spawner_spec.rb +16 -20
- data/test/stub/apache2/httpd.conf.erb +11 -6
- data/test/stub/message_channel.rb +3 -1
- data/test/stub/message_channel_2.rb +3 -1
- data/test/stub/message_channel_3.rb +5 -3
- data/test/stub/nginx/nginx.conf.erb +3 -2
- data/test/stub/rails_apps/1.2/empty/Rakefile +10 -0
- data/test/stub/rails_apps/1.2/empty/app/controllers/application.rb +7 -0
- data/test/stub/rails_apps/{foobar → 1.2/empty}/app/helpers/application_helper.rb +0 -0
- data/test/stub/rails_apps/{mycook → 1.2/empty}/config/boot.rb +3 -3
- data/test/stub/rails_apps/1.2/empty/config/database.yml +31 -0
- data/test/stub/rails_apps/1.2/empty/config/environment.rb +66 -0
- data/test/stub/rails_apps/1.2/empty/config/environments/development.rb +21 -0
- data/test/stub/rails_apps/{foobar → 1.2/empty}/config/environments/production.rb +0 -0
- data/test/stub/rails_apps/1.2/empty/config/environments/staging.rb +18 -0
- data/test/stub/rails_apps/1.2/empty/config/environments/test.rb +19 -0
- data/test/stub/rails_apps/1.2/empty/config/routes.rb +23 -0
- data/test/stub/rails_apps/1.2/empty/doc/README_FOR_APP +2 -0
- data/test/stub/rails_apps/{mycook → 1.2/empty}/public/404.html +0 -0
- data/test/stub/rails_apps/1.2/empty/public/500.html +30 -0
- data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +10 -0
- data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +24 -0
- data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +10 -0
- data/test/stub/rails_apps/{mycook → 1.2/empty}/public/favicon.ico +0 -0
- data/test/stub/rails_apps/{mycook → 1.2/empty}/public/images/rails.png +0 -0
- data/test/stub/rails_apps/1.2/empty/public/robots.txt +1 -0
- data/test/stub/rails_apps/1.2/empty/script/about +3 -0
- data/test/stub/rails_apps/1.2/empty/script/breakpointer +3 -0
- data/test/stub/rails_apps/1.2/empty/script/console +3 -0
- data/test/stub/rails_apps/1.2/empty/script/destroy +3 -0
- data/test/stub/rails_apps/1.2/empty/script/generate +3 -0
- data/test/stub/rails_apps/1.2/empty/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/1.2/empty/script/performance/profiler +3 -0
- data/test/stub/rails_apps/1.2/empty/script/plugin +3 -0
- data/test/stub/rails_apps/1.2/empty/script/process/inspector +3 -0
- data/test/stub/rails_apps/1.2/empty/script/process/reaper +3 -0
- data/test/stub/rails_apps/1.2/empty/script/process/spawner +3 -0
- data/test/stub/rails_apps/1.2/empty/script/runner +3 -0
- data/test/stub/rails_apps/1.2/empty/script/server +3 -0
- data/test/stub/rails_apps/1.2/empty/test/test_helper.rb +28 -0
- data/test/stub/rails_apps/2.0/empty/Rakefile +10 -0
- data/test/stub/rails_apps/2.0/empty/app/controllers/application.rb +10 -0
- data/test/stub/rails_apps/{mycook → 2.0/empty}/app/helpers/application_helper.rb +0 -0
- data/test/stub/rails_apps/{foobar → 2.0/empty}/config/boot.rb +3 -3
- data/test/stub/rails_apps/2.0/empty/config/database.yml +31 -0
- data/test/stub/rails_apps/2.0/empty/config/environment.rb +59 -0
- data/test/stub/rails_apps/{mycook → 2.0/empty}/config/environments/development.rb +1 -1
- data/test/stub/rails_apps/2.0/empty/config/environments/production.rb +18 -0
- data/test/stub/rails_apps/2.0/empty/config/environments/staging.rb +18 -0
- data/test/stub/rails_apps/2.0/empty/config/environments/test.rb +22 -0
- data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/inflections.rb +0 -0
- data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/mime_types.rb +0 -0
- data/test/stub/rails_apps/{foobar → 2.0/empty}/config/routes.rb +0 -0
- data/test/stub/rails_apps/2.0/empty/doc/README_FOR_APP +2 -0
- data/test/stub/rails_apps/2.0/empty/public/404.html +30 -0
- data/test/stub/rails_apps/{mycook → 2.0/empty}/public/422.html +0 -0
- data/test/stub/rails_apps/{mycook → 2.0/empty}/public/500.html +0 -0
- data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +10 -0
- data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +24 -0
- data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +10 -0
- data/test/stub/rails_apps/2.0/empty/public/favicon.ico +0 -0
- data/test/stub/rails_apps/2.0/empty/public/images/rails.png +0 -0
- data/test/stub/rails_apps/{mycook → 2.0/empty}/public/robots.txt +0 -0
- data/test/stub/rails_apps/2.0/empty/script/about +3 -0
- data/test/stub/rails_apps/2.0/empty/script/console +3 -0
- data/test/stub/rails_apps/2.0/empty/script/destroy +3 -0
- data/test/stub/rails_apps/2.0/empty/script/generate +3 -0
- data/test/stub/rails_apps/2.0/empty/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/2.0/empty/script/performance/profiler +3 -0
- data/test/stub/rails_apps/2.0/empty/script/performance/request +3 -0
- data/test/stub/rails_apps/2.0/empty/script/plugin +3 -0
- data/test/stub/rails_apps/2.0/empty/script/process/inspector +3 -0
- data/test/stub/rails_apps/2.0/empty/script/process/reaper +3 -0
- data/test/stub/rails_apps/2.0/empty/script/process/spawner +3 -0
- data/test/stub/rails_apps/2.0/empty/script/runner +3 -0
- data/test/stub/rails_apps/2.0/empty/script/server +3 -0
- data/test/stub/rails_apps/2.0/empty/test/test_helper.rb +38 -0
- data/test/stub/rails_apps/2.2/empty/Rakefile +10 -0
- data/test/stub/rails_apps/2.2/empty/app/controllers/application.rb +15 -0
- data/test/stub/rails_apps/2.2/empty/app/helpers/application_helper.rb +3 -0
- data/test/stub/rails_apps/2.2/empty/config/boot.rb +109 -0
- data/test/stub/rails_apps/2.2/empty/config/database.yml +31 -0
- data/test/stub/rails_apps/2.2/empty/config/environment.rb +75 -0
- data/test/stub/rails_apps/{foobar → 2.2/empty}/config/environments/development.rb +0 -0
- data/test/stub/rails_apps/2.2/empty/config/environments/production.rb +24 -0
- data/test/stub/rails_apps/2.2/empty/config/environments/staging.rb +24 -0
- data/test/stub/rails_apps/2.2/empty/config/environments/test.rb +22 -0
- data/test/stub/rails_apps/2.2/empty/config/initializers/inflections.rb +10 -0
- data/test/stub/rails_apps/{mycook → 2.2/empty}/config/initializers/mime_types.rb +0 -0
- data/test/stub/rails_apps/2.2/empty/config/initializers/new_rails_defaults.rb +17 -0
- data/test/stub/rails_apps/2.2/empty/config/locales/en.yml +5 -0
- data/test/stub/rails_apps/2.2/empty/config/routes.rb +43 -0
- data/test/stub/rails_apps/2.2/empty/doc/README_FOR_APP +5 -0
- data/test/stub/rails_apps/2.2/empty/public/404.html +30 -0
- data/test/stub/rails_apps/2.2/empty/public/422.html +30 -0
- data/test/stub/rails_apps/2.2/empty/public/500.html +33 -0
- data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +10 -0
- data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +24 -0
- data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +10 -0
- data/test/stub/rails_apps/2.2/empty/public/favicon.ico +0 -0
- data/test/stub/rails_apps/2.2/empty/public/images/rails.png +0 -0
- data/test/stub/rails_apps/2.2/empty/public/robots.txt +5 -0
- data/test/stub/rails_apps/2.2/empty/script/about +4 -0
- data/test/stub/rails_apps/2.2/empty/script/console +3 -0
- data/test/stub/rails_apps/2.2/empty/script/dbconsole +3 -0
- data/test/stub/rails_apps/2.2/empty/script/destroy +3 -0
- data/test/stub/rails_apps/2.2/empty/script/generate +3 -0
- data/test/stub/rails_apps/2.2/empty/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/2.2/empty/script/performance/profiler +3 -0
- data/test/stub/rails_apps/2.2/empty/script/performance/request +3 -0
- data/test/stub/rails_apps/2.2/empty/script/plugin +3 -0
- data/test/stub/rails_apps/2.2/empty/script/process/inspector +3 -0
- data/test/stub/rails_apps/2.2/empty/script/process/reaper +3 -0
- data/test/stub/rails_apps/2.2/empty/script/process/spawner +3 -0
- data/test/stub/rails_apps/2.2/empty/script/runner +3 -0
- data/test/stub/rails_apps/2.2/empty/script/server +3 -0
- data/test/stub/rails_apps/2.2/empty/test/performance/browsing_test.rb +9 -0
- data/test/stub/rails_apps/2.2/empty/test/test_helper.rb +38 -0
- data/test/stub/rails_apps/2.3/empty/Rakefile +10 -0
- data/test/stub/rails_apps/2.3/empty/app/controllers/application_controller.rb +10 -0
- data/test/stub/rails_apps/2.3/empty/app/helpers/application_helper.rb +3 -0
- data/test/stub/rails_apps/2.3/empty/config/boot.rb +110 -0
- data/test/stub/rails_apps/2.3/empty/config/database.yml +31 -0
- data/test/stub/rails_apps/2.3/empty/config/environment.rb +41 -0
- data/test/stub/rails_apps/2.3/empty/config/environments/development.rb +17 -0
- data/test/stub/rails_apps/2.3/empty/config/environments/production.rb +28 -0
- data/test/stub/rails_apps/2.3/empty/config/environments/staging.rb +28 -0
- data/test/stub/rails_apps/2.3/empty/config/environments/test.rb +28 -0
- data/test/stub/rails_apps/2.3/empty/config/initializers/backtrace_silencers.rb +7 -0
- data/test/stub/rails_apps/2.3/empty/config/initializers/inflections.rb +10 -0
- data/test/stub/rails_apps/2.3/empty/config/initializers/mime_types.rb +5 -0
- data/test/stub/rails_apps/2.3/empty/config/initializers/new_rails_defaults.rb +21 -0
- data/test/stub/rails_apps/2.3/empty/config/initializers/session_store.rb +15 -0
- data/test/stub/rails_apps/2.3/empty/config/locales/en.yml +5 -0
- data/test/stub/rails_apps/2.3/empty/config/routes.rb +43 -0
- data/test/stub/rails_apps/2.3/empty/db/seeds.rb +7 -0
- data/test/stub/rails_apps/2.3/empty/doc/README_FOR_APP +2 -0
- data/test/stub/rails_apps/2.3/empty/public/404.html +30 -0
- data/test/stub/rails_apps/2.3/empty/public/422.html +30 -0
- data/test/stub/rails_apps/2.3/empty/public/500.html +30 -0
- data/test/stub/rails_apps/2.3/empty/public/favicon.ico +0 -0
- data/test/stub/rails_apps/2.3/empty/public/images/rails.png +0 -0
- data/test/stub/rails_apps/2.3/empty/public/robots.txt +5 -0
- data/test/stub/rails_apps/2.3/empty/script/about +4 -0
- data/test/stub/rails_apps/2.3/empty/script/console +3 -0
- data/test/stub/rails_apps/2.3/empty/script/dbconsole +3 -0
- data/test/stub/rails_apps/2.3/empty/script/destroy +3 -0
- data/test/stub/rails_apps/2.3/empty/script/generate +3 -0
- data/test/stub/rails_apps/2.3/empty/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/2.3/empty/script/performance/profiler +3 -0
- data/test/stub/rails_apps/2.3/empty/script/plugin +3 -0
- data/test/stub/rails_apps/2.3/empty/script/runner +3 -0
- data/test/stub/rails_apps/2.3/empty/script/server +3 -0
- data/test/stub/rails_apps/2.3/empty/test/performance/browsing_test.rb +9 -0
- data/test/stub/rails_apps/2.3/empty/test/test_helper.rb +38 -0
- data/test/stub/rails_apps/2.3/foobar/Rakefile +10 -0
- data/test/stub/rails_apps/{foobar/app/controllers/application.rb → 2.3/foobar/app/controllers/application_controller.rb} +0 -0
- data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_1.rb +0 -0
- data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_2.rb +0 -0
- data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/foo_controller.rb +0 -0
- data/test/stub/rails_apps/2.3/foobar/app/helpers/application_helper.rb +3 -0
- data/test/stub/rails_apps/2.3/foobar/config/boot.rb +110 -0
- data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/database.yml +0 -0
- data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/environment.rb +1 -1
- data/test/stub/rails_apps/2.3/foobar/config/environments/development.rb +17 -0
- data/test/stub/rails_apps/2.3/foobar/config/environments/production.rb +18 -0
- data/test/stub/rails_apps/2.3/foobar/config/environments/staging.rb +18 -0
- data/test/stub/rails_apps/{mycook → 2.3/foobar}/config/initializers/inflections.rb +0 -0
- data/test/stub/rails_apps/2.3/foobar/config/initializers/mime_types.rb +5 -0
- data/test/stub/rails_apps/2.3/foobar/config/routes.rb +35 -0
- data/test/stub/rails_apps/2.3/foobar/script/about +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/console +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/dbconsole +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/destroy +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/generate +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/performance/profiler +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/performance/request +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/plugin +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/process/inspector +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/process/reaper +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/process/spawner +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/runner +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/server +3 -0
- data/test/stub/rails_apps/2.3/mycook/Rakefile +10 -0
- data/test/stub/rails_apps/{mycook/app/controllers/application.rb → 2.3/mycook/app/controllers/application_controller.rb} +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/recipes_controller.rb +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/uploads_controller.rb +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/welcome_controller.rb +0 -0
- data/test/stub/rails_apps/2.3/mycook/app/helpers/application_helper.rb +3 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/layouts/default.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/create.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/index.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/new.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/index.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/new.html.erb +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/cached.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/index.rhtml +0 -0
- data/test/stub/rails_apps/2.3/mycook/config/boot.rb +110 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/database.yml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environment.rb +1 -1
- data/test/stub/rails_apps/2.3/mycook/config/environments/development.rb +18 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environments/production.rb +0 -0
- data/test/stub/rails_apps/2.3/mycook/config/initializers/inflections.rb +10 -0
- data/test/stub/rails_apps/2.3/mycook/config/initializers/mime_types.rb +5 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/routes.rb +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/log/useless.txt +0 -0
- data/test/stub/rails_apps/2.3/mycook/public/404.html +30 -0
- data/test/stub/rails_apps/2.3/mycook/public/422.html +30 -0
- data/test/stub/rails_apps/2.3/mycook/public/500.html +30 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.cgi +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.fcgi +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.rb +1 -1
- data/test/stub/rails_apps/2.3/mycook/public/favicon.ico +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/angrywizard.gif +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/cookbook.gif +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/header.png +0 -0
- data/test/stub/rails_apps/2.3/mycook/public/images/rails.png +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/application.js +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/controls.js +73 -73
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/dragdrop.js +166 -165
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/effects.js +174 -166
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/prototype.js +362 -267
- data/test/stub/rails_apps/2.3/mycook/public/robots.txt +5 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/uploads.html +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/welcome/cached.html +0 -0
- data/test/stub/rails_apps/2.3/mycook/script/about +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/console +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/dbconsole +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/destroy +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/generate +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/performance/profiler +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/performance/request +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/plugin +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/process/inspector +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/process/reaper +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/process/spawner +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/runner +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/server +3 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/uploads.html +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/welcome/cached.html +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/cache/useless.txt +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/pids/useless.txt +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sessions/useless.txt +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sockets/useless.txt +0 -0
- data/test/stub/rails_apps/3.0/empty/Gemfile +22 -0
- data/test/stub/rails_apps/3.0/empty/Rakefile +10 -0
- data/test/stub/rails_apps/3.0/empty/app/controllers/application_controller.rb +4 -0
- data/test/stub/rails_apps/3.0/empty/app/helpers/application_helper.rb +2 -0
- data/test/stub/rails_apps/3.0/empty/app/views/layouts/application.html.erb +14 -0
- data/test/stub/rails_apps/3.0/empty/config.ru +4 -0
- data/test/stub/rails_apps/3.0/empty/config/application.rb +48 -0
- data/test/stub/rails_apps/3.0/empty/config/boot.rb +13 -0
- data/test/stub/rails_apps/3.0/empty/config/database.yml +22 -0
- data/test/stub/rails_apps/3.0/empty/config/environment.rb +5 -0
- data/test/stub/rails_apps/3.0/empty/config/environments/development.rb +19 -0
- data/test/stub/rails_apps/3.0/empty/config/environments/production.rb +48 -0
- data/test/stub/rails_apps/3.0/empty/config/environments/test.rb +32 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/backtrace_silencers.rb +7 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/inflections.rb +10 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/mime_types.rb +5 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/passenger.rb +1 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/secret_token.rb +7 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/session_store.rb +8 -0
- data/test/stub/rails_apps/3.0/empty/config/locales/en.yml +5 -0
- data/test/stub/rails_apps/3.0/empty/config/routes.rb +58 -0
- data/test/stub/rails_apps/3.0/empty/db/seeds.rb +7 -0
- data/test/stub/rails_apps/3.0/empty/doc/README_FOR_APP +2 -0
- data/test/stub/rails_apps/3.0/empty/log/development.log +3 -0
- data/test/stub/rails_apps/3.0/empty/public/404.html +26 -0
- data/test/stub/rails_apps/3.0/empty/public/422.html +26 -0
- data/test/stub/rails_apps/3.0/empty/public/500.html +26 -0
- data/test/stub/rails_apps/3.0/empty/public/favicon.ico +0 -0
- data/test/stub/rails_apps/3.0/empty/public/index.html +279 -0
- data/test/stub/rails_apps/3.0/empty/public/robots.txt +5 -0
- data/test/stub/rails_apps/3.0/empty/script/rails +9 -0
- data/test/stub/rails_apps/3.0/empty/test/performance/browsing_test.rb +9 -0
- data/test/stub/rails_apps/3.0/empty/test/test_helper.rb +13 -0
- data/test/stub/spawn_server.rb +4 -2
- data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +3 -0
- data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +7 -2
- data/test/support/apache2_controller.rb +10 -2
- data/test/support/nginx_controller.rb +3 -2
- data/test/support/test_helper.rb +282 -46
- data/test/{support → tut}/tut.h +6 -0
- data/test/{support → tut}/tut_reporter.h +0 -0
- metadata +824 -266
- data/benchmark/ApplicationPool.cpp +0 -52
- data/benchmark/accept_vs_socketpair_vs_named_pipes.rb +0 -126
- data/benchmark/dispatcher.rb +0 -42
- data/benchmark/overhead_of_password_checking.rb +0 -81
- data/benchmark/socket_connections_vs_persistent_pipe.rb +0 -99
- data/benchmark/unix_sockets_vs_pipes.rb +0 -83
- data/ext/boost/LICENSE.TXT +0 -23
- data/ext/boost/VERSION.TXT +0 -1
- data/ext/boost/detail/sp_counted_base.hpp +0 -81
- data/ext/boost/src/pthread/exceptions.cpp +0 -146
- data/ext/boost/src/win32/exceptions.cpp +0 -124
- data/ext/boost/src/win32/thread.cpp +0 -629
- data/ext/boost/src/win32/timeconv.inl +0 -130
- data/ext/boost/src/win32/tss_dll.cpp +0 -72
- data/ext/boost/src/win32/tss_pe.cpp +0 -269
- data/ext/boost/thread/pthread/thread.hpp +0 -339
- data/ext/boost/thread/pthread/tss.hpp +0 -103
- data/ext/common/Application.h +0 -511
- data/ext/common/ApplicationPoolServer.h +0 -794
- data/ext/common/ApplicationPoolServerExecutable.cpp +0 -743
- data/ext/common/ApplicationPoolStatusReporter.h +0 -336
- data/ext/common/DummySpawnManager.h +0 -108
- data/ext/common/StandardApplicationPool.h +0 -821
- data/ext/common/SystemTime.h +0 -88
- data/lib/phusion_passenger/admin_tools/control_process.rb +0 -150
- data/lib/phusion_passenger/railz/application_spawner.rb +0 -463
- data/lib/phusion_passenger/templates/invalid_app_root.html.erb +0 -9
- data/test/ApplicationPoolServerTest.cpp +0 -114
- data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +0 -33
- data/test/ApplicationPoolTest.cpp +0 -599
- data/test/MessageChannelTest.cpp +0 -320
- data/test/SpawnManagerTest.cpp +0 -64
- data/test/StandardApplicationPoolTest.cpp +0 -27
- data/test/StaticStringTest.cpp +0 -51
- data/test/UtilsTest.cpp +0 -257
- data/test/ruby/rails/application_spawner_spec.rb +0 -159
- data/test/ruby/rails/framework_spawner_spec.rb +0 -133
- data/test/ruby/rails/minimal_spawner_spec.rb +0 -93
- data/test/ruby/rails/spawner_error_handling_spec.rb +0 -107
- data/test/ruby/rails/spawner_privilege_lowering_spec.rb +0 -97
- data/test/ruby/spawn_server_spec.rb +0 -26
- data/test/stub/MessageServer.dSYM/Contents/Info.plist +0 -25
- data/test/stub/MessageServer.dSYM/Contents/Resources/DWARF/MessageServer +0 -0
- data/test/support/Support.cpp +0 -84
- data/test/support/Support.h +0 -118
- data/test/support/config.rb +0 -38
- data/test/support/run_rspec_tests.rb +0 -10
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - http://www.modrails.com/
|
3
|
-
* Copyright (c)
|
3
|
+
* Copyright (c) 2010 Phusion
|
4
4
|
*
|
5
5
|
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
6
|
*
|
@@ -31,9 +31,9 @@
|
|
31
31
|
|
32
32
|
#include <oxt/backtrace.hpp>
|
33
33
|
|
34
|
-
#include "
|
35
|
-
#include "Configuration.h"
|
34
|
+
#include "Configuration.hpp"
|
36
35
|
#include "Utils.h"
|
36
|
+
#include "Utils/CachedFileStat.hpp"
|
37
37
|
|
38
38
|
// The Apache/APR headers *must* come after the Boost headers, otherwise
|
39
39
|
// compilation will fail on OpenBSD.
|
@@ -0,0 +1,359 @@
|
|
1
|
+
/*
|
2
|
+
* Phusion Passenger - http://www.modrails.com/
|
3
|
+
* Copyright (c) 2010 Phusion
|
4
|
+
*
|
5
|
+
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
|
+
*
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
12
|
+
* furnished to do so, subject to the following conditions:
|
13
|
+
*
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
15
|
+
* all copies or substantial portions of the Software.
|
16
|
+
*
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
+
* THE SOFTWARE.
|
24
|
+
*/
|
25
|
+
|
26
|
+
#include <boost/shared_ptr.hpp>
|
27
|
+
#include <boost/bind.hpp>
|
28
|
+
#include <oxt/thread.hpp>
|
29
|
+
#include <oxt/system_calls.hpp>
|
30
|
+
#include <oxt/backtrace.hpp>
|
31
|
+
|
32
|
+
#include <string>
|
33
|
+
#include <sys/types.h>
|
34
|
+
#include <sys/select.h>
|
35
|
+
#include <unistd.h>
|
36
|
+
#include <pwd.h>
|
37
|
+
#include <grp.h>
|
38
|
+
#include <cstdlib>
|
39
|
+
#include <cstring>
|
40
|
+
#include <cerrno>
|
41
|
+
|
42
|
+
#include "AgentBase.h"
|
43
|
+
#include "HelperAgent/BacktracesServer.h"
|
44
|
+
#include "Constants.h"
|
45
|
+
#include "ApplicationPool/Pool.h"
|
46
|
+
#include "ApplicationPool/Server.h"
|
47
|
+
#include "AccountsDatabase.h"
|
48
|
+
#include "Account.h"
|
49
|
+
#include "MessageServer.h"
|
50
|
+
#include "ServerInstanceDir.h"
|
51
|
+
#include "ResourceLocator.h"
|
52
|
+
#include "MessageChannel.h"
|
53
|
+
#include "FileDescriptor.h"
|
54
|
+
#include "Logging.h"
|
55
|
+
#include "Exceptions.h"
|
56
|
+
#include "Utils.h"
|
57
|
+
#include "Utils/Timer.h"
|
58
|
+
|
59
|
+
using namespace std;
|
60
|
+
using namespace boost;
|
61
|
+
using namespace oxt;
|
62
|
+
using namespace Passenger;
|
63
|
+
|
64
|
+
class Server;
|
65
|
+
|
66
|
+
|
67
|
+
class TimerUpdateHandler: public MessageServer::Handler {
|
68
|
+
private:
|
69
|
+
Timer &timer;
|
70
|
+
unsigned int clients;
|
71
|
+
|
72
|
+
public:
|
73
|
+
TimerUpdateHandler(Timer &_timer): timer(_timer) {
|
74
|
+
clients = 0;
|
75
|
+
}
|
76
|
+
|
77
|
+
virtual MessageServer::ClientContextPtr newClient(MessageServer::CommonClientContext &commonContext) {
|
78
|
+
clients++;
|
79
|
+
timer.stop();
|
80
|
+
return MessageServer::ClientContextPtr();
|
81
|
+
}
|
82
|
+
|
83
|
+
virtual void clientDisconnected(MessageServer::CommonClientContext &commonContext,
|
84
|
+
MessageServer::ClientContextPtr &handlerSpecificContext)
|
85
|
+
{
|
86
|
+
clients--;
|
87
|
+
if (clients == 0) {
|
88
|
+
timer.start();
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
virtual bool processMessage(MessageServer::CommonClientContext &commonContext,
|
93
|
+
MessageServer::ClientContextPtr &handlerSpecificContext,
|
94
|
+
const vector<string> &args)
|
95
|
+
{
|
96
|
+
return false;
|
97
|
+
}
|
98
|
+
};
|
99
|
+
|
100
|
+
class ExitHandler: public MessageServer::Handler {
|
101
|
+
private:
|
102
|
+
EventFd &exitEvent;
|
103
|
+
|
104
|
+
public:
|
105
|
+
ExitHandler(EventFd &_exitEvent)
|
106
|
+
: exitEvent(_exitEvent)
|
107
|
+
{ }
|
108
|
+
|
109
|
+
virtual bool processMessage(MessageServer::CommonClientContext &commonContext,
|
110
|
+
MessageServer::ClientContextPtr &handlerSpecificContext,
|
111
|
+
const vector<string> &args)
|
112
|
+
{
|
113
|
+
if (args[0] == "exit") {
|
114
|
+
TRACE_POINT();
|
115
|
+
commonContext.requireRights(Account::EXIT);
|
116
|
+
UPDATE_TRACE_POINT();
|
117
|
+
exitEvent.notify();
|
118
|
+
UPDATE_TRACE_POINT();
|
119
|
+
commonContext.channel.write("exit command received", NULL);
|
120
|
+
return true;
|
121
|
+
} else {
|
122
|
+
return false;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
};
|
126
|
+
|
127
|
+
class Server {
|
128
|
+
private:
|
129
|
+
static const unsigned int MESSAGE_SERVER_STACK_SIZE = 64 * 1024;
|
130
|
+
|
131
|
+
ServerInstanceDir serverInstanceDir;
|
132
|
+
ServerInstanceDir::GenerationPtr generation;
|
133
|
+
FileDescriptor feedbackFd;
|
134
|
+
MessageChannel feedbackChannel;
|
135
|
+
AnalyticsLoggerPtr analyticsLogger;
|
136
|
+
AccountsDatabasePtr accountsDatabase;
|
137
|
+
MessageServerPtr messageServer;
|
138
|
+
ApplicationPool::PoolPtr pool;
|
139
|
+
ResourceLocator resourceLocator;
|
140
|
+
shared_ptr<oxt::thread> prestarterThread;
|
141
|
+
shared_ptr<oxt::thread> messageServerThread;
|
142
|
+
EventFd exitEvent;
|
143
|
+
Timer exitTimer;
|
144
|
+
|
145
|
+
string receivePassword() {
|
146
|
+
TRACE_POINT();
|
147
|
+
vector<string> args;
|
148
|
+
|
149
|
+
if (!feedbackChannel.read(args)) {
|
150
|
+
throw IOException("The watchdog unexpectedly closed the connection.");
|
151
|
+
}
|
152
|
+
if (args[0] != "request socket password" && args[0] != "message socket password") {
|
153
|
+
throw IOException("Unexpected input message '" + args[0] + "'");
|
154
|
+
}
|
155
|
+
return Base64::decode(args[1]);
|
156
|
+
}
|
157
|
+
|
158
|
+
/**
|
159
|
+
* Lowers this process's privilege to that of <em>username</em> and <em>groupname</em>.
|
160
|
+
*/
|
161
|
+
void lowerPrivilege(const string &username, const string &groupname) {
|
162
|
+
struct passwd *userEntry;
|
163
|
+
struct group *groupEntry;
|
164
|
+
int e;
|
165
|
+
|
166
|
+
userEntry = getpwnam(username.c_str());
|
167
|
+
if (userEntry == NULL) {
|
168
|
+
throw NonExistentUserException(string("Unable to lower Passenger "
|
169
|
+
"HelperServer's privilege to that of user '") + username +
|
170
|
+
"': user does not exist.");
|
171
|
+
}
|
172
|
+
groupEntry = getgrnam(groupname.c_str());
|
173
|
+
if (groupEntry == NULL) {
|
174
|
+
throw NonExistentGroupException(string("Unable to lower Passenger "
|
175
|
+
"HelperServer's privilege to that of user '") + username +
|
176
|
+
"': user does not exist.");
|
177
|
+
}
|
178
|
+
|
179
|
+
if (initgroups(username.c_str(), userEntry->pw_gid) != 0) {
|
180
|
+
e = errno;
|
181
|
+
throw SystemException(string("Unable to lower Passenger HelperServer's "
|
182
|
+
"privilege to that of user '") + username +
|
183
|
+
"': cannot set supplementary groups for this user", e);
|
184
|
+
}
|
185
|
+
if (setgid(groupEntry->gr_gid) != 0) {
|
186
|
+
e = errno;
|
187
|
+
throw SystemException(string("Unable to lower Passenger HelperServer's "
|
188
|
+
"privilege to that of user '") + username +
|
189
|
+
"': cannot set group ID", e);
|
190
|
+
}
|
191
|
+
if (setuid(userEntry->pw_uid) != 0) {
|
192
|
+
e = errno;
|
193
|
+
throw SystemException(string("Unable to lower Passenger HelperServer's "
|
194
|
+
"privilege to that of user '") + username +
|
195
|
+
"': cannot set user ID", e);
|
196
|
+
}
|
197
|
+
}
|
198
|
+
|
199
|
+
public:
|
200
|
+
Server(FileDescriptor feedbackFd,
|
201
|
+
pid_t webServerPid, const string &tempDir,
|
202
|
+
bool userSwitching, const string &defaultUser, const string &defaultGroup,
|
203
|
+
const string &passengerRoot, const string &rubyCommand,
|
204
|
+
unsigned int generationNumber, unsigned int maxPoolSize,
|
205
|
+
unsigned int maxInstancesPerApp, unsigned int poolIdleTime,
|
206
|
+
const VariantMap &options)
|
207
|
+
: serverInstanceDir(webServerPid, tempDir, false),
|
208
|
+
resourceLocator(passengerRoot)
|
209
|
+
{
|
210
|
+
TRACE_POINT();
|
211
|
+
string messageSocketPassword;
|
212
|
+
string loggingAgentPassword;
|
213
|
+
|
214
|
+
this->feedbackFd = feedbackFd;
|
215
|
+
feedbackChannel = MessageChannel(feedbackFd);
|
216
|
+
|
217
|
+
UPDATE_TRACE_POINT();
|
218
|
+
messageSocketPassword = Base64::decode(options.get("message_socket_password"));
|
219
|
+
loggingAgentPassword = options.get("logging_agent_password");
|
220
|
+
|
221
|
+
generation = serverInstanceDir.getGeneration(generationNumber);
|
222
|
+
accountsDatabase = AccountsDatabase::createDefault(generation,
|
223
|
+
userSwitching, defaultUser, defaultGroup);
|
224
|
+
accountsDatabase->add("_web_server", messageSocketPassword, false,
|
225
|
+
Account::GET | Account::DETACH | Account::SET_PARAMETERS | Account::EXIT);
|
226
|
+
messageServer = ptr(new MessageServer(generation->getPath() + "/socket", accountsDatabase));
|
227
|
+
|
228
|
+
createFile(generation->getPath() + "/helper_server.pid",
|
229
|
+
toString(getpid()), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
|
230
|
+
|
231
|
+
if (geteuid() == 0 && !userSwitching) {
|
232
|
+
lowerPrivilege(defaultUser, defaultGroup);
|
233
|
+
}
|
234
|
+
|
235
|
+
UPDATE_TRACE_POINT();
|
236
|
+
analyticsLogger = ptr(new AnalyticsLogger(options.get("logging_agent_address"),
|
237
|
+
"logging", loggingAgentPassword));
|
238
|
+
|
239
|
+
pool = ptr(new ApplicationPool::Pool(
|
240
|
+
resourceLocator.getSpawnServerFilename(), generation,
|
241
|
+
accountsDatabase, rubyCommand,
|
242
|
+
analyticsLogger,
|
243
|
+
options.getInt("log_level"),
|
244
|
+
options.get("debug_log_file", false)
|
245
|
+
));
|
246
|
+
pool->setMax(maxPoolSize);
|
247
|
+
pool->setMaxPerApp(maxInstancesPerApp);
|
248
|
+
pool->setMaxIdleTime(poolIdleTime);
|
249
|
+
|
250
|
+
messageServer->addHandler(ptr(new TimerUpdateHandler(exitTimer)));
|
251
|
+
messageServer->addHandler(ptr(new ApplicationPool::Server(pool)));
|
252
|
+
messageServer->addHandler(ptr(new BacktracesServer()));
|
253
|
+
messageServer->addHandler(ptr(new ExitHandler(exitEvent)));
|
254
|
+
|
255
|
+
UPDATE_TRACE_POINT();
|
256
|
+
feedbackChannel.write("initialized",
|
257
|
+
"", // Request socket filename; not available in the Apache helper server.
|
258
|
+
messageServer->getSocketFilename().c_str(),
|
259
|
+
NULL);
|
260
|
+
|
261
|
+
prestarterThread = ptr(new oxt::thread(
|
262
|
+
boost::bind(prestartWebApps, resourceLocator, options.get("prestart_urls"))
|
263
|
+
));
|
264
|
+
}
|
265
|
+
|
266
|
+
~Server() {
|
267
|
+
TRACE_POINT();
|
268
|
+
prestarterThread->interrupt_and_join();
|
269
|
+
if (messageServerThread != NULL) {
|
270
|
+
messageServerThread->interrupt_and_join();
|
271
|
+
}
|
272
|
+
}
|
273
|
+
|
274
|
+
void mainLoop() {
|
275
|
+
TRACE_POINT();
|
276
|
+
|
277
|
+
messageServerThread.reset(new oxt::thread(
|
278
|
+
boost::bind(&MessageServer::mainLoop, messageServer.get()),
|
279
|
+
"MessageServer thread",
|
280
|
+
MESSAGE_SERVER_STACK_SIZE
|
281
|
+
));
|
282
|
+
|
283
|
+
/* Wait until the watchdog closes the feedback fd (meaning it
|
284
|
+
* was killed) or until we receive an exit message.
|
285
|
+
*/
|
286
|
+
this_thread::disable_syscall_interruption dsi;
|
287
|
+
fd_set fds;
|
288
|
+
int largestFd;
|
289
|
+
|
290
|
+
FD_ZERO(&fds);
|
291
|
+
FD_SET(feedbackFd, &fds);
|
292
|
+
FD_SET(exitEvent.fd(), &fds);
|
293
|
+
largestFd = (feedbackFd > exitEvent.fd()) ? (int) feedbackFd : exitEvent.fd();
|
294
|
+
UPDATE_TRACE_POINT();
|
295
|
+
if (syscalls::select(largestFd + 1, &fds, NULL, NULL, NULL) == -1) {
|
296
|
+
int e = errno;
|
297
|
+
throw SystemException("select() failed", e);
|
298
|
+
}
|
299
|
+
|
300
|
+
if (FD_ISSET(feedbackFd, &fds)) {
|
301
|
+
/* If the watchdog has been killed then we'll kill all descendant
|
302
|
+
* processes and exit. There's no point in keeping this helper
|
303
|
+
* server running because we can't detect when the web server exits,
|
304
|
+
* and because this helper server doesn't own the server instance
|
305
|
+
* directory. As soon as passenger-status is run, the server
|
306
|
+
* instance directory will be cleaned up, making this helper server
|
307
|
+
* inaccessible.
|
308
|
+
*/
|
309
|
+
syscalls::killpg(getpgrp(), SIGKILL);
|
310
|
+
_exit(2); // In case killpg() fails.
|
311
|
+
} else {
|
312
|
+
/* We received an exit command. We want to exit 5 seconds after
|
313
|
+
* the last client has disconnected, .
|
314
|
+
*/
|
315
|
+
exitTimer.start();
|
316
|
+
exitTimer.wait(5000);
|
317
|
+
}
|
318
|
+
}
|
319
|
+
};
|
320
|
+
|
321
|
+
int
|
322
|
+
main(int argc, char *argv[]) {
|
323
|
+
TRACE_POINT();
|
324
|
+
VariantMap options = initializeAgent(argc, argv, "PassengerHelperAgent");
|
325
|
+
pid_t webServerPid = options.getPid("web_server_pid");
|
326
|
+
string tempDir = options.get("temp_dir");
|
327
|
+
bool userSwitching = options.getBool("user_switching");
|
328
|
+
string defaultUser = options.get("default_user");
|
329
|
+
string defaultGroup = options.get("default_group");
|
330
|
+
string passengerRoot = options.get("passenger_root");
|
331
|
+
string rubyCommand = options.get("ruby");
|
332
|
+
unsigned int generationNumber = options.getInt("generation_number");
|
333
|
+
unsigned int maxPoolSize = options.getInt("max_pool_size");
|
334
|
+
unsigned int maxInstancesPerApp = options.getInt("max_instances_per_app");
|
335
|
+
unsigned int poolIdleTime = options.getInt("pool_idle_time");
|
336
|
+
|
337
|
+
try {
|
338
|
+
UPDATE_TRACE_POINT();
|
339
|
+
Server server(FEEDBACK_FD, webServerPid, tempDir,
|
340
|
+
userSwitching, defaultUser, defaultGroup,
|
341
|
+
passengerRoot, rubyCommand, generationNumber,
|
342
|
+
maxPoolSize, maxInstancesPerApp, poolIdleTime,
|
343
|
+
options);
|
344
|
+
|
345
|
+
UPDATE_TRACE_POINT();
|
346
|
+
server.mainLoop();
|
347
|
+
} catch (const tracable_exception &e) {
|
348
|
+
P_ERROR(e.what() << "\n" << e.backtrace());
|
349
|
+
return 1;
|
350
|
+
} catch (const std::exception &e) {
|
351
|
+
P_ERROR(e.what());
|
352
|
+
return 1;
|
353
|
+
} catch (...) {
|
354
|
+
P_ERROR("Unknown exception thrown in main thread.");
|
355
|
+
throw;
|
356
|
+
}
|
357
|
+
|
358
|
+
return 0;
|
359
|
+
}
|
data/ext/apache2/Hooks.cpp
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - http://www.modrails.com/
|
3
|
-
* Copyright (c)
|
3
|
+
* Copyright (c) 2010 Phusion
|
4
4
|
*
|
5
5
|
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
6
|
*
|
@@ -22,6 +22,21 @@
|
|
22
22
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
23
|
* THE SOFTWARE.
|
24
24
|
*/
|
25
|
+
|
26
|
+
/*
|
27
|
+
* This is the main source file which interfaces directly with Apache by
|
28
|
+
* installing hooks. The code here can look a bit convoluted, but it'll make
|
29
|
+
* more sense if you read:
|
30
|
+
* http://httpd.apache.org/docs/2.2/developer/request.html
|
31
|
+
*
|
32
|
+
* Scroll all the way down to passenger_register_hooks to get an idea of
|
33
|
+
* what we're hooking into and what we do in those hooks. There are many
|
34
|
+
* hooks but the gist is implemented in just two methods: prepareRequest()
|
35
|
+
* and handleRequest(). Most hooks exist for implementing compatibility
|
36
|
+
* with other Apache modules. These hooks create an environment in which
|
37
|
+
* prepareRequest() and handleRequest() can be comfortably run.
|
38
|
+
*/
|
39
|
+
|
25
40
|
#include <boost/thread.hpp>
|
26
41
|
|
27
42
|
#include <sys/time.h>
|
@@ -33,21 +48,22 @@
|
|
33
48
|
#include <oxt/macros.hpp>
|
34
49
|
#include "Hooks.h"
|
35
50
|
#include "Bucket.h"
|
36
|
-
#include "Configuration.
|
51
|
+
#include "Configuration.hpp"
|
37
52
|
#include "Utils.h"
|
53
|
+
#include "Utils/Timer.h"
|
38
54
|
#include "Logging.h"
|
39
|
-
#include "
|
55
|
+
#include "AgentsStarter.hpp"
|
56
|
+
#include "ApplicationPool/Client.h"
|
40
57
|
#include "MessageChannel.h"
|
41
58
|
#include "DirectoryMapper.h"
|
42
|
-
#include "
|
43
|
-
#include "Version.h"
|
59
|
+
#include "Constants.h"
|
44
60
|
|
45
61
|
/* The Apache/APR headers *must* come after the Boost headers, otherwise
|
46
62
|
* compilation will fail on OpenBSD.
|
47
63
|
*
|
48
64
|
* apr_want.h *must* come after MessageChannel.h, otherwise compilation will
|
49
65
|
* fail on platforms on which apr_want.h tries to redefine 'struct iovec'.
|
50
|
-
* http://
|
66
|
+
* http://groups.google.com/group/phusion-passenger/browse_thread/thread/7e162f60df212e9c
|
51
67
|
*/
|
52
68
|
#include <ap_config.h>
|
53
69
|
#include <httpd.h>
|
@@ -68,17 +84,6 @@ using namespace Passenger;
|
|
68
84
|
extern "C" module AP_MODULE_DECLARE_DATA passenger_module;
|
69
85
|
|
70
86
|
|
71
|
-
/*
|
72
|
-
* This is the main source file which interfaces directly with Apache by
|
73
|
-
* installing hooks. The code here can look a bit convoluted, but it'll make
|
74
|
-
* more sense if you read:
|
75
|
-
* http://httpd.apache.org/docs/2.2/developer/request.html
|
76
|
-
*
|
77
|
-
* Scroll all the way down to passenger_register_hooks to get an idea of
|
78
|
-
* what we're hooking into and what we do in those hooks.
|
79
|
-
*/
|
80
|
-
|
81
|
-
|
82
87
|
/**
|
83
88
|
* If the HTTP client sends POST data larger than this value (in bytes),
|
84
89
|
* then the POST data will be fully buffered into a temporary file, before
|
@@ -95,38 +100,17 @@ extern "C" module AP_MODULE_DECLARE_DATA passenger_module;
|
|
95
100
|
*/
|
96
101
|
class Hooks {
|
97
102
|
private:
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
static apr_status_t cleanup(void *p) {
|
102
|
-
delete (AprDestructable *) p;
|
103
|
-
return APR_SUCCESS;
|
104
|
-
}
|
105
|
-
};
|
106
|
-
|
107
|
-
struct RequestNote: public AprDestructable {
|
108
|
-
DirectoryMapper mapper;
|
109
|
-
DirConfig *config;
|
110
|
-
bool forwardToBackend;
|
111
|
-
const char *handlerBeforeModRewrite;
|
112
|
-
char *filenameBeforeModRewrite;
|
113
|
-
apr_filetype_e oldFileType;
|
114
|
-
const char *handlerBeforeModAutoIndex;
|
115
|
-
|
116
|
-
RequestNote(const DirectoryMapper &m)
|
117
|
-
: mapper(m) {
|
118
|
-
forwardToBackend = false;
|
119
|
-
filenameBeforeModRewrite = NULL;
|
120
|
-
}
|
121
|
-
};
|
122
|
-
|
123
|
-
struct ErrorReport: public AprDestructable {
|
103
|
+
class ErrorReport {
|
104
|
+
public:
|
105
|
+
virtual ~ErrorReport() { }
|
124
106
|
virtual int report(request_rec *r) = 0;
|
125
107
|
};
|
126
108
|
|
127
|
-
|
109
|
+
class ReportFileSystemError: public ErrorReport {
|
110
|
+
private:
|
128
111
|
FileSystemException e;
|
129
|
-
|
112
|
+
|
113
|
+
public:
|
130
114
|
ReportFileSystemError(const FileSystemException &ex): e(ex) { }
|
131
115
|
|
132
116
|
int report(request_rec *r) {
|
@@ -150,6 +134,37 @@ private:
|
|
150
134
|
}
|
151
135
|
};
|
152
136
|
|
137
|
+
struct RequestNote {
|
138
|
+
DirectoryMapper mapper;
|
139
|
+
DirConfig *config;
|
140
|
+
ErrorReport *errorReport;
|
141
|
+
|
142
|
+
const char *handlerBeforeModRewrite;
|
143
|
+
char *filenameBeforeModRewrite;
|
144
|
+
apr_filetype_e oldFileType;
|
145
|
+
const char *handlerBeforeModAutoIndex;
|
146
|
+
|
147
|
+
RequestNote(const DirectoryMapper &m, DirConfig *c)
|
148
|
+
: mapper(m),
|
149
|
+
config(c)
|
150
|
+
{
|
151
|
+
errorReport = NULL;
|
152
|
+
handlerBeforeModRewrite = NULL;
|
153
|
+
filenameBeforeModRewrite = NULL;
|
154
|
+
oldFileType = APR_NOFILE;
|
155
|
+
handlerBeforeModAutoIndex = NULL;
|
156
|
+
}
|
157
|
+
|
158
|
+
~RequestNote() {
|
159
|
+
delete errorReport;
|
160
|
+
}
|
161
|
+
|
162
|
+
static apr_status_t cleanup(void *p) {
|
163
|
+
delete (RequestNote *) p;
|
164
|
+
return APR_SUCCESS;
|
165
|
+
}
|
166
|
+
};
|
167
|
+
|
153
168
|
/**
|
154
169
|
* A StringListCreator which returns a list of environment variable
|
155
170
|
* names and values, as found in r->subprocess_env.
|
@@ -157,27 +172,31 @@ private:
|
|
157
172
|
class EnvironmentVariablesStringListCreator: public StringListCreator {
|
158
173
|
private:
|
159
174
|
request_rec *r;
|
175
|
+
mutable StringListPtr result;
|
160
176
|
public:
|
161
177
|
EnvironmentVariablesStringListCreator(request_rec *r) {
|
162
178
|
this->r = r;
|
163
179
|
}
|
164
180
|
|
165
181
|
virtual const StringListPtr getItems() const {
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
182
|
+
if (!result) {
|
183
|
+
const apr_array_header_t *env_arr;
|
184
|
+
apr_table_entry_t *env_entries;
|
185
|
+
|
186
|
+
result.reset(new StringList());
|
187
|
+
|
188
|
+
// Some standard CGI headers.
|
189
|
+
result->push_back("SERVER_SOFTWARE");
|
190
|
+
result->push_back(ap_get_server_version());
|
191
|
+
|
192
|
+
// Subprocess environment variables.
|
193
|
+
env_arr = apr_table_elts(r->subprocess_env);
|
194
|
+
env_entries = (apr_table_entry_t *) env_arr->elts;
|
195
|
+
for (int i = 0; i < env_arr->nelts; ++i) {
|
196
|
+
if (env_entries[i].key != NULL && env_entries[i].val != NULL) {
|
197
|
+
result->push_back(env_entries[i].key);
|
198
|
+
result->push_back(env_entries[i].val);
|
199
|
+
}
|
181
200
|
}
|
182
201
|
}
|
183
202
|
return result;
|
@@ -186,19 +205,19 @@ private:
|
|
186
205
|
|
187
206
|
enum Threeway { YES, NO, UNKNOWN };
|
188
207
|
|
189
|
-
|
190
|
-
thread_specific_ptr<ApplicationPoolPtr> threadSpecificApplicationPool;
|
208
|
+
thread_specific_ptr<ApplicationPool::Client> threadSpecificApplicationPool;
|
191
209
|
Threeway m_hasModRewrite, m_hasModDir, m_hasModAutoIndex, m_hasModXsendfile;
|
192
210
|
CachedFileStat cstat;
|
211
|
+
AgentsStarter agentsStarter;
|
212
|
+
AnalyticsLoggerPtr analyticsLogger;
|
193
213
|
|
194
214
|
inline DirConfig *getDirConfig(request_rec *r) {
|
195
215
|
return (DirConfig *) ap_get_module_config(r->per_dir_config, &passenger_module);
|
196
216
|
}
|
197
217
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
218
|
+
/**
|
219
|
+
* The existance of a request note means that the handler should be run.
|
220
|
+
*/
|
202
221
|
inline RequestNote *getRequestNote(request_rec *r) {
|
203
222
|
// The union is needed in order to be compliant with
|
204
223
|
// C99/C++'s strict aliasing rules. http://tinyurl.com/g5hgh
|
@@ -212,27 +231,92 @@ private:
|
|
212
231
|
}
|
213
232
|
|
214
233
|
/**
|
215
|
-
* Returns a usable ApplicationPool object.
|
234
|
+
* Returns a usable ApplicationPool::Client object.
|
216
235
|
*
|
217
|
-
* When using the worker MPM and global queuing, deadlocks can occur,
|
218
|
-
*
|
219
|
-
*
|
220
|
-
*
|
236
|
+
* When using the worker MPM and global queuing, deadlocks can occur, as
|
237
|
+
* explained by ApplicationPool::Client's overview. This method allows us
|
238
|
+
* to avoid deadlocks by making sure that each thread gets its own connection
|
239
|
+
* to the application pool server.
|
221
240
|
*
|
222
241
|
* It also checks whether the currently cached ApplicationPool object
|
223
242
|
* is disconnected (which can happen if an error previously occured).
|
224
|
-
* If so, it will reconnect to the
|
243
|
+
* If so, it will reconnect to the application pool server.
|
244
|
+
*
|
245
|
+
* @throws SystemException
|
246
|
+
* @throws IOException
|
247
|
+
* @throws RuntimeException
|
248
|
+
* @throws SecurityException
|
225
249
|
*/
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
250
|
+
ApplicationPool::Client *getApplicationPool() {
|
251
|
+
TRACE_POINT();
|
252
|
+
ApplicationPool::Client *pool = threadSpecificApplicationPool.get();
|
253
|
+
if (pool == NULL || !pool->connected()) {
|
254
|
+
UPDATE_TRACE_POINT();
|
255
|
+
if (pool != NULL) {
|
256
|
+
P_DEBUG("Reconnecting to ApplicationPool server");
|
257
|
+
}
|
258
|
+
auto_ptr<ApplicationPool::Client> pool_ptr(new ApplicationPool::Client);
|
259
|
+
pool_ptr->connect(agentsStarter.getMessageSocketFilename(),
|
260
|
+
"_web_server", agentsStarter.getMessageSocketPassword());
|
261
|
+
pool = pool_ptr.release();
|
262
|
+
threadSpecificApplicationPool.reset(pool);
|
263
|
+
}
|
264
|
+
return pool;
|
265
|
+
}
|
266
|
+
|
267
|
+
/**
|
268
|
+
* Get a session from the application pool, similar to how
|
269
|
+
* ApplicationPool::Interface::get() works. This method also checks whether
|
270
|
+
* the helper server has crashed. If it did then it will attempt to
|
271
|
+
* reconnect to the helper server for a small period of time until it's up
|
272
|
+
* again.
|
273
|
+
*
|
274
|
+
* @throws SystemException
|
275
|
+
* @throws IOException
|
276
|
+
* @throws RuntimeException
|
277
|
+
* @throws SecurityExcepion
|
278
|
+
*/
|
279
|
+
SessionPtr getSession(const PoolOptions &options) {
|
280
|
+
TRACE_POINT();
|
281
|
+
ApplicationPool::Client *pool = getApplicationPool();
|
282
|
+
try {
|
283
|
+
return pool->get(options);
|
284
|
+
} catch (const SystemException &e) {
|
285
|
+
if (e.code() == EPIPE) {
|
286
|
+
UPDATE_TRACE_POINT();
|
287
|
+
|
288
|
+
// Maybe the helper server crashed. First wait 50 ms.
|
289
|
+
usleep(50000);
|
290
|
+
|
291
|
+
// Then try to reconnect to the helper server for the
|
292
|
+
// next 5 seconds.
|
293
|
+
time_t deadline = time(NULL) + 5;
|
294
|
+
while (time(NULL) < deadline) {
|
295
|
+
try {
|
296
|
+
pool = getApplicationPool();
|
297
|
+
} catch (const SystemException &e) {
|
298
|
+
if (e.code() == ECONNREFUSED || e.code() == ECONNRESET) {
|
299
|
+
// Looks like the helper server hasn't been
|
300
|
+
// restarted yet. Wait between 20 and 100 ms.
|
301
|
+
usleep(20000 + rand() % 80000);
|
302
|
+
// Don't care about thread-safety of rand()
|
303
|
+
} else {
|
304
|
+
throw;
|
305
|
+
}
|
306
|
+
}
|
307
|
+
}
|
308
|
+
|
309
|
+
UPDATE_TRACE_POINT();
|
310
|
+
if (pool != NULL && pool->connected()) {
|
311
|
+
return pool->get(options);
|
312
|
+
} else {
|
313
|
+
UPDATE_TRACE_POINT();
|
314
|
+
throw IOException("Cannot connect to the helper server");
|
315
|
+
}
|
316
|
+
} else {
|
317
|
+
throw;
|
318
|
+
}
|
234
319
|
}
|
235
|
-
return *pool_ptr;
|
236
320
|
}
|
237
321
|
|
238
322
|
bool hasModRewrite() {
|
@@ -293,31 +377,29 @@ private:
|
|
293
377
|
}
|
294
378
|
|
295
379
|
/**
|
296
|
-
* Gather some information about the request and do some preparations.
|
297
|
-
* it will be determined whether the request URI should be served statically by Apache
|
298
|
-
* (in case of static assets or in case there's a page cache file available) or
|
299
|
-
* whether it should be forwarded to the backend application.
|
300
|
-
*
|
301
|
-
* The strategy is as follows:
|
380
|
+
* Gather some information about the request and do some preparations.
|
302
381
|
*
|
303
|
-
*
|
304
|
-
*
|
382
|
+
* This method will determine whether the Phusion Passenger handler method
|
383
|
+
* should be run for this request, through the following checks:
|
305
384
|
* (B) There is a backend application defined for this URI.
|
306
|
-
* (C) r->filename already exists.
|
307
|
-
* (D) There is a page cache file for
|
385
|
+
* (C) r->filename already exists, meaning that this URI already maps to an existing file.
|
386
|
+
* (D) There is a page cache file for this URI.
|
308
387
|
*
|
309
|
-
* - If
|
310
|
-
* Passenger will be disabled during the rest of this request.
|
388
|
+
* - If B is not true, or if C is true, then the handler shouldn't be run.
|
311
389
|
* - If D is true, then we first transform r->filename to the page cache file's
|
312
|
-
* filename, and then we let Apache serve it statically.
|
313
|
-
*
|
390
|
+
* filename, and then we let Apache serve it statically. The Phusion Passenger
|
391
|
+
* handler shouldn't be run.
|
392
|
+
* - If D is not true, then the handler should be run.
|
314
393
|
*
|
315
|
-
* @pre
|
394
|
+
* @pre config->isEnabled()
|
316
395
|
* @param coreModuleWillBeRun Whether the core.c map_to_storage hook might be called after this.
|
317
|
-
* @return Whether the Passenger handler hook method should be run.
|
396
|
+
* @return Whether the Phusion Passenger handler hook method should be run.
|
397
|
+
* When true, this method will save a request note object so that future hooks
|
398
|
+
* can store request-specific information.
|
318
399
|
*/
|
319
400
|
bool prepareRequest(request_rec *r, DirConfig *config, const char *filename, bool coreModuleWillBeRun = false) {
|
320
401
|
TRACE_POINT();
|
402
|
+
|
321
403
|
DirectoryMapper mapper(r, config, &cstat, config->getStatThrottleRate());
|
322
404
|
try {
|
323
405
|
if (mapper.getBaseURI() == NULL) {
|
@@ -339,34 +421,19 @@ private:
|
|
339
421
|
* Phusion Passenger for the rest of the request.
|
340
422
|
*/
|
341
423
|
if (e.code() == EACCES || e.code() == EPERM) {
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
// - mkdir /foo/config
|
347
|
-
// - chmod 000 /foo/config
|
348
|
-
// - add vhost 'foo' with document root /foo/public
|
349
|
-
// - curl http://foo/
|
350
|
-
apr_pool_userdata_set(new ReportFileSystemError(e),
|
351
|
-
"Phusion Passenger: error report",
|
352
|
-
ReportFileSystemError::cleanup,
|
353
|
-
r->pool);
|
424
|
+
auto_ptr<RequestNote> note(new RequestNote(mapper, config));
|
425
|
+
note->errorReport = new ReportFileSystemError(e);
|
426
|
+
apr_pool_userdata_set(note.release(), "Phusion Passenger",
|
427
|
+
RequestNote::cleanup, r->pool);
|
354
428
|
return true;
|
355
429
|
} else {
|
356
430
|
return false;
|
357
431
|
}
|
358
432
|
}
|
359
433
|
|
360
|
-
|
361
|
-
* The existance of this note indicates that the URI belongs to a Phusion
|
362
|
-
* Passenger-served application.
|
363
|
-
*/
|
364
|
-
RequestNote *note = new RequestNote(mapper);
|
365
|
-
note->config = config;
|
366
|
-
apr_pool_userdata_set(note, "Phusion Passenger", RequestNote::cleanup, r->pool);
|
434
|
+
// (B) is true.
|
367
435
|
|
368
436
|
try {
|
369
|
-
// (B) is true.
|
370
437
|
FileType fileType = getFileType(filename);
|
371
438
|
if (fileType == FT_REGULAR) {
|
372
439
|
// (C) is true.
|
@@ -417,7 +484,9 @@ private:
|
|
417
484
|
return false;
|
418
485
|
} else {
|
419
486
|
// (D) is not true.
|
420
|
-
note
|
487
|
+
RequestNote *note = new RequestNote(mapper, config);
|
488
|
+
apr_pool_userdata_set(note, "Phusion Passenger",
|
489
|
+
RequestNote::cleanup, r->pool);
|
421
490
|
return true;
|
422
491
|
}
|
423
492
|
} catch (const FileSystemException &e) {
|
@@ -443,25 +512,14 @@ private:
|
|
443
512
|
* to the browser.
|
444
513
|
*/
|
445
514
|
|
446
|
-
// The union is needed in order to be compliant with
|
447
|
-
// C99/C++'s strict aliasing rules. http://tinyurl.com/g5hgh
|
448
|
-
union {
|
449
|
-
ErrorReport *errorReport;
|
450
|
-
void *pointer;
|
451
|
-
} u;
|
452
|
-
|
453
|
-
/* Did an error occur in any of the previous hook methods during
|
454
|
-
* this request? If so, show the error and stop here.
|
455
|
-
*/
|
456
|
-
u.errorReport = 0;
|
457
|
-
apr_pool_userdata_get(&u.pointer, "Phusion Passenger: error report", r->pool);
|
458
|
-
if (u.errorReport != 0) {
|
459
|
-
return u.errorReport->report(r);
|
460
|
-
}
|
461
|
-
|
462
515
|
RequestNote *note = getRequestNote(r);
|
463
|
-
if (note ==
|
516
|
+
if (note == NULL) {
|
464
517
|
return DECLINED;
|
518
|
+
} else if (note->errorReport != NULL) {
|
519
|
+
/* Did an error occur in any of the previous hook methods during
|
520
|
+
* this request? If so, show the error and stop here.
|
521
|
+
*/
|
522
|
+
return note->errorReport->report(r);
|
465
523
|
} else if (r->handler != NULL && strcmp(r->handler, "redirect-handler") == 0) {
|
466
524
|
// mod_rewrite is at work.
|
467
525
|
return DECLINED;
|
@@ -469,24 +527,45 @@ private:
|
|
469
527
|
|
470
528
|
TRACE_POINT();
|
471
529
|
DirConfig *config = note->config;
|
472
|
-
DirectoryMapper &mapper
|
530
|
+
DirectoryMapper &mapper = note->mapper;
|
531
|
+
string publicDirectory, appRoot;
|
473
532
|
|
474
|
-
|
475
|
-
|
533
|
+
try {
|
534
|
+
publicDirectory = mapper.getPublicDirectory();
|
535
|
+
if (publicDirectory.empty()) {
|
536
|
+
return reportDocumentRootDeterminationError(r);
|
537
|
+
}
|
538
|
+
appRoot = config->getAppRoot(publicDirectory.c_str());
|
539
|
+
} catch (const FileSystemException &e) {
|
540
|
+
/* The application root cannot be determined. This could
|
541
|
+
* happen if, for example, the user specified 'RailsBaseURI /foo'
|
542
|
+
* while there is no filesystem entry called "foo" in the virtual
|
543
|
+
* host's document root.
|
544
|
+
*/
|
545
|
+
return ReportFileSystemError(e).report(r);
|
476
546
|
}
|
477
547
|
|
478
548
|
|
479
|
-
|
480
|
-
|
481
|
-
int httpStatus = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
|
482
|
-
if (httpStatus != OK) {
|
483
|
-
return httpStatus;
|
484
|
-
}
|
485
|
-
|
549
|
+
UPDATE_TRACE_POINT();
|
486
550
|
try {
|
551
|
+
AnalyticsLogPtr log;
|
552
|
+
if (config->analyticsEnabled()) {
|
553
|
+
log = analyticsLogger->newTransaction(config->getAppGroupName(appRoot));
|
554
|
+
log->message(string("URI: ") + r->uri);
|
555
|
+
} else {
|
556
|
+
log.reset(new AnalyticsLog());
|
557
|
+
}
|
558
|
+
|
559
|
+
/********** Step 2: handle HTTP upload data, if any **********/
|
560
|
+
|
561
|
+
int httpStatus = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
|
562
|
+
if (httpStatus != OK) {
|
563
|
+
return httpStatus;
|
564
|
+
}
|
565
|
+
|
487
566
|
this_thread::disable_interruption di;
|
488
567
|
this_thread::disable_syscall_interruption dsi;
|
489
|
-
|
568
|
+
SessionPtr session;
|
490
569
|
bool expectingUploadData;
|
491
570
|
string uploadDataMemory;
|
492
571
|
shared_ptr<BufferedUpload> uploadDataFile;
|
@@ -537,59 +616,71 @@ private:
|
|
537
616
|
/********** Step 3: forwarding the request to a backend
|
538
617
|
process from the application pool **********/
|
539
618
|
|
540
|
-
|
619
|
+
AnalyticsScopeLog requestProcessingScope(log, "request processing");
|
620
|
+
|
541
621
|
try {
|
542
|
-
|
543
|
-
string publicDirectory(mapper.getPublicDirectory());
|
622
|
+
AnalyticsScopeLog scope(log, "get from pool");
|
544
623
|
PoolOptions options(
|
545
|
-
|
546
|
-
|
547
|
-
|
624
|
+
appRoot,
|
625
|
+
config->getAppGroupName(appRoot),
|
626
|
+
mapper.getApplicationTypeString(),
|
548
627
|
mapper.getEnvironment(),
|
549
628
|
config->getSpawnMethodString(),
|
550
|
-
|
629
|
+
config->getUser(),
|
630
|
+
config->getGroup(),
|
631
|
+
serverConfig.defaultUser,
|
632
|
+
serverConfig.defaultGroup,
|
551
633
|
config->frameworkSpawnerTimeout,
|
552
634
|
config->appSpawnerTimeout,
|
635
|
+
mapper.getBaseURI(),
|
553
636
|
config->getMaxRequests(),
|
554
|
-
config->
|
637
|
+
config->getMinInstances(),
|
555
638
|
config->usingGlobalQueue(),
|
639
|
+
true,
|
556
640
|
config->getStatThrottleRate(),
|
557
641
|
config->getRestartDir(),
|
558
|
-
|
642
|
+
DEFAULT_BACKEND_ACCOUNT_RIGHTS,
|
643
|
+
false,
|
644
|
+
config->analyticsEnabled(),
|
645
|
+
log->isNull() ? AnalyticsLogPtr() : log
|
559
646
|
);
|
560
647
|
options.environmentVariables = ptr(new EnvironmentVariablesStringListCreator(r));
|
561
648
|
|
562
|
-
session =
|
649
|
+
session = getSession(options);
|
563
650
|
P_TRACE(3, "Forwarding " << r->uri << " to PID " << session->getPid());
|
651
|
+
scope.success();
|
652
|
+
log->message("Application PID: " + toString(session->getPid()) +
|
653
|
+
" (GUPID: " + session->getGupid() + ")");
|
564
654
|
} catch (const SpawnException &e) {
|
565
655
|
r->status = 500;
|
566
|
-
if (e.hasErrorPage()) {
|
656
|
+
if (e.hasErrorPage() && config->showFriendlyErrorPages()) {
|
567
657
|
ap_set_content_type(r, "text/html; charset=utf-8");
|
568
658
|
ap_rputs(e.getErrorPage().c_str(), r);
|
569
659
|
return OK;
|
570
660
|
} else {
|
571
661
|
throw;
|
572
662
|
}
|
573
|
-
} catch (const FileSystemException &e) {
|
574
|
-
/* The application root cannot be determined. This could
|
575
|
-
* happen if, for example, the user specified 'RailsBaseURI /foo'
|
576
|
-
* while there is no filesystem entry called "foo" in the virtual
|
577
|
-
* host's document root.
|
578
|
-
*/
|
579
|
-
return ReportFileSystemError(e).report(r);
|
580
663
|
} catch (const BusyException &e) {
|
581
664
|
return reportBusyException(r);
|
582
665
|
}
|
583
666
|
|
584
667
|
UPDATE_TRACE_POINT();
|
585
|
-
|
668
|
+
AnalyticsScopeLog requestProxyingScope(log, "request proxying");
|
669
|
+
|
670
|
+
{
|
671
|
+
AnalyticsScopeLog scope(log, "send request headers");
|
672
|
+
sendHeaders(r, config, session, mapper.getBaseURI(), log, appRoot);
|
673
|
+
scope.success();
|
674
|
+
}
|
586
675
|
if (expectingUploadData) {
|
676
|
+
AnalyticsScopeLog scope(log, "send request body");
|
587
677
|
if (uploadDataFile != NULL) {
|
588
678
|
sendRequestBody(r, session, uploadDataFile);
|
589
679
|
uploadDataFile.reset();
|
590
680
|
} else {
|
591
681
|
sendRequestBody(r, session, uploadDataMemory);
|
592
682
|
}
|
683
|
+
scope.success();
|
593
684
|
}
|
594
685
|
try {
|
595
686
|
session->shutdownWriter();
|
@@ -680,6 +771,9 @@ private:
|
|
680
771
|
P_WARN("Apache stopped forwarding the backend's response, "
|
681
772
|
"even though the HTTP client did not close the "
|
682
773
|
"connection. Is this an Apache bug?");
|
774
|
+
} else {
|
775
|
+
requestProxyingScope.success();
|
776
|
+
requestProcessingScope.success();
|
683
777
|
}
|
684
778
|
|
685
779
|
return OK;
|
@@ -749,7 +843,7 @@ private:
|
|
749
843
|
e.what() << "\n" << " Backtrace:\n" << e.backtrace());
|
750
844
|
return HTTP_INTERNAL_SERVER_ERROR;
|
751
845
|
|
752
|
-
} catch (const exception &e) {
|
846
|
+
} catch (const std::exception &e) {
|
753
847
|
P_ERROR("Unexpected error in mod_passenger: " <<
|
754
848
|
e.what() << "\n" << " Backtrace: not available");
|
755
849
|
return HTTP_INTERNAL_SERVER_ERROR;
|
@@ -808,7 +902,9 @@ private:
|
|
808
902
|
}
|
809
903
|
}
|
810
904
|
|
811
|
-
apr_status_t sendHeaders(request_rec *r, DirConfig *config,
|
905
|
+
apr_status_t sendHeaders(request_rec *r, DirConfig *config, SessionPtr &session,
|
906
|
+
const char *baseURI, const AnalyticsLogPtr &log, const string &appRoot)
|
907
|
+
{
|
812
908
|
apr_table_t *headers;
|
813
909
|
headers = apr_table_make(r->pool, 40);
|
814
910
|
if (headers == NULL) {
|
@@ -884,6 +980,12 @@ private:
|
|
884
980
|
addHeader(headers, env[i].key, env[i].val);
|
885
981
|
}
|
886
982
|
|
983
|
+
if (config->analyticsEnabled()) {
|
984
|
+
addHeader(headers, "PASSENGER_GROUP_NAME",
|
985
|
+
config->getAppGroupName(appRoot).c_str());
|
986
|
+
addHeader(headers, "PASSENGER_TXN_ID", log->getTxnId().c_str());
|
987
|
+
}
|
988
|
+
|
887
989
|
// Now send the headers.
|
888
990
|
string buffer;
|
889
991
|
|
@@ -897,6 +999,14 @@ private:
|
|
897
999
|
buffer.append(1, '\0');
|
898
1000
|
}
|
899
1001
|
|
1002
|
+
buffer.append("PASSENGER_CONNECT_PASSWORD");
|
1003
|
+
buffer.append(1, '\0');
|
1004
|
+
buffer.append(session->getConnectPassword());
|
1005
|
+
buffer.append(1, '\0');
|
1006
|
+
|
1007
|
+
/*********************/
|
1008
|
+
/*********************/
|
1009
|
+
|
900
1010
|
/*
|
901
1011
|
* If the last header value is an empty string, then the buffer
|
902
1012
|
* will end with "\0\0". For example, if 'SSLOptions +ExportCertData'
|
@@ -932,7 +1042,8 @@ private:
|
|
932
1042
|
string message("An error occured while "
|
933
1043
|
"buffering HTTP upload data to "
|
934
1044
|
"a temporary file in ");
|
935
|
-
|
1045
|
+
ServerInstanceDir::GenerationPtr generation = agentsStarter.getGeneration();
|
1046
|
+
message.append(config->getUploadBufferDir(generation));
|
936
1047
|
|
937
1048
|
switch (code) {
|
938
1049
|
case ENOSPC:
|
@@ -1103,7 +1214,9 @@ private:
|
|
1103
1214
|
DirConfig *config = getDirConfig(r);
|
1104
1215
|
shared_ptr<BufferedUpload> tempFile;
|
1105
1216
|
try {
|
1106
|
-
|
1217
|
+
ServerInstanceDir::GenerationPtr generation = agentsStarter.getGeneration();
|
1218
|
+
string uploadBufferDir = config->getUploadBufferDir(generation);
|
1219
|
+
tempFile.reset(new BufferedUpload(uploadBufferDir));
|
1107
1220
|
} catch (const SystemException &e) {
|
1108
1221
|
throwUploadBufferingException(r, e.code());
|
1109
1222
|
}
|
@@ -1155,7 +1268,7 @@ private:
|
|
1155
1268
|
}
|
1156
1269
|
}
|
1157
1270
|
|
1158
|
-
void sendRequestBody(request_rec *r,
|
1271
|
+
void sendRequestBody(request_rec *r, SessionPtr &session, shared_ptr<BufferedUpload> &uploadData) {
|
1159
1272
|
TRACE_POINT();
|
1160
1273
|
rewind(uploadData->handle);
|
1161
1274
|
while (!feof(uploadData->handle)) {
|
@@ -1168,16 +1281,20 @@ private:
|
|
1168
1281
|
}
|
1169
1282
|
}
|
1170
1283
|
|
1171
|
-
void sendRequestBody(request_rec *r,
|
1284
|
+
void sendRequestBody(request_rec *r, SessionPtr &session, const string &buffer) {
|
1172
1285
|
session->sendBodyBlock(buffer.c_str(), buffer.size());
|
1173
1286
|
}
|
1174
1287
|
|
1175
1288
|
public:
|
1176
1289
|
Hooks(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
|
1177
|
-
: cstat(1024)
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1290
|
+
: cstat(1024),
|
1291
|
+
agentsStarter(AgentsStarter::APACHE)
|
1292
|
+
{
|
1293
|
+
serverConfig.finalize();
|
1294
|
+
Passenger::setLogLevel(serverConfig.logLevel);
|
1295
|
+
if (serverConfig.debugLogFile != NULL) {
|
1296
|
+
Passenger::setDebugFile(serverConfig.debugLogFile);
|
1297
|
+
}
|
1181
1298
|
m_hasModRewrite = UNKNOWN;
|
1182
1299
|
m_hasModDir = UNKNOWN;
|
1183
1300
|
m_hasModAutoIndex = UNKNOWN;
|
@@ -1186,64 +1303,50 @@ public:
|
|
1186
1303
|
P_DEBUG("Initializing Phusion Passenger...");
|
1187
1304
|
ap_add_version_component(pconf, "Phusion_Passenger/" PASSENGER_VERSION);
|
1188
1305
|
|
1189
|
-
|
1190
|
-
string applicationPoolServerExe, spawnServer;
|
1191
|
-
|
1192
|
-
createPassengerTempDir(config->getTempDir(), config->userSwitching,
|
1193
|
-
config->getDefaultUser(), unixd_config.user_id,
|
1194
|
-
unixd_config.group_id);
|
1195
|
-
|
1196
|
-
if (config->userSwitching) {
|
1197
|
-
user = "";
|
1198
|
-
} else {
|
1199
|
-
user = config->getDefaultUser();
|
1200
|
-
}
|
1201
|
-
|
1202
|
-
if (config->root == NULL) {
|
1306
|
+
if (serverConfig.root == NULL) {
|
1203
1307
|
throw ConfigurationException("The 'PassengerRoot' configuration option "
|
1204
1308
|
"is not specified. This option is required, so please specify it. "
|
1205
1309
|
"TIP: The correct value for this option was given to you by "
|
1206
1310
|
"'passenger-install-apache2-module'.");
|
1207
1311
|
}
|
1208
1312
|
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1313
|
+
agentsStarter.start(serverConfig.logLevel,
|
1314
|
+
(serverConfig.debugLogFile == NULL) ? "" : serverConfig.debugLogFile,
|
1315
|
+
getpid(), serverConfig.tempDir,
|
1316
|
+
serverConfig.userSwitching,
|
1317
|
+
serverConfig.defaultUser, serverConfig.defaultGroup,
|
1318
|
+
unixd_config.user_id, unixd_config.group_id,
|
1319
|
+
serverConfig.root, serverConfig.ruby, serverConfig.maxPoolSize,
|
1320
|
+
serverConfig.maxInstancesPerApp, serverConfig.poolIdleTime,
|
1321
|
+
"",
|
1322
|
+
serverConfig.analyticsLogDir, serverConfig.analyticsLogUser,
|
1323
|
+
serverConfig.analyticsLogGroup, serverConfig.analyticsLogPermissions,
|
1324
|
+
DEFAULT_UNION_STATION_GATEWAY_ADDRESS,
|
1325
|
+
DEFAULT_UNION_STATION_GATEWAY_PORT,
|
1326
|
+
"",
|
1327
|
+
serverConfig.prestartURLs);
|
1328
|
+
|
1329
|
+
analyticsLogger = ptr(new AnalyticsLogger(agentsStarter.getLoggingSocketAddress(),
|
1330
|
+
"logging", agentsStarter.getLoggingSocketPassword()));
|
1331
|
+
|
1332
|
+
// Store some relevant information in the generation directory.
|
1333
|
+
string generationPath = agentsStarter.getGeneration()->getPath();
|
1334
|
+
server_rec *server;
|
1335
|
+
string configFiles;
|
1225
1336
|
|
1226
|
-
|
1227
|
-
new ApplicationPoolServer(
|
1228
|
-
applicationPoolServerExe, spawnServer, "",
|
1229
|
-
config->getRuby(), user)
|
1230
|
-
);
|
1337
|
+
createFile(generationPath + "/web_server.txt", ap_get_server_description());
|
1231
1338
|
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1339
|
+
for (server = s; server != NULL; server = server->next) {
|
1340
|
+
if (server->defn_name != NULL) {
|
1341
|
+
configFiles.append(server->defn_name);
|
1342
|
+
configFiles.append(1, '\n');
|
1343
|
+
}
|
1344
|
+
}
|
1345
|
+
createFile(generationPath + "/config_files.txt", configFiles);
|
1236
1346
|
}
|
1237
1347
|
|
1238
|
-
|
1239
|
-
|
1240
|
-
/* mod_passenger is loaded twice during Apache startup (load, unload, load),
|
1241
|
-
* but on OS X sometimes the old memory values of global variables can
|
1242
|
-
* stay behind and affect the next load. So here we empty the temp dir variable
|
1243
|
-
* explicitly so that the next load correctly calculates a new temp dir
|
1244
|
-
* filename using the after-daemonization Apache PID.
|
1245
|
-
*/
|
1246
|
-
setPassengerTempDir("");
|
1348
|
+
void childInit(apr_pool_t *pchild, server_rec *s) {
|
1349
|
+
agentsStarter.detach();
|
1247
1350
|
}
|
1248
1351
|
|
1249
1352
|
int prepareRequestWhenInHighPerformanceMode(request_rec *r) {
|
@@ -1470,7 +1573,7 @@ destroy_hooks(void *arg) {
|
|
1470
1573
|
} catch (const thread_interrupted &) {
|
1471
1574
|
// Ignore interruptions, we're shutting down anyway.
|
1472
1575
|
P_TRACE(3, "A system call was interrupted during shutdown of mod_passenger.");
|
1473
|
-
} catch (const exception &e) {
|
1576
|
+
} catch (const std::exception &e) {
|
1474
1577
|
// Ignore other exceptions, we're shutting down anyway.
|
1475
1578
|
P_TRACE(3, "Exception during shutdown of mod_passenger: " << e.what());
|
1476
1579
|
}
|
@@ -1558,7 +1661,7 @@ init_module(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *
|
|
1558
1661
|
|
1559
1662
|
return DECLINED;
|
1560
1663
|
|
1561
|
-
} catch (const exception &e) {
|
1664
|
+
} catch (const std::exception &e) {
|
1562
1665
|
ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
|
1563
1666
|
"*** Passenger could not be initialized because of this error: %s",
|
1564
1667
|
e.what());
|
@@ -1567,6 +1670,13 @@ init_module(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *
|
|
1567
1670
|
}
|
1568
1671
|
}
|
1569
1672
|
|
1673
|
+
static void
|
1674
|
+
child_init(apr_pool_t *pchild, server_rec *s) {
|
1675
|
+
if (OXT_LIKELY(hooks != NULL)) {
|
1676
|
+
hooks->childInit(pchild, s);
|
1677
|
+
}
|
1678
|
+
}
|
1679
|
+
|
1570
1680
|
#define DEFINE_REQUEST_HOOK(c_name, cpp_name) \
|
1571
1681
|
static int c_name(request_rec *r) { \
|
1572
1682
|
if (OXT_LIKELY(hooks != NULL)) { \
|
@@ -1597,8 +1707,11 @@ passenger_register_hooks(apr_pool_t *p) {
|
|
1597
1707
|
static const char * const rewrite_module[] = { "mod_rewrite.c", NULL };
|
1598
1708
|
static const char * const dir_module[] = { "mod_dir.c", NULL };
|
1599
1709
|
static const char * const autoindex_module[] = { "mod_autoindex.c", NULL };
|
1600
|
-
|
1710
|
+
|
1601
1711
|
ap_hook_post_config(init_module, NULL, NULL, APR_HOOK_MIDDLE);
|
1712
|
+
ap_hook_child_init(child_init, NULL, NULL, APR_HOOK_MIDDLE);
|
1713
|
+
|
1714
|
+
// The hooks here are defined in the order that they're called.
|
1602
1715
|
|
1603
1716
|
ap_hook_map_to_storage(prepare_request_when_in_high_performance_mode, NULL, NULL, APR_HOOK_FIRST);
|
1604
1717
|
ap_hook_map_to_storage(save_original_filename, NULL, NULL, APR_HOOK_LAST);
|