internal CassandraConnection(Session owner, IPAddress serverAddress, ProtocolOptions protocolOptions, SocketOptions socketOptions, ClientOptions clientOptions, IAuthInfoProvider authInfoProvider) { this._owner = owner; _bufferingMode = null; switch (protocolOptions.Compression) { case CompressionType.Snappy: _bufferingMode = new FrameBuffering(); break; case CompressionType.NoCompression: _bufferingMode = clientOptions.WithoutRowSetBuffering ? new NoBuffering() : new FrameBuffering(); break; default: throw new ArgumentException(); } this._authInfoProvider = authInfoProvider; if (protocolOptions.Compression == CompressionType.Snappy) { _startupOptions.Add("COMPRESSION", "snappy"); _compressor = new SnappyProtoBufCompressor(); } this._serverAddress = serverAddress; this._port = protocolOptions.Port; this._queryAbortTimeout = clientOptions.QueryAbortTimeout; this._asyncCallAbortTimeout = clientOptions.AsyncCallAbortTimeout; this._socketOptions = socketOptions; CreateConnection(); if (IsHealthy) { BeginReading(); } }
internal CassandraConnection(Session owner, IPAddress serverAddress, ProtocolOptions protocolOptions, SocketOptions socketOptions, ClientOptions clientOptions, IAuthProvider authProvider, IAuthInfoProvider authInfoProvider) { this.Guid = Guid.NewGuid(); this._owner = owner; _bufferingMode = null; switch (protocolOptions.Compression) { case CompressionType.Snappy: _bufferingMode = new FrameBuffering(); break; case CompressionType.NoCompression: _bufferingMode = clientOptions.WithoutRowSetBuffering ? new NoBuffering() : new FrameBuffering(); break; default: throw new ArgumentException(); } this._authProvider = authProvider; this._authInfoProvider = authInfoProvider; if (protocolOptions.Compression == CompressionType.Snappy) { _startupOptions.Add("COMPRESSION", "snappy"); _compressor = new SnappyProtoBufCompressor(); } this._serverAddress = serverAddress; this._port = protocolOptions.Port; this._queryAbortTimeout = clientOptions.QueryAbortTimeout; this._socketOptions = socketOptions; for (int i = 0; i <= sbyte.MaxValue; i++) { _freeStreamIDs.Push(i); } _protocolErrorHandlerAction = new Action <ErrorActionParam>((param) => { if (param.AbstractResponse is ErrorResponse) { JobFinished( param.Jar, (param.AbstractResponse as ErrorResponse).Output); } }); _frameEventCallback.Value = new Action <ResponseFrame>(EventOccured); _buffer = new byte[][] { new byte[_bufferingMode.PreferedBufferSize()], new byte[_bufferingMode.PreferedBufferSize()] }; var newSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); if (_socketOptions.KeepAlive != null) { newSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, _socketOptions.KeepAlive.Value); } newSock.SendTimeout = _socketOptions.ConnectTimeoutMillis; if (_socketOptions.SoLinger != null) { newSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, new LingerOption(true, _socketOptions.SoLinger.Value)); } if (_socketOptions.ReceiveBufferSize != null) { newSock.ReceiveBufferSize = _socketOptions.ReceiveBufferSize.Value; } if (_socketOptions.SendBufferSize != null) { newSock.ReceiveBufferSize = _socketOptions.SendBufferSize.Value; } if (_socketOptions.TcpNoDelay != null) { newSock.NoDelay = _socketOptions.TcpNoDelay.Value; } newSock.Connect(new IPEndPoint(_serverAddress, _port)); _socket = newSock; _bufferingMode.Reset(); if (protocolOptions.SslOptions == null) { _socketStream = new NetworkStream(_socket); } else { string targetHost; try { targetHost = Dns.GetHostEntry(_serverAddress).HostName; } catch (SocketException ex) { targetHost = serverAddress.ToString(); _logger.Error(string.Format("SSL connection: Can not resolve {0} address. Using IP address instead of hostname. This may cause RemoteCertificateNameMismatch error during Cassandra host authentication. Note that Cassandra node SSL certificate's CN(Common Name) must match the Cassandra node hostname.", _serverAddress.ToString()), ex); } _socketStream = new SslStream(new NetworkStream(_socket), false, new RemoteCertificateValidationCallback(protocolOptions.SslOptions.RemoteCertValidationCallback), null); (_socketStream as SslStream).AuthenticateAsClient(targetHost, new X509CertificateCollection(), protocolOptions.SslOptions.SslProtocol, false); } if (IsHealthy) { BeginReading(); } }