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
|
#!/usr/bin/env ruby
|
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,9 +22,10 @@
|
|
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
|
-
|
25
|
+
require 'socket'
|
26
|
+
|
27
|
+
SERVER_SOCKET_FD = 3
|
28
|
+
OWNER_SOCKET_FD = 4
|
28
29
|
|
29
30
|
begin
|
30
31
|
STDOUT.sync = true
|
@@ -34,31 +35,68 @@ begin
|
|
34
35
|
GC.copy_on_write_friendly = true
|
35
36
|
end
|
36
37
|
|
37
|
-
|
38
|
+
server_socket = UNIXServer.for_fd(SERVER_SOCKET_FD)
|
39
|
+
owner_socket = UNIXSocket.for_fd(OWNER_SOCKET_FD)
|
40
|
+
begin
|
41
|
+
socket_filename = owner_socket.readline.strip
|
42
|
+
socket_password = owner_socket.readline.strip
|
43
|
+
generation_path = owner_socket.readline.strip
|
44
|
+
logging_agent_address = owner_socket.readline.strip
|
45
|
+
logging_agent_username = owner_socket.readline.strip
|
46
|
+
logging_agent_password_base64 = owner_socket.readline.strip
|
47
|
+
node_name = owner_socket.readline.strip
|
48
|
+
log_level = owner_socket.readline.to_i
|
49
|
+
debug_log_file = owner_socket.readline.strip
|
50
|
+
rescue EOFError
|
51
|
+
exit
|
52
|
+
end
|
53
|
+
|
38
54
|
# Optimization for decreasing startup time. Since Apache starts the spawn
|
39
55
|
# server twice during startup, we don't want to load the Passenger classes
|
40
56
|
# if we don't need them.
|
41
|
-
#
|
57
|
+
# We check whether Apache immediately closes the connection. If so,
|
42
58
|
# we exit without loading the rest of Passenger. If Apache doesn't close
|
43
59
|
# the connection within 4 seconds then we continue with loading Passenger,
|
44
60
|
# so that loading doesn't happen during the first spawn.
|
45
61
|
begin
|
46
|
-
|
47
|
-
|
62
|
+
ios = select([server_socket, owner_socket], nil, nil, 4)
|
63
|
+
if ios
|
64
|
+
readable = ios[0]
|
65
|
+
if !readable.include?(server_socket) && readable.include?(owner_socket)
|
66
|
+
exit
|
67
|
+
end
|
48
68
|
end
|
49
69
|
rescue Interrupt
|
50
70
|
exit
|
51
71
|
end
|
52
72
|
|
53
|
-
|
73
|
+
source_root = File.expand_path(File.dirname(__FILE__) + "/..")
|
74
|
+
$LOAD_PATH.unshift("#{source_root}/lib")
|
75
|
+
require 'rubygems' rescue nil
|
76
|
+
require 'phusion_passenger'
|
77
|
+
require 'phusion_passenger/debug_logging'
|
78
|
+
require 'phusion_passenger/utils/tmpdir'
|
79
|
+
require 'phusion_passenger/native_support'
|
54
80
|
if defined?(PhusionPassenger::NativeSupport)
|
55
81
|
PhusionPassenger::NativeSupport.disable_stdio_buffering
|
56
82
|
end
|
57
|
-
PhusionPassenger::
|
83
|
+
PhusionPassenger::DebugLogging.log_level = log_level
|
84
|
+
PhusionPassenger::DebugLogging.log_file = debug_log_file
|
85
|
+
PhusionPassenger::Utils.passenger_tmpdir = generation_path
|
86
|
+
if logging_agent_address.empty?
|
87
|
+
options = {}
|
88
|
+
else
|
89
|
+
options = {
|
90
|
+
"logging_agent_address" => logging_agent_address,
|
91
|
+
"logging_agent_username" => logging_agent_username,
|
92
|
+
"logging_agent_password_base64" => logging_agent_password_base64,
|
93
|
+
"node_name" => node_name
|
94
|
+
}
|
95
|
+
end
|
58
96
|
|
59
97
|
require 'phusion_passenger/spawn_manager'
|
60
|
-
spawn_manager = PhusionPassenger::SpawnManager.new
|
61
|
-
spawn_manager.start_synchronously(
|
98
|
+
spawn_manager = PhusionPassenger::SpawnManager.new(options)
|
99
|
+
spawn_manager.start_synchronously(socket_filename, socket_password, server_socket, owner_socket)
|
62
100
|
spawn_manager.cleanup
|
63
101
|
rescue => e
|
64
102
|
require 'phusion_passenger/utils'
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
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
|
+
STDOUT.sync = true
|
26
|
+
STDERR.sync = true
|
27
|
+
|
28
|
+
require 'uri'
|
29
|
+
url = ARGV[0]
|
30
|
+
begin
|
31
|
+
uri = URI.parse(url)
|
32
|
+
rescue URI::InvaludURIError
|
33
|
+
STDERR.puts "*** ERROR: '#{url}' is not a valid URL."
|
34
|
+
exit 1
|
35
|
+
end
|
36
|
+
if uri.scheme.nil? || uri.host.nil? || uri.port.nil? || uri.path.nil?
|
37
|
+
STDERR.puts "*** ERROR: '#{url}' is not a valid URL."
|
38
|
+
exit 1
|
39
|
+
end
|
40
|
+
|
41
|
+
require 'socket'
|
42
|
+
path = uri.path.empty? ? "/" : uri.path
|
43
|
+
socket = TCPSocket.new('127.0.0.1', uri.port)
|
44
|
+
if uri.scheme == 'https'
|
45
|
+
require 'openssl'
|
46
|
+
socket = OpenSSL::SSL::SSLSocket.new(socket)
|
47
|
+
socket.sync_close = true
|
48
|
+
socket.connect
|
49
|
+
end
|
50
|
+
begin
|
51
|
+
socket.write("HEAD #{path} HTTP/1.1\r\n")
|
52
|
+
socket.write("Host: #{uri.host}\r\n")
|
53
|
+
socket.write("Connection: close\r\n")
|
54
|
+
socket.write("\r\n")
|
55
|
+
if socket.respond_to?(:close_write)
|
56
|
+
socket.close_write
|
57
|
+
socket.read
|
58
|
+
else
|
59
|
+
socket.readline
|
60
|
+
end
|
61
|
+
ensure
|
62
|
+
socket.close
|
63
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# Phusion Passenger - http://www.modrails.com/
|
2
|
+
# Copyright (c) 2010 Phusion
|
3
|
+
#
|
4
|
+
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
5
|
+
#
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
# of this software and associated documentation files (the "Software"), to deal
|
8
|
+
# in the Software without restriction, including without limitation the rights
|
9
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
# copies of the Software, and to permit persons to whom the Software is
|
11
|
+
# furnished to do so, subject to the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be included in
|
14
|
+
# all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
# THE SOFTWARE.
|
23
|
+
|
24
|
+
module PhusionPassenger
|
25
|
+
###### Version numbers ######
|
26
|
+
|
27
|
+
# Phusion Passenger version number. Don't forget to edit ext/common/Constants.h too.
|
28
|
+
VERSION_STRING = '3.0.0.pre1'
|
29
|
+
|
30
|
+
PREFERRED_NGINX_VERSION = '0.7.67'
|
31
|
+
PREFERRED_PCRE_VERSION = '8.02'
|
32
|
+
STANDALONE_INTERFACE_VERSION = 1
|
33
|
+
|
34
|
+
|
35
|
+
###### Directories ######
|
36
|
+
# Don't forget to modify ext/common/ResourceLocator.h too.
|
37
|
+
|
38
|
+
# Returns whether this Phusion Passenger installation is packaged
|
39
|
+
# using the OS's native package management system, i.e. as opposed
|
40
|
+
# to being installed from source or with RubyGems.
|
41
|
+
def self.natively_packaged?
|
42
|
+
if !defined?(@natively_packaged)
|
43
|
+
@natively_packaged = !File.exist?("#{LIBDIR}/../Rakefile") ||
|
44
|
+
!File.exist?("#{LIBDIR}/../DEVELOPERS.TXT")
|
45
|
+
end
|
46
|
+
return @natively_packaged
|
47
|
+
end
|
48
|
+
|
49
|
+
NATIVELY_PACKAGED_SOURCE_ROOT = "/usr/share/phusion-passenger/source"
|
50
|
+
NATIVELY_PACKAGED_NATIVE_SUPPORT_DIR = "/usr/lib/phusion-passenger/native_support/#{VERSION_STRING}"
|
51
|
+
NATIVELY_PACKAGED_DOCDIR = "/usr/share/doc/phusion-passenger"
|
52
|
+
NATIVELY_PACKAGED_AGENTS_DIR = "/usr/lib/phusion-passenger/agents"
|
53
|
+
NATIVELY_PACKAGED_HELPER_SCRIPTS_DIR = "/usr/share/phusion-passenger/helper-scripts"
|
54
|
+
NATIVELY_PACKAGED_APACHE2_MODULE = "/usr/lib/apache2/modules/mod_passenger.so"
|
55
|
+
|
56
|
+
# Directory containing the Phusion Passenger Ruby libraries.
|
57
|
+
LIBDIR = File.expand_path(File.dirname(__FILE__))
|
58
|
+
|
59
|
+
# Directory containing templates.
|
60
|
+
TEMPLATES_DIR = File.join(LIBDIR, "phusion_passenger", "templates")
|
61
|
+
|
62
|
+
# Subdirectory under $HOME to use for storing resource files.
|
63
|
+
LOCAL_DIR = ".passenger"
|
64
|
+
|
65
|
+
# Directories in which to look for plugins.
|
66
|
+
PLUGIN_DIRS = ["/usr/share/phusion-passenger/plugins",
|
67
|
+
"/usr/local/share/phusion-passenger/plugins",
|
68
|
+
"~/#{LOCAL_DIR}/plugins"]
|
69
|
+
|
70
|
+
# Directory under $HOME for storing Phusion Passenger Standalone resource files.
|
71
|
+
LOCAL_STANDALONE_RESOURCE_DIR = File.join(LOCAL_DIR, "standalone")
|
72
|
+
|
73
|
+
# System-wide directory for storing Phusion Passenger Standalone resource files.
|
74
|
+
GLOBAL_STANDALONE_RESOURCE_DIR = "/var/lib/passenger-standalone"
|
75
|
+
|
76
|
+
if !natively_packaged?
|
77
|
+
# Top directory of the Phusion Passenger source code.
|
78
|
+
SOURCE_ROOT = File.expand_path(File.join(LIBDIR, ".."))
|
79
|
+
|
80
|
+
# Directory containing #{archdir}/native_support.so.
|
81
|
+
NATIVE_SUPPORT_DIR = File.join(SOURCE_ROOT, "ext", "phusion_passenger")
|
82
|
+
|
83
|
+
# Documentation directory.
|
84
|
+
DOCDIR = File.join(SOURCE_ROOT, "doc")
|
85
|
+
|
86
|
+
# Directory containing Phusion Passenger agent executables.
|
87
|
+
AGENTS_DIR = File.join(SOURCE_ROOT, "agents")
|
88
|
+
|
89
|
+
# Directory containing Phusion Passenger helper scripts.
|
90
|
+
HELPER_SCRIPTS_DIR = File.join(SOURCE_ROOT, "helper-scripts")
|
91
|
+
|
92
|
+
# Location of the Apache 2 module.
|
93
|
+
APACHE2_MODULE = File.join(SOURCE_ROOT, "ext", "apache2", "mod_passenger.so")
|
94
|
+
else
|
95
|
+
SOURCE_ROOT = NATIVELY_PACKAGED_SOURCE_DIR
|
96
|
+
NATIVE_SUPPORT_DIR = NATIVELY_PACKAGED_NATIVE_SUPPORT_DIR
|
97
|
+
DOCDIR = NATIVELY_PACKAGED_DOCDIR
|
98
|
+
AGENTS_DIR = NATIVELY_PACKAGED_AGENTS_DIR
|
99
|
+
HELPER_SCRIPTS_DIR = NATIVELY_PACKAGED_HELPER_SCRIPTS_DIR
|
100
|
+
APACHE2_MODULE = NATIVELY_PACKAGED_APACHE2_MODULE
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
###### Other resource locations ######
|
105
|
+
|
106
|
+
STANDALONE_BINARIES_URL_ROOT = "http://standalone-binaries.modrails.com"
|
107
|
+
|
108
|
+
|
109
|
+
if $LOAD_PATH.first != LIBDIR
|
110
|
+
$LOAD_PATH.unshift(LIBDIR)
|
111
|
+
$LOAD_PATH.uniq!
|
112
|
+
end
|
113
|
+
end if !defined?(PhusionPassenger::LIBDIR)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Phusion Passenger - http://www.modrails.com/
|
2
|
-
# Copyright (c)
|
2
|
+
# Copyright (c) 2010 Phusion
|
3
3
|
#
|
4
4
|
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
5
5
|
#
|
@@ -21,32 +21,57 @@
|
|
21
21
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
22
|
# THE SOFTWARE.
|
23
23
|
|
24
|
+
require 'phusion_passenger'
|
24
25
|
require 'phusion_passenger/constants'
|
25
|
-
require 'phusion_passenger/packaging'
|
26
26
|
require 'phusion_passenger/console_text_template'
|
27
|
+
require 'phusion_passenger/platform_info'
|
28
|
+
|
29
|
+
# IMPORTANT: do not directly or indirectly require native_support; we can't compile
|
30
|
+
# it yet until we have a compiler, and installers usually check whether a compiler
|
31
|
+
# is installed.
|
27
32
|
|
28
33
|
module PhusionPassenger
|
29
34
|
|
30
|
-
# Abstract base class for installers. Used by
|
31
|
-
# and passenger-install-nginx-module.
|
35
|
+
# Abstract base class for text mode installers. Used by
|
36
|
+
# passenger-install-apache2-module and passenger-install-nginx-module.
|
37
|
+
#
|
38
|
+
# Subclasses must at least implement the #install! method which handles
|
39
|
+
# the installation itself.
|
40
|
+
#
|
41
|
+
# Usage:
|
42
|
+
#
|
43
|
+
# installer = ConcereteInstallerClass.new(options...)
|
44
|
+
# installer.start
|
32
45
|
class AbstractInstaller
|
33
46
|
PASSENGER_WEBSITE = "http://www.modrails.com/"
|
34
47
|
PHUSION_WEBSITE = "www.phusion.nl"
|
35
48
|
|
49
|
+
# Create an AbstractInstaller. All options will be stored as instance
|
50
|
+
# variables, for example:
|
51
|
+
#
|
52
|
+
# installer = AbstractInstaller.new(:foo => "bar")
|
53
|
+
# installer.instance_variable_get(:"@foo") # => "bar"
|
36
54
|
def initialize(options = {})
|
37
55
|
options.each_pair do |key, value|
|
38
56
|
instance_variable_set(:"@#{key}", value)
|
39
57
|
end
|
40
58
|
end
|
41
59
|
|
60
|
+
# Start the installation by calling the #install! method.
|
42
61
|
def start
|
62
|
+
before_install
|
43
63
|
install!
|
44
64
|
ensure
|
45
|
-
|
65
|
+
after_install
|
46
66
|
end
|
47
67
|
|
48
68
|
private
|
49
|
-
def
|
69
|
+
def before_install
|
70
|
+
# Hook for subclasses.
|
71
|
+
end
|
72
|
+
|
73
|
+
def after_install
|
74
|
+
# Reset terminal colors.
|
50
75
|
STDOUT.write("\e[0m")
|
51
76
|
STDOUT.flush
|
52
77
|
end
|
@@ -127,8 +152,8 @@ private
|
|
127
152
|
return []
|
128
153
|
end
|
129
154
|
|
130
|
-
def check_dependencies
|
131
|
-
new_screen
|
155
|
+
def check_dependencies(show_new_screen = true)
|
156
|
+
new_screen if show_new_screen
|
132
157
|
missing_dependencies = []
|
133
158
|
color_puts "<banner>Checking for required software...</banner>"
|
134
159
|
puts
|
@@ -168,16 +193,21 @@ private
|
|
168
193
|
print_dependency_installation_instructions(dep)
|
169
194
|
puts
|
170
195
|
end
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
196
|
+
if respond_to?(:users_guide)
|
197
|
+
color_puts "If the aforementioned instructions didn't solve your problem, then please take"
|
198
|
+
color_puts "a look at the Users Guide:"
|
199
|
+
puts
|
200
|
+
color_puts " <yellow>#{users_guide}</yellow>"
|
201
|
+
end
|
175
202
|
return false
|
176
203
|
end
|
177
204
|
end
|
178
205
|
|
179
206
|
def print_dependency_installation_instructions(dep)
|
180
207
|
color_puts " * To install <yellow>#{dep.name}</yellow>:"
|
208
|
+
if dep.install_comments
|
209
|
+
color_puts " " << dep.install_comments
|
210
|
+
end
|
181
211
|
if !dep.install_command.nil?
|
182
212
|
color_puts " Please run <b>#{dep.install_command}</b> as root."
|
183
213
|
elsif !dep.install_instructions.nil?
|
@@ -191,6 +221,14 @@ private
|
|
191
221
|
color_puts " Search Google."
|
192
222
|
end
|
193
223
|
end
|
224
|
+
|
225
|
+
def download(url, output)
|
226
|
+
if PlatformInfo.find_command("wget")
|
227
|
+
return sh("wget", "-O", output, url)
|
228
|
+
else
|
229
|
+
return sh("curl", url, "-L", "-o", output)
|
230
|
+
end
|
231
|
+
end
|
194
232
|
end
|
195
233
|
|
196
234
|
end # module PhusionPassenger
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: binary
|
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
|
#
|
@@ -24,9 +24,17 @@
|
|
24
24
|
|
25
25
|
require 'socket'
|
26
26
|
require 'fcntl'
|
27
|
+
require 'phusion_passenger'
|
28
|
+
require 'phusion_passenger/constants'
|
29
|
+
require 'phusion_passenger/public_api'
|
27
30
|
require 'phusion_passenger/message_channel'
|
31
|
+
require 'phusion_passenger/message_client'
|
32
|
+
require 'phusion_passenger/debug_logging'
|
28
33
|
require 'phusion_passenger/utils'
|
29
|
-
require 'phusion_passenger/
|
34
|
+
require 'phusion_passenger/utils/tmpdir'
|
35
|
+
require 'phusion_passenger/utils/unseekable_socket'
|
36
|
+
require 'phusion_passenger/native_support'
|
37
|
+
|
30
38
|
module PhusionPassenger
|
31
39
|
|
32
40
|
# The request handler is the layer which connects Apache with the underlying application's
|
@@ -87,31 +95,44 @@ module PhusionPassenger
|
|
87
95
|
# The web server transforms the HTTP request to the aforementioned format,
|
88
96
|
# and sends it to the request handler.
|
89
97
|
class AbstractRequestHandler
|
98
|
+
include DebugLogging
|
99
|
+
|
90
100
|
# Signal which will cause the Rails application to exit immediately.
|
91
101
|
HARD_TERMINATION_SIGNAL = "SIGTERM"
|
92
102
|
# Signal which will cause the Rails application to exit as soon as it's done processing a request.
|
93
103
|
SOFT_TERMINATION_SIGNAL = "SIGUSR1"
|
94
|
-
BACKLOG_SIZE =
|
104
|
+
BACKLOG_SIZE = 500
|
95
105
|
MAX_HEADER_SIZE = 128 * 1024
|
96
106
|
|
97
107
|
# String constants which exist to relieve Ruby's garbage collector.
|
98
108
|
IGNORE = 'IGNORE' # :nodoc:
|
99
109
|
DEFAULT = 'DEFAULT' # :nodoc:
|
100
|
-
NULL = "\0" # :nodoc:
|
101
110
|
X_POWERED_BY = 'X-Powered-By' # :nodoc:
|
102
111
|
REQUEST_METHOD = 'REQUEST_METHOD' # :nodoc:
|
103
|
-
PING = '
|
112
|
+
PING = 'PING' # :nodoc:
|
113
|
+
PASSENGER_CONNECT_PASSWORD = "PASSENGER_CONNECT_PASSWORD" # :nodoc:
|
104
114
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
attr_reader :socket_name
|
115
|
+
OBJECT_SPACE_SUPPORTS_LIVE_OBJECTS = ObjectSpace.respond_to?(:live_objects)
|
116
|
+
OBJECT_SPACE_SUPPORTS_ALLOCATED_OBJECTS = ObjectSpace.respond_to?(:allocated_objects)
|
117
|
+
OBJECT_SPACE_SUPPORTS_COUNT_OBJECTS = ObjectSpace.respond_to?(:count_objects)
|
118
|
+
GC_SUPPORTS_TIME = GC.respond_to?(:time)
|
119
|
+
GC_SUPPORTS_CLEAR_STATS = GC.respond_to?(:clear_stats)
|
111
120
|
|
112
|
-
#
|
113
|
-
#
|
114
|
-
|
121
|
+
# A hash containing all server sockets that this request handler listens on.
|
122
|
+
# The hash is in the form of:
|
123
|
+
#
|
124
|
+
# {
|
125
|
+
# name1 => [socket_address1, socket_type1, socket1],
|
126
|
+
# name2 => [socket_address2, socket_type2, socket2],
|
127
|
+
# ...
|
128
|
+
# }
|
129
|
+
#
|
130
|
+
# +name+ is a Symbol. +socket_addressx+ is the address of the socket,
|
131
|
+
# +socket_typex+ is the socket's type (either 'unix' or 'tcp') and
|
132
|
+
# +socketx+ is the actual socket IO objec.
|
133
|
+
# There's guaranteed to be at least one server socket, namely one with the
|
134
|
+
# name +:main+.
|
135
|
+
attr_reader :server_sockets
|
115
136
|
|
116
137
|
# Specifies the maximum allowed memory usage, in MB. If after having processed
|
117
138
|
# a request AbstractRequestHandler detects that memory usage has risen above
|
@@ -129,27 +150,64 @@ class AbstractRequestHandler
|
|
129
150
|
# exceptions.
|
130
151
|
attr_reader :processed_requests
|
131
152
|
|
153
|
+
# If a soft termination signal was received, then the main loop will quit
|
154
|
+
# the given amount of seconds after the last time a connection was accepted.
|
155
|
+
# Defaults to 3 seconds.
|
156
|
+
attr_accessor :soft_termination_linger_time
|
157
|
+
|
158
|
+
# A password with which clients must authenticate. Default is unauthenticated.
|
159
|
+
attr_accessor :connect_password
|
160
|
+
|
132
161
|
# Create a new RequestHandler with the given owner pipe.
|
133
162
|
# +owner_pipe+ must be the readable part of a pipe IO object.
|
134
163
|
#
|
135
164
|
# Additionally, the following options may be given:
|
136
165
|
# - memory_limit: Used to set the +memory_limit+ attribute.
|
166
|
+
# - detach_key
|
167
|
+
# - connect_password
|
168
|
+
# - pool_account_username
|
169
|
+
# - pool_account_password_base64
|
137
170
|
def initialize(owner_pipe, options = {})
|
171
|
+
@server_sockets = {}
|
172
|
+
|
138
173
|
if should_use_unix_sockets?
|
139
|
-
create_unix_socket_on_filesystem
|
174
|
+
@main_socket_address, @main_socket = create_unix_socket_on_filesystem
|
175
|
+
@server_sockets[:main] = [@main_socket_address, 'unix', @main_socket]
|
140
176
|
else
|
141
|
-
create_tcp_socket
|
177
|
+
@main_socket_address, @main_socket = create_tcp_socket
|
178
|
+
@server_sockets[:main] = [@main_socket_address, 'tcp', @main_socket]
|
142
179
|
end
|
143
|
-
|
180
|
+
|
181
|
+
@http_socket_address, @http_socket = create_tcp_socket
|
182
|
+
@server_sockets[:http] = [@http_socket_address, 'tcp', @http_socket]
|
183
|
+
|
144
184
|
@owner_pipe = owner_pipe
|
185
|
+
@options = options
|
145
186
|
@previous_signal_handlers = {}
|
146
187
|
@main_loop_generation = 0
|
147
188
|
@main_loop_thread_lock = Mutex.new
|
148
189
|
@main_loop_thread_cond = ConditionVariable.new
|
149
|
-
@memory_limit
|
150
|
-
@
|
190
|
+
@memory_limit = options["memory_limit"] || 0
|
191
|
+
@connect_password = options["connect_password"]
|
192
|
+
@detach_key = options["detach_key"]
|
193
|
+
@pool_account_username = options["pool_account_username"]
|
194
|
+
if options["pool_account_password_base64"]
|
195
|
+
@pool_account_password = options["pool_account_password_base64"].unpack('m').first
|
196
|
+
end
|
197
|
+
@analytics_logger = options["analytics_logger"]
|
198
|
+
@iterations = 0
|
151
199
|
@processed_requests = 0
|
152
|
-
@
|
200
|
+
@soft_termination_linger_time = 3
|
201
|
+
@main_loop_running = false
|
202
|
+
@passenger_header = determine_passenger_header
|
203
|
+
|
204
|
+
@debugger = @options["debugger"]
|
205
|
+
if @debugger
|
206
|
+
@server_sockets[:ruby_debug_cmd] = ["127.0.0.1:#{Debugger.cmd_port}", 'tcp']
|
207
|
+
@server_sockets[:ruby_debug_ctrl] = ["127.0.0.1:#{Debugger.ctrl_port}", 'tcp']
|
208
|
+
end
|
209
|
+
|
210
|
+
#############
|
153
211
|
end
|
154
212
|
|
155
213
|
# Clean up temporary stuff created by the request handler.
|
@@ -166,9 +224,14 @@ class AbstractRequestHandler
|
|
166
224
|
end
|
167
225
|
@main_loop_thread.join
|
168
226
|
end
|
169
|
-
@
|
227
|
+
@server_sockets.each_value do |value|
|
228
|
+
address, type, socket = value
|
229
|
+
socket.close rescue nil
|
230
|
+
if type == 'unix'
|
231
|
+
File.unlink(address) rescue nil
|
232
|
+
end
|
233
|
+
end
|
170
234
|
@owner_pipe.close rescue nil
|
171
|
-
File.unlink(@socket_name) rescue nil
|
172
235
|
end
|
173
236
|
|
174
237
|
# Check whether the main loop's currently running.
|
@@ -178,6 +241,7 @@ class AbstractRequestHandler
|
|
178
241
|
|
179
242
|
# Enter the request handler's main loop.
|
180
243
|
def main_loop
|
244
|
+
debug("Entering request handler main loop")
|
181
245
|
reset_signal_handlers
|
182
246
|
begin
|
183
247
|
@graceful_termination_pipe = IO.pipe
|
@@ -188,52 +252,53 @@ class AbstractRequestHandler
|
|
188
252
|
@main_loop_generation += 1
|
189
253
|
@main_loop_running = true
|
190
254
|
@main_loop_thread_cond.broadcast
|
255
|
+
|
256
|
+
@select_timeout = nil
|
257
|
+
|
258
|
+
@selectable_sockets = []
|
259
|
+
@server_sockets.each_value do |value|
|
260
|
+
socket = value[2]
|
261
|
+
@selectable_sockets << socket if socket
|
262
|
+
end
|
263
|
+
@selectable_sockets << @owner_pipe
|
264
|
+
@selectable_sockets << @graceful_termination_pipe[0]
|
191
265
|
end
|
192
266
|
|
193
267
|
install_useful_signal_handlers
|
268
|
+
socket_wrapper = Utils::UnseekableSocket.new
|
269
|
+
channel = MessageChannel.new
|
270
|
+
buffer = ''
|
194
271
|
|
195
272
|
while true
|
196
273
|
@iterations += 1
|
197
|
-
|
198
|
-
|
274
|
+
if !accept_and_process_next_request(socket_wrapper, channel, buffer)
|
275
|
+
trace(2, "Request handler main loop exited normally")
|
199
276
|
break
|
200
277
|
end
|
201
|
-
begin
|
202
|
-
headers, input = parse_request(client)
|
203
|
-
if headers
|
204
|
-
if headers[REQUEST_METHOD] == PING
|
205
|
-
process_ping(headers, input, client)
|
206
|
-
else
|
207
|
-
process_request(headers, input, client)
|
208
|
-
end
|
209
|
-
end
|
210
|
-
rescue IOError, SocketError, SystemCallError => e
|
211
|
-
print_exception("Passenger RequestHandler", e)
|
212
|
-
ensure
|
213
|
-
# 'input' is the same as 'client' so we don't
|
214
|
-
# need to close that.
|
215
|
-
# The 'close_write' here prevents forked child
|
216
|
-
# processes from unintentionally keeping the
|
217
|
-
# connection open.
|
218
|
-
client.close_write rescue nil
|
219
|
-
client.close rescue nil
|
220
|
-
end
|
221
278
|
@processed_requests += 1
|
222
279
|
end
|
223
280
|
rescue EOFError
|
224
281
|
# Exit main loop.
|
282
|
+
trace(2, "Request handler main loop interrupted by EOFError exception")
|
225
283
|
rescue Interrupt
|
226
284
|
# Exit main loop.
|
285
|
+
trace(2, "Request handler main loop interrupted by Interrupt exception")
|
227
286
|
rescue SignalException => signal
|
287
|
+
trace(2, "Request handler main loop interrupted by SignalException")
|
228
288
|
if signal.message != HARD_TERMINATION_SIGNAL &&
|
229
289
|
signal.message != SOFT_TERMINATION_SIGNAL
|
230
290
|
raise
|
231
291
|
end
|
292
|
+
rescue Exception => e
|
293
|
+
trace(2, "Request handler main loop interrupted by #{e.class} exception")
|
294
|
+
raise
|
232
295
|
ensure
|
296
|
+
debug("Exiting request handler main loop")
|
233
297
|
revert_signal_handlers
|
234
298
|
@main_loop_thread_lock.synchronize do
|
235
|
-
@graceful_termination_pipe[0].close rescue nil
|
236
299
|
@graceful_termination_pipe[1].close rescue nil
|
300
|
+
@graceful_termination_pipe[0].close rescue nil
|
301
|
+
@selectable_sockets = []
|
237
302
|
@main_loop_generation += 1
|
238
303
|
@main_loop_running = false
|
239
304
|
@main_loop_thread_cond.broadcast
|
@@ -245,7 +310,11 @@ class AbstractRequestHandler
|
|
245
310
|
def start_main_loop_thread
|
246
311
|
current_generation = @main_loop_generation
|
247
312
|
@main_loop_thread = Thread.new do
|
248
|
-
|
313
|
+
begin
|
314
|
+
main_loop
|
315
|
+
rescue Exception => e
|
316
|
+
print_exception(self.class, e)
|
317
|
+
end
|
249
318
|
end
|
250
319
|
@main_loop_thread_lock.synchronize do
|
251
320
|
while @main_loop_generation == current_generation
|
@@ -253,39 +322,75 @@ class AbstractRequestHandler
|
|
253
322
|
end
|
254
323
|
end
|
255
324
|
end
|
325
|
+
|
326
|
+
# Remove this request handler from the application pool so that no
|
327
|
+
# new connections will come in. Then make the main loop quit a few
|
328
|
+
# seconds after the last time a connection came in. This all is to
|
329
|
+
# ensure that no connections come in while we're shutting down.
|
330
|
+
#
|
331
|
+
# May only be called while the main loop is running. May be called
|
332
|
+
# from any thread.
|
333
|
+
def soft_shutdown
|
334
|
+
@select_timeout = @soft_termination_linger_time
|
335
|
+
@graceful_termination_pipe[1].close rescue nil
|
336
|
+
if @detach_key && @pool_account_username && @pool_account_password
|
337
|
+
client = MessageClient.new(@pool_account_username, @pool_account_password)
|
338
|
+
begin
|
339
|
+
client.detach(@detach_key)
|
340
|
+
ensure
|
341
|
+
client.close
|
342
|
+
end
|
343
|
+
end
|
344
|
+
end
|
256
345
|
|
257
346
|
private
|
258
347
|
include Utils
|
259
348
|
|
260
349
|
def should_use_unix_sockets?
|
261
|
-
#
|
262
|
-
#
|
263
|
-
#
|
264
|
-
#
|
265
|
-
#
|
266
|
-
|
350
|
+
# Historical note:
|
351
|
+
# There seems to be a bug in MacOS X Leopard w.r.t. Unix server
|
352
|
+
# sockets file descriptors that are passed to another process.
|
353
|
+
# Usually Unix server sockets work fine, but when they're passed
|
354
|
+
# to another process, then clients that connect to the socket
|
355
|
+
# can incorrectly determine that the client socket is closed,
|
356
|
+
# even though that's not actually the case. More specifically:
|
357
|
+
# recv()/read() calls on these client sockets can return 0 even
|
358
|
+
# when we know EOF is not reached.
|
359
|
+
#
|
360
|
+
# The ApplicationPool infrastructure used to connect to a backend
|
361
|
+
# process's Unix socket in the helper server process, and then
|
362
|
+
# pass the connection file descriptor to the web server, which
|
363
|
+
# triggers this kernel bug. We used to work around this by using
|
364
|
+
# TCP sockets instead of Unix sockets; TCP sockets can still fail
|
365
|
+
# with this fake-EOF bug once in a while, but not nearly as often
|
366
|
+
# as with Unix sockets.
|
367
|
+
#
|
368
|
+
# This problem no longer applies today. The client socket is now
|
369
|
+
# created directly in the web server, and the bug is no longer
|
370
|
+
# triggered. Nevertheless, we keep this function intact so that
|
371
|
+
# if something like this ever happens again, we know why, and we
|
372
|
+
# can easily reactivate the workaround. Or maybe if we just need
|
373
|
+
# TCP sockets for some other reason.
|
374
|
+
|
375
|
+
#return RUBY_PLATFORM !~ /darwin/
|
376
|
+
return true
|
267
377
|
end
|
268
378
|
|
269
379
|
def create_unix_socket_on_filesystem
|
270
|
-
|
271
|
-
while !done
|
380
|
+
while true
|
272
381
|
begin
|
273
382
|
if defined?(NativeSupport)
|
274
383
|
unix_path_max = NativeSupport::UNIX_PATH_MAX
|
275
384
|
else
|
276
385
|
unix_path_max = 100
|
277
386
|
end
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
File.chmod(
|
284
|
-
|
285
|
-
# The SpawnManager class will set tighter permissions on the
|
286
|
-
# socket later on. See sendSpawnCommand in SpawnManager.h.
|
287
|
-
|
288
|
-
done = true
|
387
|
+
socket_address = "#{passenger_tmpdir}/backends/ruby.#{generate_random_id(:base64)}"
|
388
|
+
socket_address = socket_address.slice(0, unix_path_max - 1)
|
389
|
+
socket = UNIXServer.new(socket_address)
|
390
|
+
socket.listen(BACKLOG_SIZE)
|
391
|
+
socket.close_on_exec!
|
392
|
+
File.chmod(0666, socket_address)
|
393
|
+
return [socket_address, socket]
|
289
394
|
rescue Errno::EADDRINUSE
|
290
395
|
# Do nothing, try again with another name.
|
291
396
|
end
|
@@ -295,10 +400,11 @@ private
|
|
295
400
|
def create_tcp_socket
|
296
401
|
# We use "127.0.0.1" as address in order to force
|
297
402
|
# TCPv4 instead of TCPv6.
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
403
|
+
socket = TCPServer.new('127.0.0.1', 0)
|
404
|
+
socket.listen(BACKLOG_SIZE)
|
405
|
+
socket.close_on_exec!
|
406
|
+
socket_address = "127.0.0.1:#{socket.addr[1]}"
|
407
|
+
return [socket_address, socket]
|
302
408
|
end
|
303
409
|
|
304
410
|
# Reset signal handlers to their default handler, and install some
|
@@ -323,7 +429,11 @@ private
|
|
323
429
|
trappable_signals = Signal.list_trappable
|
324
430
|
|
325
431
|
trap(SOFT_TERMINATION_SIGNAL) do
|
326
|
-
|
432
|
+
begin
|
433
|
+
soft_shutdown
|
434
|
+
rescue => e
|
435
|
+
print_exception("Passenger RequestHandler soft shutdown routine", e)
|
436
|
+
end
|
327
437
|
end if trappable_signals.has_key?(SOFT_TERMINATION_SIGNAL.sub(/^SIG/, ''))
|
328
438
|
|
329
439
|
trap('ABRT') do
|
@@ -331,31 +441,7 @@ private
|
|
331
441
|
end if trappable_signals.has_key?('ABRT')
|
332
442
|
|
333
443
|
trap('QUIT') do
|
334
|
-
|
335
|
-
output = "========== Process #{Process.pid}: backtrace dump ==========\n"
|
336
|
-
caller_for_all_threads.each_pair do |thread, stack|
|
337
|
-
output << ("-" * 60) << "\n"
|
338
|
-
output << "# Thread: #{thread.inspect}, "
|
339
|
-
if thread == Thread.main
|
340
|
-
output << "[main thread], "
|
341
|
-
end
|
342
|
-
if thread == Thread.current
|
343
|
-
output << "[current thread], "
|
344
|
-
end
|
345
|
-
output << "alive = #{thread.alive?}\n"
|
346
|
-
output << ("-" * 60) << "\n"
|
347
|
-
output << " " << stack.join("\n ")
|
348
|
-
output << "\n\n"
|
349
|
-
end
|
350
|
-
else
|
351
|
-
output = "========== Process #{Process.pid}: backtrace dump ==========\n"
|
352
|
-
output << ("-" * 60) << "\n"
|
353
|
-
output << "# Current thread: #{Thread.current.inspect}\n"
|
354
|
-
output << ("-" * 60) << "\n"
|
355
|
-
output << " " << caller.join("\n ")
|
356
|
-
end
|
357
|
-
STDERR.puts(output)
|
358
|
-
STDERR.flush
|
444
|
+
warn(global_backtrace_report)
|
359
445
|
end if trappable_signals.has_key?('QUIT')
|
360
446
|
end
|
361
447
|
|
@@ -365,58 +451,106 @@ private
|
|
365
451
|
end
|
366
452
|
end
|
367
453
|
|
368
|
-
def
|
369
|
-
|
370
|
-
if
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
# skip fwrite() and use write() instead. So here we set
|
391
|
-
# 'sync' to true in the hope that this will work around
|
392
|
-
# the problem.
|
393
|
-
client.sync = true
|
394
|
-
|
395
|
-
# We monkeypatch the 'sync=' method to a no-op so that
|
396
|
-
# sync mode can't be disabled.
|
397
|
-
def client.sync=(value)
|
398
|
-
end
|
399
|
-
|
400
|
-
# The real input stream is not seekable (calling _seek_
|
401
|
-
# or _rewind_ on it will raise an exception). But some
|
402
|
-
# frameworks (e.g. Merb) call _rewind_ if the object
|
403
|
-
# responds to it. So we simply undefine _seek_ and
|
404
|
-
# _rewind_.
|
405
|
-
client.instance_eval do
|
406
|
-
undef seek if respond_to?(:seek)
|
407
|
-
undef rewind if respond_to?(:rewind)
|
408
|
-
end
|
409
|
-
|
410
|
-
# There's no need to set the encoding for Ruby 1.9 because this
|
411
|
-
# source file is tagged with 'encoding: binary'.
|
412
|
-
|
413
|
-
return client
|
454
|
+
def accept_and_process_next_request(socket_wrapper, channel, buffer)
|
455
|
+
select_result = select(@selectable_sockets, nil, nil, @select_timeout)
|
456
|
+
if select_result.nil?
|
457
|
+
# This can only happen after we've received a soft termination
|
458
|
+
# signal. No connection was accepted for @select_timeout seconds,
|
459
|
+
# so now we quit the main loop.
|
460
|
+
trace(2, "Soft termination timeout")
|
461
|
+
return false
|
462
|
+
end
|
463
|
+
|
464
|
+
ios = select_result.first
|
465
|
+
if ios.include?(@main_socket)
|
466
|
+
trace(3, "Accepting new request on main socket")
|
467
|
+
connection = socket_wrapper.wrap(@main_socket.accept)
|
468
|
+
channel.io = connection
|
469
|
+
headers, input_stream = parse_native_request(connection, channel, buffer)
|
470
|
+
full_http_response = false
|
471
|
+
elsif ios.include?(@http_socket)
|
472
|
+
trace(3, "Accepting new request on HTTP socket")
|
473
|
+
connection = socket_wrapper.wrap(@http_socket.accept)
|
474
|
+
headers, input_stream = parse_http_request(connection)
|
475
|
+
full_http_response = true
|
414
476
|
else
|
415
477
|
# The other end of the owner pipe has been closed, or the
|
416
478
|
# graceful termination pipe has been closed. This is our
|
417
479
|
# call to gracefully terminate (after having processed all
|
418
480
|
# incoming requests).
|
419
|
-
|
481
|
+
if @select_timeout
|
482
|
+
# But if @select_timeout is set then it means that we
|
483
|
+
# received a soft termination signal. In that case
|
484
|
+
# we don't want to quit immediately, but @select_timeout
|
485
|
+
# seconds after the last time a connection was accepted.
|
486
|
+
#
|
487
|
+
# #soft_shutdown not only closes the graceful termination
|
488
|
+
# pipe, but it also tells the application pool to remove
|
489
|
+
# this process from the pool, which will cause the owner
|
490
|
+
# pipe to be closed. So we remove both IO objects
|
491
|
+
# from @selectable_sockets in order to prevent the
|
492
|
+
# next select call from immediately returning, allowing
|
493
|
+
# it to time out.
|
494
|
+
@selectable_sockets.delete(@graceful_termination_pipe[0])
|
495
|
+
@selectable_sockets.delete(@owner_pipe)
|
496
|
+
return true
|
497
|
+
else
|
498
|
+
if ios.include?(@owner_pipe)
|
499
|
+
trace(2, "Owner pipe closed")
|
500
|
+
elsif ios.include?(@graceful_termination_pipe[0])
|
501
|
+
trace(2, "Graceful termination pipe closed")
|
502
|
+
end
|
503
|
+
return false
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
507
|
+
if headers
|
508
|
+
prepare_request(headers)
|
509
|
+
begin
|
510
|
+
if headers[REQUEST_METHOD] == PING
|
511
|
+
process_ping(headers, input_stream, connection)
|
512
|
+
else
|
513
|
+
process_request(headers, input_stream, connection, full_http_response)
|
514
|
+
end
|
515
|
+
rescue Exception
|
516
|
+
has_error = true
|
517
|
+
raise
|
518
|
+
ensure
|
519
|
+
finalize_request(headers, has_error)
|
520
|
+
end
|
521
|
+
end
|
522
|
+
return true
|
523
|
+
rescue => e
|
524
|
+
if socket_wrapper.source_of_exception?(e)
|
525
|
+
# EPIPE is harmless, it just means that the client closed the connection.
|
526
|
+
# Other errors might indicate a problem so we print them, but they're
|
527
|
+
# probably not bad enough to warrant stopping the request handler.
|
528
|
+
if !e.is_a?(Errno::EPIPE)
|
529
|
+
print_exception("Passenger RequestHandler's client socket", e)
|
530
|
+
end
|
531
|
+
return true
|
532
|
+
else
|
533
|
+
if @analytics_logger && headers && headers[PASSENGER_TXN_ID]
|
534
|
+
log_analytics_exception(headers, e)
|
535
|
+
end
|
536
|
+
raise e
|
537
|
+
end
|
538
|
+
ensure
|
539
|
+
# The 'close_write' here prevents forked child
|
540
|
+
# processes from unintentionally keeping the
|
541
|
+
# connection open.
|
542
|
+
if connection && !connection.closed?
|
543
|
+
begin
|
544
|
+
connection.close_write
|
545
|
+
rescue SystemCallError
|
546
|
+
end
|
547
|
+
begin
|
548
|
+
connection.close
|
549
|
+
rescue SystemCallError
|
550
|
+
end
|
551
|
+
end
|
552
|
+
if input_stream && !input_stream.closed?
|
553
|
+
input_stream.close rescue nil
|
420
554
|
end
|
421
555
|
end
|
422
556
|
|
@@ -426,52 +560,179 @@ private
|
|
426
560
|
# reading HTTP POST data.
|
427
561
|
#
|
428
562
|
# Returns nil if end-of-stream was encountered.
|
429
|
-
def
|
430
|
-
|
431
|
-
headers_data = channel.read_scalar(MAX_HEADER_SIZE)
|
563
|
+
def parse_native_request(socket, channel, buffer)
|
564
|
+
headers_data = channel.read_scalar(buffer, MAX_HEADER_SIZE)
|
432
565
|
if headers_data.nil?
|
433
566
|
return
|
434
567
|
end
|
435
|
-
headers =
|
436
|
-
|
568
|
+
headers = split_by_null_into_hash(headers_data)
|
569
|
+
if @connect_password && headers[PASSENGER_CONNECT_PASSWORD] != @connect_password
|
570
|
+
warn "*** Passenger RequestHandler warning: " <<
|
571
|
+
"someone tried to connect with an invalid connect password."
|
572
|
+
return
|
573
|
+
else
|
574
|
+
return [headers, socket]
|
575
|
+
end
|
437
576
|
rescue SecurityError => e
|
438
|
-
|
439
|
-
|
440
|
-
|
577
|
+
warn("*** Passenger RequestHandler warning: " <<
|
578
|
+
"HTTP header size exceeded maximum.")
|
579
|
+
return nil
|
580
|
+
end
|
581
|
+
|
582
|
+
# Like parse_native_request, but parses an HTTP request. This is a very minimalistic
|
583
|
+
# HTTP parser and is not intended to be complete, fast or secure, since the HTTP server
|
584
|
+
# socket is intended to be used for debugging purposes only.
|
585
|
+
def parse_http_request(socket)
|
586
|
+
headers = {}
|
587
|
+
|
588
|
+
data = ""
|
589
|
+
while data !~ /\r\n\r\n/ && data.size < MAX_HEADER_SIZE
|
590
|
+
data << socket.readpartial(16 * 1024)
|
591
|
+
end
|
592
|
+
if data.size >= MAX_HEADER_SIZE
|
593
|
+
warn("*** Passenger RequestHandler warning: " <<
|
594
|
+
"HTTP header size exceeded maximum.")
|
595
|
+
return nil
|
596
|
+
end
|
597
|
+
|
598
|
+
data.gsub!(/\r\n\r\n.*/, '')
|
599
|
+
data.split("\r\n").each_with_index do |line, i|
|
600
|
+
if i == 0
|
601
|
+
# GET / HTTP/1.1
|
602
|
+
line =~ /^([A-Za-z]+) (.+?) (HTTP\/\d\.\d)$/
|
603
|
+
request_method = $1
|
604
|
+
request_uri = $2
|
605
|
+
protocol = $3
|
606
|
+
path_info, query_string = request_uri.split("?", 2)
|
607
|
+
headers[REQUEST_METHOD] = request_method
|
608
|
+
headers["REQUEST_URI"] = request_uri
|
609
|
+
headers["QUERY_STRING"] = query_string || ""
|
610
|
+
headers["SCRIPT_NAME"] = ""
|
611
|
+
headers["PATH_INFO"] = path_info
|
612
|
+
headers["SERVER_NAME"] = "127.0.0.1"
|
613
|
+
headers["SERVER_PORT"] = socket.addr[1].to_s
|
614
|
+
headers["SERVER_PROTOCOL"] = protocol
|
615
|
+
else
|
616
|
+
header, value = line.split(/\s*:\s*/, 2)
|
617
|
+
header.upcase! # "Foo-Bar" => "FOO-BAR"
|
618
|
+
header.gsub!("-", "_") # => "FOO_BAR"
|
619
|
+
if header == "CONTENT_LENGTH" || header == "CONTENT_TYPE"
|
620
|
+
headers[header] = value
|
621
|
+
else
|
622
|
+
headers["HTTP_#{header}"] = value
|
623
|
+
end
|
624
|
+
end
|
625
|
+
end
|
626
|
+
|
627
|
+
if @connect_password && headers["HTTP_X_PASSENGER_CONNECT_PASSWORD"] != @connect_password
|
628
|
+
warn "*** Passenger RequestHandler warning: " <<
|
629
|
+
"someone tried to connect with an invalid connect password."
|
630
|
+
return
|
631
|
+
else
|
632
|
+
return [headers, socket]
|
633
|
+
end
|
634
|
+
rescue EOFError
|
635
|
+
return nil
|
441
636
|
end
|
442
637
|
|
443
638
|
def process_ping(env, input, output)
|
444
639
|
output.write("pong")
|
445
640
|
end
|
446
641
|
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
when :base64
|
452
|
-
require 'base64' unless defined?(Base64)
|
453
|
-
data = Base64.encode64(File.read("/dev/urandom", 64))
|
454
|
-
data.gsub!("\n", '')
|
455
|
-
data.gsub!("+", '')
|
456
|
-
data.gsub!("/", '')
|
457
|
-
data.gsub!(/==$/, '')
|
458
|
-
when :hex
|
459
|
-
data = File.read("/dev/urandom", 64).unpack('H*')[0]
|
642
|
+
def determine_passenger_header
|
643
|
+
header = "Phusion Passenger (mod_rails/mod_rack)"
|
644
|
+
if @options["show_version_in_header"]
|
645
|
+
header << " #{VERSION_STRING}"
|
460
646
|
end
|
461
|
-
|
462
|
-
end
|
463
|
-
|
464
|
-
def self.determine_passenger_header
|
465
|
-
header = "Phusion Passenger (mod_rails/mod_rack) #{VERSION_STRING}"
|
466
|
-
if File.exist?("#{File.dirname(__FILE__)}/../../enterprisey.txt") ||
|
647
|
+
if File.exist?("#{SOURCE_ROOT}/enterprisey.txt") ||
|
467
648
|
File.exist?("/etc/passenger_enterprisey.txt")
|
468
649
|
header << ", Enterprise Edition"
|
469
650
|
end
|
470
651
|
return header
|
471
652
|
end
|
653
|
+
|
654
|
+
def prepare_request(headers)
|
655
|
+
if @analytics_logger && headers[PASSENGER_TXN_ID]
|
656
|
+
txn_id = headers[PASSENGER_TXN_ID]
|
657
|
+
group_name = headers[PASSENGER_GROUP_NAME]
|
658
|
+
union_station_key = headers[PASSENGER_UNION_STATION_KEY]
|
659
|
+
log = @analytics_logger.continue_transaction(txn_id, group_name,
|
660
|
+
:requests, union_station_key)
|
661
|
+
headers[PASSENGER_ANALYTICS_WEB_LOG] = log
|
662
|
+
Thread.current[PASSENGER_ANALYTICS_WEB_LOG] = log
|
663
|
+
Thread.current[PASSENGER_TXN_ID] = txn_id
|
664
|
+
Thread.current[PASSENGER_GROUP_NAME] = group_name
|
665
|
+
Thread.current[PASSENGER_UNION_STATION_KEY] = union_station_key
|
666
|
+
if OBJECT_SPACE_SUPPORTS_LIVE_OBJECTS
|
667
|
+
log.message("Initial objects on heap: #{ObjectSpace.live_objects}")
|
668
|
+
end
|
669
|
+
if OBJECT_SPACE_SUPPORTS_ALLOCATED_OBJECTS
|
670
|
+
log.message("Initial objects allocated so far: #{ObjectSpace.allocated_objects}")
|
671
|
+
elsif OBJECT_SPACE_SUPPORTS_COUNT_OBJECTS
|
672
|
+
count = ObjectSpace.count_objects
|
673
|
+
log.message("Initial objects allocated so far: #{count[:TOTAL] - count[:FREE]}")
|
674
|
+
end
|
675
|
+
if GC_SUPPORTS_TIME
|
676
|
+
log.message("Initial GC time: #{GC.time}")
|
677
|
+
end
|
678
|
+
log.begin_measure("app request handler processing")
|
679
|
+
end
|
680
|
+
|
681
|
+
#################
|
682
|
+
end
|
683
|
+
|
684
|
+
def finalize_request(headers, has_error)
|
685
|
+
log = headers[PASSENGER_ANALYTICS_WEB_LOG]
|
686
|
+
if log
|
687
|
+
begin
|
688
|
+
log.end_measure("app request handler processing", has_error)
|
689
|
+
if OBJECT_SPACE_SUPPORTS_LIVE_OBJECTS
|
690
|
+
log.message("Final objects on heap: #{ObjectSpace.live_objects}")
|
691
|
+
end
|
692
|
+
if OBJECT_SPACE_SUPPORTS_ALLOCATED_OBJECTS
|
693
|
+
log.message("Final objects allocated so far: #{ObjectSpace.allocated_objects}")
|
694
|
+
elsif OBJECT_SPACE_SUPPORTS_COUNT_OBJECTS
|
695
|
+
count = ObjectSpace.count_objects
|
696
|
+
log.message("Final objects allocated so far: #{count[:TOTAL] - count[:FREE]}")
|
697
|
+
end
|
698
|
+
if GC_SUPPORTS_TIME
|
699
|
+
log.message("Final GC time: #{GC.time}")
|
700
|
+
end
|
701
|
+
if GC_SUPPORTS_CLEAR_STATS
|
702
|
+
# Clear statistics to void integer wraps.
|
703
|
+
GC.clear_stats
|
704
|
+
end
|
705
|
+
Thread.current[PASSENGER_ANALYTICS_WEB_LOG] = nil
|
706
|
+
ensure
|
707
|
+
log.close
|
708
|
+
end
|
709
|
+
end
|
710
|
+
|
711
|
+
#################
|
712
|
+
end
|
713
|
+
|
714
|
+
def log_analytics_exception(env, exception)
|
715
|
+
log = @analytics_logger.new_transaction(
|
716
|
+
env[PASSENGER_GROUP_NAME],
|
717
|
+
:exceptions,
|
718
|
+
env[PASSENGER_UNION_STATION_KEY])
|
719
|
+
begin
|
720
|
+
request_txn_id = env[PASSENGER_TXN_ID]
|
721
|
+
message = exception.message
|
722
|
+
message = exception.to_s if message.empty?
|
723
|
+
message = [message].pack('m')
|
724
|
+
message.gsub!("\n", "")
|
725
|
+
backtrace_string = [exception.backtrace.join("\n")].pack('m')
|
726
|
+
backtrace_string.gsub!("\n", "")
|
472
727
|
|
473
|
-
|
474
|
-
|
728
|
+
log.message("Request transaction ID: #{request_txn_id}")
|
729
|
+
log.message("Message: #{message}")
|
730
|
+
log.message("Class: #{exception.class.name}")
|
731
|
+
log.message("Backtrace: #{backtrace_string}")
|
732
|
+
ensure
|
733
|
+
log.close
|
734
|
+
end
|
735
|
+
end
|
475
736
|
end
|
476
737
|
|
477
738
|
end # module PhusionPassenger
|