zeroc-ice 3.6b1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ICE_LICENSE +54 -0
- data/LICENSE +339 -0
- data/bin/slice2rb +17 -0
- data/ext/Communicator.cpp +596 -0
- data/ext/Communicator.h +25 -0
- data/ext/Config.h +111 -0
- data/ext/Connection.cpp +381 -0
- data/ext/Connection.h +26 -0
- data/ext/Endpoint.cpp +311 -0
- data/ext/Endpoint.h +27 -0
- data/ext/ImplicitContext.cpp +152 -0
- data/ext/ImplicitContext.h +25 -0
- data/ext/Init.cpp +52 -0
- data/ext/Logger.cpp +151 -0
- data/ext/Logger.h +28 -0
- data/ext/ObjectFactory.cpp +140 -0
- data/ext/ObjectFactory.h +50 -0
- data/ext/Operation.cpp +676 -0
- data/ext/Operation.h +36 -0
- data/ext/Properties.cpp +369 -0
- data/ext/Properties.h +25 -0
- data/ext/Proxy.cpp +1354 -0
- data/ext/Proxy.h +27 -0
- data/ext/Slice.cpp +223 -0
- data/ext/Slice.h +22 -0
- data/ext/Types.cpp +3160 -0
- data/ext/Types.h +545 -0
- data/ext/Util.cpp +792 -0
- data/ext/Util.h +511 -0
- data/ext/extconf.rb +118 -0
- data/ext/ice/BZIP_LICENSE +42 -0
- data/ext/ice/MCPP_LICENSE +36 -0
- data/ext/ice/bzip2/blocksort.c +1094 -0
- data/ext/ice/bzip2/bzlib.c +1572 -0
- data/ext/ice/bzip2/bzlib.h +282 -0
- data/ext/ice/bzip2/bzlib_private.h +509 -0
- data/ext/ice/bzip2/compress.c +672 -0
- data/ext/ice/bzip2/crctable.c +104 -0
- data/ext/ice/bzip2/decompress.c +646 -0
- data/ext/ice/bzip2/huffman.c +205 -0
- data/ext/ice/bzip2/randtable.c +84 -0
- data/ext/ice/cpp/include/Ice/ACMF.h +30 -0
- data/ext/ice/cpp/include/Ice/Application.h +156 -0
- data/ext/ice/cpp/include/Ice/AsyncResult.h +363 -0
- data/ext/ice/cpp/include/Ice/AsyncResultF.h +26 -0
- data/ext/ice/cpp/include/Ice/BasicStream.h +1315 -0
- data/ext/ice/cpp/include/Ice/Buffer.h +159 -0
- data/ext/ice/cpp/include/Ice/BuiltinSequences.h +74 -0
- data/ext/ice/cpp/include/Ice/Communicator.h +194 -0
- data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +115 -0
- data/ext/ice/cpp/include/Ice/CommunicatorF.h +60 -0
- data/ext/ice/cpp/include/Ice/Config.h +97 -0
- data/ext/ice/cpp/include/Ice/Connection.h +495 -0
- data/ext/ice/cpp/include/Ice/ConnectionAsync.h +115 -0
- data/ext/ice/cpp/include/Ice/ConnectionF.h +72 -0
- data/ext/ice/cpp/include/Ice/ConnectionFactoryF.h +30 -0
- data/ext/ice/cpp/include/Ice/ConnectionIF.h +37 -0
- data/ext/ice/cpp/include/Ice/Current.h +94 -0
- data/ext/ice/cpp/include/Ice/DefaultObjectFactory.h +48 -0
- data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +62 -0
- data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +33 -0
- data/ext/ice/cpp/include/Ice/Dispatcher.h +51 -0
- data/ext/ice/cpp/include/Ice/DynamicLibrary.h +105 -0
- data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +29 -0
- data/ext/ice/cpp/include/Ice/Endpoint.h +350 -0
- data/ext/ice/cpp/include/Ice/EndpointF.h +97 -0
- data/ext/ice/cpp/include/Ice/EndpointTypes.h +74 -0
- data/ext/ice/cpp/include/Ice/Exception.h +114 -0
- data/ext/ice/cpp/include/Ice/FacetMap.h +56 -0
- data/ext/ice/cpp/include/Ice/FactoryTable.h +69 -0
- data/ext/ice/cpp/include/Ice/FactoryTableInit.h +87 -0
- data/ext/ice/cpp/include/Ice/Format.h +39 -0
- data/ext/ice/cpp/include/Ice/Functional.h +138 -0
- data/ext/ice/cpp/include/Ice/GCObject.h +73 -0
- data/ext/ice/cpp/include/Ice/Handle.h +192 -0
- data/ext/ice/cpp/include/Ice/Ice.h +54 -0
- data/ext/ice/cpp/include/Ice/Identity.h +160 -0
- data/ext/ice/cpp/include/Ice/ImplicitContext.h +96 -0
- data/ext/ice/cpp/include/Ice/ImplicitContextF.h +60 -0
- data/ext/ice/cpp/include/Ice/Incoming.h +131 -0
- data/ext/ice/cpp/include/Ice/IncomingAsync.h +108 -0
- data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +35 -0
- data/ext/ice/cpp/include/Ice/Initialize.h +141 -0
- data/ext/ice/cpp/include/Ice/InstanceF.h +26 -0
- data/ext/ice/cpp/include/Ice/Instrumentation.h +377 -0
- data/ext/ice/cpp/include/Ice/InstrumentationF.h +71 -0
- data/ext/ice/cpp/include/Ice/LocalException.h +1022 -0
- data/ext/ice/cpp/include/Ice/LocalObject.h +36 -0
- data/ext/ice/cpp/include/Ice/LocalObjectF.h +26 -0
- data/ext/ice/cpp/include/Ice/Locator.h +2191 -0
- data/ext/ice/cpp/include/Ice/LocatorF.h +89 -0
- data/ext/ice/cpp/include/Ice/Logger.h +94 -0
- data/ext/ice/cpp/include/Ice/LoggerF.h +60 -0
- data/ext/ice/cpp/include/Ice/LoggerUtil.h +153 -0
- data/ext/ice/cpp/include/Ice/Makefile +26 -0
- data/ext/ice/cpp/include/Ice/Metrics.h +2989 -0
- data/ext/ice/cpp/include/Ice/MetricsAdminI.h +662 -0
- data/ext/ice/cpp/include/Ice/MetricsFunctional.h +144 -0
- data/ext/ice/cpp/include/Ice/MetricsObserverI.h +576 -0
- data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +55 -0
- data/ext/ice/cpp/include/Ice/Object.h +165 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapter.h +162 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapterF.h +60 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapterFactoryF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObjectF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObjectFactory.h +86 -0
- data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +60 -0
- data/ext/ice/cpp/include/Ice/ObjectFactoryManagerF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObserverHelper.h +177 -0
- data/ext/ice/cpp/include/Ice/Outgoing.h +197 -0
- data/ext/ice/cpp/include/Ice/OutgoingAsync.h +264 -0
- data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +38 -0
- data/ext/ice/cpp/include/Ice/Plugin.h +121 -0
- data/ext/ice/cpp/include/Ice/PluginF.h +66 -0
- data/ext/ice/cpp/include/Ice/Process.h +568 -0
- data/ext/ice/cpp/include/Ice/ProcessF.h +77 -0
- data/ext/ice/cpp/include/Ice/Properties.h +130 -0
- data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +824 -0
- data/ext/ice/cpp/include/Ice/PropertiesF.h +83 -0
- data/ext/ice/cpp/include/Ice/Protocol.h +242 -0
- data/ext/ice/cpp/include/Ice/Proxy.h +2448 -0
- data/ext/ice/cpp/include/Ice/ProxyF.h +78 -0
- data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +26 -0
- data/ext/ice/cpp/include/Ice/ProxyHandle.h +330 -0
- data/ext/ice/cpp/include/Ice/ReferenceF.h +34 -0
- data/ext/ice/cpp/include/Ice/RemoteLogger.h +1496 -0
- data/ext/ice/cpp/include/Ice/RequestHandlerF.h +29 -0
- data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +25 -0
- data/ext/ice/cpp/include/Ice/Router.h +1155 -0
- data/ext/ice/cpp/include/Ice/RouterF.h +77 -0
- data/ext/ice/cpp/include/Ice/ServantLocator.h +90 -0
- data/ext/ice/cpp/include/Ice/ServantLocatorF.h +60 -0
- data/ext/ice/cpp/include/Ice/ServantManagerF.h +26 -0
- data/ext/ice/cpp/include/Ice/Service.h +260 -0
- data/ext/ice/cpp/include/Ice/SliceChecksumDict.h +56 -0
- data/ext/ice/cpp/include/Ice/SliceChecksums.h +34 -0
- data/ext/ice/cpp/include/Ice/SlicedData.h +103 -0
- data/ext/ice/cpp/include/Ice/SlicedDataF.h +34 -0
- data/ext/ice/cpp/include/Ice/Stream.h +449 -0
- data/ext/ice/cpp/include/Ice/StreamF.h +30 -0
- data/ext/ice/cpp/include/Ice/StreamHelpers.h +877 -0
- data/ext/ice/cpp/include/Ice/ThreadPoolF.h +28 -0
- data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +56 -0
- data/ext/ice/cpp/include/Ice/Version.h +254 -0
- data/ext/ice/cpp/include/IceSSL/Config.h +23 -0
- data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +119 -0
- data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +101 -0
- data/ext/ice/cpp/include/IceSSL/IceSSL.h +22 -0
- data/ext/ice/cpp/include/IceSSL/Makefile +26 -0
- data/ext/ice/cpp/include/IceSSL/Plugin.h +558 -0
- data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +119 -0
- data/ext/ice/cpp/include/IceUtil/Cache.h +362 -0
- data/ext/ice/cpp/include/IceUtil/Cond.h +323 -0
- data/ext/ice/cpp/include/IceUtil/Config.h +234 -0
- data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +50 -0
- data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +70 -0
- data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +45 -0
- data/ext/ice/cpp/include/IceUtil/Exception.h +184 -0
- data/ext/ice/cpp/include/IceUtil/Functional.h +389 -0
- data/ext/ice/cpp/include/IceUtil/Handle.h +266 -0
- data/ext/ice/cpp/include/IceUtil/IceUtil.h +51 -0
- data/ext/ice/cpp/include/IceUtil/IconvStringConverter.h +302 -0
- data/ext/ice/cpp/include/IceUtil/InputUtil.h +47 -0
- data/ext/ice/cpp/include/IceUtil/Iterator.h +36 -0
- data/ext/ice/cpp/include/IceUtil/Lock.h +135 -0
- data/ext/ice/cpp/include/IceUtil/Makefile +26 -0
- data/ext/ice/cpp/include/IceUtil/Monitor.h +249 -0
- data/ext/ice/cpp/include/IceUtil/Mutex.h +357 -0
- data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +28 -0
- data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +83 -0
- data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +82 -0
- data/ext/ice/cpp/include/IceUtil/Optional.h +322 -0
- data/ext/ice/cpp/include/IceUtil/Options.h +141 -0
- data/ext/ice/cpp/include/IceUtil/OutputUtil.h +362 -0
- data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +19 -0
- data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +26 -0
- data/ext/ice/cpp/include/IceUtil/Random.h +24 -0
- data/ext/ice/cpp/include/IceUtil/RecMutex.h +113 -0
- data/ext/ice/cpp/include/IceUtil/SHA1.h +65 -0
- data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +44 -0
- data/ext/ice/cpp/include/IceUtil/ScopedArray.h +97 -0
- data/ext/ice/cpp/include/IceUtil/Shared.h +168 -0
- data/ext/ice/cpp/include/IceUtil/StringConverter.h +175 -0
- data/ext/ice/cpp/include/IceUtil/StringUtil.h +91 -0
- data/ext/ice/cpp/include/IceUtil/Thread.h +181 -0
- data/ext/ice/cpp/include/IceUtil/ThreadException.h +108 -0
- data/ext/ice/cpp/include/IceUtil/Time.h +209 -0
- data/ext/ice/cpp/include/IceUtil/Timer.h +143 -0
- data/ext/ice/cpp/include/IceUtil/UUID.h +22 -0
- data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +42 -0
- data/ext/ice/cpp/include/IceUtil/UniquePtr.h +101 -0
- data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +64 -0
- data/ext/ice/cpp/include/Slice/Checksum.h +26 -0
- data/ext/ice/cpp/include/Slice/CsUtil.h +92 -0
- data/ext/ice/cpp/include/Slice/DotNetNames.h +34 -0
- data/ext/ice/cpp/include/Slice/FileTracker.h +71 -0
- data/ext/ice/cpp/include/Slice/JavaUtil.h +277 -0
- data/ext/ice/cpp/include/Slice/Makefile +26 -0
- data/ext/ice/cpp/include/Slice/PHPUtil.h +50 -0
- data/ext/ice/cpp/include/Slice/Parser.h +1116 -0
- data/ext/ice/cpp/include/Slice/Preprocessor.h +68 -0
- data/ext/ice/cpp/include/Slice/PythonUtil.h +64 -0
- data/ext/ice/cpp/include/Slice/RubyUtil.h +54 -0
- data/ext/ice/cpp/include/Slice/Util.h +33 -0
- data/ext/ice/cpp/src/Ice/ACM.cpp +343 -0
- data/ext/ice/cpp/src/Ice/ACM.h +117 -0
- data/ext/ice/cpp/src/Ice/Acceptor.cpp +16 -0
- data/ext/ice/cpp/src/Ice/Acceptor.h +41 -0
- data/ext/ice/cpp/src/Ice/AcceptorF.h +30 -0
- data/ext/ice/cpp/src/Ice/Application.cpp +760 -0
- data/ext/ice/cpp/src/Ice/AsyncResult.cpp +599 -0
- data/ext/ice/cpp/src/Ice/Base64.cpp +269 -0
- data/ext/ice/cpp/src/Ice/Base64.h +36 -0
- data/ext/ice/cpp/src/Ice/BasicStream.cpp +3393 -0
- data/ext/ice/cpp/src/Ice/Buffer.cpp +98 -0
- data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +34 -0
- data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +718 -0
- data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +106 -0
- data/ext/ice/cpp/src/Ice/Communicator.cpp +45 -0
- data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +386 -0
- data/ext/ice/cpp/src/Ice/CommunicatorI.h +112 -0
- data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +546 -0
- data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +97 -0
- data/ext/ice/cpp/src/Ice/Connection.cpp +58 -0
- data/ext/ice/cpp/src/Ice/ConnectionF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +1639 -0
- data/ext/ice/cpp/src/Ice/ConnectionFactory.h +236 -0
- data/ext/ice/cpp/src/Ice/ConnectionI.cpp +3876 -0
- data/ext/ice/cpp/src/Ice/ConnectionI.h +364 -0
- data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +115 -0
- data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +50 -0
- data/ext/ice/cpp/src/Ice/Connector.cpp +16 -0
- data/ext/ice/cpp/src/Ice/Connector.h +36 -0
- data/ext/ice/cpp/src/Ice/ConnectorF.h +26 -0
- data/ext/ice/cpp/src/Ice/Current.cpp +38 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +168 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +57 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +26 -0
- data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +60 -0
- data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +49 -0
- data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +281 -0
- data/ext/ice/cpp/src/Ice/Endpoint.cpp +53 -0
- data/ext/ice/cpp/src/Ice/EndpointF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +25 -0
- data/ext/ice/cpp/src/Ice/EndpointFactory.h +44 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +26 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +208 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +46 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +26 -0
- data/ext/ice/cpp/src/Ice/EndpointI.cpp +87 -0
- data/ext/ice/cpp/src/Ice/EndpointI.h +165 -0
- data/ext/ice/cpp/src/Ice/EndpointIF.h +41 -0
- data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +38 -0
- data/ext/ice/cpp/src/Ice/EventHandler.cpp +35 -0
- data/ext/ice/cpp/src/Ice/EventHandler.h +78 -0
- data/ext/ice/cpp/src/Ice/EventHandlerF.h +26 -0
- data/ext/ice/cpp/src/Ice/EventLoggerMsg.h +53 -0
- data/ext/ice/cpp/src/Ice/Exception.cpp +832 -0
- data/ext/ice/cpp/src/Ice/FacetMap.cpp +34 -0
- data/ext/ice/cpp/src/Ice/FactoryTable.cpp +158 -0
- data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +95 -0
- data/ext/ice/cpp/src/Ice/GCObject.cpp +444 -0
- data/ext/ice/cpp/src/Ice/HashUtil.h +59 -0
- data/ext/ice/cpp/src/Ice/HttpParser.cpp +680 -0
- data/ext/ice/cpp/src/Ice/HttpParser.h +124 -0
- data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +733 -0
- data/ext/ice/cpp/src/Ice/IPEndpointI.h +157 -0
- data/ext/ice/cpp/src/Ice/IPEndpointIF.h +29 -0
- data/ext/ice/cpp/src/Ice/Identity.cpp +42 -0
- data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +639 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextI.h +51 -0
- data/ext/ice/cpp/src/Ice/Incoming.cpp +757 -0
- data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +340 -0
- data/ext/ice/cpp/src/Ice/IncomingRequest.h +37 -0
- data/ext/ice/cpp/src/Ice/Initialize.cpp +401 -0
- data/ext/ice/cpp/src/Ice/Instance.cpp +1928 -0
- data/ext/ice/cpp/src/Ice/Instance.h +198 -0
- data/ext/ice/cpp/src/Ice/Instrumentation.cpp +68 -0
- data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +43 -0
- data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +1083 -0
- data/ext/ice/cpp/src/Ice/InstrumentationI.h +262 -0
- data/ext/ice/cpp/src/Ice/LocalException.cpp +2091 -0
- data/ext/ice/cpp/src/Ice/LocalObject.cpp +29 -0
- data/ext/ice/cpp/src/Ice/Locator.cpp +1946 -0
- data/ext/ice/cpp/src/Ice/LocatorF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +917 -0
- data/ext/ice/cpp/src/Ice/LocatorInfo.h +193 -0
- data/ext/ice/cpp/src/Ice/LocatorInfoF.h +34 -0
- data/ext/ice/cpp/src/Ice/Logger.cpp +40 -0
- data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +862 -0
- data/ext/ice/cpp/src/Ice/LoggerAdminI.h +46 -0
- data/ext/ice/cpp/src/Ice/LoggerF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/LoggerI.cpp +199 -0
- data/ext/ice/cpp/src/Ice/LoggerI.h +57 -0
- data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +107 -0
- data/ext/ice/cpp/src/Ice/Makefile +190 -0
- data/ext/ice/cpp/src/Ice/Metrics.cpp +2159 -0
- data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +669 -0
- data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +14 -0
- data/ext/ice/cpp/src/Ice/Network.cpp +2694 -0
- data/ext/ice/cpp/src/Ice/Network.h +291 -0
- data/ext/ice/cpp/src/Ice/NetworkF.h +28 -0
- data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +325 -0
- data/ext/ice/cpp/src/Ice/NetworkProxy.h +74 -0
- data/ext/ice/cpp/src/Ice/NetworkProxyF.h +26 -0
- data/ext/ice/cpp/src/Ice/Object.cpp +440 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +241 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +52 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +1498 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +155 -0
- data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +140 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +43 -0
- data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +84 -0
- data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +407 -0
- data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +70 -0
- data/ext/ice/cpp/src/Ice/Outgoing.cpp +737 -0
- data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +874 -0
- data/ext/ice/cpp/src/Ice/Plugin.cpp +43 -0
- data/ext/ice/cpp/src/Ice/PluginF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +503 -0
- data/ext/ice/cpp/src/Ice/PluginManagerI.h +67 -0
- data/ext/ice/cpp/src/Ice/Process.cpp +299 -0
- data/ext/ice/cpp/src/Ice/ProcessF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/Properties.cpp +45 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +555 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +207 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +45 -0
- data/ext/ice/cpp/src/Ice/PropertiesF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/PropertiesI.cpp +759 -0
- data/ext/ice/cpp/src/Ice/PropertiesI.h +78 -0
- data/ext/ice/cpp/src/Ice/PropertyNames.cpp +1293 -0
- data/ext/ice/cpp/src/Ice/PropertyNames.h +81 -0
- data/ext/ice/cpp/src/Ice/Protocol.cpp +137 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +98 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstance.h +91 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +26 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +51 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +67 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +26 -0
- data/ext/ice/cpp/src/Ice/Proxy.cpp +1810 -0
- data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +305 -0
- data/ext/ice/cpp/src/Ice/ProxyFactory.h +57 -0
- data/ext/ice/cpp/src/Ice/Reference.cpp +1947 -0
- data/ext/ice/cpp/src/Ice/Reference.h +305 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +937 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactory.h +81 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +24 -0
- data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +958 -0
- data/ext/ice/cpp/src/Ice/ReplyStatus.h +29 -0
- data/ext/ice/cpp/src/Ice/RequestHandler.cpp +40 -0
- data/ext/ice/cpp/src/Ice/RequestHandler.h +90 -0
- data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +70 -0
- data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +41 -0
- data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +20 -0
- data/ext/ice/cpp/src/Ice/ResponseHandler.h +39 -0
- data/ext/ice/cpp/src/Ice/RetryQueue.cpp +154 -0
- data/ext/ice/cpp/src/Ice/RetryQueue.h +69 -0
- data/ext/ice/cpp/src/Ice/RetryQueueF.h +24 -0
- data/ext/ice/cpp/src/Ice/Router.cpp +849 -0
- data/ext/ice/cpp/src/Ice/RouterF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/RouterInfo.cpp +381 -0
- data/ext/ice/cpp/src/Ice/RouterInfo.h +148 -0
- data/ext/ice/cpp/src/Ice/RouterInfoF.h +30 -0
- data/ext/ice/cpp/src/Ice/Selector.cpp +926 -0
- data/ext/ice/cpp/src/Ice/Selector.h +231 -0
- data/ext/ice/cpp/src/Ice/ServantLocator.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ServantManager.cpp +495 -0
- data/ext/ice/cpp/src/Ice/ServantManager.h +74 -0
- data/ext/ice/cpp/src/Ice/Service.cpp +1897 -0
- data/ext/ice/cpp/src/Ice/SharedContext.h +51 -0
- data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +34 -0
- data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +80 -0
- data/ext/ice/cpp/src/Ice/SlicedData.cpp +80 -0
- data/ext/ice/cpp/src/Ice/Stream.cpp +53 -0
- data/ext/ice/cpp/src/Ice/StreamI.cpp +832 -0
- data/ext/ice/cpp/src/Ice/StreamI.h +198 -0
- data/ext/ice/cpp/src/Ice/StreamSocket.cpp +521 -0
- data/ext/ice/cpp/src/Ice/StreamSocket.h +85 -0
- data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +145 -0
- data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +167 -0
- data/ext/ice/cpp/src/Ice/SysLoggerI.h +43 -0
- data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +235 -0
- data/ext/ice/cpp/src/Ice/TcpAcceptor.h +67 -0
- data/ext/ice/cpp/src/Ice/TcpConnector.cpp +133 -0
- data/ext/ice/cpp/src/Ice/TcpConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +397 -0
- data/ext/ice/cpp/src/Ice/TcpEndpointI.h +93 -0
- data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +127 -0
- data/ext/ice/cpp/src/Ice/TcpTransceiver.h +61 -0
- data/ext/ice/cpp/src/Ice/ThreadPool.cpp +1357 -0
- data/ext/ice/cpp/src/Ice/ThreadPool.h +399 -0
- data/ext/ice/cpp/src/Ice/TraceLevels.cpp +43 -0
- data/ext/ice/cpp/src/Ice/TraceLevels.h +50 -0
- data/ext/ice/cpp/src/Ice/TraceLevelsF.h +26 -0
- data/ext/ice/cpp/src/Ice/TraceUtil.cpp +452 -0
- data/ext/ice/cpp/src/Ice/TraceUtil.h +28 -0
- data/ext/ice/cpp/src/Ice/Transceiver.cpp +24 -0
- data/ext/ice/cpp/src/Ice/Transceiver.h +52 -0
- data/ext/ice/cpp/src/Ice/TransceiverF.h +38 -0
- data/ext/ice/cpp/src/Ice/UdpConnector.cpp +144 -0
- data/ext/ice/cpp/src/Ice/UdpConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +483 -0
- data/ext/ice/cpp/src/Ice/UdpEndpointI.h +95 -0
- data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +1156 -0
- data/ext/ice/cpp/src/Ice/UdpTransceiver.h +123 -0
- data/ext/ice/cpp/src/Ice/Version.cpp +46 -0
- data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +103 -0
- data/ext/ice/cpp/src/Ice/WSAcceptor.h +61 -0
- data/ext/ice/cpp/src/Ice/WSConnector.cpp +113 -0
- data/ext/ice/cpp/src/Ice/WSConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +441 -0
- data/ext/ice/cpp/src/Ice/WSEndpoint.h +97 -0
- data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +1728 -0
- data/ext/ice/cpp/src/Ice/WSTransceiver.h +149 -0
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +594 -0
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +1035 -0
- data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +208 -0
- data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +78 -0
- data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +308 -0
- data/ext/ice/cpp/src/IceDiscovery/LookupI.h +183 -0
- data/ext/ice/cpp/src/IceDiscovery/Makefile +61 -0
- data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +148 -0
- data/ext/ice/cpp/src/IceDiscovery/PluginI.h +39 -0
- data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +258 -0
- data/ext/ice/cpp/src/IceSSL/AcceptorI.h +66 -0
- data/ext/ice/cpp/src/IceSSL/Certificate.cpp +1334 -0
- data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +42 -0
- data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +151 -0
- data/ext/ice/cpp/src/IceSSL/ConnectorI.h +56 -0
- data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +397 -0
- data/ext/ice/cpp/src/IceSSL/EndpointI.h +96 -0
- data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +41 -0
- data/ext/ice/cpp/src/IceSSL/Instance.cpp +38 -0
- data/ext/ice/cpp/src/IceSSL/Instance.h +42 -0
- data/ext/ice/cpp/src/IceSSL/InstanceF.h +34 -0
- data/ext/ice/cpp/src/IceSSL/Makefile +82 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +1001 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +607 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +75 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.cpp +102 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.h +56 -0
- data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +541 -0
- data/ext/ice/cpp/src/IceSSL/RFC2253.h +67 -0
- data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +729 -0
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +1062 -0
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +130 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +291 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.h +264 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +41 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +1514 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +609 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +91 -0
- data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +246 -0
- data/ext/ice/cpp/src/IceSSL/TrustManager.h +51 -0
- data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +26 -0
- data/ext/ice/cpp/src/IceSSL/Util.cpp +1423 -0
- data/ext/ice/cpp/src/IceSSL/Util.h +136 -0
- data/ext/ice/cpp/src/IceUtil/ArgVector.cpp +65 -0
- data/ext/ice/cpp/src/IceUtil/ArgVector.h +41 -0
- data/ext/ice/cpp/src/IceUtil/Cond.cpp +386 -0
- data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +477 -0
- data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +144 -0
- data/ext/ice/cpp/src/IceUtil/CountDownLatch.cpp +184 -0
- data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +273 -0
- data/ext/ice/cpp/src/IceUtil/Exception.cpp +782 -0
- data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +532 -0
- data/ext/ice/cpp/src/IceUtil/FileUtil.h +159 -0
- data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +41 -0
- data/ext/ice/cpp/src/IceUtil/Makefile +68 -0
- data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +24 -0
- data/ext/ice/cpp/src/IceUtil/Options.cpp +1049 -0
- data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +591 -0
- data/ext/ice/cpp/src/IceUtil/Random.cpp +185 -0
- data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +257 -0
- data/ext/ice/cpp/src/IceUtil/SHA1.cpp +126 -0
- data/ext/ice/cpp/src/IceUtil/Shared.cpp +200 -0
- data/ext/ice/cpp/src/IceUtil/StopWatch.h +54 -0
- data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +450 -0
- data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +842 -0
- data/ext/ice/cpp/src/IceUtil/Thread.cpp +809 -0
- data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +172 -0
- data/ext/ice/cpp/src/IceUtil/Time.cpp +306 -0
- data/ext/ice/cpp/src/IceUtil/Timer.cpp +251 -0
- data/ext/ice/cpp/src/IceUtil/UUID.cpp +174 -0
- data/ext/ice/cpp/src/IceUtil/Unicode.cpp +131 -0
- data/ext/ice/cpp/src/IceUtil/Unicode.h +49 -0
- data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +1139 -0
- data/ext/ice/cpp/src/Slice/Checksum.cpp +452 -0
- data/ext/ice/cpp/src/Slice/CsUtil.cpp +2650 -0
- data/ext/ice/cpp/src/Slice/DotNetNames.cpp +146 -0
- data/ext/ice/cpp/src/Slice/FileTracker.cpp +203 -0
- data/ext/ice/cpp/src/Slice/Grammar.cpp +4755 -0
- data/ext/ice/cpp/src/Slice/Grammar.h +98 -0
- data/ext/ice/cpp/src/Slice/GrammarUtil.h +234 -0
- data/ext/ice/cpp/src/Slice/JavaUtil.cpp +4376 -0
- data/ext/ice/cpp/src/Slice/MD5.cpp +57 -0
- data/ext/ice/cpp/src/Slice/MD5.h +44 -0
- data/ext/ice/cpp/src/Slice/MD5I.cpp +385 -0
- data/ext/ice/cpp/src/Slice/MD5I.h +91 -0
- data/ext/ice/cpp/src/Slice/Makefile +65 -0
- data/ext/ice/cpp/src/Slice/PHPUtil.cpp +156 -0
- data/ext/ice/cpp/src/Slice/Parser.cpp +6386 -0
- data/ext/ice/cpp/src/Slice/Preprocessor.cpp +686 -0
- data/ext/ice/cpp/src/Slice/Python.cpp +675 -0
- data/ext/ice/cpp/src/Slice/PythonUtil.cpp +2614 -0
- data/ext/ice/cpp/src/Slice/Ruby.cpp +317 -0
- data/ext/ice/cpp/src/Slice/RubyUtil.cpp +1774 -0
- data/ext/ice/cpp/src/Slice/Scanner.cpp +2426 -0
- data/ext/ice/cpp/src/Slice/Util.cpp +325 -0
- data/ext/ice/mcpp/config.h.Darwin +227 -0
- data/ext/ice/mcpp/config.h.Linux +227 -0
- data/ext/ice/mcpp/config.h.MINGW +7 -0
- data/ext/ice/mcpp/configed.H +382 -0
- data/ext/ice/mcpp/directive.c +1699 -0
- data/ext/ice/mcpp/eval.c +1673 -0
- data/ext/ice/mcpp/expand.c +2980 -0
- data/ext/ice/mcpp/internal.H +564 -0
- data/ext/ice/mcpp/main.c +1131 -0
- data/ext/ice/mcpp/mbchar.c +869 -0
- data/ext/ice/mcpp/mcpp_lib.h +31 -0
- data/ext/ice/mcpp/mcpp_out.h +13 -0
- data/ext/ice/mcpp/support.c +2811 -0
- data/ext/ice/mcpp/system.H +396 -0
- data/ext/ice/mcpp/system.c +4940 -0
- data/ice.gemspec +41 -0
- data/lib/Glacier2.rb +12 -0
- data/lib/Glacier2/Metrics.rb +99 -0
- data/lib/Glacier2/PermissionsVerifier.rb +168 -0
- data/lib/Glacier2/PermissionsVerifierF.rb +34 -0
- data/lib/Glacier2/Router.rb +141 -0
- data/lib/Glacier2/RouterF.rb +29 -0
- data/lib/Glacier2/SSLInfo.rb +79 -0
- data/lib/Glacier2/Session.rb +470 -0
- data/lib/Ice.rb +659 -0
- data/lib/Ice/BuiltinSequences.rb +64 -0
- data/lib/Ice/Communicator.rb +93 -0
- data/lib/Ice/CommunicatorF.rb +28 -0
- data/lib/Ice/Connection.rb +414 -0
- data/lib/Ice/ConnectionF.rb +36 -0
- data/lib/Ice/Current.rb +152 -0
- data/lib/Ice/Endpoint.rb +265 -0
- data/lib/Ice/EndpointF.rb +52 -0
- data/lib/Ice/EndpointTypes.rb +77 -0
- data/lib/Ice/FacetMap.rb +28 -0
- data/lib/Ice/Identity.rb +70 -0
- data/lib/Ice/ImplicitContext.rb +59 -0
- data/lib/Ice/ImplicitContextF.rb +28 -0
- data/lib/Ice/Instrumentation.rb +425 -0
- data/lib/Ice/InstrumentationF.rb +35 -0
- data/lib/Ice/LocalException.rb +1081 -0
- data/lib/Ice/Locator.rb +314 -0
- data/lib/Ice/LocatorF.rb +34 -0
- data/lib/Ice/Logger.rb +57 -0
- data/lib/Ice/LoggerF.rb +28 -0
- data/lib/Ice/Metrics.rb +696 -0
- data/lib/Ice/ObjectAdapterF.rb +28 -0
- data/lib/Ice/ObjectFactory.rb +53 -0
- data/lib/Ice/ObjectFactoryF.rb +28 -0
- data/lib/Ice/Plugin.rb +87 -0
- data/lib/Ice/PluginF.rb +32 -0
- data/lib/Ice/Process.rb +93 -0
- data/lib/Ice/ProcessF.rb +29 -0
- data/lib/Ice/Properties.rb +65 -0
- data/lib/Ice/PropertiesAdmin.rb +104 -0
- data/lib/Ice/PropertiesF.rb +33 -0
- data/lib/Ice/Router.rb +163 -0
- data/lib/Ice/RouterF.rb +29 -0
- data/lib/Ice/SliceChecksumDict.rb +28 -0
- data/lib/Ice/Version.rb +100 -0
- data/lib/IceBox.rb +10 -0
- data/lib/IceBox/IceBox.rb +272 -0
- data/lib/IceGrid.rb +17 -0
- data/lib/IceGrid/Admin.rb +1076 -0
- data/lib/IceGrid/Descriptor.rb +1505 -0
- data/lib/IceGrid/Exception.rb +401 -0
- data/lib/IceGrid/FileParser.rb +105 -0
- data/lib/IceGrid/Locator.rb +105 -0
- data/lib/IceGrid/Observer.rb +571 -0
- data/lib/IceGrid/Query.rb +168 -0
- data/lib/IceGrid/Registry.rb +120 -0
- data/lib/IceGrid/Session.rb +114 -0
- data/lib/IceGrid/UserAccountMapper.rb +101 -0
- data/lib/IcePatch2.rb +10 -0
- data/lib/IcePatch2/FileInfo.rb +75 -0
- data/lib/IcePatch2/FileServer.rb +141 -0
- data/lib/IceStorm.rb +11 -0
- data/lib/IceStorm/IceStorm.rb +463 -0
- data/lib/IceStorm/Metrics.rb +155 -0
- data/slice/Freeze/BackgroundSaveEvictor.ice +111 -0
- data/slice/Freeze/CatalogData.ice +49 -0
- data/slice/Freeze/Connection.ice +111 -0
- data/slice/Freeze/ConnectionF.ice +20 -0
- data/slice/Freeze/DB.ice +37 -0
- data/slice/Freeze/Evictor.ice +339 -0
- data/slice/Freeze/EvictorF.ice +22 -0
- data/slice/Freeze/EvictorStorage.ice +72 -0
- data/slice/Freeze/Exception.ice +100 -0
- data/slice/Freeze/Transaction.ice +57 -0
- data/slice/Freeze/TransactionalEvictor.ice +50 -0
- data/slice/Glacier2/Metrics.ice +77 -0
- data/slice/Glacier2/PermissionsVerifier.ice +105 -0
- data/slice/Glacier2/PermissionsVerifierF.ice +21 -0
- data/slice/Glacier2/Router.ice +178 -0
- data/slice/Glacier2/RouterF.ice +20 -0
- data/slice/Glacier2/SSLInfo.ice +50 -0
- data/slice/Glacier2/Session.ice +273 -0
- data/slice/Ice/BuiltinSequences.ice +48 -0
- data/slice/Ice/Communicator.ice +567 -0
- data/slice/Ice/CommunicatorF.ice +20 -0
- data/slice/Ice/Connection.ice +323 -0
- data/slice/Ice/ConnectionF.ice +22 -0
- data/slice/Ice/Current.ice +160 -0
- data/slice/Ice/Endpoint.ice +227 -0
- data/slice/Ice/EndpointF.ice +32 -0
- data/slice/Ice/EndpointTypes.ice +38 -0
- data/slice/Ice/FacetMap.ice +25 -0
- data/slice/Ice/Identity.ice +59 -0
- data/slice/Ice/ImplicitContext.ice +109 -0
- data/slice/Ice/ImplicitContextF.ice +20 -0
- data/slice/Ice/Instrumentation.ice +499 -0
- data/slice/Ice/InstrumentationF.ice +26 -0
- data/slice/Ice/LocalException.ice +1015 -0
- data/slice/Ice/Locator.ice +227 -0
- data/slice/Ice/LocatorF.ice +21 -0
- data/slice/Ice/Logger.ice +86 -0
- data/slice/Ice/LoggerF.ice +20 -0
- data/slice/Ice/Metrics.ice +422 -0
- data/slice/Ice/ObjectAdapter.ice +673 -0
- data/slice/Ice/ObjectAdapterF.ice +20 -0
- data/slice/Ice/ObjectFactory.ice +60 -0
- data/slice/Ice/ObjectFactoryF.ice +20 -0
- data/slice/Ice/Plugin.ice +117 -0
- data/slice/Ice/PluginF.ice +21 -0
- data/slice/Ice/Process.ice +54 -0
- data/slice/Ice/ProcessF.ice +20 -0
- data/slice/Ice/Properties.ice +228 -0
- data/slice/Ice/PropertiesAdmin.ice +75 -0
- data/slice/Ice/PropertiesF.ice +21 -0
- data/slice/Ice/RemoteLogger.ice +232 -0
- data/slice/Ice/Router.ice +83 -0
- data/slice/Ice/RouterF.ice +20 -0
- data/slice/Ice/ServantLocator.ice +117 -0
- data/slice/Ice/ServantLocatorF.ice +20 -0
- data/slice/Ice/SliceChecksumDict.ice +25 -0
- data/slice/Ice/Version.ice +39 -0
- data/slice/IceBox/IceBox.ice +194 -0
- data/slice/IceDiscovery/IceDiscovery.ice +32 -0
- data/slice/IceGrid/Admin.ice +1578 -0
- data/slice/IceGrid/Descriptor.ice +1079 -0
- data/slice/IceGrid/Discovery.ice +73 -0
- data/slice/IceGrid/Exception.ice +383 -0
- data/slice/IceGrid/FileParser.ice +61 -0
- data/slice/IceGrid/Locator.ice +56 -0
- data/slice/IceGrid/Observer.ice +394 -0
- data/slice/IceGrid/PluginFacade.ice +316 -0
- data/slice/IceGrid/Query.ice +130 -0
- data/slice/IceGrid/Registry.ice +138 -0
- data/slice/IceGrid/Session.ice +124 -0
- data/slice/IceGrid/UserAccountMapper.ice +58 -0
- data/slice/IcePatch2/FileInfo.ice +49 -0
- data/slice/IcePatch2/FileServer.ice +129 -0
- data/slice/IceSSL/ConnectionInfo.ice +34 -0
- data/slice/IceSSL/EndpointInfo.ice +41 -0
- data/slice/IceStorm/IceStorm.ice +405 -0
- data/slice/IceStorm/Metrics.ice +71 -0
- metadata +737 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#ifndef ICE_WS_ENDPOINT_I_H
|
|
11
|
+
#define ICE_WS_ENDPOINT_I_H
|
|
12
|
+
|
|
13
|
+
#include <Ice/EndpointI.h>
|
|
14
|
+
#include <Ice/IPEndpointIF.h>
|
|
15
|
+
#include <Ice/EndpointFactory.h>
|
|
16
|
+
#include <Ice/InstanceF.h>
|
|
17
|
+
#include <Ice/Endpoint.h>
|
|
18
|
+
#include <Ice/ProtocolInstance.h>
|
|
19
|
+
|
|
20
|
+
namespace IceInternal
|
|
21
|
+
{
|
|
22
|
+
|
|
23
|
+
class WSEndpoint : public EndpointI
|
|
24
|
+
{
|
|
25
|
+
public:
|
|
26
|
+
|
|
27
|
+
WSEndpoint(const ProtocolInstancePtr&, const EndpointIPtr&, const std::string&);
|
|
28
|
+
WSEndpoint(const ProtocolInstancePtr&, const EndpointIPtr&, std::vector<std::string>&);
|
|
29
|
+
WSEndpoint(const ProtocolInstancePtr&, const EndpointIPtr&, BasicStream*);
|
|
30
|
+
|
|
31
|
+
virtual Ice::EndpointInfoPtr getInfo() const;
|
|
32
|
+
virtual Ice::Short type() const;
|
|
33
|
+
virtual const std::string& protocol() const;
|
|
34
|
+
virtual void streamWrite(BasicStream*) const;
|
|
35
|
+
|
|
36
|
+
virtual Ice::Int timeout() const;
|
|
37
|
+
virtual EndpointIPtr timeout(Ice::Int) const;
|
|
38
|
+
virtual const std::string& connectionId() const;
|
|
39
|
+
virtual EndpointIPtr connectionId(const ::std::string&) const;
|
|
40
|
+
virtual bool compress() const;
|
|
41
|
+
virtual EndpointIPtr compress(bool) const;
|
|
42
|
+
virtual bool datagram() const;
|
|
43
|
+
virtual bool secure() const;
|
|
44
|
+
|
|
45
|
+
virtual TransceiverPtr transceiver() const;
|
|
46
|
+
virtual void connectors_async(Ice::EndpointSelectionType, const EndpointI_connectorsPtr&) const;
|
|
47
|
+
virtual AcceptorPtr acceptor(const std::string&) const;
|
|
48
|
+
|
|
49
|
+
virtual std::vector<EndpointIPtr> expand() const;
|
|
50
|
+
virtual bool equivalent(const EndpointIPtr&) const;
|
|
51
|
+
virtual ::Ice::Int hash() const;
|
|
52
|
+
virtual std::string options() const;
|
|
53
|
+
|
|
54
|
+
EndpointIPtr delegate() const;
|
|
55
|
+
WSEndpointPtr endpoint(const EndpointIPtr&) const;
|
|
56
|
+
|
|
57
|
+
virtual bool operator==(const Ice::LocalObject&) const;
|
|
58
|
+
virtual bool operator<(const Ice::LocalObject&) const;
|
|
59
|
+
|
|
60
|
+
protected:
|
|
61
|
+
|
|
62
|
+
virtual bool checkOption(const std::string&, const std::string&, const std::string&);
|
|
63
|
+
|
|
64
|
+
private:
|
|
65
|
+
|
|
66
|
+
//
|
|
67
|
+
// All members are const, because endpoints are immutable.
|
|
68
|
+
//
|
|
69
|
+
const ProtocolInstancePtr _instance;
|
|
70
|
+
const IPEndpointIPtr _delegate;
|
|
71
|
+
const std::string _resource;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
class ICE_API WSEndpointFactory : public EndpointFactory
|
|
75
|
+
{
|
|
76
|
+
public:
|
|
77
|
+
|
|
78
|
+
WSEndpointFactory(const ProtocolInstancePtr&, const EndpointFactoryPtr&);
|
|
79
|
+
virtual ~WSEndpointFactory();
|
|
80
|
+
|
|
81
|
+
virtual Ice::Short type() const;
|
|
82
|
+
virtual std::string protocol() const;
|
|
83
|
+
virtual EndpointIPtr create(std::vector<std::string>&, bool) const;
|
|
84
|
+
virtual EndpointIPtr read(BasicStream*) const;
|
|
85
|
+
virtual void destroy();
|
|
86
|
+
|
|
87
|
+
virtual EndpointFactoryPtr clone(const ProtocolInstancePtr&) const;
|
|
88
|
+
|
|
89
|
+
private:
|
|
90
|
+
|
|
91
|
+
ProtocolInstancePtr _instance;
|
|
92
|
+
const EndpointFactoryPtr _delegate;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
#endif
|
|
@@ -0,0 +1,1728 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#include <Ice/WSTransceiver.h>
|
|
11
|
+
#include <Ice/Endpoint.h>
|
|
12
|
+
#include <Ice/Connection.h>
|
|
13
|
+
#include <Ice/ProtocolInstance.h>
|
|
14
|
+
#include <Ice/HttpParser.h>
|
|
15
|
+
#include <Ice/Communicator.h>
|
|
16
|
+
#include <Ice/LoggerUtil.h>
|
|
17
|
+
#include <Ice/Buffer.h>
|
|
18
|
+
#include <Ice/LocalException.h>
|
|
19
|
+
#include <Ice/Base64.h>
|
|
20
|
+
#include <IceUtil/Random.h>
|
|
21
|
+
#include <IceUtil/SHA1.h>
|
|
22
|
+
#include <IceUtil/StringUtil.h>
|
|
23
|
+
|
|
24
|
+
#include <IceUtil/DisableWarnings.h>
|
|
25
|
+
|
|
26
|
+
// Python 2.7 under Windows.
|
|
27
|
+
#if _MSC_VER == 1500
|
|
28
|
+
typedef unsigned short uint16_t;
|
|
29
|
+
#else
|
|
30
|
+
#include <stdint.h>
|
|
31
|
+
#endif
|
|
32
|
+
|
|
33
|
+
#include <climits>
|
|
34
|
+
|
|
35
|
+
using namespace std;
|
|
36
|
+
using namespace Ice;
|
|
37
|
+
using namespace IceInternal;
|
|
38
|
+
|
|
39
|
+
//
|
|
40
|
+
// WebSocket opcodes
|
|
41
|
+
//
|
|
42
|
+
#define OP_CONT 0x0 // Continuation frame
|
|
43
|
+
#define OP_TEXT 0x1 // Text frame
|
|
44
|
+
#define OP_DATA 0x2 // Data frame
|
|
45
|
+
#define OP_RES_0x3 0x3 // Reserved
|
|
46
|
+
#define OP_RES_0x4 0x4 // Reserved
|
|
47
|
+
#define OP_RES_0x5 0x5 // Reserved
|
|
48
|
+
#define OP_RES_0x6 0x6 // Reserved
|
|
49
|
+
#define OP_RES_0x7 0x7 // Reserved
|
|
50
|
+
#define OP_CLOSE 0x8 // Connection close
|
|
51
|
+
#define OP_PING 0x9 // Ping
|
|
52
|
+
#define OP_PONG 0xA // Pong
|
|
53
|
+
#define OP_RES_0xB 0xB // Reserved
|
|
54
|
+
#define OP_RES_0xC 0xC // Reserved
|
|
55
|
+
#define OP_RES_0xD 0xD // Reserved
|
|
56
|
+
#define OP_RES_0xE 0xE // Reserved
|
|
57
|
+
#define OP_RES_0xF 0xF // Reserved
|
|
58
|
+
#define FLAG_FINAL 0x80 // Last frame
|
|
59
|
+
#define FLAG_MASKED 0x80 // Payload is masked
|
|
60
|
+
|
|
61
|
+
#define CLOSURE_NORMAL 1000
|
|
62
|
+
#define CLOSURE_SHUTDOWN 1001
|
|
63
|
+
#define CLOSURE_PROTOCOL_ERROR 1002
|
|
64
|
+
#define CLOSURE_TOO_BIG 1009
|
|
65
|
+
|
|
66
|
+
namespace
|
|
67
|
+
{
|
|
68
|
+
|
|
69
|
+
const string _iceProtocol = "ice.zeroc.com";
|
|
70
|
+
const string _wsUUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
|
71
|
+
|
|
72
|
+
//
|
|
73
|
+
// Rename to avoid conflict with OS 10.10 htonll
|
|
74
|
+
//
|
|
75
|
+
void ice_htonll(Long v, Byte* dest)
|
|
76
|
+
{
|
|
77
|
+
//
|
|
78
|
+
// Transfer a 64-bit integer in network (big-endian) order.
|
|
79
|
+
//
|
|
80
|
+
#ifdef ICE_BIG_ENDIAN
|
|
81
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v);
|
|
82
|
+
*dest++ = *src++;
|
|
83
|
+
*dest++ = *src++;
|
|
84
|
+
*dest++ = *src++;
|
|
85
|
+
*dest++ = *src++;
|
|
86
|
+
*dest++ = *src++;
|
|
87
|
+
*dest++ = *src++;
|
|
88
|
+
*dest++ = *src++;
|
|
89
|
+
*dest = *src;
|
|
90
|
+
#else
|
|
91
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v) + sizeof(Long) - 1;
|
|
92
|
+
*dest++ = *src--;
|
|
93
|
+
*dest++ = *src--;
|
|
94
|
+
*dest++ = *src--;
|
|
95
|
+
*dest++ = *src--;
|
|
96
|
+
*dest++ = *src--;
|
|
97
|
+
*dest++ = *src--;
|
|
98
|
+
*dest++ = *src--;
|
|
99
|
+
*dest = *src;
|
|
100
|
+
#endif
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
//
|
|
104
|
+
// Rename to avoid conflict with OS 10.10 nlltoh
|
|
105
|
+
//
|
|
106
|
+
Long ice_nlltoh(const Byte* src)
|
|
107
|
+
{
|
|
108
|
+
Long v;
|
|
109
|
+
|
|
110
|
+
//
|
|
111
|
+
// Extract a 64-bit integer in network (big-endian) order.
|
|
112
|
+
//
|
|
113
|
+
#ifdef ICE_BIG_ENDIAN
|
|
114
|
+
Byte* dest = reinterpret_cast<Byte*>(&v);
|
|
115
|
+
*dest++ = *src++;
|
|
116
|
+
*dest++ = *src++;
|
|
117
|
+
*dest++ = *src++;
|
|
118
|
+
*dest++ = *src++;
|
|
119
|
+
*dest++ = *src++;
|
|
120
|
+
*dest++ = *src++;
|
|
121
|
+
*dest++ = *src++;
|
|
122
|
+
*dest = *src;
|
|
123
|
+
#else
|
|
124
|
+
Byte* dest = reinterpret_cast<Byte*>(&v) + sizeof(Long) - 1;
|
|
125
|
+
*dest-- = *src++;
|
|
126
|
+
*dest-- = *src++;
|
|
127
|
+
*dest-- = *src++;
|
|
128
|
+
*dest-- = *src++;
|
|
129
|
+
*dest-- = *src++;
|
|
130
|
+
*dest-- = *src++;
|
|
131
|
+
*dest-- = *src++;
|
|
132
|
+
*dest = *src;
|
|
133
|
+
#endif
|
|
134
|
+
|
|
135
|
+
return v;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
#if defined(ICE_OS_WINRT)
|
|
139
|
+
Short htons(Short v)
|
|
140
|
+
{
|
|
141
|
+
Short result;
|
|
142
|
+
Byte* dest = reinterpret_cast<Byte*>(&result);
|
|
143
|
+
|
|
144
|
+
//
|
|
145
|
+
// Transfer a short in network (big-endian) order.
|
|
146
|
+
//
|
|
147
|
+
#ifdef ICE_BIG_ENDIAN
|
|
148
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v);
|
|
149
|
+
*dest++ = *src++;
|
|
150
|
+
*dest = *src;
|
|
151
|
+
#else
|
|
152
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v) + sizeof(Short) - 1;
|
|
153
|
+
*dest++ = *src--;
|
|
154
|
+
*dest = *src;
|
|
155
|
+
#endif
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
Short ntohs(Short value)
|
|
160
|
+
{
|
|
161
|
+
const Byte* src = reinterpret_cast<Byte*>(&value);
|
|
162
|
+
Short v;
|
|
163
|
+
|
|
164
|
+
//
|
|
165
|
+
// Extract a 64-bit integer in network (big-endian) order.
|
|
166
|
+
//
|
|
167
|
+
#ifdef ICE_BIG_ENDIAN
|
|
168
|
+
Byte* dest = reinterpret_cast<Byte*>(&v);
|
|
169
|
+
*dest++ = *src++;
|
|
170
|
+
*dest = *src;
|
|
171
|
+
#else
|
|
172
|
+
Byte* dest = reinterpret_cast<Byte*>(&v) + sizeof(Short) - 1;
|
|
173
|
+
*dest-- = *src++;
|
|
174
|
+
*dest = *src;
|
|
175
|
+
#endif
|
|
176
|
+
|
|
177
|
+
return v;
|
|
178
|
+
}
|
|
179
|
+
#endif
|
|
180
|
+
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
NativeInfoPtr
|
|
184
|
+
IceInternal::WSTransceiver::getNativeInfo()
|
|
185
|
+
{
|
|
186
|
+
return _delegate->getNativeInfo();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
#if defined(ICE_USE_IOCP)
|
|
190
|
+
AsyncInfo*
|
|
191
|
+
IceInternal::WSTransceiver::getAsyncInfo(SocketOperation status)
|
|
192
|
+
{
|
|
193
|
+
return _delegate->getNativeInfo()->getAsyncInfo(status);
|
|
194
|
+
}
|
|
195
|
+
#elif defined(ICE_OS_WINRT)
|
|
196
|
+
void
|
|
197
|
+
IceInternal::WSTransceiver::setCompletedHandler(IceInternal::SocketOperationCompletedHandler^ handler)
|
|
198
|
+
{
|
|
199
|
+
_delegate->getNativeInfo()->setCompletedHandler(handler);
|
|
200
|
+
}
|
|
201
|
+
#endif
|
|
202
|
+
|
|
203
|
+
SocketOperation
|
|
204
|
+
IceInternal::WSTransceiver::initialize(Buffer& readBuffer, Buffer& writeBuffer, bool& hasMoreData)
|
|
205
|
+
{
|
|
206
|
+
//
|
|
207
|
+
// Delegate logs exceptions that occur during initialize(), so there's no need to trap them here.
|
|
208
|
+
//
|
|
209
|
+
if(_state == StateInitializeDelegate)
|
|
210
|
+
{
|
|
211
|
+
SocketOperation op = _delegate->initialize(readBuffer, writeBuffer, hasMoreData);
|
|
212
|
+
if(op != SocketOperationNone)
|
|
213
|
+
{
|
|
214
|
+
return op;
|
|
215
|
+
}
|
|
216
|
+
_state = StateConnected;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
try
|
|
220
|
+
{
|
|
221
|
+
if(_state == StateConnected)
|
|
222
|
+
{
|
|
223
|
+
//
|
|
224
|
+
// We don't know how much we'll need to read.
|
|
225
|
+
//
|
|
226
|
+
_readBuffer.b.resize(1024);
|
|
227
|
+
_readI = _readBuffer.i = _readBuffer.b.begin();
|
|
228
|
+
|
|
229
|
+
//
|
|
230
|
+
// The server waits for the client's upgrade request, the
|
|
231
|
+
// client sends the upgrade request.
|
|
232
|
+
//
|
|
233
|
+
_state = StateUpgradeRequestPending;
|
|
234
|
+
if(!_incoming)
|
|
235
|
+
{
|
|
236
|
+
//
|
|
237
|
+
// Compose the upgrade request.
|
|
238
|
+
//
|
|
239
|
+
ostringstream out;
|
|
240
|
+
out << "GET " << _resource << " HTTP/1.1\r\n"
|
|
241
|
+
<< "Host: " << _host << ":" << _port << "\r\n"
|
|
242
|
+
<< "Upgrade: websocket\r\n"
|
|
243
|
+
<< "Connection: Upgrade\r\n"
|
|
244
|
+
<< "Sec-WebSocket-Protocol: " << _iceProtocol << "\r\n"
|
|
245
|
+
<< "Sec-WebSocket-Version: 13\r\n"
|
|
246
|
+
<< "Sec-WebSocket-Key: ";
|
|
247
|
+
|
|
248
|
+
//
|
|
249
|
+
// The value for Sec-WebSocket-Key is a 16-byte random number,
|
|
250
|
+
// encoded with Base64.
|
|
251
|
+
//
|
|
252
|
+
vector<unsigned char> key(16);
|
|
253
|
+
IceUtilInternal::generateRandom(reinterpret_cast<char*>(&key[0]), key.size());
|
|
254
|
+
_key = IceInternal::Base64::encode(key);
|
|
255
|
+
out << _key << "\r\n\r\n"; // EOM
|
|
256
|
+
|
|
257
|
+
string str = out.str();
|
|
258
|
+
_writeBuffer.b.resize(str.size());
|
|
259
|
+
memcpy(&_writeBuffer.b[0], str.c_str(), str.size());
|
|
260
|
+
_writeBuffer.i = _writeBuffer.b.begin();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
//
|
|
265
|
+
// Try to write the client's upgrade request.
|
|
266
|
+
//
|
|
267
|
+
if(_state == StateUpgradeRequestPending && !_incoming)
|
|
268
|
+
{
|
|
269
|
+
if(_writeBuffer.i < _writeBuffer.b.end())
|
|
270
|
+
{
|
|
271
|
+
SocketOperation s = _delegate->write(_writeBuffer);
|
|
272
|
+
if(s)
|
|
273
|
+
{
|
|
274
|
+
return s;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
assert(_writeBuffer.i == _writeBuffer.b.end());
|
|
278
|
+
_state = StateUpgradeResponsePending;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
while(true)
|
|
282
|
+
{
|
|
283
|
+
if(_readBuffer.i < _readBuffer.b.end())
|
|
284
|
+
{
|
|
285
|
+
SocketOperation s = _delegate->read(_readBuffer, hasMoreData);
|
|
286
|
+
if(s == SocketOperationWrite || _readBuffer.i == _readBuffer.b.begin())
|
|
287
|
+
{
|
|
288
|
+
return s;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
//
|
|
293
|
+
// Try to read the client's upgrade request or the server's response.
|
|
294
|
+
//
|
|
295
|
+
if((_state == StateUpgradeRequestPending && _incoming) ||
|
|
296
|
+
(_state == StateUpgradeResponsePending && !_incoming))
|
|
297
|
+
{
|
|
298
|
+
//
|
|
299
|
+
// Check if we have enough data for a complete message.
|
|
300
|
+
//
|
|
301
|
+
const Ice::Byte* p = _parser->isCompleteMessage(&_readBuffer.b[0], _readBuffer.i);
|
|
302
|
+
if(!p)
|
|
303
|
+
{
|
|
304
|
+
if(_readBuffer.i < _readBuffer.b.end())
|
|
305
|
+
{
|
|
306
|
+
return SocketOperationRead;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
//
|
|
310
|
+
// Enlarge the buffer and try to read more.
|
|
311
|
+
//
|
|
312
|
+
const size_t oldSize = static_cast<size_t>(_readBuffer.i - _readBuffer.b.begin());
|
|
313
|
+
if(oldSize + 1024 > _instance->messageSizeMax())
|
|
314
|
+
{
|
|
315
|
+
throw MemoryLimitException(__FILE__, __LINE__);
|
|
316
|
+
}
|
|
317
|
+
_readBuffer.b.resize(oldSize + 1024);
|
|
318
|
+
_readBuffer.i = _readBuffer.b.begin() + oldSize;
|
|
319
|
+
continue; // Try again to read the response/request
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
//
|
|
323
|
+
// Set _readI at the end of the response/request message.
|
|
324
|
+
//
|
|
325
|
+
_readI = _readBuffer.b.begin() + (p - &_readBuffer.b[0]);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
//
|
|
329
|
+
// We're done, the client's upgrade request or server's response is read.
|
|
330
|
+
//
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
try
|
|
335
|
+
{
|
|
336
|
+
//
|
|
337
|
+
// Parse the client's upgrade request.
|
|
338
|
+
//
|
|
339
|
+
if(_state == StateUpgradeRequestPending && _incoming)
|
|
340
|
+
{
|
|
341
|
+
if(_parser->parse(&_readBuffer.b[0], _readI))
|
|
342
|
+
{
|
|
343
|
+
handleRequest(_writeBuffer);
|
|
344
|
+
_state = StateUpgradeResponsePending;
|
|
345
|
+
}
|
|
346
|
+
else
|
|
347
|
+
{
|
|
348
|
+
throw ProtocolException(__FILE__, __LINE__, "incomplete request message");
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
if(_state == StateUpgradeResponsePending)
|
|
353
|
+
{
|
|
354
|
+
if(_incoming)
|
|
355
|
+
{
|
|
356
|
+
if(_writeBuffer.i < _writeBuffer.b.end())
|
|
357
|
+
{
|
|
358
|
+
SocketOperation s = _delegate->write(_writeBuffer);
|
|
359
|
+
if(s)
|
|
360
|
+
{
|
|
361
|
+
return s;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
else
|
|
366
|
+
{
|
|
367
|
+
//
|
|
368
|
+
// Parse the server's response
|
|
369
|
+
//
|
|
370
|
+
if(_parser->parse(&_readBuffer.b[0], _readI))
|
|
371
|
+
{
|
|
372
|
+
handleResponse();
|
|
373
|
+
}
|
|
374
|
+
else
|
|
375
|
+
{
|
|
376
|
+
throw ProtocolException(__FILE__, __LINE__, "incomplete response message");
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
catch(const WebSocketException& ex)
|
|
382
|
+
{
|
|
383
|
+
throw ProtocolException(__FILE__, __LINE__, ex.reason);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
_state = StateOpened;
|
|
387
|
+
_nextState = StateOpened;
|
|
388
|
+
|
|
389
|
+
hasMoreData |= _readI < _readBuffer.i;
|
|
390
|
+
}
|
|
391
|
+
catch(const Ice::LocalException& ex)
|
|
392
|
+
{
|
|
393
|
+
if(_instance->traceLevel() >= 2)
|
|
394
|
+
{
|
|
395
|
+
Trace out(_instance->logger(), _instance->traceCategory());
|
|
396
|
+
out << protocol() << " connection HTTP upgrade request failed\n" << toString() << "\n" << ex;
|
|
397
|
+
}
|
|
398
|
+
throw;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
if(_instance->traceLevel() >= 1)
|
|
402
|
+
{
|
|
403
|
+
Trace out(_instance->logger(), _instance->traceCategory());
|
|
404
|
+
if(_incoming)
|
|
405
|
+
{
|
|
406
|
+
out << "accepted " << protocol() << " connection HTTP upgrade request\n" << toString();
|
|
407
|
+
}
|
|
408
|
+
else
|
|
409
|
+
{
|
|
410
|
+
out << protocol() << " connection HTTP upgrade request accepted\n" << toString();
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return SocketOperationNone;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
SocketOperation
|
|
418
|
+
IceInternal::WSTransceiver::closing(bool initiator, const Ice::LocalException& reason)
|
|
419
|
+
{
|
|
420
|
+
if(_instance->traceLevel() >= 1)
|
|
421
|
+
{
|
|
422
|
+
Trace out(_instance->logger(), _instance->traceCategory());
|
|
423
|
+
out << "gracefully closing " << protocol() << " connection\n" << toString();
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
State s = _nextState == StateOpened ? _state : _nextState;
|
|
427
|
+
|
|
428
|
+
if(s == StateClosingRequestPending && _closingInitiator)
|
|
429
|
+
{
|
|
430
|
+
//
|
|
431
|
+
// If we initiated a close connection but also received a
|
|
432
|
+
// close connection, we assume we didn't initiated the
|
|
433
|
+
// connection and we send the close frame now. This is to
|
|
434
|
+
// ensure that if both peers close the connection at the same
|
|
435
|
+
// time we don't hang having both peer waiting for the close
|
|
436
|
+
// frame of the other.
|
|
437
|
+
//
|
|
438
|
+
assert(!initiator);
|
|
439
|
+
_closingInitiator = false;
|
|
440
|
+
return SocketOperationWrite;
|
|
441
|
+
}
|
|
442
|
+
else if(s >= StateClosingRequestPending)
|
|
443
|
+
{
|
|
444
|
+
return SocketOperationNone;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
_closingInitiator = initiator;
|
|
448
|
+
if(dynamic_cast<const Ice::CloseConnectionException*>(&reason))
|
|
449
|
+
{
|
|
450
|
+
_closingReason = CLOSURE_NORMAL;
|
|
451
|
+
}
|
|
452
|
+
else if(dynamic_cast<const Ice::ObjectAdapterDeactivatedException*>(&reason) ||
|
|
453
|
+
dynamic_cast<const Ice::CommunicatorDestroyedException*>(&reason))
|
|
454
|
+
{
|
|
455
|
+
_closingReason = CLOSURE_SHUTDOWN;
|
|
456
|
+
}
|
|
457
|
+
else if(dynamic_cast<const Ice::ProtocolException*>(&reason))
|
|
458
|
+
{
|
|
459
|
+
_closingReason = CLOSURE_PROTOCOL_ERROR;
|
|
460
|
+
}
|
|
461
|
+
else if(dynamic_cast<const Ice::MemoryLimitException*>(&reason))
|
|
462
|
+
{
|
|
463
|
+
_closingReason = CLOSURE_TOO_BIG;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
if(_state == StateOpened)
|
|
467
|
+
{
|
|
468
|
+
_state = StateClosingRequestPending;
|
|
469
|
+
return initiator ? SocketOperationRead : SocketOperationWrite;
|
|
470
|
+
}
|
|
471
|
+
else
|
|
472
|
+
{
|
|
473
|
+
_nextState = StateClosingRequestPending;
|
|
474
|
+
return SocketOperationNone;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
void
|
|
479
|
+
IceInternal::WSTransceiver::close()
|
|
480
|
+
{
|
|
481
|
+
_delegate->close();
|
|
482
|
+
_state = StateClosed;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
SocketOperation
|
|
486
|
+
IceInternal::WSTransceiver::write(Buffer& buf)
|
|
487
|
+
{
|
|
488
|
+
if(_writePending)
|
|
489
|
+
{
|
|
490
|
+
return SocketOperationWrite;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
if(_state < StateOpened)
|
|
494
|
+
{
|
|
495
|
+
if(_state < StateConnected)
|
|
496
|
+
{
|
|
497
|
+
return _delegate->write(buf);
|
|
498
|
+
}
|
|
499
|
+
else
|
|
500
|
+
{
|
|
501
|
+
return _delegate->write(_writeBuffer);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
do
|
|
506
|
+
{
|
|
507
|
+
if(preWrite(buf))
|
|
508
|
+
{
|
|
509
|
+
if(_writeBuffer.i < _writeBuffer.b.end())
|
|
510
|
+
{
|
|
511
|
+
SocketOperation s = _delegate->write(_writeBuffer);
|
|
512
|
+
if(s)
|
|
513
|
+
{
|
|
514
|
+
return s;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
else if(_incoming && !buf.b.empty() && _writeState == WriteStatePayload)
|
|
518
|
+
{
|
|
519
|
+
SocketOperation s = _delegate->write(buf);
|
|
520
|
+
if(s)
|
|
521
|
+
{
|
|
522
|
+
return s;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
while(postWrite(buf));
|
|
528
|
+
|
|
529
|
+
if(_state == StateClosingResponsePending && !_closingInitiator)
|
|
530
|
+
{
|
|
531
|
+
return SocketOperationRead;
|
|
532
|
+
}
|
|
533
|
+
return SocketOperationNone;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
SocketOperation
|
|
537
|
+
IceInternal::WSTransceiver::read(Buffer& buf, bool& hasMoreData)
|
|
538
|
+
{
|
|
539
|
+
if(_readPending)
|
|
540
|
+
{
|
|
541
|
+
return SocketOperationRead;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
if(_state < StateOpened)
|
|
545
|
+
{
|
|
546
|
+
if(_state < StateConnected)
|
|
547
|
+
{
|
|
548
|
+
return _delegate->read(buf, hasMoreData);
|
|
549
|
+
}
|
|
550
|
+
else
|
|
551
|
+
{
|
|
552
|
+
if(_delegate->read(_readBuffer, hasMoreData) == SocketOperationWrite)
|
|
553
|
+
{
|
|
554
|
+
return SocketOperationWrite;
|
|
555
|
+
}
|
|
556
|
+
else
|
|
557
|
+
{
|
|
558
|
+
return SocketOperationNone;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
//
|
|
564
|
+
// If we read the full Ice message, handle it before trying
|
|
565
|
+
// reading anymore data from the WS connection.
|
|
566
|
+
//
|
|
567
|
+
if(buf.i == buf.b.end())
|
|
568
|
+
{
|
|
569
|
+
hasMoreData |= _readI < _readBuffer.i;
|
|
570
|
+
return SocketOperationNone;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
SocketOperation s = SocketOperationNone;
|
|
574
|
+
do
|
|
575
|
+
{
|
|
576
|
+
if(preRead(buf))
|
|
577
|
+
{
|
|
578
|
+
if(_readState == ReadStatePayload)
|
|
579
|
+
{
|
|
580
|
+
//
|
|
581
|
+
// If the payload length is smaller than what remains to be read, we read
|
|
582
|
+
// no more than the payload length. The remaining of the buffer will be
|
|
583
|
+
// sent over in another frame.
|
|
584
|
+
//
|
|
585
|
+
size_t readSz = _readPayloadLength - (buf.i - _readStart); // Already read
|
|
586
|
+
if(static_cast<size_t>(buf.b.end() - buf.i) > readSz)
|
|
587
|
+
{
|
|
588
|
+
size_t size = buf.b.size();
|
|
589
|
+
buf.b.resize(buf.i - buf.b.begin() + readSz);
|
|
590
|
+
s = _delegate->read(buf, hasMoreData);
|
|
591
|
+
buf.b.resize(size);
|
|
592
|
+
}
|
|
593
|
+
else
|
|
594
|
+
{
|
|
595
|
+
s = _delegate->read(buf, hasMoreData);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
else
|
|
599
|
+
{
|
|
600
|
+
s = _delegate->read(_readBuffer, hasMoreData);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
if(s == SocketOperationWrite)
|
|
604
|
+
{
|
|
605
|
+
postRead(buf);
|
|
606
|
+
return s;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
while(postRead(buf));
|
|
611
|
+
|
|
612
|
+
if(buf.i == buf.b.end())
|
|
613
|
+
{
|
|
614
|
+
hasMoreData |= _readI < _readBuffer.i;
|
|
615
|
+
s = SocketOperationNone;
|
|
616
|
+
}
|
|
617
|
+
else
|
|
618
|
+
{
|
|
619
|
+
hasMoreData = false;
|
|
620
|
+
s = SocketOperationRead;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
if(((_state == StateClosingRequestPending && !_closingInitiator) ||
|
|
624
|
+
(_state == StateClosingResponsePending && _closingInitiator) ||
|
|
625
|
+
_state == StatePingPending ||
|
|
626
|
+
_state == StatePongPending) &&
|
|
627
|
+
_writeState == WriteStateHeader)
|
|
628
|
+
{
|
|
629
|
+
// We have things to write, ask to be notified when writes are ready.
|
|
630
|
+
s = static_cast<SocketOperation>(s | SocketOperationWrite);
|
|
631
|
+
}
|
|
632
|
+
return s;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
#if defined(ICE_USE_IOCP) || defined(ICE_OS_WINRT)
|
|
636
|
+
bool
|
|
637
|
+
IceInternal::WSTransceiver::startWrite(Buffer& buf)
|
|
638
|
+
{
|
|
639
|
+
_writePending = true;
|
|
640
|
+
if(_state < StateOpened)
|
|
641
|
+
{
|
|
642
|
+
if(_state < StateConnected)
|
|
643
|
+
{
|
|
644
|
+
return _delegate->startWrite(buf);
|
|
645
|
+
}
|
|
646
|
+
else
|
|
647
|
+
{
|
|
648
|
+
return _delegate->startWrite(_writeBuffer);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
if(preWrite(buf))
|
|
653
|
+
{
|
|
654
|
+
if(_writeBuffer.i < _writeBuffer.b.end())
|
|
655
|
+
{
|
|
656
|
+
_delegate->startWrite(_writeBuffer);
|
|
657
|
+
return false;
|
|
658
|
+
}
|
|
659
|
+
else
|
|
660
|
+
{
|
|
661
|
+
assert(_incoming);
|
|
662
|
+
return _delegate->startWrite(buf);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
else
|
|
666
|
+
{
|
|
667
|
+
_delegate->getNativeInfo()->completed(IceInternal::SocketOperationWrite);
|
|
668
|
+
return false;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
void
|
|
673
|
+
IceInternal::WSTransceiver::finishWrite(Buffer& buf)
|
|
674
|
+
{
|
|
675
|
+
_writePending = false;
|
|
676
|
+
if(_state < StateOpened)
|
|
677
|
+
{
|
|
678
|
+
if(_state < StateConnected)
|
|
679
|
+
{
|
|
680
|
+
_delegate->finishWrite(buf);
|
|
681
|
+
}
|
|
682
|
+
else
|
|
683
|
+
{
|
|
684
|
+
_delegate->finishWrite(_writeBuffer);
|
|
685
|
+
}
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
if(_writeBuffer.i < _writeBuffer.b.end())
|
|
690
|
+
{
|
|
691
|
+
_delegate->finishWrite(_writeBuffer);
|
|
692
|
+
}
|
|
693
|
+
else if(!buf.b.empty() && buf.i != buf.b.end())
|
|
694
|
+
{
|
|
695
|
+
assert(_incoming);
|
|
696
|
+
_delegate->finishWrite(buf);
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
postWrite(buf);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
void
|
|
703
|
+
IceInternal::WSTransceiver::startRead(Buffer& buf)
|
|
704
|
+
{
|
|
705
|
+
_readPending = true;
|
|
706
|
+
if(_state < StateOpened)
|
|
707
|
+
{
|
|
708
|
+
if(_state < StateConnected)
|
|
709
|
+
{
|
|
710
|
+
_delegate->startRead(buf);
|
|
711
|
+
}
|
|
712
|
+
else
|
|
713
|
+
{
|
|
714
|
+
_delegate->startRead(_readBuffer);
|
|
715
|
+
}
|
|
716
|
+
return;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
if(preRead(buf))
|
|
720
|
+
{
|
|
721
|
+
if(_readState == ReadStatePayload)
|
|
722
|
+
{
|
|
723
|
+
//
|
|
724
|
+
// If the payload length is smaller than what remains to be read, we read
|
|
725
|
+
// no more than the payload length. The remaining of the buffer will be
|
|
726
|
+
// sent over in another frame.
|
|
727
|
+
//
|
|
728
|
+
size_t readSz = _readPayloadLength - (buf.i - _readStart);
|
|
729
|
+
if(static_cast<size_t>(buf.b.end() - buf.i) > readSz)
|
|
730
|
+
{
|
|
731
|
+
size_t size = buf.b.size();
|
|
732
|
+
buf.b.resize(buf.i - buf.b.begin() + readSz);
|
|
733
|
+
_delegate->startRead(buf);
|
|
734
|
+
buf.b.resize(size);
|
|
735
|
+
}
|
|
736
|
+
else
|
|
737
|
+
{
|
|
738
|
+
_delegate->startRead(buf);
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
else
|
|
742
|
+
{
|
|
743
|
+
_delegate->startRead(_readBuffer);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
else
|
|
747
|
+
{
|
|
748
|
+
_delegate->getNativeInfo()->completed(IceInternal::SocketOperationRead);
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
void
|
|
753
|
+
IceInternal::WSTransceiver::finishRead(Buffer& buf, bool& hasMoreData)
|
|
754
|
+
{
|
|
755
|
+
_readPending = false;
|
|
756
|
+
if(_state < StateOpened)
|
|
757
|
+
{
|
|
758
|
+
if(_state < StateConnected)
|
|
759
|
+
{
|
|
760
|
+
_delegate->finishRead(buf, hasMoreData);
|
|
761
|
+
}
|
|
762
|
+
else
|
|
763
|
+
{
|
|
764
|
+
_delegate->finishRead(_readBuffer, hasMoreData);
|
|
765
|
+
}
|
|
766
|
+
return;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
if(buf.b.empty() || buf.i == buf.b.end())
|
|
770
|
+
{
|
|
771
|
+
// Nothing to do.
|
|
772
|
+
}
|
|
773
|
+
else if(_readState == ReadStatePayload)
|
|
774
|
+
{
|
|
775
|
+
_delegate->finishRead(buf, hasMoreData);
|
|
776
|
+
}
|
|
777
|
+
else
|
|
778
|
+
{
|
|
779
|
+
_delegate->finishRead(_readBuffer, hasMoreData);
|
|
780
|
+
}
|
|
781
|
+
postRead(buf);
|
|
782
|
+
}
|
|
783
|
+
#endif
|
|
784
|
+
|
|
785
|
+
string
|
|
786
|
+
IceInternal::WSTransceiver::protocol() const
|
|
787
|
+
{
|
|
788
|
+
return _instance->protocol();
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
string
|
|
792
|
+
IceInternal::WSTransceiver::toString() const
|
|
793
|
+
{
|
|
794
|
+
return _delegate->toString();
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
string
|
|
798
|
+
IceInternal::WSTransceiver::toDetailedString() const
|
|
799
|
+
{
|
|
800
|
+
return _delegate->toDetailedString();
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
Ice::ConnectionInfoPtr
|
|
804
|
+
IceInternal::WSTransceiver::getInfo() const
|
|
805
|
+
{
|
|
806
|
+
IPConnectionInfoPtr di = IPConnectionInfoPtr::dynamicCast(_delegate->getInfo());
|
|
807
|
+
assert(di);
|
|
808
|
+
WSConnectionInfoPtr info = new WSConnectionInfo();
|
|
809
|
+
info->localAddress = di->localAddress;
|
|
810
|
+
info->localPort = di->localPort;
|
|
811
|
+
info->remoteAddress = di->remoteAddress;
|
|
812
|
+
info->remotePort = di->remotePort;
|
|
813
|
+
return info;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
void
|
|
817
|
+
IceInternal::WSTransceiver::checkSendSize(const Buffer& buf)
|
|
818
|
+
{
|
|
819
|
+
_delegate->checkSendSize(buf);
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
IceInternal::WSTransceiver::WSTransceiver(const ProtocolInstancePtr& instance, const TransceiverPtr& del,
|
|
823
|
+
const string& host, int port, const string& resource) :
|
|
824
|
+
_instance(instance),
|
|
825
|
+
_delegate(del),
|
|
826
|
+
_host(host),
|
|
827
|
+
_port(port),
|
|
828
|
+
_resource(resource),
|
|
829
|
+
_incoming(false),
|
|
830
|
+
_state(StateInitializeDelegate),
|
|
831
|
+
_parser(new HttpParser),
|
|
832
|
+
_readState(ReadStateOpcode),
|
|
833
|
+
_readBufferSize(1024),
|
|
834
|
+
_readLastFrame(true),
|
|
835
|
+
_readOpCode(0),
|
|
836
|
+
_readHeaderLength(0),
|
|
837
|
+
_readPayloadLength(0),
|
|
838
|
+
_writeState(WriteStateHeader),
|
|
839
|
+
_writeBufferSize(1024),
|
|
840
|
+
_readPending(false),
|
|
841
|
+
_writePending(false),
|
|
842
|
+
_closingInitiator(false),
|
|
843
|
+
_closingReason(CLOSURE_NORMAL)
|
|
844
|
+
{
|
|
845
|
+
//
|
|
846
|
+
// For client connections, the sent frame payload must be
|
|
847
|
+
// masked. So we copy and send the message buffer data in chuncks
|
|
848
|
+
// of data whose size is up to the write buffer size.
|
|
849
|
+
//
|
|
850
|
+
const_cast<size_t&>(_writeBufferSize) = max(IceInternal::getSendBufferSize(del->getNativeInfo()->fd()), 1024);
|
|
851
|
+
|
|
852
|
+
//
|
|
853
|
+
// Write and read buffer size must be large enough to hold the frame header!
|
|
854
|
+
//
|
|
855
|
+
assert(_writeBufferSize > 256);
|
|
856
|
+
assert(_readBufferSize > 256);
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
IceInternal::WSTransceiver::WSTransceiver(const ProtocolInstancePtr& instance, const TransceiverPtr& del) :
|
|
860
|
+
_instance(instance),
|
|
861
|
+
_delegate(del),
|
|
862
|
+
_port(-1),
|
|
863
|
+
_incoming(true),
|
|
864
|
+
_state(StateInitializeDelegate),
|
|
865
|
+
_parser(new HttpParser),
|
|
866
|
+
_readState(ReadStateOpcode),
|
|
867
|
+
_readBufferSize(1024),
|
|
868
|
+
_readLastFrame(true),
|
|
869
|
+
_readOpCode(0),
|
|
870
|
+
_readHeaderLength(0),
|
|
871
|
+
_readPayloadLength(0),
|
|
872
|
+
_writeState(WriteStateHeader),
|
|
873
|
+
_writeBufferSize(1024),
|
|
874
|
+
_readPending(false),
|
|
875
|
+
_writePending(false),
|
|
876
|
+
_closingInitiator(false),
|
|
877
|
+
_closingReason(CLOSURE_NORMAL)
|
|
878
|
+
{
|
|
879
|
+
//
|
|
880
|
+
// Write and read buffer size must be large enough to hold the frame header!
|
|
881
|
+
//
|
|
882
|
+
assert(_writeBufferSize > 256);
|
|
883
|
+
assert(_readBufferSize > 256);
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
IceInternal::WSTransceiver::~WSTransceiver()
|
|
887
|
+
{
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
void
|
|
891
|
+
IceInternal::WSTransceiver::handleRequest(Buffer& responseBuffer)
|
|
892
|
+
{
|
|
893
|
+
string val;
|
|
894
|
+
|
|
895
|
+
//
|
|
896
|
+
// HTTP/1.1
|
|
897
|
+
//
|
|
898
|
+
if(_parser->versionMajor() != 1 || _parser->versionMinor() != 1)
|
|
899
|
+
{
|
|
900
|
+
throw WebSocketException("unsupported HTTP version");
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
//
|
|
904
|
+
// "An |Upgrade| header field containing the value 'websocket',
|
|
905
|
+
// treated as an ASCII case-insensitive value."
|
|
906
|
+
//
|
|
907
|
+
if(!_parser->getHeader("Upgrade", val, true))
|
|
908
|
+
{
|
|
909
|
+
throw WebSocketException("missing value for Upgrade field");
|
|
910
|
+
}
|
|
911
|
+
else if(val != "websocket")
|
|
912
|
+
{
|
|
913
|
+
throw WebSocketException("invalid value `" + val + "' for Upgrade field");
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
//
|
|
917
|
+
// "A |Connection| header field that includes the token 'Upgrade',
|
|
918
|
+
// treated as an ASCII case-insensitive value.
|
|
919
|
+
//
|
|
920
|
+
if(!_parser->getHeader("Connection", val, true))
|
|
921
|
+
{
|
|
922
|
+
throw WebSocketException("missing value for Connection field");
|
|
923
|
+
}
|
|
924
|
+
else if(val.find("upgrade") == string::npos)
|
|
925
|
+
{
|
|
926
|
+
throw WebSocketException("invalid value `" + val + "' for Connection field");
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
//
|
|
930
|
+
// "A |Sec-WebSocket-Version| header field, with a value of 13."
|
|
931
|
+
//
|
|
932
|
+
if(!_parser->getHeader("Sec-WebSocket-Version", val, false))
|
|
933
|
+
{
|
|
934
|
+
throw WebSocketException("missing value for WebSocket version");
|
|
935
|
+
}
|
|
936
|
+
else if(val != "13")
|
|
937
|
+
{
|
|
938
|
+
throw WebSocketException("unsupported WebSocket version `" + val + "'");
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
//
|
|
942
|
+
// "Optionally, a |Sec-WebSocket-Protocol| header field, with a list
|
|
943
|
+
// of values indicating which protocols the client would like to
|
|
944
|
+
// speak, ordered by preference."
|
|
945
|
+
//
|
|
946
|
+
bool addProtocol = false;
|
|
947
|
+
if(_parser->getHeader("Sec-WebSocket-Protocol", val, true))
|
|
948
|
+
{
|
|
949
|
+
vector<string> protocols;
|
|
950
|
+
if(!IceUtilInternal::splitString(val, ",", protocols))
|
|
951
|
+
{
|
|
952
|
+
throw WebSocketException("invalid value `" + val + "' for WebSocket protocol");
|
|
953
|
+
}
|
|
954
|
+
for(vector<string>::iterator p = protocols.begin(); p != protocols.end(); ++p)
|
|
955
|
+
{
|
|
956
|
+
if(IceUtilInternal::trim(*p) != _iceProtocol)
|
|
957
|
+
{
|
|
958
|
+
throw WebSocketException("unknown value `" + *p + "' for WebSocket protocol");
|
|
959
|
+
}
|
|
960
|
+
addProtocol = true;
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
//
|
|
965
|
+
// "A |Sec-WebSocket-Key| header field with a base64-encoded
|
|
966
|
+
// value that, when decoded, is 16 bytes in length."
|
|
967
|
+
//
|
|
968
|
+
string key;
|
|
969
|
+
if(!_parser->getHeader("Sec-WebSocket-Key", key, false))
|
|
970
|
+
{
|
|
971
|
+
throw WebSocketException("missing value for WebSocket key");
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
vector<unsigned char> decodedKey = Base64::decode(key);
|
|
975
|
+
if(decodedKey.size() != 16)
|
|
976
|
+
{
|
|
977
|
+
throw WebSocketException("invalid value `" + key + "' for WebSocket key");
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
//
|
|
981
|
+
// Retain the target resource.
|
|
982
|
+
//
|
|
983
|
+
const_cast<string&>(_resource) = _parser->uri();
|
|
984
|
+
|
|
985
|
+
//
|
|
986
|
+
// Compose the response.
|
|
987
|
+
//
|
|
988
|
+
ostringstream out;
|
|
989
|
+
out << "HTTP/1.1 101 Switching Protocols\r\n"
|
|
990
|
+
<< "Upgrade: websocket\r\n"
|
|
991
|
+
<< "Connection: Upgrade\r\n";
|
|
992
|
+
if(addProtocol)
|
|
993
|
+
{
|
|
994
|
+
out << "Sec-WebSocket-Protocol: " << _iceProtocol << "\r\n";
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
//
|
|
998
|
+
// The response includes:
|
|
999
|
+
//
|
|
1000
|
+
// "A |Sec-WebSocket-Accept| header field. The value of this
|
|
1001
|
+
// header field is constructed by concatenating /key/, defined
|
|
1002
|
+
// above in step 4 in Section 4.2.2, with the string "258EAFA5-
|
|
1003
|
+
// E914-47DA-95CA-C5AB0DC85B11", taking the SHA-1 hash of this
|
|
1004
|
+
// concatenated value to obtain a 20-byte value and base64-
|
|
1005
|
+
// encoding (see Section 4 of [RFC4648]) this 20-byte hash.
|
|
1006
|
+
//
|
|
1007
|
+
out << "Sec-WebSocket-Accept: ";
|
|
1008
|
+
string input = key + _wsUUID;
|
|
1009
|
+
vector<unsigned char> hash;
|
|
1010
|
+
IceUtil::sha1(reinterpret_cast<const unsigned char*>(&input[0]), input.size(), hash);
|
|
1011
|
+
out << IceInternal::Base64::encode(hash) << "\r\n" << "\r\n"; // EOM
|
|
1012
|
+
|
|
1013
|
+
string str = out.str();
|
|
1014
|
+
responseBuffer.b.resize(str.size());
|
|
1015
|
+
memcpy(&responseBuffer.b[0], str.c_str(), str.size());
|
|
1016
|
+
responseBuffer.i = responseBuffer.b.begin();
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
void
|
|
1020
|
+
IceInternal::WSTransceiver::handleResponse()
|
|
1021
|
+
{
|
|
1022
|
+
string val;
|
|
1023
|
+
|
|
1024
|
+
//
|
|
1025
|
+
// HTTP/1.1
|
|
1026
|
+
//
|
|
1027
|
+
if(_parser->versionMajor() != 1 || _parser->versionMinor() != 1)
|
|
1028
|
+
{
|
|
1029
|
+
throw WebSocketException("unsupported HTTP version");
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
//
|
|
1033
|
+
// "If the status code received from the server is not 101, the
|
|
1034
|
+
// client handles the response per HTTP [RFC2616] procedures. In
|
|
1035
|
+
// particular, the client might perform authentication if it
|
|
1036
|
+
// receives a 401 status code; the server might redirect the client
|
|
1037
|
+
// using a 3xx status code (but clients are not required to follow
|
|
1038
|
+
// them), etc."
|
|
1039
|
+
//
|
|
1040
|
+
if(_parser->status() != 101)
|
|
1041
|
+
{
|
|
1042
|
+
ostringstream out;
|
|
1043
|
+
out << "unexpected status value " << _parser->status();
|
|
1044
|
+
if(!_parser->reason().empty())
|
|
1045
|
+
{
|
|
1046
|
+
out << ":" << endl << _parser->reason();
|
|
1047
|
+
}
|
|
1048
|
+
throw WebSocketException(out.str());
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
//
|
|
1052
|
+
// "If the response lacks an |Upgrade| header field or the |Upgrade|
|
|
1053
|
+
// header field contains a value that is not an ASCII case-
|
|
1054
|
+
// insensitive match for the value "websocket", the client MUST
|
|
1055
|
+
// _Fail the WebSocket Connection_."
|
|
1056
|
+
//
|
|
1057
|
+
if(!_parser->getHeader("Upgrade", val, true))
|
|
1058
|
+
{
|
|
1059
|
+
throw WebSocketException("missing value for Upgrade field");
|
|
1060
|
+
}
|
|
1061
|
+
else if(val != "websocket")
|
|
1062
|
+
{
|
|
1063
|
+
throw WebSocketException("invalid value `" + val + "' for Upgrade field");
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
//
|
|
1067
|
+
// "If the response lacks a |Connection| header field or the
|
|
1068
|
+
// |Connection| header field doesn't contain a token that is an
|
|
1069
|
+
// ASCII case-insensitive match for the value "Upgrade", the client
|
|
1070
|
+
// MUST _Fail the WebSocket Connection_."
|
|
1071
|
+
//
|
|
1072
|
+
if(!_parser->getHeader("Connection", val, true))
|
|
1073
|
+
{
|
|
1074
|
+
throw WebSocketException("missing value for Connection field");
|
|
1075
|
+
}
|
|
1076
|
+
else if(val.find("upgrade") == string::npos)
|
|
1077
|
+
{
|
|
1078
|
+
throw WebSocketException("invalid value `" + val + "' for Connection field");
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
//
|
|
1082
|
+
// "If the response includes a |Sec-WebSocket-Protocol| header field
|
|
1083
|
+
// and this header field indicates the use of a subprotocol that was
|
|
1084
|
+
// not present in the client's handshake (the server has indicated a
|
|
1085
|
+
// subprotocol not requested by the client), the client MUST _Fail
|
|
1086
|
+
// the WebSocket Connection_."
|
|
1087
|
+
//
|
|
1088
|
+
if(_parser->getHeader("Sec-WebSocket-Protocol", val, true) && val != _iceProtocol)
|
|
1089
|
+
{
|
|
1090
|
+
throw WebSocketException("invalid value `" + val + "' for WebSocket protocol");
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
//
|
|
1094
|
+
// "If the response lacks a |Sec-WebSocket-Accept| header field or
|
|
1095
|
+
// the |Sec-WebSocket-Accept| contains a value other than the
|
|
1096
|
+
// base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-
|
|
1097
|
+
// Key| (as a string, not base64-decoded) with the string "258EAFA5-
|
|
1098
|
+
// E914-47DA-95CA-C5AB0DC85B11" but ignoring any leading and
|
|
1099
|
+
// trailing whitespace, the client MUST _Fail the WebSocket
|
|
1100
|
+
// Connection_."
|
|
1101
|
+
//
|
|
1102
|
+
if(!_parser->getHeader("Sec-WebSocket-Accept", val, false))
|
|
1103
|
+
{
|
|
1104
|
+
throw WebSocketException("missing value for Sec-WebSocket-Accept");
|
|
1105
|
+
}
|
|
1106
|
+
string input = _key + _wsUUID;
|
|
1107
|
+
vector<unsigned char> hash;
|
|
1108
|
+
IceUtil::sha1(reinterpret_cast<const unsigned char*>(&input[0]), input.size(), hash);
|
|
1109
|
+
if(val != IceInternal::Base64::encode(hash))
|
|
1110
|
+
{
|
|
1111
|
+
throw WebSocketException("invalid value `" + val + "' for Sec-WebSocket-Accept");
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
bool
|
|
1116
|
+
IceInternal::WSTransceiver::preRead(Buffer& buf)
|
|
1117
|
+
{
|
|
1118
|
+
while(true)
|
|
1119
|
+
{
|
|
1120
|
+
if(_readState == ReadStateOpcode)
|
|
1121
|
+
{
|
|
1122
|
+
//
|
|
1123
|
+
// Is there enough data available to read the opcode?
|
|
1124
|
+
//
|
|
1125
|
+
if(!readBuffered(2))
|
|
1126
|
+
{
|
|
1127
|
+
return true;
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
//
|
|
1131
|
+
// Most-significant bit indicates whether this is the
|
|
1132
|
+
// last frame. Least-significant four bits hold the
|
|
1133
|
+
// opcode.
|
|
1134
|
+
//
|
|
1135
|
+
unsigned char ch = static_cast<unsigned char>(*_readI++);
|
|
1136
|
+
_readOpCode = ch & 0xf;
|
|
1137
|
+
|
|
1138
|
+
//
|
|
1139
|
+
// Remember if last frame if we're going to read a data or
|
|
1140
|
+
// continuation frame, this is only for protocol
|
|
1141
|
+
// correctness checking purpose.
|
|
1142
|
+
//
|
|
1143
|
+
if(_readOpCode == OP_DATA)
|
|
1144
|
+
{
|
|
1145
|
+
if(!_readLastFrame)
|
|
1146
|
+
{
|
|
1147
|
+
throw ProtocolException(__FILE__, __LINE__, "invalid data frame, no FIN on previous frame");
|
|
1148
|
+
}
|
|
1149
|
+
_readLastFrame = (ch & FLAG_FINAL) == FLAG_FINAL;
|
|
1150
|
+
}
|
|
1151
|
+
else if(_readOpCode == OP_CONT)
|
|
1152
|
+
{
|
|
1153
|
+
if(_readLastFrame)
|
|
1154
|
+
{
|
|
1155
|
+
throw ProtocolException(__FILE__, __LINE__, "invalid continuation frame, previous frame FIN set");
|
|
1156
|
+
}
|
|
1157
|
+
_readLastFrame = (ch & FLAG_FINAL) == FLAG_FINAL;
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
ch = static_cast<unsigned char>(*_readI++);
|
|
1161
|
+
|
|
1162
|
+
//
|
|
1163
|
+
// Check the MASK bit. Messages sent by a client must be masked;
|
|
1164
|
+
// messages sent by a server must not be masked.
|
|
1165
|
+
//
|
|
1166
|
+
const bool masked = (ch & FLAG_MASKED) == FLAG_MASKED;
|
|
1167
|
+
if(masked != _incoming)
|
|
1168
|
+
{
|
|
1169
|
+
throw ProtocolException(__FILE__, __LINE__, "invalid masking");
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
//
|
|
1173
|
+
// Extract the payload length, which can have the following values:
|
|
1174
|
+
//
|
|
1175
|
+
// 0-125: The payload length
|
|
1176
|
+
// 126: The subsequent two bytes contain the payload length
|
|
1177
|
+
// 127: The subsequent eight bytes contain the payload length
|
|
1178
|
+
//
|
|
1179
|
+
_readPayloadLength = (ch & 0x7f);
|
|
1180
|
+
if(_readPayloadLength < 126)
|
|
1181
|
+
{
|
|
1182
|
+
_readHeaderLength = 0;
|
|
1183
|
+
}
|
|
1184
|
+
else if(_readPayloadLength == 126)
|
|
1185
|
+
{
|
|
1186
|
+
_readHeaderLength = 2; // Need to read a 16-bit payload length.
|
|
1187
|
+
}
|
|
1188
|
+
else
|
|
1189
|
+
{
|
|
1190
|
+
_readHeaderLength = 8; // Need to read a 64-bit payload length.
|
|
1191
|
+
}
|
|
1192
|
+
if(masked)
|
|
1193
|
+
{
|
|
1194
|
+
_readHeaderLength += 4; // Need to read a 32-bit mask.
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
_readState = ReadStateHeader;
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
if(_readState == ReadStateHeader)
|
|
1201
|
+
{
|
|
1202
|
+
//
|
|
1203
|
+
// Is there enough data available to read the header?
|
|
1204
|
+
//
|
|
1205
|
+
if(_readHeaderLength > 0 && !readBuffered(_readHeaderLength))
|
|
1206
|
+
{
|
|
1207
|
+
return true;
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
if(_readPayloadLength == 126)
|
|
1211
|
+
{
|
|
1212
|
+
_readPayloadLength = static_cast<size_t>(ntohs(*reinterpret_cast<uint16_t*>(_readI)));
|
|
1213
|
+
_readI += 2;
|
|
1214
|
+
}
|
|
1215
|
+
else if(_readPayloadLength == 127)
|
|
1216
|
+
{
|
|
1217
|
+
assert(_readPayloadLength == 127);
|
|
1218
|
+
Long l = ice_nlltoh(_readI);
|
|
1219
|
+
_readI += 8;
|
|
1220
|
+
if(l < 0 || l > INT_MAX)
|
|
1221
|
+
{
|
|
1222
|
+
ostringstream ostr;
|
|
1223
|
+
ostr << "invalid WebSocket payload length: " << l;
|
|
1224
|
+
throw ProtocolException(__FILE__, __LINE__, ostr.str());
|
|
1225
|
+
}
|
|
1226
|
+
_readPayloadLength = static_cast<size_t>(l);
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
//
|
|
1230
|
+
// Read the mask if this is an incoming connection.
|
|
1231
|
+
//
|
|
1232
|
+
if(_incoming)
|
|
1233
|
+
{
|
|
1234
|
+
assert(_readBuffer.i - _readI >= 4); // We must have needed to read the mask.
|
|
1235
|
+
memcpy(_readMask, _readI, 4); // Copy the mask.
|
|
1236
|
+
_readI += 4;
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
switch(_readOpCode)
|
|
1240
|
+
{
|
|
1241
|
+
case OP_TEXT: // Text frame
|
|
1242
|
+
{
|
|
1243
|
+
throw ProtocolException(__FILE__, __LINE__, "text frames not supported");
|
|
1244
|
+
}
|
|
1245
|
+
case OP_DATA: // Data frame
|
|
1246
|
+
case OP_CONT: // Continuation frame
|
|
1247
|
+
{
|
|
1248
|
+
if(_instance->traceLevel() >= 2)
|
|
1249
|
+
{
|
|
1250
|
+
Trace out(_instance->logger(), _instance->traceCategory());
|
|
1251
|
+
out << "received " << protocol() << (_readOpCode == OP_DATA ? " data" : " continuation");
|
|
1252
|
+
out << " frame with payload length of " << _readPayloadLength;
|
|
1253
|
+
out << " bytes\n" << toString();
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
if(_readPayloadLength <= 0)
|
|
1257
|
+
{
|
|
1258
|
+
throw ProtocolException(__FILE__, __LINE__, "payload length is 0");
|
|
1259
|
+
}
|
|
1260
|
+
_readState = ReadStatePayload;
|
|
1261
|
+
assert(buf.i != buf.b.end());
|
|
1262
|
+
_readFrameStart = buf.i;
|
|
1263
|
+
break;
|
|
1264
|
+
}
|
|
1265
|
+
case OP_CLOSE: // Connection close
|
|
1266
|
+
{
|
|
1267
|
+
if(_instance->traceLevel() >= 2)
|
|
1268
|
+
{
|
|
1269
|
+
Trace out(_instance->logger(), _instance->traceCategory());
|
|
1270
|
+
out << "received " << protocol() << " connection close frame\n" << toString();
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
State s = _nextState == StateOpened ? _state : _nextState;
|
|
1274
|
+
if(s == StateClosingRequestPending)
|
|
1275
|
+
{
|
|
1276
|
+
//
|
|
1277
|
+
// If we receive a close frame while we were actually
|
|
1278
|
+
// waiting to send one, change the role and send a
|
|
1279
|
+
// close frame response.
|
|
1280
|
+
//
|
|
1281
|
+
if(!_closingInitiator)
|
|
1282
|
+
{
|
|
1283
|
+
_closingInitiator = true;
|
|
1284
|
+
}
|
|
1285
|
+
if(_state == StateClosingRequestPending)
|
|
1286
|
+
{
|
|
1287
|
+
_state = StateClosingResponsePending;
|
|
1288
|
+
}
|
|
1289
|
+
else
|
|
1290
|
+
{
|
|
1291
|
+
_nextState = StateClosingResponsePending;
|
|
1292
|
+
}
|
|
1293
|
+
return false; // No longer interested in reading
|
|
1294
|
+
}
|
|
1295
|
+
else
|
|
1296
|
+
{
|
|
1297
|
+
ConnectionLostException ex(__FILE__, __LINE__);
|
|
1298
|
+
ex.error = 0;
|
|
1299
|
+
throw ex;
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
case OP_PING:
|
|
1303
|
+
{
|
|
1304
|
+
if(_instance->traceLevel() >= 2)
|
|
1305
|
+
{
|
|
1306
|
+
Trace out(_instance->logger(), _instance->traceCategory());
|
|
1307
|
+
out << "received " << protocol() << " connection ping frame\n" << toString();
|
|
1308
|
+
}
|
|
1309
|
+
_readState = ReadStateControlFrame;
|
|
1310
|
+
break;
|
|
1311
|
+
}
|
|
1312
|
+
case OP_PONG: // Pong
|
|
1313
|
+
{
|
|
1314
|
+
if(_instance->traceLevel() >= 2)
|
|
1315
|
+
{
|
|
1316
|
+
Trace out(_instance->logger(), _instance->traceCategory());
|
|
1317
|
+
out << "received " << protocol() << " connection pong frame\n" << toString();
|
|
1318
|
+
}
|
|
1319
|
+
_readState = ReadStateControlFrame;
|
|
1320
|
+
break;
|
|
1321
|
+
}
|
|
1322
|
+
default:
|
|
1323
|
+
{
|
|
1324
|
+
ostringstream ostr;
|
|
1325
|
+
ostr << "unsupported opcode: " << _readOpCode;
|
|
1326
|
+
throw ProtocolException(__FILE__, __LINE__, ostr.str());
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
if(_readState == ReadStateControlFrame)
|
|
1332
|
+
{
|
|
1333
|
+
if(_readPayloadLength > 0 && !readBuffered(_readPayloadLength))
|
|
1334
|
+
{
|
|
1335
|
+
return true;
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
if(_readPayloadLength > 0 && _readOpCode == OP_PING)
|
|
1339
|
+
{
|
|
1340
|
+
_pingPayload.clear();
|
|
1341
|
+
_pingPayload.resize(_readPayloadLength);
|
|
1342
|
+
memcpy(&_pingPayload[0], _readI, _pingPayload.size());
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
_readI += _readPayloadLength;
|
|
1346
|
+
_readPayloadLength = 0;
|
|
1347
|
+
|
|
1348
|
+
if(_readOpCode == OP_PING)
|
|
1349
|
+
{
|
|
1350
|
+
if(_state == StateOpened)
|
|
1351
|
+
{
|
|
1352
|
+
_state = StatePongPending; // Send pong frame now
|
|
1353
|
+
}
|
|
1354
|
+
else if(_nextState < StatePongPending)
|
|
1355
|
+
{
|
|
1356
|
+
_nextState = StatePongPending; // Send pong frame next
|
|
1357
|
+
}
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
//
|
|
1361
|
+
// We've read the payload of the PING/PONG frame, we're ready
|
|
1362
|
+
// to read a new frame.
|
|
1363
|
+
//
|
|
1364
|
+
_readState = ReadStateOpcode;
|
|
1365
|
+
}
|
|
1366
|
+
|
|
1367
|
+
if(_readState == ReadStatePayload)
|
|
1368
|
+
{
|
|
1369
|
+
//
|
|
1370
|
+
// This must be assigned before the check for the buffer. If the buffer is empty
|
|
1371
|
+
// or already read, postRead will return false.
|
|
1372
|
+
//
|
|
1373
|
+
_readStart = buf.i;
|
|
1374
|
+
|
|
1375
|
+
if(buf.b.empty() || buf.i == buf.b.end())
|
|
1376
|
+
{
|
|
1377
|
+
return false;
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
if(_readI < _readBuffer.i)
|
|
1381
|
+
{
|
|
1382
|
+
size_t n = min(_readBuffer.i - _readI, buf.b.end() - buf.i);
|
|
1383
|
+
memcpy(buf.i, _readI, n);
|
|
1384
|
+
buf.i += n;
|
|
1385
|
+
_readI += n;
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
//
|
|
1389
|
+
// Continue reading if we didn't read the full message, otherwise give back
|
|
1390
|
+
// the control to the connection
|
|
1391
|
+
//
|
|
1392
|
+
return buf.i < buf.b.end();
|
|
1393
|
+
}
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
bool
|
|
1398
|
+
IceInternal::WSTransceiver::postRead(Buffer& buf)
|
|
1399
|
+
{
|
|
1400
|
+
if(_readState != ReadStatePayload)
|
|
1401
|
+
{
|
|
1402
|
+
return _readStart < _readBuffer.i; // Returns true if data was read.
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
if(_readStart == buf.i)
|
|
1406
|
+
{
|
|
1407
|
+
return false; // Nothing was read or nothing to read.
|
|
1408
|
+
}
|
|
1409
|
+
assert(_readStart < buf.i);
|
|
1410
|
+
|
|
1411
|
+
if(_incoming)
|
|
1412
|
+
{
|
|
1413
|
+
//
|
|
1414
|
+
// Unmask the data we just read.
|
|
1415
|
+
//
|
|
1416
|
+
IceInternal::Buffer::Container::iterator p = _readStart;
|
|
1417
|
+
for(size_t n = _readStart - _readFrameStart; p < buf.i; ++p, ++n)
|
|
1418
|
+
{
|
|
1419
|
+
*p ^= _readMask[n % 4];
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
_readPayloadLength -= buf.i - _readStart;
|
|
1424
|
+
_readStart = buf.i;
|
|
1425
|
+
if(_readPayloadLength == 0)
|
|
1426
|
+
{
|
|
1427
|
+
//
|
|
1428
|
+
// We've read the complete payload, we're ready to read a new frame.
|
|
1429
|
+
//
|
|
1430
|
+
_readState = ReadStateOpcode;
|
|
1431
|
+
}
|
|
1432
|
+
return buf.i != buf.b.end();
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1435
|
+
bool
|
|
1436
|
+
IceInternal::WSTransceiver::preWrite(Buffer& buf)
|
|
1437
|
+
{
|
|
1438
|
+
if(_writeState == WriteStateHeader)
|
|
1439
|
+
{
|
|
1440
|
+
if(_state == StateOpened)
|
|
1441
|
+
{
|
|
1442
|
+
if(buf.b.empty() || buf.i == buf.b.end())
|
|
1443
|
+
{
|
|
1444
|
+
return false;
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1447
|
+
assert(buf.i = buf.b.begin());
|
|
1448
|
+
prepareWriteHeader(OP_DATA, buf.b.size());
|
|
1449
|
+
|
|
1450
|
+
_writeState = WriteStatePayload;
|
|
1451
|
+
}
|
|
1452
|
+
else if(_state == StatePingPending)
|
|
1453
|
+
{
|
|
1454
|
+
prepareWriteHeader(OP_PING, 0); // Don't send any payload
|
|
1455
|
+
|
|
1456
|
+
_writeBuffer.b.resize(_writeBuffer.i - _writeBuffer.b.begin());
|
|
1457
|
+
_writeState = WriteStateControlFrame;
|
|
1458
|
+
_writeBuffer.i = _writeBuffer.b.begin();
|
|
1459
|
+
}
|
|
1460
|
+
else if(_state == StatePongPending)
|
|
1461
|
+
{
|
|
1462
|
+
prepareWriteHeader(OP_PONG, _pingPayload.size());
|
|
1463
|
+
if(_pingPayload.size() > static_cast<size_t>(_writeBuffer.b.end() - _writeBuffer.i))
|
|
1464
|
+
{
|
|
1465
|
+
size_t pos = _writeBuffer.i - _writeBuffer.b.begin();
|
|
1466
|
+
_writeBuffer.b.resize(pos + _pingPayload.size());
|
|
1467
|
+
_writeBuffer.i = _writeBuffer.b.begin() + pos;
|
|
1468
|
+
}
|
|
1469
|
+
memcpy(_writeBuffer.i, &_pingPayload[0], _pingPayload.size());
|
|
1470
|
+
_writeBuffer.i += _pingPayload.size();
|
|
1471
|
+
_pingPayload.clear();
|
|
1472
|
+
|
|
1473
|
+
_writeBuffer.b.resize(_writeBuffer.i - _writeBuffer.b.begin());
|
|
1474
|
+
_writeState = WriteStateControlFrame;
|
|
1475
|
+
_writeBuffer.i = _writeBuffer.b.begin();
|
|
1476
|
+
}
|
|
1477
|
+
else if((_state == StateClosingRequestPending && !_closingInitiator) ||
|
|
1478
|
+
(_state == StateClosingResponsePending && _closingInitiator))
|
|
1479
|
+
{
|
|
1480
|
+
prepareWriteHeader(OP_CLOSE, 2);
|
|
1481
|
+
|
|
1482
|
+
// Write closing reason
|
|
1483
|
+
*reinterpret_cast<uint16_t*>(_writeBuffer.i) = htons(static_cast<uint16_t>(_closingReason));
|
|
1484
|
+
if(!_incoming)
|
|
1485
|
+
{
|
|
1486
|
+
*_writeBuffer.i++ ^= _writeMask[0];
|
|
1487
|
+
*_writeBuffer.i++ ^= _writeMask[1];
|
|
1488
|
+
}
|
|
1489
|
+
else
|
|
1490
|
+
{
|
|
1491
|
+
_writeBuffer.i += 2;
|
|
1492
|
+
}
|
|
1493
|
+
|
|
1494
|
+
_writeState = WriteStateControlFrame;
|
|
1495
|
+
_writeBuffer.b.resize(_writeBuffer.i - _writeBuffer.b.begin());
|
|
1496
|
+
_writeBuffer.i = _writeBuffer.b.begin();
|
|
1497
|
+
}
|
|
1498
|
+
else
|
|
1499
|
+
{
|
|
1500
|
+
assert(_state != StateClosed);
|
|
1501
|
+
return false; // Nothing to write in this state
|
|
1502
|
+
}
|
|
1503
|
+
|
|
1504
|
+
_writePayloadLength = 0;
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
if(_writeState == WriteStatePayload)
|
|
1508
|
+
{
|
|
1509
|
+
//
|
|
1510
|
+
// For an outgoing connection, each message must be masked with a random
|
|
1511
|
+
// 32-bit value, so we copy the entire message into the internal buffer
|
|
1512
|
+
// for writing. For incoming connections, we just copy the start of the
|
|
1513
|
+
// message in the internal buffer after the hedaer. If the message is
|
|
1514
|
+
// larger, the reminder is sent directly from the message buffer to avoid
|
|
1515
|
+
// copying.
|
|
1516
|
+
//
|
|
1517
|
+
|
|
1518
|
+
if(!_incoming && (_writePayloadLength == 0 || _writeBuffer.i == _writeBuffer.b.end()))
|
|
1519
|
+
{
|
|
1520
|
+
if(_writeBuffer.i == _writeBuffer.b.end())
|
|
1521
|
+
{
|
|
1522
|
+
_writeBuffer.i = _writeBuffer.b.begin();
|
|
1523
|
+
}
|
|
1524
|
+
|
|
1525
|
+
size_t n = buf.i - buf.b.begin();
|
|
1526
|
+
for(; n < buf.b.size() && _writeBuffer.i < _writeBuffer.b.end(); ++_writeBuffer.i, ++n)
|
|
1527
|
+
{
|
|
1528
|
+
*_writeBuffer.i = buf.b[n] ^ _writeMask[n % 4];
|
|
1529
|
+
}
|
|
1530
|
+
_writePayloadLength = n;
|
|
1531
|
+
if(_writeBuffer.i < _writeBuffer.b.end())
|
|
1532
|
+
{
|
|
1533
|
+
_writeBuffer.b.resize(_writeBuffer.i - _writeBuffer.b.begin());
|
|
1534
|
+
}
|
|
1535
|
+
_writeBuffer.i = _writeBuffer.b.begin();
|
|
1536
|
+
}
|
|
1537
|
+
else if(_writePayloadLength == 0)
|
|
1538
|
+
{
|
|
1539
|
+
size_t n = min(_writeBuffer.b.end() - _writeBuffer.i, buf.b.end() - buf.i);
|
|
1540
|
+
memcpy(_writeBuffer.i, buf.i, n);
|
|
1541
|
+
_writeBuffer.i += n;
|
|
1542
|
+
buf.i += n;
|
|
1543
|
+
_writePayloadLength = n;
|
|
1544
|
+
if(_writeBuffer.i < _writeBuffer.b.end())
|
|
1545
|
+
{
|
|
1546
|
+
_writeBuffer.b.resize(_writeBuffer.i - _writeBuffer.b.begin());
|
|
1547
|
+
}
|
|
1548
|
+
_writeBuffer.i = _writeBuffer.b.begin();
|
|
1549
|
+
}
|
|
1550
|
+
return true;
|
|
1551
|
+
}
|
|
1552
|
+
else
|
|
1553
|
+
{
|
|
1554
|
+
return _writeBuffer.i < _writeBuffer.b.end();
|
|
1555
|
+
}
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
bool
|
|
1559
|
+
IceInternal::WSTransceiver::postWrite(Buffer& buf)
|
|
1560
|
+
{
|
|
1561
|
+
if(_state > StateOpened && _writeState == WriteStateControlFrame)
|
|
1562
|
+
{
|
|
1563
|
+
if(_writeBuffer.i == _writeBuffer.b.end())
|
|
1564
|
+
{
|
|
1565
|
+
if(_state == StatePingPending)
|
|
1566
|
+
{
|
|
1567
|
+
if(_instance->traceLevel() >= 2)
|
|
1568
|
+
{
|
|
1569
|
+
Trace out(_instance->logger(), _instance->traceCategory());
|
|
1570
|
+
out << "sent " << protocol() << " connection ping frame\n" << toString();
|
|
1571
|
+
}
|
|
1572
|
+
}
|
|
1573
|
+
else if(_state == StatePongPending)
|
|
1574
|
+
{
|
|
1575
|
+
if(_instance->traceLevel() >= 2)
|
|
1576
|
+
{
|
|
1577
|
+
Trace out(_instance->logger(), _instance->traceCategory());
|
|
1578
|
+
out << "sent " << protocol() << " connection pong frame\n" << toString();
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
else if((_state == StateClosingRequestPending && !_closingInitiator) ||
|
|
1582
|
+
(_state == StateClosingResponsePending && _closingInitiator))
|
|
1583
|
+
{
|
|
1584
|
+
if(_instance->traceLevel() >= 2)
|
|
1585
|
+
{
|
|
1586
|
+
Trace out(_instance->logger(), _instance->traceCategory());
|
|
1587
|
+
out << "sent " << protocol() << " connection close frame\n" << toString();
|
|
1588
|
+
}
|
|
1589
|
+
|
|
1590
|
+
if(_state == StateClosingRequestPending && !_closingInitiator)
|
|
1591
|
+
{
|
|
1592
|
+
_writeState = WriteStateHeader;
|
|
1593
|
+
_state = StateClosingResponsePending;
|
|
1594
|
+
return false;
|
|
1595
|
+
}
|
|
1596
|
+
else
|
|
1597
|
+
{
|
|
1598
|
+
ConnectionLostException ex(__FILE__, __LINE__);
|
|
1599
|
+
ex.error = 0;
|
|
1600
|
+
throw ex;
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
else if(_state == StateClosed)
|
|
1604
|
+
{
|
|
1605
|
+
return false;
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1608
|
+
_state = _nextState;
|
|
1609
|
+
_nextState = StateOpened;
|
|
1610
|
+
_writeState = WriteStateHeader;
|
|
1611
|
+
}
|
|
1612
|
+
else
|
|
1613
|
+
{
|
|
1614
|
+
return true;
|
|
1615
|
+
}
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1618
|
+
if((!_incoming || buf.i == buf.b.begin()) && _writePayloadLength > 0)
|
|
1619
|
+
{
|
|
1620
|
+
if(_writeBuffer.i == _writeBuffer.b.end())
|
|
1621
|
+
{
|
|
1622
|
+
buf.i = buf.b.begin() + _writePayloadLength;
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1625
|
+
|
|
1626
|
+
if(buf.b.empty() || buf.i == buf.b.end())
|
|
1627
|
+
{
|
|
1628
|
+
_writeState = WriteStateHeader;
|
|
1629
|
+
if(_state == StatePingPending ||
|
|
1630
|
+
_state == StatePongPending ||
|
|
1631
|
+
(_state == StateClosingRequestPending && !_closingInitiator) ||
|
|
1632
|
+
(_state == StateClosingResponsePending && _closingInitiator))
|
|
1633
|
+
{
|
|
1634
|
+
return true;
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
else if(_state == StateOpened)
|
|
1638
|
+
{
|
|
1639
|
+
return true;
|
|
1640
|
+
}
|
|
1641
|
+
return false;
|
|
1642
|
+
}
|
|
1643
|
+
|
|
1644
|
+
bool
|
|
1645
|
+
IceInternal::WSTransceiver::readBuffered(IceInternal::Buffer::Container::size_type sz)
|
|
1646
|
+
{
|
|
1647
|
+
if(_readI == _readBuffer.i)
|
|
1648
|
+
{
|
|
1649
|
+
_readBuffer.b.resize(_readBufferSize);
|
|
1650
|
+
_readI = _readBuffer.i = _readBuffer.b.begin();
|
|
1651
|
+
}
|
|
1652
|
+
else
|
|
1653
|
+
{
|
|
1654
|
+
IceInternal::Buffer::Container::size_type available = _readBuffer.i - _readI;
|
|
1655
|
+
if(available < sz)
|
|
1656
|
+
{
|
|
1657
|
+
if(_readI != &_readBuffer.b[0])
|
|
1658
|
+
{
|
|
1659
|
+
memmove(&_readBuffer.b[0], _readI, available);
|
|
1660
|
+
}
|
|
1661
|
+
_readBuffer.b.resize(max(_readBufferSize, sz));
|
|
1662
|
+
_readI = _readBuffer.b.begin();
|
|
1663
|
+
_readBuffer.i = _readI + available;
|
|
1664
|
+
}
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
_readStart = _readBuffer.i;
|
|
1668
|
+
if(_readI + sz > _readBuffer.i)
|
|
1669
|
+
{
|
|
1670
|
+
return false; // Not enough read.
|
|
1671
|
+
}
|
|
1672
|
+
assert(_readBuffer.i > _readI);
|
|
1673
|
+
return true;
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
void
|
|
1677
|
+
IceInternal::WSTransceiver::prepareWriteHeader(Byte opCode, IceInternal::Buffer::Container::size_type payloadLength)
|
|
1678
|
+
{
|
|
1679
|
+
//
|
|
1680
|
+
// We need to prepare the frame header.
|
|
1681
|
+
//
|
|
1682
|
+
_writeBuffer.b.resize(_writeBufferSize);
|
|
1683
|
+
_writeBuffer.i = _writeBuffer.b.begin();
|
|
1684
|
+
|
|
1685
|
+
//
|
|
1686
|
+
// Set the opcode - this is the one and only data frame.
|
|
1687
|
+
//
|
|
1688
|
+
*_writeBuffer.i++ = static_cast<Byte>(opCode | FLAG_FINAL);
|
|
1689
|
+
|
|
1690
|
+
//
|
|
1691
|
+
// Set the payload length.
|
|
1692
|
+
//
|
|
1693
|
+
if(payloadLength <= 125)
|
|
1694
|
+
{
|
|
1695
|
+
*_writeBuffer.i++ = static_cast<Byte>(payloadLength);
|
|
1696
|
+
}
|
|
1697
|
+
else if(payloadLength > 125 && payloadLength <= USHRT_MAX)
|
|
1698
|
+
{
|
|
1699
|
+
//
|
|
1700
|
+
// Use an extra 16 bits to encode the payload length.
|
|
1701
|
+
//
|
|
1702
|
+
*_writeBuffer.i++ = static_cast<Byte>(126);
|
|
1703
|
+
*reinterpret_cast<uint16_t*>(_writeBuffer.i) = htons(static_cast<uint16_t>(payloadLength));
|
|
1704
|
+
_writeBuffer.i += 2;
|
|
1705
|
+
}
|
|
1706
|
+
else if(payloadLength > USHRT_MAX)
|
|
1707
|
+
{
|
|
1708
|
+
//
|
|
1709
|
+
// Use an extra 64 bits to encode the payload length.
|
|
1710
|
+
//
|
|
1711
|
+
*_writeBuffer.i++ = static_cast<Byte>(127);
|
|
1712
|
+
ice_htonll(payloadLength, _writeBuffer.i);
|
|
1713
|
+
_writeBuffer.i += 8;
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
if(!_incoming)
|
|
1717
|
+
{
|
|
1718
|
+
//
|
|
1719
|
+
// Add a random 32-bit mask to every outgoing frame, copy the payload data,
|
|
1720
|
+
// and apply the mask.
|
|
1721
|
+
//
|
|
1722
|
+
_writeBuffer.b[1] |= FLAG_MASKED;
|
|
1723
|
+
IceUtilInternal::generateRandom(reinterpret_cast<char*>(_writeMask), sizeof(_writeMask));
|
|
1724
|
+
memcpy(_writeBuffer.i, _writeMask, sizeof(_writeMask));
|
|
1725
|
+
_writeBuffer.i += sizeof(_writeMask);
|
|
1726
|
+
}
|
|
1727
|
+
}
|
|
1728
|
+
|