passenger 3.0.4 → 3.0.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- data/NEWS +27 -0
- data/build/common_library.rb +4 -0
- data/doc/ApplicationPool algorithm.txt +1 -1
- 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 +118 -0
- 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 +311 -0
- data/doc/cxxapi/EventedClient_8h_source.html +733 -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 +393 -0
- data/doc/cxxapi/FileDescriptor_8h_source.html +324 -0
- data/doc/cxxapi/Hooks_8h_source.html +76 -0
- data/doc/cxxapi/HttpStatusExtractor_8h_source.html +382 -0
- data/doc/cxxapi/IniFile_8h_source.html +527 -0
- data/doc/cxxapi/Logging_8h_source.html +796 -0
- data/doc/cxxapi/MessageChannel_8h_source.html +776 -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 +612 -0
- data/doc/cxxapi/PoolOptions_8h_source.html +549 -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 +166 -0
- data/doc/cxxapi/SafeLibev_8h_source.html +180 -0
- data/doc/cxxapi/ScgiRequestParser_8h_source.html +406 -0
- data/doc/cxxapi/ServerInstanceDir_8h_source.html +378 -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 +329 -0
- data/doc/cxxapi/StringListCreator_8h_source.html +114 -0
- data/doc/cxxapi/Utils_8h_source.html +459 -0
- data/doc/cxxapi/annotated.html +87 -0
- data/doc/cxxapi/apache2_2Configuration_8h_source.html +82 -0
- data/doc/cxxapi/classAgentWatcher-members.html +54 -0
- data/doc/cxxapi/classAgentWatcher.html +419 -0
- data/doc/cxxapi/classClient-members.html +38 -0
- data/doc/cxxapi/classClient.html +123 -0
- data/doc/cxxapi/classHooks-members.html +40 -0
- data/doc/cxxapi/classHooks.html +153 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +40 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +187 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1ArgumentException.html +56 -0
- 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 +38 -0
- data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +112 -0
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1BusyException.html +54 -0
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +51 -0
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +41 -0
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +223 -0
- data/doc/cxxapi/classPassenger_1_1EOFException-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1EOFException.html +61 -0
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1EventFd-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1EventFd.html +52 -0
- data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +59 -0
- data/doc/cxxapi/classPassenger_1_1EventedClient.html +531 -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 +41 -0
- data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +178 -0
- data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +52 -0
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +58 -0
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +41 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +66 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +39 -0
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +128 -0
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1IOException.html +61 -0
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +4 -0
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +57 -0
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +839 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +49 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer.html +407 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +58 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +41 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +165 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +39 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +173 -0
- data/doc/cxxapi/classPassenger_1_1Process-members.html +44 -0
- data/doc/cxxapi/classPassenger_1_1Process.html +290 -0
- data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +79 -0
- data/doc/cxxapi/classPassenger_1_1ResourceLocator-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1ResourceLocator.html +51 -0
- data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1RuntimeException.html +54 -0
- data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1SafeLibev.html +51 -0
- 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 +50 -0
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +285 -0
- data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1SecurityException.html +56 -0
- data/doc/cxxapi/classPassenger_1_1Session-members.html +53 -0
- data/doc/cxxapi/classPassenger_1_1Session.html +556 -0
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +39 -0
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +101 -0
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +42 -0
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +292 -0
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +54 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession.html +394 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1StaticString-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1StaticString.html +56 -0
- data/doc/cxxapi/classPassenger_1_1SyntaxError-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1SyntaxError.html +54 -0
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +40 -0
- data/doc/cxxapi/classPassenger_1_1SystemException.html +155 -0
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +4 -0
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +40 -0
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +61 -0
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1TimeoutException.html +54 -0
- 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 +36 -0
- data/doc/cxxapi/classServer.html +49 -0
- data/doc/cxxapi/classServerInstanceDirToucher-members.html +36 -0
- data/doc/cxxapi/classServerInstanceDirToucher.html +47 -0
- data/doc/cxxapi/classes.html +52 -0
- data/doc/cxxapi/definitions_8h_source.html +36 -0
- data/doc/cxxapi/doxygen.css +532 -0
- data/doc/cxxapi/doxygen.png +0 -0
- data/doc/cxxapi/files.html +76 -0
- data/doc/cxxapi/ftv2blank.png +0 -0
- data/doc/cxxapi/ftv2doc.png +0 -0
- data/doc/cxxapi/ftv2folderclosed.png +0 -0
- data/doc/cxxapi/ftv2folderopen.png +0 -0
- data/doc/cxxapi/ftv2lastnode.png +0 -0
- data/doc/cxxapi/ftv2link.png +0 -0
- data/doc/cxxapi/ftv2mlastnode.png +0 -0
- data/doc/cxxapi/ftv2mnode.png +0 -0
- data/doc/cxxapi/ftv2node.png +0 -0
- data/doc/cxxapi/ftv2plastnode.png +0 -0
- data/doc/cxxapi/ftv2pnode.png +0 -0
- data/doc/cxxapi/ftv2vertline.png +0 -0
- data/doc/cxxapi/functions.html +103 -0
- data/doc/cxxapi/functions_0x62.html +82 -0
- data/doc/cxxapi/functions_0x63.html +102 -0
- data/doc/cxxapi/functions_0x64.html +102 -0
- data/doc/cxxapi/functions_0x65.html +88 -0
- data/doc/cxxapi/functions_0x66.html +100 -0
- data/doc/cxxapi/functions_0x67.html +167 -0
- data/doc/cxxapi/functions_0x68.html +88 -0
- data/doc/cxxapi/functions_0x69.html +96 -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 +49 -0
- data/doc/cxxapi/functions_eval.html +67 -0
- data/doc/cxxapi/functions_func.html +531 -0
- data/doc/cxxapi/functions_vars.html +278 -0
- data/doc/cxxapi/graph_legend.dot +22 -0
- data/doc/cxxapi/graph_legend.html +92 -0
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Core.html +46 -0
- data/doc/cxxapi/group__Core.map +3 -0
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +53 -0
- data/doc/cxxapi/group__Hooks.html +42 -0
- data/doc/cxxapi/group__Hooks.map +3 -0
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +538 -0
- data/doc/cxxapi/hierarchy.html +101 -0
- data/doc/cxxapi/index.html +16 -0
- data/doc/cxxapi/inherit__graph__0.map +3 -0
- data/doc/cxxapi/inherit__graph__0.md5 +1 -0
- data/doc/cxxapi/inherit__graph__0.png +0 -0
- data/doc/cxxapi/inherit__graph__1.map +3 -0
- data/doc/cxxapi/inherit__graph__1.md5 +1 -0
- data/doc/cxxapi/inherit__graph__1.png +0 -0
- data/doc/cxxapi/inherit__graph__10.map +3 -0
- data/doc/cxxapi/inherit__graph__10.md5 +1 -0
- data/doc/cxxapi/inherit__graph__10.png +0 -0
- data/doc/cxxapi/inherit__graph__11.map +4 -0
- data/doc/cxxapi/inherit__graph__11.md5 +1 -0
- data/doc/cxxapi/inherit__graph__11.png +0 -0
- data/doc/cxxapi/inherit__graph__12.map +3 -0
- data/doc/cxxapi/inherit__graph__12.md5 +1 -0
- data/doc/cxxapi/inherit__graph__12.png +0 -0
- data/doc/cxxapi/inherit__graph__13.map +3 -0
- data/doc/cxxapi/inherit__graph__13.md5 +1 -0
- data/doc/cxxapi/inherit__graph__13.png +0 -0
- data/doc/cxxapi/inherit__graph__14.map +3 -0
- data/doc/cxxapi/inherit__graph__14.md5 +1 -0
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +3 -0
- data/doc/cxxapi/inherit__graph__15.md5 +1 -0
- data/doc/cxxapi/inherit__graph__15.png +0 -0
- data/doc/cxxapi/inherit__graph__16.map +5 -0
- data/doc/cxxapi/inherit__graph__16.md5 +1 -0
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.map +3 -0
- data/doc/cxxapi/inherit__graph__17.md5 +1 -0
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.map +3 -0
- data/doc/cxxapi/inherit__graph__18.md5 +1 -0
- data/doc/cxxapi/inherit__graph__18.png +0 -0
- data/doc/cxxapi/inherit__graph__19.map +4 -0
- data/doc/cxxapi/inherit__graph__19.md5 +1 -0
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__2.map +3 -0
- data/doc/cxxapi/inherit__graph__2.md5 +1 -0
- data/doc/cxxapi/inherit__graph__2.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +3 -0
- data/doc/cxxapi/inherit__graph__20.md5 +1 -0
- data/doc/cxxapi/inherit__graph__20.png +0 -0
- data/doc/cxxapi/inherit__graph__21.map +3 -0
- data/doc/cxxapi/inherit__graph__21.md5 +1 -0
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__22.map +3 -0
- data/doc/cxxapi/inherit__graph__22.md5 +1 -0
- data/doc/cxxapi/inherit__graph__22.png +0 -0
- data/doc/cxxapi/inherit__graph__23.map +3 -0
- data/doc/cxxapi/inherit__graph__23.md5 +1 -0
- data/doc/cxxapi/inherit__graph__23.png +0 -0
- data/doc/cxxapi/inherit__graph__24.map +3 -0
- data/doc/cxxapi/inherit__graph__24.md5 +1 -0
- data/doc/cxxapi/inherit__graph__24.png +0 -0
- data/doc/cxxapi/inherit__graph__25.map +3 -0
- data/doc/cxxapi/inherit__graph__25.md5 +1 -0
- data/doc/cxxapi/inherit__graph__25.png +0 -0
- data/doc/cxxapi/inherit__graph__26.map +3 -0
- data/doc/cxxapi/inherit__graph__26.md5 +1 -0
- data/doc/cxxapi/inherit__graph__26.png +0 -0
- data/doc/cxxapi/inherit__graph__27.map +3 -0
- data/doc/cxxapi/inherit__graph__27.md5 +1 -0
- data/doc/cxxapi/inherit__graph__27.png +0 -0
- data/doc/cxxapi/inherit__graph__28.map +3 -0
- data/doc/cxxapi/inherit__graph__28.md5 +1 -0
- data/doc/cxxapi/inherit__graph__28.png +0 -0
- data/doc/cxxapi/inherit__graph__29.map +3 -0
- data/doc/cxxapi/inherit__graph__29.md5 +1 -0
- data/doc/cxxapi/inherit__graph__29.png +0 -0
- data/doc/cxxapi/inherit__graph__3.map +4 -0
- data/doc/cxxapi/inherit__graph__3.md5 +1 -0
- data/doc/cxxapi/inherit__graph__3.png +0 -0
- data/doc/cxxapi/inherit__graph__30.map +3 -0
- data/doc/cxxapi/inherit__graph__30.md5 +1 -0
- data/doc/cxxapi/inherit__graph__30.png +0 -0
- data/doc/cxxapi/inherit__graph__31.map +4 -0
- data/doc/cxxapi/inherit__graph__31.md5 +1 -0
- data/doc/cxxapi/inherit__graph__31.png +0 -0
- data/doc/cxxapi/inherit__graph__32.map +3 -0
- data/doc/cxxapi/inherit__graph__32.md5 +1 -0
- data/doc/cxxapi/inherit__graph__32.png +0 -0
- data/doc/cxxapi/inherit__graph__33.map +3 -0
- data/doc/cxxapi/inherit__graph__33.md5 +1 -0
- data/doc/cxxapi/inherit__graph__33.png +0 -0
- data/doc/cxxapi/inherit__graph__34.map +3 -0
- data/doc/cxxapi/inherit__graph__34.md5 +1 -0
- data/doc/cxxapi/inherit__graph__34.png +0 -0
- data/doc/cxxapi/inherit__graph__35.map +3 -0
- data/doc/cxxapi/inherit__graph__35.md5 +1 -0
- data/doc/cxxapi/inherit__graph__35.png +0 -0
- data/doc/cxxapi/inherit__graph__36.map +5 -0
- data/doc/cxxapi/inherit__graph__36.md5 +1 -0
- data/doc/cxxapi/inherit__graph__36.png +0 -0
- data/doc/cxxapi/inherit__graph__37.map +3 -0
- data/doc/cxxapi/inherit__graph__37.md5 +1 -0
- data/doc/cxxapi/inherit__graph__37.png +0 -0
- data/doc/cxxapi/inherit__graph__38.map +3 -0
- data/doc/cxxapi/inherit__graph__38.md5 +1 -0
- data/doc/cxxapi/inherit__graph__38.png +0 -0
- data/doc/cxxapi/inherit__graph__39.map +3 -0
- data/doc/cxxapi/inherit__graph__39.md5 +1 -0
- data/doc/cxxapi/inherit__graph__39.png +0 -0
- data/doc/cxxapi/inherit__graph__4.map +3 -0
- data/doc/cxxapi/inherit__graph__4.md5 +1 -0
- data/doc/cxxapi/inherit__graph__4.png +0 -0
- data/doc/cxxapi/inherit__graph__40.map +3 -0
- data/doc/cxxapi/inherit__graph__40.md5 +1 -0
- data/doc/cxxapi/inherit__graph__40.png +0 -0
- data/doc/cxxapi/inherit__graph__41.map +3 -0
- data/doc/cxxapi/inherit__graph__41.md5 +1 -0
- data/doc/cxxapi/inherit__graph__41.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +3 -0
- data/doc/cxxapi/inherit__graph__5.md5 +1 -0
- data/doc/cxxapi/inherit__graph__5.png +0 -0
- data/doc/cxxapi/inherit__graph__6.map +3 -0
- data/doc/cxxapi/inherit__graph__6.md5 +1 -0
- data/doc/cxxapi/inherit__graph__6.png +0 -0
- data/doc/cxxapi/inherit__graph__7.map +3 -0
- data/doc/cxxapi/inherit__graph__7.md5 +1 -0
- data/doc/cxxapi/inherit__graph__7.png +0 -0
- data/doc/cxxapi/inherit__graph__8.map +3 -0
- data/doc/cxxapi/inherit__graph__8.md5 +1 -0
- data/doc/cxxapi/inherit__graph__8.png +0 -0
- data/doc/cxxapi/inherit__graph__9.map +3 -0
- data/doc/cxxapi/inherit__graph__9.md5 +1 -0
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +165 -0
- data/doc/cxxapi/main.html +28 -0
- data/doc/cxxapi/modules.html +36 -0
- data/doc/cxxapi/namespacePassenger.html +553 -0
- data/doc/cxxapi/namespacemembers.html +135 -0
- data/doc/cxxapi/namespacemembers_enum.html +48 -0
- data/doc/cxxapi/namespacemembers_eval.html +57 -0
- data/doc/cxxapi/namespacemembers_func.html +111 -0
- data/doc/cxxapi/namespacemembers_type.html +54 -0
- data/doc/cxxapi/namespaces.html +37 -0
- data/doc/cxxapi/nginx_2Configuration_8h_source.html +126 -0
- data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +94 -0
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +36 -0
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +51 -0
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +67 -0
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +647 -0
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +36 -0
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +51 -0
- data/doc/cxxapi/tab_b.gif +0 -0
- data/doc/cxxapi/tab_l.gif +0 -0
- data/doc/cxxapi/tab_r.gif +0 -0
- data/doc/cxxapi/tabs.css +105 -0
- data/doc/cxxapi/tree.html +249 -0
- data/doc/rdoc/classes/ConditionVariable.html +215 -0
- data/doc/rdoc/classes/Exception.html +120 -0
- data/doc/rdoc/classes/GC.html +113 -0
- data/doc/rdoc/classes/IO.html +221 -0
- data/doc/rdoc/classes/PhusionPassenger.html +397 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +180 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +647 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +654 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/InvalidPassword.html +92 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +97 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +96 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +97 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +96 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +619 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +142 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats.html +368 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats/Process.html +231 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance.html +588 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/CorruptedDirectoryError.html +92 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/GenerationsAbsentError.html +92 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Group.html +147 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Process.html +279 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/RoleDeniedError.html +92 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/StaleDirectoryError.html +92 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Stats.html +123 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/UnsupportedGenerationStructureVersionError.html +92 -0
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger.html +368 -0
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Lock.html +194 -0
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Log.html +299 -0
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/SharedData.html +206 -0
- data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +155 -0
- data/doc/rdoc/classes/PhusionPassenger/AppProcess.html +367 -0
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails.html +95 -0
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner.html +351 -0
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner/Error.html +98 -0
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/CGIFixed.html +200 -0
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner.html +410 -0
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner/Error.html +98 -0
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/RequestHandler.html +156 -0
- data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions.html +115 -0
- data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions/AnalyticsLogging.html +202 -0
- data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +172 -0
- data/doc/rdoc/classes/PhusionPassenger/DebugLogging.html +273 -0
- data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +145 -0
- data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +162 -0
- data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +141 -0
- data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +673 -0
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel/InvalidHashError.html +92 -0
- data/doc/rdoc/classes/PhusionPassenger/MessageClient.html +415 -0
- data/doc/rdoc/classes/PhusionPassenger/NativeSupportLoader.html +134 -0
- data/doc/rdoc/classes/PhusionPassenger/Packaging.html +129 -0
- data/doc/rdoc/classes/PhusionPassenger/PlatformInfo.html +1972 -0
- data/doc/rdoc/classes/PhusionPassenger/Plugin.html +237 -0
- data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +312 -0
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner/Error.html +98 -0
- data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +218 -0
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions.html +114 -0
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging.html +259 -0
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ACExtension.html +139 -0
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ASBenchmarkableExtension.html +118 -0
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ExceptionLogger.html +135 -0
- data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +378 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone.html +111 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/AppFinder.html +252 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Command.html +161 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile.html +368 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile/DisallowedContextError.html +132 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/HelpCommand.html +151 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Main.html +189 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/PackageRuntimeCommand.html +177 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/RuntimeInstaller.html +341 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StartCommand.html +203 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StatusCommand.html +156 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StopCommand.html +168 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Utils.html +86 -0
- data/doc/rdoc/classes/PhusionPassenger/Standalone/VersionCommand.html +135 -0
- data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +125 -0
- data/doc/rdoc/classes/PhusionPassenger/Utils.html +1543 -0
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher.html +204 -0
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/DirInfo.html +171 -0
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/FileInfo.html +140 -0
- data/doc/rdoc/classes/PhusionPassenger/Utils/HostsFileParser.html +260 -0
- data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +194 -0
- data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +265 -0
- data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +120 -0
- data/doc/rdoc/classes/PhusionPassenger/Utils/UnseekableSocket.html +561 -0
- data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +140 -0
- data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
- data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +182 -0
- data/doc/rdoc/classes/Process.html +115 -0
- data/doc/rdoc/classes/Signal.html +139 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/DEVELOPERS_TXT.html +280 -0
- data/doc/rdoc/files/README.html +157 -0
- data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +130 -0
- data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +135 -0
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +128 -0
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/memory_stats_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/server_instance_rb.html +132 -0
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +122 -0
- data/doc/rdoc/files/lib/phusion_passenger/analytics_logger_rb.html +129 -0
- data/doc/rdoc/files/lib/phusion_passenger/app_process_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/application_spawner_rb.html +141 -0
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/cgi_fixed_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/framework_spawner_rb.html +146 -0
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/request_handler_rb.html +125 -0
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails_extensions/init_rb.html +132 -0
- data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +122 -0
- data/doc/rdoc/files/lib/phusion_passenger/debug_logging_rb.html +122 -0
- data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +147 -0
- data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +122 -0
- data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +120 -0
- data/doc/rdoc/files/lib/phusion_passenger/message_client_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/native_support_rb.html +132 -0
- data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +122 -0
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/apache_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/binary_compatibility_rb.html +129 -0
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/compiler_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/curl_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/documentation_tools_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/linux_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/operating_system_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/ruby_rb.html +128 -0
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/zlib_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +122 -0
- data/doc/rdoc/files/lib/phusion_passenger/plugin_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/public_api_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +137 -0
- data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +125 -0
- data/doc/rdoc/files/lib/phusion_passenger/rails3_extensions/init_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +122 -0
- data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +160 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/app_finder_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/command_rb.html +136 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/config_file_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/help_command_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/main_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/package_runtime_command_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/runtime_installer_rb.html +133 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/start_command_rb.html +136 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/status_command_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/stop_command_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/utils_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/standalone/version_command_rb.html +127 -0
- data/doc/rdoc/files/lib/phusion_passenger/utils/file_system_watcher_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/utils/hosts_file_parser_rb.html +120 -0
- data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +100 -0
- data/doc/rdoc/files/lib/phusion_passenger/utils/tmpdir_rb.html +122 -0
- data/doc/rdoc/files/lib/phusion_passenger/utils/unseekable_socket_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +179 -0
- data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +132 -0
- data/doc/rdoc/fr_class_index.html +139 -0
- data/doc/rdoc/fr_file_index.html +108 -0
- data/doc/rdoc/fr_method_index.html +439 -0
- data/doc/rdoc/index.html +26 -0
- data/doc/rdoc/rdoc-style.css +187 -0
- data/ext/apache2/Configuration.cpp +6 -6
- data/ext/apache2/Configuration.hpp +3 -3
- data/ext/apache2/HelperAgent.cpp +1 -1
- data/ext/apache2/Hooks.cpp +3 -3
- data/ext/common/ApplicationPool/Pool.h +1 -1
- data/ext/common/ApplicationPool/Server.h +5 -2
- data/ext/common/Constants.h +1 -1
- data/ext/common/LoggingAgent/FilterSupport.cpp +66 -0
- data/ext/common/LoggingAgent/FilterSupport.h +262 -73
- data/ext/common/LoggingAgent/RemoteSender.h +13 -4
- data/ext/common/Utils/CachedFileStat.cpp +6 -12
- data/ext/common/Utils/CachedFileStat.h +4 -4
- data/ext/common/libboost_oxt/aggregate.cpp +10 -0
- data/ext/common/libpassenger_common/aggregate.cpp +16 -0
- data/ext/nginx/Configuration.c +77 -4
- data/ext/nginx/Configuration.h +2 -1
- data/ext/nginx/ContentHandler.c +32 -4
- data/ext/nginx/HelperAgent.cpp +5 -4
- data/ext/nginx/ngx_http_passenger_module.c +6 -6
- data/ext/nginx/ngx_http_passenger_module.h +5 -5
- data/lib/phusion_passenger.rb +1 -1
- data/lib/phusion_passenger/abstract_request_handler.rb +4 -1
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_base_extension.rb +3 -1
- data/lib/phusion_passenger/standalone/runtime_installer.rb +1 -1
- data/lib/phusion_passenger/standalone/start_command.rb +6 -0
- data/lib/phusion_passenger/templates/standalone/config.erb +1 -1
- data/test/cxx/FilterSupportTest.cpp +135 -5
- metadata +547 -4
@@ -0,0 +1,358 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
5
|
+
<title>Passenger: EventedMessageServer.h Source File</title>
|
6
|
+
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
7
|
+
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<!-- Generated by Doxygen 1.6.2 -->
|
11
|
+
<div class="navigation" id="top">
|
12
|
+
<div class="tabs">
|
13
|
+
<ul>
|
14
|
+
<li><a href="main.html"><span>Main Page</span></a></li>
|
15
|
+
<li><a href="modules.html"><span>Modules</span></a></li>
|
16
|
+
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
|
17
|
+
<li><a href="annotated.html"><span>Classes</span></a></li>
|
18
|
+
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
19
|
+
</ul>
|
20
|
+
</div>
|
21
|
+
<div class="tabs">
|
22
|
+
<ul>
|
23
|
+
<li><a href="files.html"><span>File List</span></a></li>
|
24
|
+
</ul>
|
25
|
+
</div>
|
26
|
+
<h1>EventedMessageServer.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
|
27
|
+
<a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
|
28
|
+
<a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
|
29
|
+
<a name="l00004"></a>00004 <span class="comment"> *</span>
|
30
|
+
<a name="l00005"></a>00005 <span class="comment"> * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.</span>
|
31
|
+
<a name="l00006"></a>00006 <span class="comment"> *</span>
|
32
|
+
<a name="l00007"></a>00007 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span>
|
33
|
+
<a name="l00008"></a>00008 <span class="comment"> * of this software and associated documentation files (the "Software"), to deal</span>
|
34
|
+
<a name="l00009"></a>00009 <span class="comment"> * in the Software without restriction, including without limitation the rights</span>
|
35
|
+
<a name="l00010"></a>00010 <span class="comment"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
|
36
|
+
<a name="l00011"></a>00011 <span class="comment"> * copies of the Software, and to permit persons to whom the Software is</span>
|
37
|
+
<a name="l00012"></a>00012 <span class="comment"> * furnished to do so, subject to the following conditions:</span>
|
38
|
+
<a name="l00013"></a>00013 <span class="comment"> *</span>
|
39
|
+
<a name="l00014"></a>00014 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
|
40
|
+
<a name="l00015"></a>00015 <span class="comment"> * all copies or substantial portions of the Software.</span>
|
41
|
+
<a name="l00016"></a>00016 <span class="comment"> *</span>
|
42
|
+
<a name="l00017"></a>00017 <span class="comment"> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
|
43
|
+
<a name="l00018"></a>00018 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
|
44
|
+
<a name="l00019"></a>00019 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
|
45
|
+
<a name="l00020"></a>00020 <span class="comment"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
|
46
|
+
<a name="l00021"></a>00021 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
|
47
|
+
<a name="l00022"></a>00022 <span class="comment"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
|
48
|
+
<a name="l00023"></a>00023 <span class="comment"> * THE SOFTWARE.</span>
|
49
|
+
<a name="l00024"></a>00024 <span class="comment"> */</span>
|
50
|
+
<a name="l00025"></a>00025 <span class="preprocessor">#ifndef _PASSENGER_EVENTED_MESSAGE_SERVER_H_</span>
|
51
|
+
<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_EVENTED_MESSAGE_SERVER_H_</span>
|
52
|
+
<a name="l00027"></a>00027 <span class="preprocessor"></span>
|
53
|
+
<a name="l00028"></a>00028 <span class="preprocessor">#include <boost/shared_ptr.hpp></span>
|
54
|
+
<a name="l00029"></a>00029 <span class="preprocessor">#include <ev++.h></span>
|
55
|
+
<a name="l00030"></a>00030 <span class="preprocessor">#include <cstdarg></span>
|
56
|
+
<a name="l00031"></a>00031 <span class="preprocessor">#include "EventedServer.h"</span>
|
57
|
+
<a name="l00032"></a>00032 <span class="preprocessor">#include "MessageReadersWriters.h"</span>
|
58
|
+
<a name="l00033"></a>00033 <span class="preprocessor">#include "AccountsDatabase.h"</span>
|
59
|
+
<a name="l00034"></a>00034 <span class="preprocessor">#include "Constants.h"</span>
|
60
|
+
<a name="l00035"></a>00035 <span class="preprocessor">#include "Utils.h"</span>
|
61
|
+
<a name="l00036"></a>00036
|
62
|
+
<a name="l00037"></a>00037 <span class="keyword">namespace </span>Passenger {
|
63
|
+
<a name="l00038"></a>00038
|
64
|
+
<a name="l00039"></a>00039 <span class="keyword">using namespace </span>boost;
|
65
|
+
<a name="l00040"></a>00040
|
66
|
+
<a name="l00041"></a>00041 <span class="comment">/* This source file follows the security guidelines written in Account.h. */</span>
|
67
|
+
<a name="l00042"></a>00042
|
68
|
+
<a name="l00043"></a>00043 <span class="keyword">struct </span>EventedMessageClientContext {
|
69
|
+
<a name="l00044"></a>00044 <span class="keyword">enum</span> State {
|
70
|
+
<a name="l00045"></a>00045 MS_READING_USERNAME,
|
71
|
+
<a name="l00046"></a>00046 MS_READING_PASSWORD,
|
72
|
+
<a name="l00047"></a>00047 MS_READING_MESSAGE,
|
73
|
+
<a name="l00048"></a>00048 MS_PROCESSING_MESSAGE
|
74
|
+
<a name="l00049"></a>00049 };
|
75
|
+
<a name="l00050"></a>00050
|
76
|
+
<a name="l00051"></a>00051 State state;
|
77
|
+
<a name="l00052"></a>00052 AccountPtr account;
|
78
|
+
<a name="l00053"></a>00053
|
79
|
+
<a name="l00054"></a>00054 ev::timer authenticationTimer;
|
80
|
+
<a name="l00055"></a>00055 ScalarMessage scalarReader;
|
81
|
+
<a name="l00056"></a>00056 ArrayMessage arrayReader;
|
82
|
+
<a name="l00057"></a>00057 <span class="keywordtype">string</span> username;
|
83
|
+
<a name="l00058"></a>00058
|
84
|
+
<a name="l00059"></a>00059 EventedMessageClientContext() {
|
85
|
+
<a name="l00060"></a>00060 state = MS_READING_USERNAME;
|
86
|
+
<a name="l00061"></a>00061 }
|
87
|
+
<a name="l00062"></a>00062
|
88
|
+
<a name="l00063"></a>00063 ~EventedMessageClientContext() {
|
89
|
+
<a name="l00064"></a>00064 <span class="comment">/* Its buffer might contain password data so make sure</span>
|
90
|
+
<a name="l00065"></a>00065 <span class="comment"> * it's properly zeroed out. */</span>
|
91
|
+
<a name="l00066"></a>00066 scalarReader.reset(<span class="keyword">true</span>);
|
92
|
+
<a name="l00067"></a>00067 }
|
93
|
+
<a name="l00068"></a>00068 };
|
94
|
+
<a name="l00069"></a>00069
|
95
|
+
<a name="l00070"></a>00070 <span class="keyword">class </span>EventedMessageClient: <span class="keyword">public</span> EventedClient {
|
96
|
+
<a name="l00071"></a>00071 <span class="keyword">public</span>:
|
97
|
+
<a name="l00072"></a>00072 EventedMessageClientContext messageServer;
|
98
|
+
<a name="l00073"></a>00073
|
99
|
+
<a name="l00074"></a>00074 EventedMessageClient(<span class="keyword">struct</span> ev_loop *loop, <span class="keyword">const</span> FileDescriptor &fd)
|
100
|
+
<a name="l00075"></a>00075 : <a class="code" href="classPassenger_1_1EventedClient.html#ac3c45bfa7ac30b6d59ef08dc296f3c4e" title="Creates a new EventedClient with the given libev loop and file descriptor.">EventedClient</a>(loop, fd)
|
101
|
+
<a name="l00076"></a>00076 {
|
102
|
+
<a name="l00077"></a>00077 messageServer.authenticationTimer.set(loop);
|
103
|
+
<a name="l00078"></a>00078 }
|
104
|
+
<a name="l00079"></a>00079
|
105
|
+
<a name="l00080"></a>00080 <span class="keywordtype">void</span> writeArrayMessage(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, ...) {
|
106
|
+
<a name="l00081"></a>00081 va_list ap;
|
107
|
+
<a name="l00082"></a>00082 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count = 0;
|
108
|
+
<a name="l00083"></a>00083
|
109
|
+
<a name="l00084"></a>00084 va_start(ap, name);
|
110
|
+
<a name="l00085"></a>00085 <span class="keywordflow">while</span> (va_arg(ap, <span class="keyword">const</span> <span class="keywordtype">char</span> *) != NULL) {
|
111
|
+
<a name="l00086"></a>00086 count++;
|
112
|
+
<a name="l00087"></a>00087 }
|
113
|
+
<a name="l00088"></a>00088 va_end(ap);
|
114
|
+
<a name="l00089"></a>00089
|
115
|
+
<a name="l00090"></a>00090 StaticString args[count + 1];
|
116
|
+
<a name="l00091"></a>00091 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 1;
|
117
|
+
<a name="l00092"></a>00092
|
118
|
+
<a name="l00093"></a>00093 args[0] = name;
|
119
|
+
<a name="l00094"></a>00094 va_start(ap, name);
|
120
|
+
<a name="l00095"></a>00095 <span class="keywordflow">while</span> (<span class="keyword">true</span>) {
|
121
|
+
<a name="l00096"></a>00096 <span class="keyword">const</span> <span class="keywordtype">char</span> *arg = va_arg(ap, <span class="keyword">const</span> <span class="keywordtype">char</span> *);
|
122
|
+
<a name="l00097"></a>00097 <span class="keywordflow">if</span> (arg != NULL) {
|
123
|
+
<a name="l00098"></a>00098 args[i] = arg;
|
124
|
+
<a name="l00099"></a>00099 i++;
|
125
|
+
<a name="l00100"></a>00100 } <span class="keywordflow">else</span> {
|
126
|
+
<a name="l00101"></a>00101 <span class="keywordflow">break</span>;
|
127
|
+
<a name="l00102"></a>00102 }
|
128
|
+
<a name="l00103"></a>00103 }
|
129
|
+
<a name="l00104"></a>00104 va_end(ap);
|
130
|
+
<a name="l00105"></a>00105
|
131
|
+
<a name="l00106"></a>00106 writeArrayMessage(args, count + 1);
|
132
|
+
<a name="l00107"></a>00107 }
|
133
|
+
<a name="l00108"></a>00108
|
134
|
+
<a name="l00109"></a>00109 <span class="keywordtype">void</span> writeArrayMessage(StaticString args[], <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count) {
|
135
|
+
<a name="l00110"></a>00110 <span class="keywordtype">char</span> headerBuf[<span class="keyword">sizeof</span>(uint16_t)];
|
136
|
+
<a name="l00111"></a>00111 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outSize = ArrayMessage::outputSize(count);
|
137
|
+
<a name="l00112"></a>00112 StaticString out[outSize];
|
138
|
+
<a name="l00113"></a>00113
|
139
|
+
<a name="l00114"></a>00114 <a class="code" href="classPassenger_1_1ArrayMessage.html#a25603619576f11f0d76286a17a014a92" title="Given a bunch of array items, generates an array message.">ArrayMessage::generate</a>(args, count, headerBuf, out, outSize);
|
140
|
+
<a name="l00115"></a>00115 write(out, outSize);
|
141
|
+
<a name="l00116"></a>00116 }
|
142
|
+
<a name="l00117"></a>00117 };
|
143
|
+
<a name="l00118"></a>00118 <span class="comment"></span>
|
144
|
+
<a name="l00119"></a>00119 <span class="comment">/**</span>
|
145
|
+
<a name="l00120"></a><a class="code" href="classPassenger_1_1EventedMessageServer.html">00120</a> <span class="comment"> * Note when overriding onNewClient: call the parent method first! It does</span>
|
146
|
+
<a name="l00121"></a>00121 <span class="comment"> * some initialization but might disconnect the client if that initialization</span>
|
147
|
+
<a name="l00122"></a>00122 <span class="comment"> * fails. The override should check for this.</span>
|
148
|
+
<a name="l00123"></a>00123 <span class="comment"> */</span>
|
149
|
+
<a name="l00124"></a>00124 <span class="keyword">class </span><a class="code" href="classPassenger_1_1EventedMessageServer.html" title="Note when overriding onNewClient: call the parent method first! It does some initialization...">EventedMessageServer</a>: <span class="keyword">public</span> <a class="code" href="classPassenger_1_1EventedServer.html" title="A base class for writing single-threaded, evented servers that use non-blocking I/O...">EventedServer</a> {
|
150
|
+
<a name="l00125"></a>00125 <span class="keyword">protected</span>:
|
151
|
+
<a name="l00126"></a>00126 AccountsDatabasePtr accountsDatabase;
|
152
|
+
<a name="l00127"></a>00127
|
153
|
+
<a name="l00128"></a>00128
|
154
|
+
<a name="l00129"></a>00129 <span class="comment">/******** Overrided hooks and methods ********/</span>
|
155
|
+
<a name="l00130"></a>00130
|
156
|
+
<a name="l00131"></a>00131 <span class="keyword">virtual</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *createClient(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> &fd) {
|
157
|
+
<a name="l00132"></a>00132 <span class="keywordflow">return</span> <span class="keyword">new</span> EventedMessageClient(getLoop(), fd);
|
158
|
+
<a name="l00133"></a>00133 }
|
159
|
+
<a name="l00134"></a>00134
|
160
|
+
<a name="l00135"></a>00135 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onNewClient(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *_client) {
|
161
|
+
<a name="l00136"></a>00136 EventedMessageClient *client = (EventedMessageClient *) _client;
|
162
|
+
<a name="l00137"></a>00137 EventedMessageClientContext *context = &client->messageServer;
|
163
|
+
<a name="l00138"></a>00138
|
164
|
+
<a name="l00139"></a>00139 context->authenticationTimer.set
|
165
|
+
<a name="l00140"></a>00140 <&EventedMessageServer::onAuthenticationTimeout>(client);
|
166
|
+
<a name="l00141"></a>00141 context->authenticationTimer.start(10);
|
167
|
+
<a name="l00142"></a>00142
|
168
|
+
<a name="l00143"></a>00143 context->arrayReader.reserve(5);
|
169
|
+
<a name="l00144"></a>00144 context->scalarReader.setMaxSize(MESSAGE_SERVER_MAX_USERNAME_SIZE);
|
170
|
+
<a name="l00145"></a>00145
|
171
|
+
<a name="l00146"></a>00146 client->writeArrayMessage(<span class="stringliteral">"version"</span>, protocolVersion(), NULL);
|
172
|
+
<a name="l00147"></a>00147 }
|
173
|
+
<a name="l00148"></a>00148
|
174
|
+
<a name="l00149"></a>00149 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onClientReadable(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *_client) {
|
175
|
+
<a name="l00150"></a>00150 EventedMessageClient *client = (EventedMessageClient *) _client;
|
176
|
+
<a name="l00151"></a>00151 this_thread::disable_syscall_interruption dsi;
|
177
|
+
<a name="l00152"></a>00152 <span class="keywordtype">int</span> i = 0;
|
178
|
+
<a name="l00153"></a>00153 <span class="keywordtype">bool</span> done = <span class="keyword">false</span>;
|
179
|
+
<a name="l00154"></a>00154
|
180
|
+
<a name="l00155"></a>00155 <span class="comment">// read() from the client at most 10 times on every read readiness event</span>
|
181
|
+
<a name="l00156"></a>00156 <span class="comment">// in order to give other events the chance to be processed.</span>
|
182
|
+
<a name="l00157"></a>00157 <span class="keywordflow">while</span> (i < 10 && !done) {
|
183
|
+
<a name="l00158"></a>00158 <span class="keywordtype">char</span> buf[1024 * 8];
|
184
|
+
<a name="l00159"></a>00159 ssize_t ret;
|
185
|
+
<a name="l00160"></a>00160
|
186
|
+
<a name="l00161"></a>00161 ret = syscalls::read(client->fd, buf, <span class="keyword">sizeof</span>(buf));
|
187
|
+
<a name="l00162"></a>00162 <span class="keywordflow">if</span> (ret == -1) {
|
188
|
+
<a name="l00163"></a>00163 <span class="keywordflow">if</span> (errno != EAGAIN) {
|
189
|
+
<a name="l00164"></a>00164 <span class="keywordtype">int</span> e = errno;
|
190
|
+
<a name="l00165"></a>00165 client->disconnect(<span class="keyword">true</span>);
|
191
|
+
<a name="l00166"></a>00166 logSystemError(client, <span class="stringliteral">"Cannot read data from client"</span>, e);
|
192
|
+
<a name="l00167"></a>00167 }
|
193
|
+
<a name="l00168"></a>00168 done = <span class="keyword">true</span>;
|
194
|
+
<a name="l00169"></a>00169 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ret == 0) {
|
195
|
+
<a name="l00170"></a>00170 done = <span class="keyword">true</span>;
|
196
|
+
<a name="l00171"></a>00171 ScopeGuard guard(boost::bind(&<a class="code" href="classPassenger_1_1EventedClient.html#a5b1a3011165ea9a47f6fe668a5010a20" title="Disconnects the client.">EventedClient::disconnect</a>,
|
197
|
+
<a name="l00172"></a>00172 client, <span class="keyword">false</span>));
|
198
|
+
<a name="l00173"></a>00173 onEndOfStream(client);
|
199
|
+
<a name="l00174"></a>00174 } <span class="keywordflow">else</span> {
|
200
|
+
<a name="l00175"></a>00175 onDataReceived(client, buf, ret);
|
201
|
+
<a name="l00176"></a>00176 }
|
202
|
+
<a name="l00177"></a>00177 i++;
|
203
|
+
<a name="l00178"></a>00178 done = done || !client->ioAllowed();
|
204
|
+
<a name="l00179"></a>00179 }
|
205
|
+
<a name="l00180"></a>00180 }
|
206
|
+
<a name="l00181"></a>00181
|
207
|
+
<a name="l00182"></a>00182
|
208
|
+
<a name="l00183"></a>00183 <span class="comment">/******** New EventedMessageServer overridable hooks and API methods ********/</span>
|
209
|
+
<a name="l00184"></a>00184
|
210
|
+
<a name="l00185"></a>00185 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onClientAuthenticated(EventedMessageClient *client) {
|
211
|
+
<a name="l00186"></a>00186 <span class="comment">// Do nothing.</span>
|
212
|
+
<a name="l00187"></a>00187 }
|
213
|
+
<a name="l00188"></a>00188
|
214
|
+
<a name="l00189"></a>00189 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> onMessageReceived(EventedMessageClient *client, <span class="keyword">const</span> vector<StaticString> &args) {
|
215
|
+
<a name="l00190"></a>00190 <span class="keywordflow">return</span> <span class="keyword">true</span>;
|
216
|
+
<a name="l00191"></a>00191 }
|
217
|
+
<a name="l00192"></a>00192
|
218
|
+
<a name="l00193"></a>00193 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onEndOfStream(EventedMessageClient *client) {
|
219
|
+
<a name="l00194"></a>00194 <span class="comment">// Do nothing.</span>
|
220
|
+
<a name="l00195"></a>00195 }
|
221
|
+
<a name="l00196"></a>00196
|
222
|
+
<a name="l00197"></a>00197 <span class="keyword">virtual</span> pair<size_t, bool> onOtherDataReceived(EventedMessageClient *client,
|
223
|
+
<a name="l00198"></a>00198 <span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size)
|
224
|
+
<a name="l00199"></a>00199 {
|
225
|
+
<a name="l00200"></a>00200 abort();
|
226
|
+
<a name="l00201"></a>00201 }
|
227
|
+
<a name="l00202"></a>00202
|
228
|
+
<a name="l00203"></a>00203 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *protocolVersion()<span class="keyword"> const </span>{
|
229
|
+
<a name="l00204"></a>00204 <span class="keywordflow">return</span> <span class="stringliteral">"1"</span>;
|
230
|
+
<a name="l00205"></a>00205 }
|
231
|
+
<a name="l00206"></a>00206
|
232
|
+
<a name="l00207"></a>00207 <span class="keywordtype">void</span> discardReadData() {
|
233
|
+
<a name="l00208"></a>00208 readDataDiscarded = <span class="keyword">true</span>;
|
234
|
+
<a name="l00209"></a>00209 }
|
235
|
+
<a name="l00210"></a>00210
|
236
|
+
<a name="l00211"></a>00211 <span class="keyword">private</span>:
|
237
|
+
<a name="l00212"></a>00212 <span class="keywordtype">bool</span> readDataDiscarded;
|
238
|
+
<a name="l00213"></a>00213
|
239
|
+
<a name="l00214"></a>00214 <span class="keyword">static</span> <span class="keywordtype">void</span> onAuthenticationTimeout(ev::timer &t, <span class="keywordtype">int</span> revents) {
|
240
|
+
<a name="l00215"></a>00215 EventedMessageClient *client = (EventedMessageClient *) t.data;
|
241
|
+
<a name="l00216"></a>00216 client->disconnect();
|
242
|
+
<a name="l00217"></a>00217 }
|
243
|
+
<a name="l00218"></a>00218
|
244
|
+
<a name="l00219"></a>00219 <span class="keywordtype">void</span> onDataReceived(EventedMessageClient *client, <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
|
245
|
+
<a name="l00220"></a>00220 EventedMessageClientContext *context = &client->messageServer;
|
246
|
+
<a name="l00221"></a>00221 <span class="keywordtype">size_t</span> consumed = 0;
|
247
|
+
<a name="l00222"></a>00222
|
248
|
+
<a name="l00223"></a>00223 readDataDiscarded = <span class="keyword">false</span>;
|
249
|
+
<a name="l00224"></a>00224 <span class="keywordflow">while</span> (consumed < size && client->ioAllowed() && !readDataDiscarded) {
|
250
|
+
<a name="l00225"></a>00225 <span class="keywordtype">char</span> *current = data + consumed;
|
251
|
+
<a name="l00226"></a>00226 <span class="keywordtype">size_t</span> rest = size - consumed;
|
252
|
+
<a name="l00227"></a>00227
|
253
|
+
<a name="l00228"></a>00228 <span class="keywordflow">switch</span> (context->state) {
|
254
|
+
<a name="l00229"></a>00229 <span class="keywordflow">case</span> EventedMessageClientContext::MS_READING_USERNAME:
|
255
|
+
<a name="l00230"></a>00230 consumed += context->scalarReader.feed(current, rest);
|
256
|
+
<a name="l00231"></a>00231 <span class="keywordflow">if</span> (context->scalarReader.hasError()) {
|
257
|
+
<a name="l00232"></a>00232 client->writeArrayMessage(
|
258
|
+
<a name="l00233"></a>00233 <span class="stringliteral">"The supplied username is too long."</span>,
|
259
|
+
<a name="l00234"></a>00234 NULL);
|
260
|
+
<a name="l00235"></a>00235 client->disconnect();
|
261
|
+
<a name="l00236"></a>00236 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (context->scalarReader.done()) {
|
262
|
+
<a name="l00237"></a>00237 context->username = context->scalarReader.value();
|
263
|
+
<a name="l00238"></a>00238 context->scalarReader.reset();
|
264
|
+
<a name="l00239"></a>00239 context->scalarReader.setMaxSize(MESSAGE_SERVER_MAX_PASSWORD_SIZE);
|
265
|
+
<a name="l00240"></a>00240 context->state = EventedMessageClientContext::MS_READING_PASSWORD;
|
266
|
+
<a name="l00241"></a>00241 }
|
267
|
+
<a name="l00242"></a>00242 <span class="keywordflow">break</span>;
|
268
|
+
<a name="l00243"></a>00243
|
269
|
+
<a name="l00244"></a>00244 <span class="keywordflow">case</span> EventedMessageClientContext::MS_READING_PASSWORD: {
|
270
|
+
<a name="l00245"></a>00245 <span class="keywordtype">size_t</span> locallyConsumed;
|
271
|
+
<a name="l00246"></a>00246
|
272
|
+
<a name="l00247"></a>00247 locallyConsumed = context->scalarReader.feed(current, rest);
|
273
|
+
<a name="l00248"></a>00248 consumed += locallyConsumed;
|
274
|
+
<a name="l00249"></a>00249
|
275
|
+
<a name="l00250"></a>00250 <span class="comment">// The buffer contains password data so make sure we zero</span>
|
276
|
+
<a name="l00251"></a>00251 <span class="comment">// it out when we're done.</span>
|
277
|
+
<a name="l00252"></a>00252 MemZeroGuard passwordGuard(current, locallyConsumed);
|
278
|
+
<a name="l00253"></a>00253
|
279
|
+
<a name="l00254"></a>00254 <span class="keywordflow">if</span> (context->scalarReader.hasError()) {
|
280
|
+
<a name="l00255"></a>00255 context->scalarReader.reset(<span class="keyword">true</span>);
|
281
|
+
<a name="l00256"></a>00256 client->writeArrayMessage(
|
282
|
+
<a name="l00257"></a>00257 <span class="stringliteral">"The supplied password is too long."</span>,
|
283
|
+
<a name="l00258"></a>00258 NULL);
|
284
|
+
<a name="l00259"></a>00259 client->disconnect();
|
285
|
+
<a name="l00260"></a>00260 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (context->scalarReader.done()) {
|
286
|
+
<a name="l00261"></a>00261 context->authenticationTimer.stop();
|
287
|
+
<a name="l00262"></a>00262 context->account = accountsDatabase->authenticate(
|
288
|
+
<a name="l00263"></a>00263 context->username, context->scalarReader.value());
|
289
|
+
<a name="l00264"></a>00264 passwordGuard.zeroNow();
|
290
|
+
<a name="l00265"></a>00265 context->username.clear();
|
291
|
+
<a name="l00266"></a>00266 <span class="keywordflow">if</span> (context->account) {
|
292
|
+
<a name="l00267"></a>00267 context->scalarReader.reset(<span class="keyword">true</span>);
|
293
|
+
<a name="l00268"></a>00268 context->state = EventedMessageClientContext::MS_READING_MESSAGE;
|
294
|
+
<a name="l00269"></a>00269 client->writeArrayMessage(<span class="stringliteral">"ok"</span>, NULL);
|
295
|
+
<a name="l00270"></a>00270 onClientAuthenticated(client);
|
296
|
+
<a name="l00271"></a>00271 } <span class="keywordflow">else</span> {
|
297
|
+
<a name="l00272"></a>00272 context->scalarReader.reset(<span class="keyword">true</span>);
|
298
|
+
<a name="l00273"></a>00273 client->writeArrayMessage(
|
299
|
+
<a name="l00274"></a>00274 <span class="stringliteral">"Invalid username or password."</span>,
|
300
|
+
<a name="l00275"></a>00275 NULL);
|
301
|
+
<a name="l00276"></a>00276 client->disconnect();
|
302
|
+
<a name="l00277"></a>00277 }
|
303
|
+
<a name="l00278"></a>00278 }
|
304
|
+
<a name="l00279"></a>00279 <span class="keywordflow">break</span>;
|
305
|
+
<a name="l00280"></a>00280 }
|
306
|
+
<a name="l00281"></a>00281
|
307
|
+
<a name="l00282"></a>00282 <span class="keywordflow">case</span> EventedMessageClientContext::MS_READING_MESSAGE:
|
308
|
+
<a name="l00283"></a>00283 consumed += context->arrayReader.feed(current, rest);
|
309
|
+
<a name="l00284"></a>00284 <span class="keywordflow">if</span> (context->arrayReader.hasError()) {
|
310
|
+
<a name="l00285"></a>00285 client->disconnect();
|
311
|
+
<a name="l00286"></a>00286 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (context->arrayReader.done()) {
|
312
|
+
<a name="l00287"></a>00287 context->state = EventedMessageClientContext::MS_PROCESSING_MESSAGE;
|
313
|
+
<a name="l00288"></a>00288 <span class="keywordflow">if</span> (context->arrayReader.value().empty()) {
|
314
|
+
<a name="l00289"></a>00289 logError(client, <span class="stringliteral">"Client sent an empty message."</span>);
|
315
|
+
<a name="l00290"></a>00290 client->disconnect();
|
316
|
+
<a name="l00291"></a>00291 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (onMessageReceived(client, context->arrayReader.value())
|
317
|
+
<a name="l00292"></a>00292 && context->state == EventedMessageClientContext::MS_PROCESSING_MESSAGE) {
|
318
|
+
<a name="l00293"></a>00293 context->state = EventedMessageClientContext::MS_READING_MESSAGE;
|
319
|
+
<a name="l00294"></a>00294 }
|
320
|
+
<a name="l00295"></a>00295 context->arrayReader.reset();
|
321
|
+
<a name="l00296"></a>00296 }
|
322
|
+
<a name="l00297"></a>00297 <span class="keywordflow">break</span>;
|
323
|
+
<a name="l00298"></a>00298
|
324
|
+
<a name="l00299"></a>00299 <span class="keywordflow">case</span> EventedMessageClientContext::MS_PROCESSING_MESSAGE: {
|
325
|
+
<a name="l00300"></a>00300 pair<size_t, bool> ret = onOtherDataReceived(client, current, rest);
|
326
|
+
<a name="l00301"></a>00301 consumed += ret.first;
|
327
|
+
<a name="l00302"></a>00302 <span class="keywordflow">if</span> (ret.second && context->state == EventedMessageClientContext::MS_PROCESSING_MESSAGE) {
|
328
|
+
<a name="l00303"></a>00303 context->state = EventedMessageClientContext::MS_READING_MESSAGE;
|
329
|
+
<a name="l00304"></a>00304 }
|
330
|
+
<a name="l00305"></a>00305 <span class="keywordflow">break</span>;
|
331
|
+
<a name="l00306"></a>00306 }
|
332
|
+
<a name="l00307"></a>00307
|
333
|
+
<a name="l00308"></a>00308 <span class="keywordflow">default</span>:
|
334
|
+
<a name="l00309"></a>00309 <span class="comment">// Never reached.</span>
|
335
|
+
<a name="l00310"></a>00310 abort();
|
336
|
+
<a name="l00311"></a>00311 }
|
337
|
+
<a name="l00312"></a>00312 }
|
338
|
+
<a name="l00313"></a>00313 }
|
339
|
+
<a name="l00314"></a>00314
|
340
|
+
<a name="l00315"></a>00315 <span class="keyword">public</span>:
|
341
|
+
<a name="l00316"></a>00316 <a class="code" href="classPassenger_1_1EventedMessageServer.html" title="Note when overriding onNewClient: call the parent method first! It does some initialization...">EventedMessageServer</a>(<span class="keyword">struct</span> ev_loop *loop, <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> fd,
|
342
|
+
<a name="l00317"></a>00317 <span class="keyword">const</span> AccountsDatabasePtr &accountsDatabase)
|
343
|
+
<a name="l00318"></a>00318 : <a class="code" href="classPassenger_1_1EventedServer.html" title="A base class for writing single-threaded, evented servers that use non-blocking I/O...">EventedServer</a>(loop, fd)
|
344
|
+
<a name="l00319"></a>00319 {
|
345
|
+
<a name="l00320"></a>00320 this->accountsDatabase = accountsDatabase;
|
346
|
+
<a name="l00321"></a>00321 }
|
347
|
+
<a name="l00322"></a>00322 };
|
348
|
+
<a name="l00323"></a>00323
|
349
|
+
<a name="l00324"></a>00324
|
350
|
+
<a name="l00325"></a>00325 } <span class="comment">// namespace Passenger</span>
|
351
|
+
<a name="l00326"></a>00326
|
352
|
+
<a name="l00327"></a>00327 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_EVENTED_MESSAGE_SERVER_H_ */</span>
|
353
|
+
</pre></div></div>
|
354
|
+
<hr size="1"/><address style="text-align: right;"><small>Generated by
|
355
|
+
<a href="http://www.doxygen.org/index.html">
|
356
|
+
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
|
357
|
+
</body>
|
358
|
+
</html>
|
@@ -0,0 +1,326 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
5
|
+
<title>Passenger: EventedServer.h Source File</title>
|
6
|
+
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
7
|
+
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<!-- Generated by Doxygen 1.6.2 -->
|
11
|
+
<div class="navigation" id="top">
|
12
|
+
<div class="tabs">
|
13
|
+
<ul>
|
14
|
+
<li><a href="main.html"><span>Main Page</span></a></li>
|
15
|
+
<li><a href="modules.html"><span>Modules</span></a></li>
|
16
|
+
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
|
17
|
+
<li><a href="annotated.html"><span>Classes</span></a></li>
|
18
|
+
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
19
|
+
</ul>
|
20
|
+
</div>
|
21
|
+
<div class="tabs">
|
22
|
+
<ul>
|
23
|
+
<li><a href="files.html"><span>File List</span></a></li>
|
24
|
+
</ul>
|
25
|
+
</div>
|
26
|
+
<h1>EventedServer.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
|
27
|
+
<a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
|
28
|
+
<a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
|
29
|
+
<a name="l00004"></a>00004 <span class="comment"> *</span>
|
30
|
+
<a name="l00005"></a>00005 <span class="comment"> * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.</span>
|
31
|
+
<a name="l00006"></a>00006 <span class="comment"> *</span>
|
32
|
+
<a name="l00007"></a>00007 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span>
|
33
|
+
<a name="l00008"></a>00008 <span class="comment"> * of this software and associated documentation files (the "Software"), to deal</span>
|
34
|
+
<a name="l00009"></a>00009 <span class="comment"> * in the Software without restriction, including without limitation the rights</span>
|
35
|
+
<a name="l00010"></a>00010 <span class="comment"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
|
36
|
+
<a name="l00011"></a>00011 <span class="comment"> * copies of the Software, and to permit persons to whom the Software is</span>
|
37
|
+
<a name="l00012"></a>00012 <span class="comment"> * furnished to do so, subject to the following conditions:</span>
|
38
|
+
<a name="l00013"></a>00013 <span class="comment"> *</span>
|
39
|
+
<a name="l00014"></a>00014 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
|
40
|
+
<a name="l00015"></a>00015 <span class="comment"> * all copies or substantial portions of the Software.</span>
|
41
|
+
<a name="l00016"></a>00016 <span class="comment"> *</span>
|
42
|
+
<a name="l00017"></a>00017 <span class="comment"> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
|
43
|
+
<a name="l00018"></a>00018 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
|
44
|
+
<a name="l00019"></a>00019 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
|
45
|
+
<a name="l00020"></a>00020 <span class="comment"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
|
46
|
+
<a name="l00021"></a>00021 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
|
47
|
+
<a name="l00022"></a>00022 <span class="comment"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
|
48
|
+
<a name="l00023"></a>00023 <span class="comment"> * THE SOFTWARE.</span>
|
49
|
+
<a name="l00024"></a>00024 <span class="comment"> */</span>
|
50
|
+
<a name="l00025"></a>00025 <span class="preprocessor">#ifndef _PASSENGER_EVENTED_SERVER_H_</span>
|
51
|
+
<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_EVENTED_SERVER_H_</span>
|
52
|
+
<a name="l00027"></a>00027 <span class="preprocessor"></span>
|
53
|
+
<a name="l00028"></a>00028 <span class="preprocessor">#include <ev++.h></span>
|
54
|
+
<a name="l00029"></a>00029 <span class="preprocessor">#include <boost/shared_ptr.hpp></span>
|
55
|
+
<a name="l00030"></a>00030 <span class="preprocessor">#include <boost/enable_shared_from_this.hpp></span>
|
56
|
+
<a name="l00031"></a>00031 <span class="preprocessor">#include <oxt/system_calls.hpp></span>
|
57
|
+
<a name="l00032"></a>00032 <span class="preprocessor">#include <oxt/macros.hpp></span>
|
58
|
+
<a name="l00033"></a>00033 <span class="preprocessor">#include <algorithm></span>
|
59
|
+
<a name="l00034"></a>00034 <span class="preprocessor">#include <string></span>
|
60
|
+
<a name="l00035"></a>00035 <span class="preprocessor">#include <set></span>
|
61
|
+
<a name="l00036"></a>00036 <span class="preprocessor">#include <sys/types.h></span>
|
62
|
+
<a name="l00037"></a>00037 <span class="preprocessor">#include <sys/un.h></span>
|
63
|
+
<a name="l00038"></a>00038 <span class="preprocessor">#include <sys/uio.h></span>
|
64
|
+
<a name="l00039"></a>00039 <span class="preprocessor">#include <netinet/in.h></span>
|
65
|
+
<a name="l00040"></a>00040 <span class="preprocessor">#include <unistd.h></span>
|
66
|
+
<a name="l00041"></a>00041 <span class="preprocessor">#include <cerrno></span>
|
67
|
+
<a name="l00042"></a>00042 <span class="preprocessor">#include "EventedClient.h"</span>
|
68
|
+
<a name="l00043"></a>00043 <span class="preprocessor">#include "FileDescriptor.h"</span>
|
69
|
+
<a name="l00044"></a>00044 <span class="preprocessor">#include "StaticString.h"</span>
|
70
|
+
<a name="l00045"></a>00045 <span class="preprocessor">#include "Logging.h"</span>
|
71
|
+
<a name="l00046"></a>00046 <span class="preprocessor">#include "Utils/ScopeGuard.h"</span>
|
72
|
+
<a name="l00047"></a>00047 <span class="preprocessor">#include "Utils/StrIntUtils.h"</span>
|
73
|
+
<a name="l00048"></a>00048
|
74
|
+
<a name="l00049"></a>00049 <span class="keyword">namespace </span>Passenger {
|
75
|
+
<a name="l00050"></a>00050
|
76
|
+
<a name="l00051"></a>00051 <span class="keyword">using namespace </span>std;
|
77
|
+
<a name="l00052"></a>00052 <span class="keyword">using namespace </span>boost;
|
78
|
+
<a name="l00053"></a>00053 <span class="keyword">using namespace </span>oxt;
|
79
|
+
<a name="l00054"></a>00054
|
80
|
+
<a name="l00055"></a>00055 <span class="comment"></span>
|
81
|
+
<a name="l00056"></a>00056 <span class="comment">/**</span>
|
82
|
+
<a name="l00057"></a>00057 <span class="comment"> * A base class for writing single-threaded, evented servers that use non-blocking I/O.</span>
|
83
|
+
<a name="l00058"></a>00058 <span class="comment"> * It uses libev for its event loop. EventedServer handles much of the situps regarding</span>
|
84
|
+
<a name="l00059"></a>00059 <span class="comment"> * client connection management and output buffering and tries to make it easy to</span>
|
85
|
+
<a name="l00060"></a>00060 <span class="comment"> * implement a zero-copy architecture.</span>
|
86
|
+
<a name="l00061"></a>00061 <span class="comment"> *</span>
|
87
|
+
<a name="l00062"></a>00062 <span class="comment"> * <h2>Basic usage</h2></span>
|
88
|
+
<a name="l00063"></a>00063 <span class="comment"> * Derived classes can override the onClientReadable() method, which is called every time</span>
|
89
|
+
<a name="l00064"></a>00064 <span class="comment"> * a specific client becomes readable. It is passed a Client object which contains information</span>
|
90
|
+
<a name="l00065"></a>00065 <span class="comment"> * about the client, such as its file descriptor. One can use the read() system call in</span>
|
91
|
+
<a name="l00066"></a>00066 <span class="comment"> * that method to receive data from the client. Please note that client file descriptors</span>
|
92
|
+
<a name="l00067"></a>00067 <span class="comment"> * are always set to non-blocking mode so you need to handle this gracefully.</span>
|
93
|
+
<a name="l00068"></a>00068 <span class="comment"> *</span>
|
94
|
+
<a name="l00069"></a>00069 <span class="comment"> * EventedServer provides the write() method for sending data to the client. This method</span>
|
95
|
+
<a name="l00070"></a>00070 <span class="comment"> * will attempt to send the data to the client immediately; if it fails with EAGAIN then</span>
|
96
|
+
<a name="l00071"></a>00071 <span class="comment"> * EventedServer will take care of scheduling the send at a later time when the client</span>
|
97
|
+
<a name="l00072"></a>00072 <span class="comment"> * is ready again to receive data.</span>
|
98
|
+
<a name="l00073"></a>00073 <span class="comment"> *</span>
|
99
|
+
<a name="l00074"></a>00074 <span class="comment"> * To disconnect the client, call disconnect(). The connection might not be actually</span>
|
100
|
+
<a name="l00075"></a>00075 <span class="comment"> * closed until all pending outgoing data have been sent out, but all the gory details</span>
|
101
|
+
<a name="l00076"></a>00076 <span class="comment"> * is taken care of for you.</span>
|
102
|
+
<a name="l00077"></a>00077 <span class="comment"> *</span>
|
103
|
+
<a name="l00078"></a>00078 <span class="comment"> * <h2>Keeping per-client information</h2></span>
|
104
|
+
<a name="l00079"></a>00079 <span class="comment"> * If you need to keep per-client information then you can override the createClient()</span>
|
105
|
+
<a name="l00080"></a>00080 <span class="comment"> * method and make it return an object that's a subclass of EventedServer::Client. This</span>
|
106
|
+
<a name="l00081"></a>00081 <span class="comment"> * object is passed to onClientReadable(), so in there you can just cast the client object</span>
|
107
|
+
<a name="l00082"></a>00082 <span class="comment"> * to your subclass.</span>
|
108
|
+
<a name="l00083"></a>00083 <span class="comment"> *</span>
|
109
|
+
<a name="l00084"></a>00084 <span class="comment"> * <h2>Client object life times</h2></span>
|
110
|
+
<a name="l00085"></a>00085 <span class="comment"> * All client objects are destroyed along with the EventedServer. Disconnecting</span>
|
111
|
+
<a name="l00086"></a>00086 <span class="comment"> * a client also causes it to be destroyed after the current event handler has</span>
|
112
|
+
<a name="l00087"></a>00087 <span class="comment"> * run or a short period of time after that.</span>
|
113
|
+
<a name="l00088"></a>00088 <span class="comment"> */</span>
|
114
|
+
<a name="l00089"></a><a class="code" href="classPassenger_1_1EventedServer.html">00089</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1EventedServer.html" title="A base class for writing single-threaded, evented servers that use non-blocking I/O...">EventedServer</a> {
|
115
|
+
<a name="l00090"></a>00090 <span class="keyword">protected</span>:
|
116
|
+
<a name="l00091"></a>00091 <span class="keyword">typedef</span> set<EventedClient *> ClientSet;
|
117
|
+
<a name="l00092"></a>00092
|
118
|
+
<a name="l00093"></a>00093 <span class="keyword">const</span> ClientSet &getClients()<span class="keyword"> const </span>{
|
119
|
+
<a name="l00094"></a>00094 <span class="keywordflow">return</span> clients;
|
120
|
+
<a name="l00095"></a>00095 }
|
121
|
+
<a name="l00096"></a>00096
|
122
|
+
<a name="l00097"></a>00097 <span class="keywordtype">string</span> getClientName(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client)<span class="keyword"> const </span>{
|
123
|
+
<a name="l00098"></a>00098 <span class="keywordflow">return</span> toString(client);
|
124
|
+
<a name="l00099"></a>00099 }
|
125
|
+
<a name="l00100"></a>00100
|
126
|
+
<a name="l00101"></a>00101 <span class="keywordtype">void</span> logError(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client, <span class="keyword">const</span> <span class="keywordtype">string</span> &message) {
|
127
|
+
<a name="l00102"></a>00102 P_ERROR(<span class="stringliteral">"Error in client "</span> << getClientName(client) << <span class="stringliteral">": "</span> << message);
|
128
|
+
<a name="l00103"></a>00103 }
|
129
|
+
<a name="l00104"></a>00104
|
130
|
+
<a name="l00105"></a>00105 <span class="keywordtype">void</span> logSystemError(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client, <span class="keyword">const</span> <span class="keywordtype">string</span> &message, <span class="keywordtype">int</span> errorCode) {
|
131
|
+
<a name="l00106"></a>00106 P_ERROR(<span class="stringliteral">"Error in client "</span> << getClientName(client) << <span class="stringliteral">": "</span> <<
|
132
|
+
<a name="l00107"></a>00107 message << <span class="stringliteral">": "</span> << strerror(errorCode) << <span class="stringliteral">" ("</span> << errorCode << <span class="stringliteral">")"</span>);
|
133
|
+
<a name="l00108"></a>00108 }
|
134
|
+
<a name="l00109"></a>00109
|
135
|
+
<a name="l00110"></a>00110 <span class="keywordtype">void</span> logSystemError(<span class="keyword">const</span> <span class="keywordtype">string</span> &message, <span class="keywordtype">int</span> errorCode) {
|
136
|
+
<a name="l00111"></a>00111 P_ERROR(message << <span class="stringliteral">": "</span> << strerror(errorCode) << <span class="stringliteral">" ("</span> << errorCode << <span class="stringliteral">")"</span>);
|
137
|
+
<a name="l00112"></a>00112 }
|
138
|
+
<a name="l00113"></a>00113
|
139
|
+
<a name="l00114"></a>00114 <span class="keyword">virtual</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *createClient(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> &fd) {
|
140
|
+
<a name="l00115"></a>00115 <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a>(loop, fd);
|
141
|
+
<a name="l00116"></a>00116 }
|
142
|
+
<a name="l00117"></a>00117
|
143
|
+
<a name="l00118"></a>00118 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onNewClient(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client) { }
|
144
|
+
<a name="l00119"></a>00119 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onClientReadable(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client) { }
|
145
|
+
<a name="l00120"></a>00120 <span class="comment"></span>
|
146
|
+
<a name="l00121"></a>00121 <span class="comment"> /**</span>
|
147
|
+
<a name="l00122"></a>00122 <span class="comment"> * Called when a client has been disconnected. This may either be triggered</span>
|
148
|
+
<a name="l00123"></a>00123 <span class="comment"> * immediately by disconnect() or triggered after pending data has been sent</span>
|
149
|
+
<a name="l00124"></a>00124 <span class="comment"> * out. This means that if you call disconnect() from onClientReadable() you</span>
|
150
|
+
<a name="l00125"></a>00125 <span class="comment"> * need take care of the possibility that control returns to onClientReadable()</span>
|
151
|
+
<a name="l00126"></a>00126 <span class="comment"> * after this method is done.</span>
|
152
|
+
<a name="l00127"></a>00127 <span class="comment"> *</span>
|
153
|
+
<a name="l00128"></a>00128 <span class="comment"> * Please note that when EventedServer is being destroyed,</span>
|
154
|
+
<a name="l00129"></a>00129 <span class="comment"> * onClientDisconnected() is *not* triggered.</span>
|
155
|
+
<a name="l00130"></a>00130 <span class="comment"> */</span>
|
156
|
+
<a name="l00131"></a><a class="code" href="classPassenger_1_1EventedServer.html#a7db4c8d0ad8aa77bcb40344e53319f11">00131</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1EventedServer.html#a7db4c8d0ad8aa77bcb40344e53319f11" title="Called when a client has been disconnected.">onClientDisconnected</a>(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client) { }
|
157
|
+
<a name="l00132"></a>00132
|
158
|
+
<a name="l00133"></a>00133 <span class="keyword">private</span>:
|
159
|
+
<a name="l00134"></a>00134 <span class="keyword">struct </span>ev_loop *loop;
|
160
|
+
<a name="l00135"></a>00135 <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> fd;
|
161
|
+
<a name="l00136"></a>00136 ev::io acceptWatcher;
|
162
|
+
<a name="l00137"></a>00137 ClientSet clients;
|
163
|
+
<a name="l00138"></a>00138
|
164
|
+
<a name="l00139"></a>00139 <span class="keywordtype">void</span> removeClient(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client) {
|
165
|
+
<a name="l00140"></a>00140 clients.erase(client);
|
166
|
+
<a name="l00141"></a>00141 }
|
167
|
+
<a name="l00142"></a>00142
|
168
|
+
<a name="l00143"></a>00143 <span class="keywordtype">void</span> freeAllClients() {
|
169
|
+
<a name="l00144"></a>00144 ClientSet::iterator it;
|
170
|
+
<a name="l00145"></a>00145 ClientSet::iterator end = clients.end();
|
171
|
+
<a name="l00146"></a>00146
|
172
|
+
<a name="l00147"></a>00147 <span class="keywordflow">for</span> (it = clients.begin(); it != clients.end(); it++) {
|
173
|
+
<a name="l00148"></a>00148 (*it)->unref();
|
174
|
+
<a name="l00149"></a>00149 }
|
175
|
+
<a name="l00150"></a>00150 clients.clear();
|
176
|
+
<a name="l00151"></a>00151 }
|
177
|
+
<a name="l00152"></a>00152
|
178
|
+
<a name="l00153"></a>00153 <span class="keyword">static</span> <span class="keywordtype">void</span> _onReadable(EventedClient *client) {
|
179
|
+
<a name="l00154"></a>00154 EventedServer *server = (EventedServer *) client->userData;
|
180
|
+
<a name="l00155"></a>00155 client->ref();
|
181
|
+
<a name="l00156"></a>00156 ScopeGuard guard(boost::bind(&<a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">EventedClient::unref</a>, client));
|
182
|
+
<a name="l00157"></a>00157 server->onClientReadable((EventedClient *) client);
|
183
|
+
<a name="l00158"></a>00158 }
|
184
|
+
<a name="l00159"></a>00159
|
185
|
+
<a name="l00160"></a>00160 <span class="keyword">static</span> <span class="keywordtype">void</span> _onDisconnect(EventedClient *client) {
|
186
|
+
<a name="l00161"></a>00161 EventedServer *server = (EventedServer *) client->userData;
|
187
|
+
<a name="l00162"></a>00162 ScopeGuard guard1(boost::bind(&<a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">EventedClient::unref</a>, client));
|
188
|
+
<a name="l00163"></a>00163
|
189
|
+
<a name="l00164"></a>00164 client->ref();
|
190
|
+
<a name="l00165"></a>00165 ScopeGuard guard2(boost::bind(&<a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">EventedClient::unref</a>, client));
|
191
|
+
<a name="l00166"></a>00166
|
192
|
+
<a name="l00167"></a>00167 server->removeClient(client);
|
193
|
+
<a name="l00168"></a>00168 server->onClientDisconnected((EventedClient *) client);
|
194
|
+
<a name="l00169"></a>00169 }
|
195
|
+
<a name="l00170"></a>00170
|
196
|
+
<a name="l00171"></a>00171 <span class="keyword">static</span> <span class="keywordtype">void</span> _onDetach(EventedClient *client) {
|
197
|
+
<a name="l00172"></a>00172 EventedServer *server = (EventedServer *) client->userData;
|
198
|
+
<a name="l00173"></a>00173 ScopeGuard guard1(boost::bind(&<a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">EventedClient::unref</a>, client));
|
199
|
+
<a name="l00174"></a>00174
|
200
|
+
<a name="l00175"></a>00175 client->ref();
|
201
|
+
<a name="l00176"></a>00176 ScopeGuard guard2(boost::bind(&<a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">EventedClient::unref</a>, client));
|
202
|
+
<a name="l00177"></a>00177
|
203
|
+
<a name="l00178"></a>00178 server->removeClient(client);
|
204
|
+
<a name="l00179"></a>00179 }
|
205
|
+
<a name="l00180"></a>00180
|
206
|
+
<a name="l00181"></a>00181 <span class="keyword">static</span> <span class="keywordtype">void</span> _onSystemError(EventedClient *client, <span class="keyword">const</span> <span class="keywordtype">string</span> &message, <span class="keywordtype">int</span> code) {
|
207
|
+
<a name="l00182"></a>00182 EventedServer *server = (EventedServer *) client->userData;
|
208
|
+
<a name="l00183"></a>00183 server->logSystemError(client, message, code);
|
209
|
+
<a name="l00184"></a>00184 }
|
210
|
+
<a name="l00185"></a>00185
|
211
|
+
<a name="l00186"></a>00186 <span class="keywordtype">void</span> exceptionThrownWhileInitializingClient(EventedClient *client, ClientSet::iterator it) {
|
212
|
+
<a name="l00187"></a>00187 <span class="keywordflow">if</span> (!client->ioAllowed()) {
|
213
|
+
<a name="l00188"></a>00188 <span class="comment">// onNewClient() disconnected or detached the</span>
|
214
|
+
<a name="l00189"></a>00189 <span class="comment">// client, so client refcount == 1</span>
|
215
|
+
<a name="l00190"></a>00190 client->unref();
|
216
|
+
<a name="l00191"></a>00191 } <span class="keywordflow">else</span> {
|
217
|
+
<a name="l00192"></a>00192 <span class="comment">// client refcount == 2</span>
|
218
|
+
<a name="l00193"></a>00193 client->unref();
|
219
|
+
<a name="l00194"></a>00194 client->unref();
|
220
|
+
<a name="l00195"></a>00195 clients.erase(it);
|
221
|
+
<a name="l00196"></a>00196 }
|
222
|
+
<a name="l00197"></a>00197 <span class="comment">// Now client refcount == 0</span>
|
223
|
+
<a name="l00198"></a>00198 }
|
224
|
+
<a name="l00199"></a>00199
|
225
|
+
<a name="l00200"></a>00200 <span class="keywordtype">void</span> onAcceptable(ev::io &w, <span class="keywordtype">int</span> revents) {
|
226
|
+
<a name="l00201"></a>00201 this_thread::disable_syscall_interruption dsi;
|
227
|
+
<a name="l00202"></a>00202 <span class="keywordtype">int</span> i = 0;
|
228
|
+
<a name="l00203"></a>00203 <span class="keywordtype">bool</span> done = <span class="keyword">false</span>;
|
229
|
+
<a name="l00204"></a>00204
|
230
|
+
<a name="l00205"></a>00205 <span class="comment">// Accept at most 10 connections on every accept readiness event</span>
|
231
|
+
<a name="l00206"></a>00206 <span class="comment">// in order to give other events the chance to be processed.</span>
|
232
|
+
<a name="l00207"></a>00207 <span class="keywordflow">while</span> (i < 10 && !done) {
|
233
|
+
<a name="l00208"></a>00208 <span class="comment">// Reserve enough space to hold both a Unix domain socket</span>
|
234
|
+
<a name="l00209"></a>00209 <span class="comment">// address and an IP socket address.</span>
|
235
|
+
<a name="l00210"></a>00210 <span class="keyword">union </span>{
|
236
|
+
<a name="l00211"></a>00211 <span class="keyword">struct </span>sockaddr_un local;
|
237
|
+
<a name="l00212"></a>00212 <span class="keyword">struct </span>sockaddr_in inet;
|
238
|
+
<a name="l00213"></a>00213 } addr;
|
239
|
+
<a name="l00214"></a>00214 socklen_t len = <span class="keyword">sizeof</span>(addr);
|
240
|
+
<a name="l00215"></a>00215
|
241
|
+
<a name="l00216"></a>00216 <span class="keywordtype">int</span> clientfd = syscalls::accept(fd, (<span class="keyword">struct</span> sockaddr *) &addr, &len);
|
242
|
+
<a name="l00217"></a>00217 <span class="keywordflow">if</span> (clientfd == -1) {
|
243
|
+
<a name="l00218"></a>00218 <span class="keywordflow">if</span> (errno != EAGAIN && errno != EWOULDBLOCK) {
|
244
|
+
<a name="l00219"></a>00219 <span class="keywordtype">int</span> e = errno;
|
245
|
+
<a name="l00220"></a>00220 logSystemError(<span class="stringliteral">"Cannot accept new client"</span>, e);
|
246
|
+
<a name="l00221"></a>00221 }
|
247
|
+
<a name="l00222"></a>00222 done = <span class="keyword">true</span>;
|
248
|
+
<a name="l00223"></a>00223 } <span class="keywordflow">else</span> {
|
249
|
+
<a name="l00224"></a>00224 FileDescriptor clientfdGuard = clientfd;
|
250
|
+
<a name="l00225"></a>00225 <span class="keywordtype">int</span> optval = 1;
|
251
|
+
<a name="l00226"></a>00226
|
252
|
+
<a name="l00227"></a>00227 setNonBlocking(clientfdGuard);
|
253
|
+
<a name="l00228"></a>00228 syscalls::setsockopt(clientfd, SOL_SOCKET, SO_KEEPALIVE,
|
254
|
+
<a name="l00229"></a>00229 &optval, <span class="keyword">sizeof</span>(optval));
|
255
|
+
<a name="l00230"></a>00230
|
256
|
+
<a name="l00231"></a>00231 EventedClient *client = createClient(clientfdGuard);
|
257
|
+
<a name="l00232"></a>00232 client->onReadable = _onReadable;
|
258
|
+
<a name="l00233"></a>00233 client->onDisconnect = _onDisconnect;
|
259
|
+
<a name="l00234"></a>00234 client->onDetach = _onDetach;
|
260
|
+
<a name="l00235"></a>00235 client->onSystemError = _onSystemError;
|
261
|
+
<a name="l00236"></a>00236 client->userData = <span class="keyword">this</span>;
|
262
|
+
<a name="l00237"></a>00237 client->notifyReads(<span class="keyword">true</span>);
|
263
|
+
<a name="l00238"></a>00238
|
264
|
+
<a name="l00239"></a>00239 pair<ClientSet::iterator, bool> p = clients.insert(client);
|
265
|
+
<a name="l00240"></a>00240
|
266
|
+
<a name="l00241"></a>00241 client->ref();
|
267
|
+
<a name="l00242"></a>00242 <span class="comment">// client refcount == 2</span>
|
268
|
+
<a name="l00243"></a>00243 {
|
269
|
+
<a name="l00244"></a>00244 ScopeGuard g(boost::bind(
|
270
|
+
<a name="l00245"></a>00245 &EventedServer::exceptionThrownWhileInitializingClient,
|
271
|
+
<a name="l00246"></a>00246 <span class="keyword">this</span>,
|
272
|
+
<a name="l00247"></a>00247 client,
|
273
|
+
<a name="l00248"></a>00248 p.first));
|
274
|
+
<a name="l00249"></a>00249 onNewClient(client);
|
275
|
+
<a name="l00250"></a>00250 g.clear();
|
276
|
+
<a name="l00251"></a>00251 <span class="comment">// If exception occurred: client refcount == 0</span>
|
277
|
+
<a name="l00252"></a>00252 }
|
278
|
+
<a name="l00253"></a>00253
|
279
|
+
<a name="l00254"></a>00254 <span class="comment">/* No exception occured.</span>
|
280
|
+
<a name="l00255"></a>00255 <span class="comment"> * If onNewClient() disconnected or detached the client:</span>
|
281
|
+
<a name="l00256"></a>00256 <span class="comment"> * client refcount == 1</span>
|
282
|
+
<a name="l00257"></a>00257 <span class="comment"> * We want the refcount to become 0.</span>
|
283
|
+
<a name="l00258"></a>00258 <span class="comment"> * If not:</span>
|
284
|
+
<a name="l00259"></a>00259 <span class="comment"> * client refcount == 2</span>
|
285
|
+
<a name="l00260"></a>00260 <span class="comment"> * We want the refcount to become 1.</span>
|
286
|
+
<a name="l00261"></a>00261 <span class="comment"> */</span>
|
287
|
+
<a name="l00262"></a>00262 client->unref();
|
288
|
+
<a name="l00263"></a>00263 }
|
289
|
+
<a name="l00264"></a>00264 i++;
|
290
|
+
<a name="l00265"></a>00265 }
|
291
|
+
<a name="l00266"></a>00266 }
|
292
|
+
<a name="l00267"></a>00267
|
293
|
+
<a name="l00268"></a>00268 <span class="keyword">public</span>:
|
294
|
+
<a name="l00269"></a>00269 EventedServer(<span class="keyword">struct</span> ev_loop *_loop, FileDescriptor serverFd)
|
295
|
+
<a name="l00270"></a>00270 : loop(_loop),
|
296
|
+
<a name="l00271"></a>00271 acceptWatcher(_loop)
|
297
|
+
<a name="l00272"></a>00272 {
|
298
|
+
<a name="l00273"></a>00273 fd = serverFd;
|
299
|
+
<a name="l00274"></a>00274 setNonBlocking(serverFd);
|
300
|
+
<a name="l00275"></a>00275 acceptWatcher.set<EventedServer, &EventedServer::onAcceptable>(<span class="keyword">this</span>);
|
301
|
+
<a name="l00276"></a>00276 acceptWatcher.start(fd, ev::READ);
|
302
|
+
<a name="l00277"></a>00277 }
|
303
|
+
<a name="l00278"></a>00278
|
304
|
+
<a name="l00279"></a>00279 <span class="keyword">virtual</span> ~EventedServer() {
|
305
|
+
<a name="l00280"></a>00280 freeAllClients();
|
306
|
+
<a name="l00281"></a>00281 }
|
307
|
+
<a name="l00282"></a>00282
|
308
|
+
<a name="l00283"></a>00283 <span class="keyword">struct </span>ev_loop *getLoop()<span class="keyword"> const </span>{
|
309
|
+
<a name="l00284"></a>00284 <span class="keywordflow">return</span> loop;
|
310
|
+
<a name="l00285"></a>00285 }
|
311
|
+
<a name="l00286"></a>00286
|
312
|
+
<a name="l00287"></a>00287 FileDescriptor getServerFd()<span class="keyword"> const </span>{
|
313
|
+
<a name="l00288"></a>00288 <span class="keywordflow">return</span> fd;
|
314
|
+
<a name="l00289"></a>00289 }
|
315
|
+
<a name="l00290"></a>00290 };
|
316
|
+
<a name="l00291"></a>00291
|
317
|
+
<a name="l00292"></a>00292
|
318
|
+
<a name="l00293"></a>00293 } <span class="comment">// namespace Passenger</span>
|
319
|
+
<a name="l00294"></a>00294
|
320
|
+
<a name="l00295"></a>00295 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_EVENTED_SERVER_H_ */</span>
|
321
|
+
</pre></div></div>
|
322
|
+
<hr size="1"/><address style="text-align: right;"><small>Generated by
|
323
|
+
<a href="http://www.doxygen.org/index.html">
|
324
|
+
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
|
325
|
+
</body>
|
326
|
+
</html>
|