passenger 3.0.3 → 3.0.4
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 +14 -0
- data/ext/apache2/Hooks.cpp +2 -2
- data/ext/boost/thread/exceptions.hpp +8 -1
- data/ext/common/Constants.h +1 -1
- data/ext/nginx/Configuration.c +2 -1
- data/lib/phusion_passenger.rb +1 -1
- metadata +4 -618
- data/doc/cxxapi/AbstractSpawnManager_8h-source.html +0 -138
- data/doc/cxxapi/AbstractSpawnManager_8h_source.html +0 -141
- data/doc/cxxapi/Account_8h-source.html +0 -202
- data/doc/cxxapi/Account_8h_source.html +0 -206
- data/doc/cxxapi/AccountsDatabase_8h-source.html +0 -158
- data/doc/cxxapi/AccountsDatabase_8h_source.html +0 -161
- data/doc/cxxapi/AgentBase_8h_source.html +0 -70
- data/doc/cxxapi/AgentsStarter_8h-source.html +0 -79
- data/doc/cxxapi/AgentsStarter_8h_source.html +0 -112
- data/doc/cxxapi/BCrypt_8h-source.html +0 -101
- data/doc/cxxapi/BCrypt_8h_source.html +0 -104
- data/doc/cxxapi/BacktracesServer_8h-source.html +0 -87
- data/doc/cxxapi/Base64_8h-source.html +0 -85
- data/doc/cxxapi/Blowfish_8h-source.html +0 -131
- data/doc/cxxapi/Blowfish_8h_source.html +0 -134
- data/doc/cxxapi/Bucket_8h-source.html +0 -115
- data/doc/cxxapi/Bucket_8h_source.html +0 -118
- data/doc/cxxapi/CachedFileStat_8h-source.html +0 -79
- data/doc/cxxapi/Configuration_8h-source.html +0 -432
- data/doc/cxxapi/Configuration_8h_source.html +0 -435
- data/doc/cxxapi/Constants_8h-source.html +0 -71
- data/doc/cxxapi/Constants_8h_source.html +0 -79
- data/doc/cxxapi/ContentHandler_8h-source.html +0 -92
- data/doc/cxxapi/ContentHandler_8h_source.html +0 -95
- data/doc/cxxapi/DirectoryMapper_8h-source.html +0 -324
- data/doc/cxxapi/DirectoryMapper_8h_source.html +0 -311
- data/doc/cxxapi/EventedClient_8h_source.html +0 -733
- data/doc/cxxapi/EventedMessageServer_8h_source.html +0 -358
- data/doc/cxxapi/EventedServer_8h-source.html +0 -415
- data/doc/cxxapi/EventedServer_8h_source.html +0 -326
- data/doc/cxxapi/Exceptions_8h-source.html +0 -363
- data/doc/cxxapi/Exceptions_8h_source.html +0 -393
- data/doc/cxxapi/FileChangeChecker_8h-source.html +0 -237
- data/doc/cxxapi/FileDescriptor_8h-source.html +0 -206
- data/doc/cxxapi/FileDescriptor_8h_source.html +0 -324
- data/doc/cxxapi/Hooks_8h-source.html +0 -73
- data/doc/cxxapi/Hooks_8h_source.html +0 -76
- data/doc/cxxapi/HttpStatusExtractor_8h-source.html +0 -379
- data/doc/cxxapi/HttpStatusExtractor_8h_source.html +0 -382
- data/doc/cxxapi/IniFile_8h_source.html +0 -527
- data/doc/cxxapi/LoggingServer_8h-source.html +0 -165
- data/doc/cxxapi/Logging_8h-source.html +0 -709
- data/doc/cxxapi/Logging_8h_source.html +0 -796
- data/doc/cxxapi/MessageChannel_8h-source.html +0 -852
- data/doc/cxxapi/MessageChannel_8h_source.html +0 -776
- data/doc/cxxapi/MessageClient_8h-source.html +0 -297
- data/doc/cxxapi/MessageClient_8h_source.html +0 -328
- data/doc/cxxapi/MessageReadersWriters_8h-source.html +0 -451
- data/doc/cxxapi/MessageReadersWriters_8h_source.html +0 -539
- data/doc/cxxapi/MessageServer_8h-source.html +0 -607
- data/doc/cxxapi/MessageServer_8h_source.html +0 -612
- data/doc/cxxapi/PoolOptions_8h-source.html +0 -511
- data/doc/cxxapi/PoolOptions_8h_source.html +0 -549
- data/doc/cxxapi/Process_8h-source.html +0 -283
- data/doc/cxxapi/Process_8h_source.html +0 -286
- data/doc/cxxapi/RandomGenerator_8h-source.html +0 -183
- data/doc/cxxapi/RandomGenerator_8h_source.html +0 -191
- data/doc/cxxapi/ResourceLocator_8h-source.html +0 -104
- data/doc/cxxapi/ResourceLocator_8h_source.html +0 -166
- data/doc/cxxapi/SafeLibev_8h_source.html +0 -180
- data/doc/cxxapi/ScgiRequestParser_8h-source.html +0 -400
- data/doc/cxxapi/ScgiRequestParser_8h_source.html +0 -406
- data/doc/cxxapi/ServerInstanceDir_8h-source.html +0 -356
- data/doc/cxxapi/ServerInstanceDir_8h_source.html +0 -378
- data/doc/cxxapi/Session_8h-source.html +0 -496
- data/doc/cxxapi/Session_8h_source.html +0 -501
- data/doc/cxxapi/SpawnManager_8h-source.html +0 -632
- data/doc/cxxapi/SpawnManager_8h_source.html +0 -647
- data/doc/cxxapi/StaticContentHandler_8h-source.html +0 -65
- data/doc/cxxapi/StaticContentHandler_8h_source.html +0 -68
- data/doc/cxxapi/StaticString_8h-source.html +0 -214
- data/doc/cxxapi/StaticString_8h_source.html +0 -329
- data/doc/cxxapi/StringListCreator_8h-source.html +0 -111
- data/doc/cxxapi/StringListCreator_8h_source.html +0 -114
- data/doc/cxxapi/SystemTime_8h-source.html +0 -222
- data/doc/cxxapi/Timer_8h-source.html +0 -157
- data/doc/cxxapi/Utils_8h-source.html +0 -688
- data/doc/cxxapi/Utils_8h_source.html +0 -459
- data/doc/cxxapi/Version_8h-source.html +0 -59
- data/doc/cxxapi/annotated.html +0 -87
- data/doc/cxxapi/apache2_2Configuration_8h-source.html +0 -79
- data/doc/cxxapi/apache2_2Configuration_8h_source.html +0 -82
- data/doc/cxxapi/classAgentWatcher-members.html +0 -54
- data/doc/cxxapi/classAgentWatcher.html +0 -419
- data/doc/cxxapi/classClient-members.html +0 -38
- data/doc/cxxapi/classClient.html +0 -123
- data/doc/cxxapi/classHooks-members.html +0 -40
- data/doc/cxxapi/classHooks.html +0 -153
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +0 -40
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +0 -187
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1ArgumentException.html +0 -56
- data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +0 -113
- data/doc/cxxapi/classPassenger_1_1ArrayReader-members.html +0 -33
- data/doc/cxxapi/classPassenger_1_1ArrayReader.html +0 -47
- data/doc/cxxapi/classPassenger_1_1BacktracesServer-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1BacktracesServer.html +0 -107
- data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +0 -38
- data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +0 -112
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1BusyException.html +0 -54
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +0 -51
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +0 -223
- data/doc/cxxapi/classPassenger_1_1EOFException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1EOFException.html +0 -61
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1EventFd-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1EventFd.html +0 -52
- data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +0 -59
- data/doc/cxxapi/classPassenger_1_1EventedClient.html +0 -531
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +0 -59
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1EventedServer.html +0 -93
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileChangeChecker-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1FileChangeChecker.html +0 -166
- data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +0 -178
- data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +0 -52
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +0 -58
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +0 -66
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +0 -39
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +0 -128
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1IOException.html +0 -61
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +0 -2
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MemZeroGuard-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1MemZeroGuard.html +0 -147
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +0 -57
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +0 -839
- data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +0 -49
- data/doc/cxxapi/classPassenger_1_1MessageServer.html +0 -407
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +0 -58
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +0 -165
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +0 -39
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +0 -173
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1Process-members.html +0 -44
- data/doc/cxxapi/classPassenger_1_1Process.html +0 -290
- data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +0 -79
- data/doc/cxxapi/classPassenger_1_1ResourceLocator-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1ResourceLocator.html +0 -51
- data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1RuntimeException.html +0 -54
- data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1SafeLibev.html +0 -51
- data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +0 -76
- data/doc/cxxapi/classPassenger_1_1ScalarReader-members.html +0 -33
- data/doc/cxxapi/classPassenger_1_1ScalarReader.html +0 -47
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +0 -50
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +0 -285
- data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1SecurityException.html +0 -56
- data/doc/cxxapi/classPassenger_1_1Session-members.html +0 -53
- data/doc/cxxapi/classPassenger_1_1Session.html +0 -556
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +0 -39
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +0 -101
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +0 -42
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +0 -292
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +0 -54
- data/doc/cxxapi/classPassenger_1_1StandardSession.html +0 -394
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1StaticString-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1StaticString.html +0 -56
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +0 -40
- data/doc/cxxapi/classPassenger_1_1SystemException.html +0 -155
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +0 -2
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SystemTime-members.html +0 -43
- data/doc/cxxapi/classPassenger_1_1SystemTime.html +0 -173
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +0 -40
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +0 -61
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1TimeoutException.html +0 -54
- data/doc/cxxapi/classPassenger_1_1Timer-members.html +0 -38
- data/doc/cxxapi/classPassenger_1_1Timer.html +0 -163
- data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1Uint16Message.html +0 -51
- data/doc/cxxapi/classPassenger_1_1Uint16Reader-members.html +0 -33
- data/doc/cxxapi/classPassenger_1_1Uint16Reader.html +0 -47
- data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1Uint32Message.html +0 -51
- data/doc/cxxapi/classPassenger_1_1Uint32Reader-members.html +0 -33
- data/doc/cxxapi/classPassenger_1_1Uint32Reader.html +0 -47
- data/doc/cxxapi/classServer-members.html +0 -36
- data/doc/cxxapi/classServer.html +0 -49
- data/doc/cxxapi/classServerInstanceDirToucher-members.html +0 -36
- data/doc/cxxapi/classServerInstanceDirToucher.html +0 -47
- data/doc/cxxapi/classes.html +0 -52
- data/doc/cxxapi/definitions_8h-source.html +0 -33
- data/doc/cxxapi/definitions_8h_source.html +0 -36
- data/doc/cxxapi/doxygen.css +0 -532
- data/doc/cxxapi/doxygen.png +0 -0
- data/doc/cxxapi/files.html +0 -76
- 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 +0 -103
- data/doc/cxxapi/functions_0x62.html +0 -82
- data/doc/cxxapi/functions_0x63.html +0 -102
- data/doc/cxxapi/functions_0x64.html +0 -102
- data/doc/cxxapi/functions_0x65.html +0 -88
- data/doc/cxxapi/functions_0x66.html +0 -100
- data/doc/cxxapi/functions_0x67.html +0 -167
- data/doc/cxxapi/functions_0x68.html +0 -88
- data/doc/cxxapi/functions_0x69.html +0 -96
- data/doc/cxxapi/functions_0x6b.html +0 -80
- data/doc/cxxapi/functions_0x6c.html +0 -88
- data/doc/cxxapi/functions_0x6d.html +0 -88
- data/doc/cxxapi/functions_0x6e.html +0 -86
- data/doc/cxxapi/functions_0x6f.html +0 -94
- data/doc/cxxapi/functions_0x70.html +0 -94
- data/doc/cxxapi/functions_0x72.html +0 -110
- data/doc/cxxapi/functions_0x73.html +0 -171
- data/doc/cxxapi/functions_0x74.html +0 -85
- data/doc/cxxapi/functions_0x75.html +0 -85
- data/doc/cxxapi/functions_0x77.html +0 -92
- data/doc/cxxapi/functions_0x7e.html +0 -79
- data/doc/cxxapi/functions_enum.html +0 -49
- data/doc/cxxapi/functions_eval.html +0 -67
- data/doc/cxxapi/functions_func.html +0 -531
- data/doc/cxxapi/functions_vars.html +0 -278
- data/doc/cxxapi/graph_legend.dot +0 -22
- data/doc/cxxapi/graph_legend.html +0 -92
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Configuration.html +0 -198
- data/doc/cxxapi/group__Configuration.map +0 -3
- data/doc/cxxapi/group__Configuration.png +0 -0
- data/doc/cxxapi/group__Core.html +0 -46
- data/doc/cxxapi/group__Core.map +0 -3
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +0 -53
- data/doc/cxxapi/group__Hooks.html +0 -42
- data/doc/cxxapi/group__Hooks.map +0 -3
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +0 -538
- data/doc/cxxapi/hierarchy.html +0 -101
- data/doc/cxxapi/index.html +0 -16
- data/doc/cxxapi/inherit__graph__0.map +0 -1
- data/doc/cxxapi/inherit__graph__0.md5 +0 -1
- data/doc/cxxapi/inherit__graph__0.png +0 -0
- data/doc/cxxapi/inherit__graph__1.map +0 -1
- data/doc/cxxapi/inherit__graph__1.md5 +0 -1
- data/doc/cxxapi/inherit__graph__1.png +0 -0
- data/doc/cxxapi/inherit__graph__10.map +0 -3
- data/doc/cxxapi/inherit__graph__10.md5 +0 -1
- data/doc/cxxapi/inherit__graph__10.png +0 -0
- data/doc/cxxapi/inherit__graph__11.map +0 -4
- data/doc/cxxapi/inherit__graph__11.md5 +0 -1
- data/doc/cxxapi/inherit__graph__11.png +0 -0
- data/doc/cxxapi/inherit__graph__12.map +0 -3
- data/doc/cxxapi/inherit__graph__12.md5 +0 -1
- data/doc/cxxapi/inherit__graph__12.png +0 -0
- data/doc/cxxapi/inherit__graph__13.map +0 -3
- data/doc/cxxapi/inherit__graph__13.md5 +0 -1
- data/doc/cxxapi/inherit__graph__13.png +0 -0
- data/doc/cxxapi/inherit__graph__14.map +0 -3
- data/doc/cxxapi/inherit__graph__14.md5 +0 -1
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +0 -3
- data/doc/cxxapi/inherit__graph__15.md5 +0 -1
- data/doc/cxxapi/inherit__graph__15.png +0 -0
- data/doc/cxxapi/inherit__graph__16.map +0 -5
- data/doc/cxxapi/inherit__graph__16.md5 +0 -1
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.map +0 -3
- data/doc/cxxapi/inherit__graph__17.md5 +0 -1
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.map +0 -3
- data/doc/cxxapi/inherit__graph__18.md5 +0 -1
- data/doc/cxxapi/inherit__graph__18.png +0 -0
- data/doc/cxxapi/inherit__graph__19.map +0 -4
- data/doc/cxxapi/inherit__graph__19.md5 +0 -1
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__2.map +0 -1
- data/doc/cxxapi/inherit__graph__2.md5 +0 -1
- data/doc/cxxapi/inherit__graph__2.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +0 -3
- data/doc/cxxapi/inherit__graph__20.md5 +0 -1
- data/doc/cxxapi/inherit__graph__20.png +0 -0
- data/doc/cxxapi/inherit__graph__21.map +0 -3
- data/doc/cxxapi/inherit__graph__21.md5 +0 -1
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__22.map +0 -3
- data/doc/cxxapi/inherit__graph__22.md5 +0 -1
- data/doc/cxxapi/inherit__graph__22.png +0 -0
- data/doc/cxxapi/inherit__graph__23.map +0 -3
- data/doc/cxxapi/inherit__graph__23.md5 +0 -1
- data/doc/cxxapi/inherit__graph__23.png +0 -0
- data/doc/cxxapi/inherit__graph__24.map +0 -3
- data/doc/cxxapi/inherit__graph__24.md5 +0 -1
- data/doc/cxxapi/inherit__graph__24.png +0 -0
- data/doc/cxxapi/inherit__graph__25.map +0 -3
- data/doc/cxxapi/inherit__graph__25.md5 +0 -1
- data/doc/cxxapi/inherit__graph__25.png +0 -0
- data/doc/cxxapi/inherit__graph__26.map +0 -3
- data/doc/cxxapi/inherit__graph__26.md5 +0 -1
- data/doc/cxxapi/inherit__graph__26.png +0 -0
- data/doc/cxxapi/inherit__graph__27.map +0 -3
- data/doc/cxxapi/inherit__graph__27.md5 +0 -1
- data/doc/cxxapi/inherit__graph__27.png +0 -0
- data/doc/cxxapi/inherit__graph__28.map +0 -3
- data/doc/cxxapi/inherit__graph__28.md5 +0 -1
- data/doc/cxxapi/inherit__graph__28.png +0 -0
- data/doc/cxxapi/inherit__graph__29.map +0 -3
- data/doc/cxxapi/inherit__graph__29.md5 +0 -1
- data/doc/cxxapi/inherit__graph__29.png +0 -0
- data/doc/cxxapi/inherit__graph__3.map +0 -2
- data/doc/cxxapi/inherit__graph__3.md5 +0 -1
- data/doc/cxxapi/inherit__graph__3.png +0 -0
- data/doc/cxxapi/inherit__graph__30.map +0 -3
- data/doc/cxxapi/inherit__graph__30.md5 +0 -1
- data/doc/cxxapi/inherit__graph__30.png +0 -0
- data/doc/cxxapi/inherit__graph__31.map +0 -4
- data/doc/cxxapi/inherit__graph__31.md5 +0 -1
- data/doc/cxxapi/inherit__graph__31.png +0 -0
- data/doc/cxxapi/inherit__graph__32.map +0 -3
- data/doc/cxxapi/inherit__graph__32.md5 +0 -1
- data/doc/cxxapi/inherit__graph__32.png +0 -0
- data/doc/cxxapi/inherit__graph__33.map +0 -3
- data/doc/cxxapi/inherit__graph__33.md5 +0 -1
- data/doc/cxxapi/inherit__graph__33.png +0 -0
- data/doc/cxxapi/inherit__graph__34.map +0 -3
- data/doc/cxxapi/inherit__graph__34.md5 +0 -1
- data/doc/cxxapi/inherit__graph__34.png +0 -0
- data/doc/cxxapi/inherit__graph__35.map +0 -3
- data/doc/cxxapi/inherit__graph__35.md5 +0 -1
- data/doc/cxxapi/inherit__graph__35.png +0 -0
- data/doc/cxxapi/inherit__graph__36.map +0 -5
- data/doc/cxxapi/inherit__graph__36.md5 +0 -1
- data/doc/cxxapi/inherit__graph__36.png +0 -0
- data/doc/cxxapi/inherit__graph__37.map +0 -3
- data/doc/cxxapi/inherit__graph__37.md5 +0 -1
- data/doc/cxxapi/inherit__graph__37.png +0 -0
- data/doc/cxxapi/inherit__graph__38.map +0 -3
- data/doc/cxxapi/inherit__graph__38.md5 +0 -1
- data/doc/cxxapi/inherit__graph__38.png +0 -0
- data/doc/cxxapi/inherit__graph__39.map +0 -3
- data/doc/cxxapi/inherit__graph__39.md5 +0 -1
- data/doc/cxxapi/inherit__graph__39.png +0 -0
- data/doc/cxxapi/inherit__graph__4.map +0 -3
- data/doc/cxxapi/inherit__graph__4.md5 +0 -1
- data/doc/cxxapi/inherit__graph__4.png +0 -0
- data/doc/cxxapi/inherit__graph__40.map +0 -3
- data/doc/cxxapi/inherit__graph__40.md5 +0 -1
- data/doc/cxxapi/inherit__graph__40.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +0 -3
- data/doc/cxxapi/inherit__graph__5.md5 +0 -1
- data/doc/cxxapi/inherit__graph__5.png +0 -0
- data/doc/cxxapi/inherit__graph__6.map +0 -3
- data/doc/cxxapi/inherit__graph__6.md5 +0 -1
- data/doc/cxxapi/inherit__graph__6.png +0 -0
- data/doc/cxxapi/inherit__graph__7.map +0 -3
- data/doc/cxxapi/inherit__graph__7.md5 +0 -1
- data/doc/cxxapi/inherit__graph__7.png +0 -0
- data/doc/cxxapi/inherit__graph__8.map +0 -3
- data/doc/cxxapi/inherit__graph__8.md5 +0 -1
- data/doc/cxxapi/inherit__graph__8.png +0 -0
- data/doc/cxxapi/inherit__graph__9.map +0 -3
- data/doc/cxxapi/inherit__graph__9.md5 +0 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +0 -165
- data/doc/cxxapi/main.html +0 -28
- data/doc/cxxapi/md5_8h-source.html +0 -121
- data/doc/cxxapi/modules.html +0 -36
- data/doc/cxxapi/namespacePassenger.html +0 -553
- data/doc/cxxapi/namespacemembers.html +0 -135
- data/doc/cxxapi/namespacemembers_enum.html +0 -48
- data/doc/cxxapi/namespacemembers_eval.html +0 -57
- data/doc/cxxapi/namespacemembers_func.html +0 -111
- data/doc/cxxapi/namespacemembers_type.html +0 -54
- data/doc/cxxapi/namespaces.html +0 -37
- data/doc/cxxapi/nginx_2Configuration_8h-source.html +0 -115
- data/doc/cxxapi/nginx_2Configuration_8h_source.html +0 -125
- data/doc/cxxapi/ngx__http__passenger__module_8h-source.html +0 -91
- data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +0 -94
- data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +0 -33
- data/doc/cxxapi/structPassenger_1_1AnythingToString.html +0 -52
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4-members.html +0 -33
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4.html +0 -52
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +0 -33
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +0 -52
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +0 -36
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +0 -51
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +0 -67
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +0 -647
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +0 -36
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +0 -51
- 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 +0 -105
- data/doc/cxxapi/tree.html +0 -249
- data/doc/rdoc/classes/ConditionVariable.html +0 -215
- data/doc/rdoc/classes/Exception.html +0 -120
- data/doc/rdoc/classes/GC.html +0 -113
- data/doc/rdoc/classes/IO.html +0 -221
- data/doc/rdoc/classes/PhusionPassenger.html +0 -397
- data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +0 -180
- data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +0 -647
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +0 -654
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/InvalidPassword.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +0 -97
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +0 -96
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +0 -97
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +0 -96
- data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +0 -619
- data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +0 -142
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats.html +0 -368
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats/Process.html +0 -231
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance.html +0 -588
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/CorruptedDirectoryError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/GenerationsAbsentError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Group.html +0 -147
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Process.html +0 -279
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/RoleDeniedError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/StaleDirectoryError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Stats.html +0 -123
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/UnsupportedGenerationStructureVersionError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger.html +0 -368
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Log.html +0 -299
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/SharedData.html +0 -206
- data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +0 -155
- data/doc/rdoc/classes/PhusionPassenger/AppProcess.html +0 -367
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails.html +0 -95
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner.html +0 -351
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/CGIFixed.html +0 -200
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner.html +0 -410
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/RequestHandler.html +0 -156
- data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions.html +0 -115
- data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions/AnalyticsLogging.html +0 -202
- data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +0 -172
- data/doc/rdoc/classes/PhusionPassenger/DebugLogging.html +0 -273
- data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +0 -145
- data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +0 -162
- data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +0 -141
- data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +0 -673
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel/InvalidHashError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/MessageClient.html +0 -415
- data/doc/rdoc/classes/PhusionPassenger/NativeSupportLoader.html +0 -134
- data/doc/rdoc/classes/PhusionPassenger/Packaging.html +0 -129
- data/doc/rdoc/classes/PhusionPassenger/PlatformInfo.html +0 -1972
- data/doc/rdoc/classes/PhusionPassenger/Plugin.html +0 -237
- data/doc/rdoc/classes/PhusionPassenger/Rack.html +0 -91
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +0 -312
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +0 -218
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions.html +0 -114
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging.html +0 -259
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ACExtension.html +0 -139
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ASBenchmarkableExtension.html +0 -118
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ExceptionLogger.html +0 -135
- data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +0 -378
- data/doc/rdoc/classes/PhusionPassenger/Standalone.html +0 -111
- data/doc/rdoc/classes/PhusionPassenger/Standalone/AppFinder.html +0 -252
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Command.html +0 -161
- data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile.html +0 -368
- data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile/DisallowedContextError.html +0 -132
- data/doc/rdoc/classes/PhusionPassenger/Standalone/HelpCommand.html +0 -151
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Main.html +0 -189
- data/doc/rdoc/classes/PhusionPassenger/Standalone/PackageRuntimeCommand.html +0 -177
- data/doc/rdoc/classes/PhusionPassenger/Standalone/RuntimeInstaller.html +0 -341
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StartCommand.html +0 -203
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StatusCommand.html +0 -156
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StopCommand.html +0 -168
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Utils.html +0 -86
- data/doc/rdoc/classes/PhusionPassenger/Standalone/VersionCommand.html +0 -135
- data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +0 -125
- data/doc/rdoc/classes/PhusionPassenger/Utils.html +0 -1543
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher.html +0 -204
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/DirInfo.html +0 -171
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/FileInfo.html +0 -140
- data/doc/rdoc/classes/PhusionPassenger/Utils/HostsFileParser.html +0 -260
- data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +0 -194
- data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +0 -265
- data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +0 -120
- data/doc/rdoc/classes/PhusionPassenger/Utils/UnseekableSocket.html +0 -561
- data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +0 -140
- data/doc/rdoc/classes/PhusionPassenger/WSGI.html +0 -89
- data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +0 -182
- data/doc/rdoc/classes/Process.html +0 -115
- data/doc/rdoc/classes/Signal.html +0 -139
- data/doc/rdoc/created.rid +0 -1
- data/doc/rdoc/files/DEVELOPERS_TXT.html +0 -280
- data/doc/rdoc/files/README.html +0 -157
- data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +0 -130
- data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +0 -135
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +0 -128
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/memory_stats_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/server_instance_rb.html +0 -132
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/analytics_logger_rb.html +0 -129
- data/doc/rdoc/files/lib/phusion_passenger/app_process_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/application_spawner_rb.html +0 -141
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/cgi_fixed_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/framework_spawner_rb.html +0 -146
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/request_handler_rb.html +0 -125
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails_extensions/init_rb.html +0 -132
- data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/debug_logging_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +0 -147
- data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +0 -120
- data/doc/rdoc/files/lib/phusion_passenger/message_client_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/native_support_rb.html +0 -132
- data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/apache_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/binary_compatibility_rb.html +0 -129
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/compiler_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/curl_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/documentation_tools_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/linux_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/operating_system_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/ruby_rb.html +0 -128
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/zlib_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/plugin_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/public_api_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +0 -137
- data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +0 -125
- data/doc/rdoc/files/lib/phusion_passenger/rails3_extensions/init_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +0 -160
- data/doc/rdoc/files/lib/phusion_passenger/standalone/app_finder_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/standalone/command_rb.html +0 -136
- data/doc/rdoc/files/lib/phusion_passenger/standalone/config_file_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/help_command_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/main_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/package_runtime_command_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/standalone/runtime_installer_rb.html +0 -133
- data/doc/rdoc/files/lib/phusion_passenger/standalone/start_command_rb.html +0 -136
- data/doc/rdoc/files/lib/phusion_passenger/standalone/status_command_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/stop_command_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/utils_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/version_command_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/utils/file_system_watcher_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/utils/hosts_file_parser_rb.html +0 -120
- data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +0 -100
- data/doc/rdoc/files/lib/phusion_passenger/utils/tmpdir_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/utils/unseekable_socket_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +0 -179
- data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +0 -132
- data/doc/rdoc/fr_class_index.html +0 -139
- data/doc/rdoc/fr_file_index.html +0 -108
- data/doc/rdoc/fr_method_index.html +0 -439
- data/doc/rdoc/index.html +0 -26
- data/doc/rdoc/rdoc-style.css +0 -187
@@ -1,358 +0,0 @@
|
|
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>
|
@@ -1,415 +0,0 @@
|
|
1
|
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
-
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
|
3
|
-
<title>Passenger: EventedServer.h Source File</title>
|
4
|
-
<link href="tabs.css" rel="stylesheet" type="text/css">
|
5
|
-
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
6
|
-
</head><body>
|
7
|
-
<!-- Generated by Doxygen 1.5.8 -->
|
8
|
-
<div class="navigation" id="top">
|
9
|
-
<div class="tabs">
|
10
|
-
<ul>
|
11
|
-
<li><a href="main.html"><span>Main Page</span></a></li>
|
12
|
-
<li><a href="modules.html"><span>Modules</span></a></li>
|
13
|
-
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
|
14
|
-
<li><a href="annotated.html"><span>Classes</span></a></li>
|
15
|
-
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
16
|
-
</ul>
|
17
|
-
</div>
|
18
|
-
<div class="tabs">
|
19
|
-
<ul>
|
20
|
-
<li><a href="files.html"><span>File List</span></a></li>
|
21
|
-
</ul>
|
22
|
-
</div>
|
23
|
-
<h1>EventedServer.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef _PASSENGER_EVENTED_SERVER_H_</span>
|
24
|
-
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_EVENTED_SERVER_H_</span>
|
25
|
-
<a name="l00003"></a>00003 <span class="preprocessor"></span>
|
26
|
-
<a name="l00004"></a>00004 <span class="preprocessor">#include <ev++.h></span>
|
27
|
-
<a name="l00005"></a>00005 <span class="preprocessor">#include <boost/shared_ptr.hpp></span>
|
28
|
-
<a name="l00006"></a>00006 <span class="preprocessor">#include <boost/enable_shared_from_this.hpp></span>
|
29
|
-
<a name="l00007"></a>00007 <span class="preprocessor">#include <oxt/system_calls.hpp></span>
|
30
|
-
<a name="l00008"></a>00008 <span class="preprocessor">#include <oxt/macros.hpp></span>
|
31
|
-
<a name="l00009"></a>00009 <span class="preprocessor">#include <algorithm></span>
|
32
|
-
<a name="l00010"></a>00010 <span class="preprocessor">#include <string></span>
|
33
|
-
<a name="l00011"></a>00011 <span class="preprocessor">#include <set></span>
|
34
|
-
<a name="l00012"></a>00012 <span class="preprocessor">#include <sys/types.h></span>
|
35
|
-
<a name="l00013"></a>00013 <span class="preprocessor">#include <sys/un.h></span>
|
36
|
-
<a name="l00014"></a>00014 <span class="preprocessor">#include <sys/uio.h></span>
|
37
|
-
<a name="l00015"></a>00015 <span class="preprocessor">#include <netinet/in.h></span>
|
38
|
-
<a name="l00016"></a>00016 <span class="preprocessor">#include <unistd.h></span>
|
39
|
-
<a name="l00017"></a>00017 <span class="preprocessor">#include "MessageReadersWriters.h"</span>
|
40
|
-
<a name="l00018"></a>00018 <span class="preprocessor">#include "FileDescriptor.h"</span>
|
41
|
-
<a name="l00019"></a>00019 <span class="preprocessor">#include "StaticString.h"</span>
|
42
|
-
<a name="l00020"></a>00020 <span class="preprocessor">#include "Utils.h"</span>
|
43
|
-
<a name="l00021"></a>00021
|
44
|
-
<a name="l00022"></a>00022 <span class="keyword">namespace </span>Passenger {
|
45
|
-
<a name="l00023"></a>00023
|
46
|
-
<a name="l00024"></a>00024 <span class="keyword">using namespace </span>std;
|
47
|
-
<a name="l00025"></a>00025 <span class="keyword">using namespace </span>boost;
|
48
|
-
<a name="l00026"></a>00026 <span class="keyword">using namespace </span>oxt;
|
49
|
-
<a name="l00027"></a>00027
|
50
|
-
<a name="l00028"></a>00028 <span class="keyword">class </span>EventedServer {
|
51
|
-
<a name="l00029"></a>00029 <span class="keyword">protected</span>:
|
52
|
-
<a name="l00030"></a>00030 <span class="keyword">struct </span><a class="code" href="classClient.html" title="A representation of a Client from the Server&#39;s point of view.">Client</a>: <span class="keyword">public</span> enable_shared_from_this<Client> {
|
53
|
-
<a name="l00031"></a>00031 <span class="keyword">enum</span> {
|
54
|
-
<a name="l00032"></a>00032 ES_CONNECTED,
|
55
|
-
<a name="l00033"></a>00033 ES_WRITES_PENDING,
|
56
|
-
<a name="l00034"></a>00034 ES_DISCONNECTING_WITH_WRITES_PENDING,
|
57
|
-
<a name="l00035"></a>00035 ES_DISCONNECTED
|
58
|
-
<a name="l00036"></a>00036 } state;
|
59
|
-
<a name="l00037"></a>00037
|
60
|
-
<a name="l00038"></a>00038 EventedServer *server;
|
61
|
-
<a name="l00039"></a>00039 FileDescriptor fd;
|
62
|
-
<a name="l00040"></a>00040 ev::io readWatcher;
|
63
|
-
<a name="l00041"></a>00041 ev::io writeWatcher;
|
64
|
-
<a name="l00042"></a>00042 <span class="keywordtype">bool</span> readWatcherStarted;
|
65
|
-
<a name="l00043"></a>00043 <span class="keywordtype">bool</span> writeWatcherStarted;
|
66
|
-
<a name="l00044"></a>00044 <span class="keywordtype">string</span> outbox;
|
67
|
-
<a name="l00045"></a>00045
|
68
|
-
<a name="l00046"></a>00046 <a class="code" href="classClient.html" title="A representation of a Client from the Server&#39;s point of view.">Client</a>(EventedServer *_server)
|
69
|
-
<a name="l00047"></a>00047 : server(_server),
|
70
|
-
<a name="l00048"></a>00048 readWatcher(_server->loop),
|
71
|
-
<a name="l00049"></a>00049 writeWatcher(_server->loop)
|
72
|
-
<a name="l00050"></a>00050 { }
|
73
|
-
<a name="l00051"></a>00051
|
74
|
-
<a name="l00052"></a>00052 <span class="keywordtype">void</span> _onReadable(ev::io &w, <span class="keywordtype">int</span> revents) {
|
75
|
-
<a name="l00053"></a>00053 server->onClientReadable(shared_from_this());
|
76
|
-
<a name="l00054"></a>00054 }
|
77
|
-
<a name="l00055"></a>00055
|
78
|
-
<a name="l00056"></a>00056 <span class="keywordtype">void</span> _onWritable(ev::io &w, <span class="keywordtype">int</span> revents) {
|
79
|
-
<a name="l00057"></a>00057 server->onClientWritable(shared_from_this());
|
80
|
-
<a name="l00058"></a>00058 }
|
81
|
-
<a name="l00059"></a>00059 };
|
82
|
-
<a name="l00060"></a>00060
|
83
|
-
<a name="l00061"></a>00061 <span class="keyword">typedef</span> shared_ptr<Client> ClientPtr;
|
84
|
-
<a name="l00062"></a>00062
|
85
|
-
<a name="l00063"></a>00063 <span class="keywordtype">void</span> write(<span class="keyword">const</span> ClientPtr &client, <span class="keyword">const</span> <span class="keywordtype">char</span> *data) {
|
86
|
-
<a name="l00064"></a>00064 write(client, StaticString(data));
|
87
|
-
<a name="l00065"></a>00065 }
|
88
|
-
<a name="l00066"></a>00066
|
89
|
-
<a name="l00067"></a>00067 <span class="keywordtype">void</span> write(<span class="keyword">const</span> ClientPtr &client, <span class="keyword">const</span> StaticString &data) {
|
90
|
-
<a name="l00068"></a>00068 write(client, &data, 1);
|
91
|
-
<a name="l00069"></a>00069 }
|
92
|
-
<a name="l00070"></a>00070
|
93
|
-
<a name="l00071"></a>00071 <span class="keyword">virtual</span> <span class="keywordtype">void</span> write(<span class="keyword">const</span> ClientPtr &client, <span class="keyword">const</span> StaticString data[], <span class="keywordtype">size_t</span> count) {
|
94
|
-
<a name="l00072"></a>00072 <span class="keywordflow">if</span> (client->state == Client::ES_DISCONNECTED) {
|
95
|
-
<a name="l00073"></a>00073 <span class="keywordflow">return</span>;
|
96
|
-
<a name="l00074"></a>00074 }
|
97
|
-
<a name="l00075"></a>00075
|
98
|
-
<a name="l00076"></a>00076 ssize_t ret;
|
99
|
-
<a name="l00077"></a>00077 <span class="keywordtype">size_t</span> totalSize;
|
100
|
-
<a name="l00078"></a>00078 this_thread::disable_syscall_interruption dsi;
|
101
|
-
<a name="l00079"></a>00079
|
102
|
-
<a name="l00080"></a>00080 <span class="keywordflow">if</span> (client->outbox.empty()) {
|
103
|
-
<a name="l00081"></a>00081 <span class="keyword">struct </span>iovec iov[count];
|
104
|
-
<a name="l00082"></a>00082
|
105
|
-
<a name="l00083"></a>00083 totalSize = staticStringArrayToIoVec(data, count, iov);
|
106
|
-
<a name="l00084"></a>00084 ret = syscalls::writev(client->fd, iov, count);
|
107
|
-
<a name="l00085"></a>00085 <span class="keywordflow">if</span> (ret == -1) {
|
108
|
-
<a name="l00086"></a>00086 <span class="keywordflow">if</span> (errno == EAGAIN) {
|
109
|
-
<a name="l00087"></a>00087 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < count; i++) {
|
110
|
-
<a name="l00088"></a>00088 client->outbox.append(data[i].data(), data[i].size());
|
111
|
-
<a name="l00089"></a>00089 }
|
112
|
-
<a name="l00090"></a>00090 } <span class="keywordflow">else</span> {
|
113
|
-
<a name="l00091"></a>00091 printf(<span class="stringliteral">"write error\n"</span>);
|
114
|
-
<a name="l00092"></a>00092 }
|
115
|
-
<a name="l00093"></a>00093 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((<span class="keywordtype">size_t</span>) ret < totalSize) {
|
116
|
-
<a name="l00094"></a>00094 <span class="keywordtype">size_t</span> index, offset;
|
117
|
-
<a name="l00095"></a>00095
|
118
|
-
<a name="l00096"></a>00096 findEndOfDataInVectors(iov, count + 1, ret, &index, &offset);
|
119
|
-
<a name="l00097"></a>00097 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = index; i < count; i++) {
|
120
|
-
<a name="l00098"></a>00098 <span class="keywordflow">if</span> (i == index) {
|
121
|
-
<a name="l00099"></a>00099 client->outbox.append(data[i].data() + offset,
|
122
|
-
<a name="l00100"></a>00100 data[i].size() - offset);
|
123
|
-
<a name="l00101"></a>00101 } <span class="keywordflow">else</span> {
|
124
|
-
<a name="l00102"></a>00102 client->outbox.append(data[i].data(),
|
125
|
-
<a name="l00103"></a>00103 data[i].size());
|
126
|
-
<a name="l00104"></a>00104 }
|
127
|
-
<a name="l00105"></a>00105 }
|
128
|
-
<a name="l00106"></a>00106 }
|
129
|
-
<a name="l00107"></a>00107 } <span class="keywordflow">else</span> {
|
130
|
-
<a name="l00108"></a>00108 <span class="keyword">struct </span>iovec iov[count + 1];
|
131
|
-
<a name="l00109"></a>00109
|
132
|
-
<a name="l00110"></a>00110 iov[0].iov_base = (<span class="keywordtype">char</span> *) client->outbox.data();
|
133
|
-
<a name="l00111"></a>00111 iov[0].iov_len = client->outbox.size();
|
134
|
-
<a name="l00112"></a>00112 totalSize = staticStringArrayToIoVec(data, count, iov + 1);
|
135
|
-
<a name="l00113"></a>00113
|
136
|
-
<a name="l00114"></a>00114 ret = syscalls::writev(client->fd, iov, count + 1);
|
137
|
-
<a name="l00115"></a>00115 <span class="keywordflow">if</span> (ret == -1) {
|
138
|
-
<a name="l00116"></a>00116 <span class="keywordflow">if</span> (errno != EAGAIN) {
|
139
|
-
<a name="l00117"></a>00117 printf(<span class="stringliteral">"write error\n"</span>);
|
140
|
-
<a name="l00118"></a>00118 }
|
141
|
-
<a name="l00119"></a>00119 <span class="comment">// else: wait until next writable event.</span>
|
142
|
-
<a name="l00120"></a>00120 } <span class="keywordflow">else</span> {
|
143
|
-
<a name="l00121"></a>00121 string::size_type outboxSize = client->outbox.size();
|
144
|
-
<a name="l00122"></a>00122 <span class="keywordtype">size_t</span> outboxSent = std::min((<span class="keywordtype">size_t</span>) ret, outboxSize);
|
145
|
-
<a name="l00123"></a>00123
|
146
|
-
<a name="l00124"></a>00124 client->outbox.erase(0, outboxSent);
|
147
|
-
<a name="l00125"></a>00125 <span class="keywordflow">if</span> (client->outbox.empty()) {
|
148
|
-
<a name="l00126"></a>00126 <span class="keywordtype">size_t</span> index, offset;
|
149
|
-
<a name="l00127"></a>00127
|
150
|
-
<a name="l00128"></a>00128 findEndOfDataInVectors(iov, count + 1, ret, &index, &offset);
|
151
|
-
<a name="l00129"></a>00129 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = index; i < count + 1; i++) {
|
152
|
-
<a name="l00130"></a>00130 <span class="keywordflow">if</span> (i == index) {
|
153
|
-
<a name="l00131"></a>00131 client->outbox.append(
|
154
|
-
<a name="l00132"></a>00132 data[i - 1].data() + offset,
|
155
|
-
<a name="l00133"></a>00133 data[i - 1].size() - offset);
|
156
|
-
<a name="l00134"></a>00134 } <span class="keywordflow">else</span> {
|
157
|
-
<a name="l00135"></a>00135 client->outbox.append(
|
158
|
-
<a name="l00136"></a>00136 data[i - 1].data(),
|
159
|
-
<a name="l00137"></a>00137 data[i - 1].size());
|
160
|
-
<a name="l00138"></a>00138 }
|
161
|
-
<a name="l00139"></a>00139 }
|
162
|
-
<a name="l00140"></a>00140 } <span class="keywordflow">else</span> {
|
163
|
-
<a name="l00141"></a>00141 <span class="comment">// the outbox could only be partially written, so nothing</span>
|
164
|
-
<a name="l00142"></a>00142 <span class="comment">// in 'data' could be written. add everything in 'data'</span>
|
165
|
-
<a name="l00143"></a>00143 <span class="comment">// into the outbox...</span>
|
166
|
-
<a name="l00144"></a>00144 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1; i < count + 1; i++) {
|
167
|
-
<a name="l00145"></a>00145 client->outbox.append(data[i - 1].data(),
|
168
|
-
<a name="l00146"></a>00146 data[i - 1].size());
|
169
|
-
<a name="l00147"></a>00147 }
|
170
|
-
<a name="l00148"></a>00148 }
|
171
|
-
<a name="l00149"></a>00149 }
|
172
|
-
<a name="l00150"></a>00150 }
|
173
|
-
<a name="l00151"></a>00151 <span class="keywordflow">if</span> (client->outbox.empty()) {
|
174
|
-
<a name="l00152"></a>00152 outboxFlushed(client);
|
175
|
-
<a name="l00153"></a>00153 } <span class="keywordflow">else</span> {
|
176
|
-
<a name="l00154"></a>00154 outboxNotFlushed(client);
|
177
|
-
<a name="l00155"></a>00155 }
|
178
|
-
<a name="l00156"></a>00156 }
|
179
|
-
<a name="l00157"></a>00157 <span class="comment"></span>
|
180
|
-
<a name="l00158"></a>00158 <span class="comment"> /**</span>
|
181
|
-
<a name="l00159"></a>00159 <span class="comment"> * Disconnects the client. If <em>force</em> is true then the client will</span>
|
182
|
-
<a name="l00160"></a>00160 <span class="comment"> * be disconnected immediately, and any pending outgoing data will be</span>
|
183
|
-
<a name="l00161"></a>00161 <span class="comment"> * discarded. Otherwise the client will be disconnected after all pending</span>
|
184
|
-
<a name="l00162"></a>00162 <span class="comment"> * outgoing data have been sent; in the mean time no new data can be</span>
|
185
|
-
<a name="l00163"></a>00163 <span class="comment"> * received from the client.</span>
|
186
|
-
<a name="l00164"></a>00164 <span class="comment"> */</span>
|
187
|
-
<a name="l00165"></a>00165 <span class="keyword">virtual</span> <span class="keywordtype">void</span> disconnect(<span class="keyword">const</span> ClientPtr &client, <span class="keywordtype">bool</span> force = <span class="keyword">false</span>) {
|
188
|
-
<a name="l00166"></a>00166 <span class="keywordflow">if</span> (client->state == Client::ES_CONNECTED
|
189
|
-
<a name="l00167"></a>00167 || (force && client->state != Client::ES_DISCONNECTED)) {
|
190
|
-
<a name="l00168"></a>00168 watchReadEvents(client, <span class="keyword">false</span>);
|
191
|
-
<a name="l00169"></a>00169 watchWriteEvents(client, <span class="keyword">false</span>);
|
192
|
-
<a name="l00170"></a>00170 client->fd.close();
|
193
|
-
<a name="l00171"></a>00171 client->state = Client::ES_DISCONNECTED;
|
194
|
-
<a name="l00172"></a>00172 clients.erase(client);
|
195
|
-
<a name="l00173"></a>00173 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (client->state == Client::ES_WRITES_PENDING) {
|
196
|
-
<a name="l00174"></a>00174 watchReadEvents(client, <span class="keyword">false</span>);
|
197
|
-
<a name="l00175"></a>00175 watchWriteEvents(client, <span class="keyword">true</span>);
|
198
|
-
<a name="l00176"></a>00176 shutdown(client->fd, SHUT_RD);
|
199
|
-
<a name="l00177"></a>00177 client->state = Client::ES_DISCONNECTING_WITH_WRITES_PENDING;
|
200
|
-
<a name="l00178"></a>00178 }
|
201
|
-
<a name="l00179"></a>00179 }
|
202
|
-
<a name="l00180"></a>00180
|
203
|
-
<a name="l00181"></a>00181 <span class="keyword">virtual</span> ClientPtr createClient() {
|
204
|
-
<a name="l00182"></a>00182 <span class="keywordflow">return</span> ClientPtr(<span class="keyword">new</span> <a class="code" href="classClient.html" title="A representation of a Client from the Server&#39;s point of view.">Client</a>(<span class="keyword">this</span>));
|
205
|
-
<a name="l00183"></a>00183 }
|
206
|
-
<a name="l00184"></a>00184
|
207
|
-
<a name="l00185"></a>00185 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onNewClient(<span class="keyword">const</span> ClientPtr &client) { }
|
208
|
-
<a name="l00186"></a>00186 <span class="keyword">virtual</span> <span class="keywordtype">void</span> onClientReadable(<span class="keyword">const</span> ClientPtr &client) { }
|
209
|
-
<a name="l00187"></a>00187
|
210
|
-
<a name="l00188"></a>00188 <span class="keyword">private</span>:
|
211
|
-
<a name="l00189"></a>00189 <span class="keyword">struct </span>ev_loop *loop;
|
212
|
-
<a name="l00190"></a>00190 FileDescriptor fd;
|
213
|
-
<a name="l00191"></a>00191 ev::io acceptWatcher;
|
214
|
-
<a name="l00192"></a>00192 set<ClientPtr> clients;
|
215
|
-
<a name="l00193"></a>00193
|
216
|
-
<a name="l00194"></a>00194 <span class="keywordtype">size_t</span> staticStringArrayToIoVec(<span class="keyword">const</span> StaticString ary[], <span class="keywordtype">size_t</span> count, <span class="keyword">struct</span> iovec *vec) {
|
217
|
-
<a name="l00195"></a>00195 <span class="keywordtype">size_t</span> total = 0;
|
218
|
-
<a name="l00196"></a>00196 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < count; i++) {
|
219
|
-
<a name="l00197"></a>00197 vec[i].iov_base = (<span class="keywordtype">char</span> *) ary[i].data();
|
220
|
-
<a name="l00198"></a>00198 vec[i].iov_len = ary[i].size();
|
221
|
-
<a name="l00199"></a>00199 total += ary[i].size();
|
222
|
-
<a name="l00200"></a>00200 }
|
223
|
-
<a name="l00201"></a>00201 <span class="keywordflow">return</span> total;
|
224
|
-
<a name="l00202"></a>00202 }
|
225
|
-
<a name="l00203"></a>00203
|
226
|
-
<a name="l00204"></a>00204 <span class="keywordtype">void</span> findEndOfDataInVectors(<span class="keyword">struct</span> iovec iov[], <span class="keywordtype">size_t</span> count, <span class="keywordtype">size_t</span> dataSize,
|
227
|
-
<a name="l00205"></a>00205 <span class="keywordtype">size_t</span> *index, <span class="keywordtype">size_t</span> *offset)
|
228
|
-
<a name="l00206"></a>00206 {
|
229
|
-
<a name="l00207"></a>00207 <span class="keywordtype">size_t</span> i, begin;
|
230
|
-
<a name="l00208"></a>00208
|
231
|
-
<a name="l00209"></a>00209 begin = 0;
|
232
|
-
<a name="l00210"></a>00210 <span class="keywordflow">for</span> (i = 0; OXT_LIKELY(i < count); i++) {
|
233
|
-
<a name="l00211"></a>00211 <span class="keywordtype">size_t</span> end = begin + iov[i].iov_len;
|
234
|
-
<a name="l00212"></a>00212 <span class="keywordflow">if</span> (OXT_LIKELY(begin <= dataSize)) {
|
235
|
-
<a name="l00213"></a>00213 <span class="keywordflow">if</span> (dataSize < end) {
|
236
|
-
<a name="l00214"></a>00214 *index = i;
|
237
|
-
<a name="l00215"></a>00215 *offset = dataSize - begin;
|
238
|
-
<a name="l00216"></a>00216 <span class="keywordflow">return</span>;
|
239
|
-
<a name="l00217"></a>00217 } <span class="keywordflow">else</span> {
|
240
|
-
<a name="l00218"></a>00218 begin = end;
|
241
|
-
<a name="l00219"></a>00219 }
|
242
|
-
<a name="l00220"></a>00220 } <span class="keywordflow">else</span> {
|
243
|
-
<a name="l00221"></a>00221 <span class="comment">// Never reached.</span>
|
244
|
-
<a name="l00222"></a>00222 abort();
|
245
|
-
<a name="l00223"></a>00223 }
|
246
|
-
<a name="l00224"></a>00224 }
|
247
|
-
<a name="l00225"></a>00225 <span class="comment">// Never reached.</span>
|
248
|
-
<a name="l00226"></a>00226 abort();
|
249
|
-
<a name="l00227"></a>00227 }
|
250
|
-
<a name="l00228"></a>00228
|
251
|
-
<a name="l00229"></a>00229 <span class="keywordtype">void</span> outboxFlushed(<span class="keyword">const</span> ClientPtr &client) {
|
252
|
-
<a name="l00230"></a>00230 <span class="keywordflow">switch</span> (client->state) {
|
253
|
-
<a name="l00231"></a>00231 <span class="keywordflow">case</span> Client::ES_CONNECTED:
|
254
|
-
<a name="l00232"></a>00232 watchReadEvents(client, <span class="keyword">true</span>);
|
255
|
-
<a name="l00233"></a>00233 watchWriteEvents(client, <span class="keyword">false</span>);
|
256
|
-
<a name="l00234"></a>00234 <span class="keywordflow">break</span>;
|
257
|
-
<a name="l00235"></a>00235 <span class="keywordflow">case</span> Client::ES_WRITES_PENDING:
|
258
|
-
<a name="l00236"></a>00236 client->state = Client::ES_CONNECTED;
|
259
|
-
<a name="l00237"></a>00237 watchReadEvents(client, <span class="keyword">true</span>);
|
260
|
-
<a name="l00238"></a>00238 watchWriteEvents(client, <span class="keyword">false</span>);
|
261
|
-
<a name="l00239"></a>00239 <span class="keywordflow">break</span>;
|
262
|
-
<a name="l00240"></a>00240 <span class="keywordflow">case</span> Client::ES_DISCONNECTING_WITH_WRITES_PENDING:
|
263
|
-
<a name="l00241"></a>00241 client->state = Client::ES_DISCONNECTED;
|
264
|
-
<a name="l00242"></a>00242 client->fd.close();
|
265
|
-
<a name="l00243"></a>00243 clients.erase(client);
|
266
|
-
<a name="l00244"></a>00244 <span class="keywordflow">break</span>;
|
267
|
-
<a name="l00245"></a>00245 <span class="keywordflow">default</span>:
|
268
|
-
<a name="l00246"></a>00246 <span class="comment">// Never reached.</span>
|
269
|
-
<a name="l00247"></a>00247 abort();
|
270
|
-
<a name="l00248"></a>00248 }
|
271
|
-
<a name="l00249"></a>00249 }
|
272
|
-
<a name="l00250"></a>00250
|
273
|
-
<a name="l00251"></a>00251 <span class="keywordtype">void</span> outboxNotFlushed(<span class="keyword">const</span> ClientPtr &client) {
|
274
|
-
<a name="l00252"></a>00252 <span class="keywordflow">switch</span> (client->state) {
|
275
|
-
<a name="l00253"></a>00253 <span class="keywordflow">case</span> Client::ES_CONNECTED:
|
276
|
-
<a name="l00254"></a>00254 client->state = Client::ES_WRITES_PENDING;
|
277
|
-
<a name="l00255"></a>00255 <span class="comment">// If we have way too much stuff in the outbox then</span>
|
278
|
-
<a name="l00256"></a>00256 <span class="comment">// suspend reading until we've sent out the entire outbox.</span>
|
279
|
-
<a name="l00257"></a>00257 watchReadEvents(client, client->outbox.size() < 1024 * 32);
|
280
|
-
<a name="l00258"></a>00258 watchWriteEvents(client, <span class="keyword">true</span>);
|
281
|
-
<a name="l00259"></a>00259 <span class="keywordflow">break</span>;
|
282
|
-
<a name="l00260"></a>00260 <span class="keywordflow">case</span> Client::ES_WRITES_PENDING:
|
283
|
-
<a name="l00261"></a>00261 <span class="keywordflow">case</span> Client::ES_DISCONNECTING_WITH_WRITES_PENDING:
|
284
|
-
<a name="l00262"></a>00262 watchReadEvents(client, <span class="keyword">false</span>);
|
285
|
-
<a name="l00263"></a>00263 watchWriteEvents(client, <span class="keyword">true</span>);
|
286
|
-
<a name="l00264"></a>00264 <span class="keywordflow">break</span>;
|
287
|
-
<a name="l00265"></a>00265 <span class="keywordflow">default</span>:
|
288
|
-
<a name="l00266"></a>00266 <span class="comment">// Never reached.</span>
|
289
|
-
<a name="l00267"></a>00267 abort();
|
290
|
-
<a name="l00268"></a>00268 }
|
291
|
-
<a name="l00269"></a>00269 }
|
292
|
-
<a name="l00270"></a>00270
|
293
|
-
<a name="l00271"></a>00271 <span class="keywordtype">void</span> watchReadEvents(<span class="keyword">const</span> ClientPtr &client, <span class="keywordtype">bool</span> enable = <span class="keyword">true</span>) {
|
294
|
-
<a name="l00272"></a>00272 <span class="keywordflow">if</span> (client->readWatcherStarted && !enable) {
|
295
|
-
<a name="l00273"></a>00273 client->readWatcherStarted = <span class="keyword">false</span>;
|
296
|
-
<a name="l00274"></a>00274 client->readWatcher.stop();
|
297
|
-
<a name="l00275"></a>00275 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!client->readWatcherStarted && enable) {
|
298
|
-
<a name="l00276"></a>00276 client->readWatcherStarted = <span class="keyword">true</span>;
|
299
|
-
<a name="l00277"></a>00277 client->readWatcher.start();
|
300
|
-
<a name="l00278"></a>00278 }
|
301
|
-
<a name="l00279"></a>00279 }
|
302
|
-
<a name="l00280"></a>00280
|
303
|
-
<a name="l00281"></a>00281 <span class="keywordtype">void</span> watchWriteEvents(<span class="keyword">const</span> ClientPtr &client, <span class="keywordtype">bool</span> enable = <span class="keyword">true</span>) {
|
304
|
-
<a name="l00282"></a>00282 <span class="keywordflow">if</span> (client->writeWatcherStarted && !enable) {
|
305
|
-
<a name="l00283"></a>00283 client->writeWatcherStarted = <span class="keyword">false</span>;
|
306
|
-
<a name="l00284"></a>00284 client->writeWatcher.stop();
|
307
|
-
<a name="l00285"></a>00285 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!client->writeWatcherStarted && enable) {
|
308
|
-
<a name="l00286"></a>00286 client->writeWatcherStarted = <span class="keyword">true</span>;
|
309
|
-
<a name="l00287"></a>00287 client->writeWatcher.start();
|
310
|
-
<a name="l00288"></a>00288 }
|
311
|
-
<a name="l00289"></a>00289 }
|
312
|
-
<a name="l00290"></a>00290
|
313
|
-
<a name="l00291"></a>00291 <span class="keywordtype">void</span> onClientWritable(<span class="keyword">const</span> ClientPtr &client) {
|
314
|
-
<a name="l00292"></a>00292 <span class="keywordflow">if</span> (client->state == Client::ES_DISCONNECTED) {
|
315
|
-
<a name="l00293"></a>00293 <span class="keywordflow">return</span>;
|
316
|
-
<a name="l00294"></a>00294 }
|
317
|
-
<a name="l00295"></a>00295
|
318
|
-
<a name="l00296"></a>00296 this_thread::disable_syscall_interruption dsi;
|
319
|
-
<a name="l00297"></a>00297 <span class="keywordtype">size_t</span> sent = 0;
|
320
|
-
<a name="l00298"></a>00298 <span class="keywordtype">bool</span> done = client->outbox.empty();
|
321
|
-
<a name="l00299"></a>00299
|
322
|
-
<a name="l00300"></a>00300 <span class="keywordflow">while</span> (!done) {
|
323
|
-
<a name="l00301"></a>00301 ssize_t ret = syscalls::write(client->fd,
|
324
|
-
<a name="l00302"></a>00302 client->outbox.data() + sent,
|
325
|
-
<a name="l00303"></a>00303 client->outbox.size() - sent);
|
326
|
-
<a name="l00304"></a>00304 <span class="keywordflow">if</span> (ret == -1) {
|
327
|
-
<a name="l00305"></a>00305 <span class="keywordflow">if</span> (errno != EAGAIN) {
|
328
|
-
<a name="l00306"></a>00306 printf(<span class="stringliteral">"write error\n"</span>);
|
329
|
-
<a name="l00307"></a>00307 }
|
330
|
-
<a name="l00308"></a>00308 done = <span class="keyword">true</span>;
|
331
|
-
<a name="l00309"></a>00309 } <span class="keywordflow">else</span> {
|
332
|
-
<a name="l00310"></a>00310 sent += ret;
|
333
|
-
<a name="l00311"></a>00311 done = sent == client->outbox.size();
|
334
|
-
<a name="l00312"></a>00312 }
|
335
|
-
<a name="l00313"></a>00313 }
|
336
|
-
<a name="l00314"></a>00314 <span class="keywordflow">if</span> (sent > 0) {
|
337
|
-
<a name="l00315"></a>00315 client->outbox.erase(0, sent);
|
338
|
-
<a name="l00316"></a>00316 }
|
339
|
-
<a name="l00317"></a>00317
|
340
|
-
<a name="l00318"></a>00318 <span class="keywordflow">if</span> (client->outbox.empty()) {
|
341
|
-
<a name="l00319"></a>00319 outboxFlushed(client);
|
342
|
-
<a name="l00320"></a>00320 } <span class="keywordflow">else</span> {
|
343
|
-
<a name="l00321"></a>00321 outboxNotFlushed(client);
|
344
|
-
<a name="l00322"></a>00322 }
|
345
|
-
<a name="l00323"></a>00323 }
|
346
|
-
<a name="l00324"></a>00324
|
347
|
-
<a name="l00325"></a>00325 <span class="keywordtype">void</span> onAcceptable(ev::io &w, <span class="keywordtype">int</span> revents) {
|
348
|
-
<a name="l00326"></a>00326 this_thread::disable_syscall_interruption dsi;
|
349
|
-
<a name="l00327"></a>00327 <span class="keywordtype">int</span> i = 0;
|
350
|
-
<a name="l00328"></a>00328 <span class="keywordtype">bool</span> done = <span class="keyword">false</span>;
|
351
|
-
<a name="l00329"></a>00329
|
352
|
-
<a name="l00330"></a>00330 <span class="comment">// Accept at most 100 connections on every accept readiness event.</span>
|
353
|
-
<a name="l00331"></a>00331 <span class="keywordflow">while</span> (i < 100 && !done) {
|
354
|
-
<a name="l00332"></a>00332 <span class="comment">// Reserve enough space to hold both a Unix domain socket</span>
|
355
|
-
<a name="l00333"></a>00333 <span class="comment">// address and an IP socket address.</span>
|
356
|
-
<a name="l00334"></a>00334 <span class="keyword">union </span>{
|
357
|
-
<a name="l00335"></a>00335 <span class="keyword">struct </span>sockaddr_un local;
|
358
|
-
<a name="l00336"></a>00336 <span class="keyword">struct </span>sockaddr_in inet;
|
359
|
-
<a name="l00337"></a>00337 } addr;
|
360
|
-
<a name="l00338"></a>00338 socklen_t len = <span class="keyword">sizeof</span>(addr);
|
361
|
-
<a name="l00339"></a>00339
|
362
|
-
<a name="l00340"></a>00340 <span class="keywordtype">int</span> clientfd = syscalls::accept(fd, (<span class="keyword">struct</span> sockaddr *) &addr, &len);
|
363
|
-
<a name="l00341"></a>00341 <span class="keywordflow">if</span> (clientfd == -1) {
|
364
|
-
<a name="l00342"></a>00342 <span class="keywordflow">if</span> (errno != EAGAIN && errno != EWOULDBLOCK) {
|
365
|
-
<a name="l00343"></a>00343 printf(<span class="stringliteral">"accept error!\n"</span>);
|
366
|
-
<a name="l00344"></a>00344 }
|
367
|
-
<a name="l00345"></a>00345 done = <span class="keyword">true</span>;
|
368
|
-
<a name="l00346"></a>00346 } <span class="keywordflow">else</span> {
|
369
|
-
<a name="l00347"></a>00347 FileDescriptor clientfdGuard = clientfd;
|
370
|
-
<a name="l00348"></a>00348 <a class="code" href="group__Support.html#g7e3fdc923bdf6efeab407cdd325883a8" title="Sets a socket in non-blocking mode.">setNonBlocking</a>(clientfdGuard);
|
371
|
-
<a name="l00349"></a>00349
|
372
|
-
<a name="l00350"></a>00350 ClientPtr client = createClient();
|
373
|
-
<a name="l00351"></a>00351 client->state = Client::ES_CONNECTED;
|
374
|
-
<a name="l00352"></a>00352 client->fd = clientfdGuard;
|
375
|
-
<a name="l00353"></a>00353 client->readWatcher.set<<a class="code" href="classClient.html" title="A representation of a Client from the Server&#39;s point of view.">Client</a>, &Client::_onReadable>(client.get());
|
376
|
-
<a name="l00354"></a>00354 client->readWatcher.set(client->fd, ev::READ);
|
377
|
-
<a name="l00355"></a>00355 client->readWatcher.start();
|
378
|
-
<a name="l00356"></a>00356 client->readWatcherStarted = <span class="keyword">true</span>;
|
379
|
-
<a name="l00357"></a>00357 client->writeWatcher.set<<a class="code" href="classClient.html" title="A representation of a Client from the Server&#39;s point of view.">Client</a>, &Client::_onWritable>(client.get());
|
380
|
-
<a name="l00358"></a>00358 client->writeWatcher.set(client->fd, ev::WRITE);
|
381
|
-
<a name="l00359"></a>00359 client->writeWatcherStarted = <span class="keyword">false</span>;
|
382
|
-
<a name="l00360"></a>00360 clients.insert(client);
|
383
|
-
<a name="l00361"></a>00361 onNewClient(client);
|
384
|
-
<a name="l00362"></a>00362 }
|
385
|
-
<a name="l00363"></a>00363 i++;
|
386
|
-
<a name="l00364"></a>00364 }
|
387
|
-
<a name="l00365"></a>00365 }
|
388
|
-
<a name="l00366"></a>00366
|
389
|
-
<a name="l00367"></a>00367 <span class="keyword">public</span>:
|
390
|
-
<a name="l00368"></a>00368 EventedServer(<span class="keyword">struct</span> ev_loop *_loop, FileDescriptor serverFd)
|
391
|
-
<a name="l00369"></a>00369 : loop(_loop),
|
392
|
-
<a name="l00370"></a>00370 acceptWatcher(_loop)
|
393
|
-
<a name="l00371"></a>00371 {
|
394
|
-
<a name="l00372"></a>00372 fd = serverFd;
|
395
|
-
<a name="l00373"></a>00373 <a class="code" href="group__Support.html#g7e3fdc923bdf6efeab407cdd325883a8" title="Sets a socket in non-blocking mode.">setNonBlocking</a>(serverFd);
|
396
|
-
<a name="l00374"></a>00374 acceptWatcher.set<EventedServer, &EventedServer::onAcceptable>(<span class="keyword">this</span>);
|
397
|
-
<a name="l00375"></a>00375 acceptWatcher.start(fd, ev::READ);
|
398
|
-
<a name="l00376"></a>00376 }
|
399
|
-
<a name="l00377"></a>00377
|
400
|
-
<a name="l00378"></a>00378 <span class="keyword">virtual</span> ~EventedServer() { }
|
401
|
-
<a name="l00379"></a>00379
|
402
|
-
<a name="l00380"></a>00380 <span class="keyword">struct </span>ev_loop *getLoop()<span class="keyword"> const </span>{
|
403
|
-
<a name="l00381"></a>00381 <span class="keywordflow">return</span> loop;
|
404
|
-
<a name="l00382"></a>00382 }
|
405
|
-
<a name="l00383"></a>00383 };
|
406
|
-
<a name="l00384"></a>00384
|
407
|
-
<a name="l00385"></a>00385 } <span class="comment">// namespace Passenger</span>
|
408
|
-
<a name="l00386"></a>00386
|
409
|
-
<a name="l00387"></a>00387 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_EVENTED_SERVER_H_ */</span>
|
410
|
-
</pre></div></div>
|
411
|
-
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
412
|
-
<a href="http://www.doxygen.org/index.html">
|
413
|
-
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
|
414
|
-
</body>
|
415
|
-
</html>
|