private void Connect() { if (UsageTimer == null) { //Save Timer Resource for licensed usage if (!LicenseUtils.HasLicensedFeature(LicenseFeature.Redis)) { UsageTimer = new Timer(delegate { __requestsPerHour = 0; }, null, TimeSpan.FromMilliseconds(0), TimeSpan.FromHours(1)); } } socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { SendTimeout = SendTimeout, ReceiveTimeout = ReceiveTimeout }; try { if (ConnectTimeout <= 0) { socket.Connect(Host, Port); } else { var connectResult = socket.BeginConnect(Host, Port, null, null); connectResult.AsyncWaitHandle.WaitOne(ConnectTimeout, true); } if (!socket.Connected) { socket.Close(); socket = null; DeactivatedAt = DateTime.UtcNow; return; } Stream networkStream = new NetworkStream(socket); if (Ssl) { if (Env.IsMono) { //Mono doesn't support EncryptionPolicy sslStream = new SslStream(networkStream, leaveInnerStreamOpen: false, userCertificateValidationCallback: RedisConfig.CertificateValidationCallback, userCertificateSelectionCallback: RedisConfig.CertificateSelectionCallback); } else { var ctor = typeof(SslStream).GetConstructors() .First(x => x.GetParameters().Length == 5); var policyType = AssemblyUtils.FindType("System.Net.Security.EncryptionPolicy"); var policyValue = Enum.Parse(policyType, "RequireEncryption"); sslStream = (SslStream)ctor.Invoke(new[] { networkStream, false, RedisConfig.CertificateValidationCallback, RedisConfig.CertificateSelectionCallback, policyValue, }); } sslStream.AuthenticateAsClient(Host); if (!sslStream.IsEncrypted) { throw new Exception("Could not establish an encrypted connection to " + Host); } networkStream = sslStream; } Bstream = new BufferedStream(networkStream, 16 * 1024); if (!string.IsNullOrEmpty(Password)) { SendExpectSuccess(Commands.Auth, Password.ToUtf8Bytes()); } if (db != 0) { SendExpectSuccess(Commands.Select, db.ToUtf8Bytes()); } if (Client != null) { SendExpectSuccess(Commands.Client, Commands.SetName, Client.ToUtf8Bytes()); } try { if (ServerVersionNumber == 0) { var parts = ServerVersion.Split('.'); var version = int.Parse(parts[0]) * 1000; if (parts.Length > 1) { version += int.Parse(parts[1]) * 100; } if (parts.Length > 2) { version += int.Parse(parts[2]); } ServerVersionNumber = version; } } catch (Exception) { //Twemproxy doesn't support the INFO command so automatically closes the socket //Fallback to ServerVersionNumber=Unknown then try re-connecting ServerVersionNumber = Unknown; Connect(); return; } var ipEndpoint = socket.LocalEndPoint as IPEndPoint; clientPort = ipEndpoint != null ? ipEndpoint.Port : -1; lastCommand = null; lastSocketException = null; LastConnectedAtTimestamp = Stopwatch.GetTimestamp(); OnConnected(); if (ConnectionFilter != null) { ConnectionFilter(this); } } catch (SocketException) { log.Error(ErrorConnect.Fmt(Host, Port)); throw; } }
public override void OnReceivedError(WebView view, IWebResourceRequest request, WebResourceError error) { try { base.OnReceivedError(view, request, error); string TextError = Application.Context.GetString(Resource.String.Lbl_Error_Code) + " "; switch (error.ErrorCode) { case ClientError.BadUrl: TextError = ErrorBadUrl.ToString(); break; case ClientError.Connect: TextError += ErrorConnect.ToString(); break; case ClientError.FailedSslHandshake: TextError += ErrorFailedSslHandshake.ToString(); break; case ClientError.File: TextError += ErrorFile.ToString(); break; case ClientError.FileNotFound: TextError += ErrorFileNotFound.ToString(); break; case ClientError.HostLookup: TextError += ErrorHostLookup.ToString(); break; case ClientError.ProxyAuthentication: TextError += ErrorProxyAuthentication.ToString(); break; case ClientError.Timeout: TextError += ErrorTimeout.ToString(); break; case ClientError.TooManyRequests: TextError += ErrorTooManyRequests.ToString(); break; case ClientError.Unknown: TextError += ErrorUnknown.ToString(); break; case ClientError.UnsafeResource: TextError += ErrorUnsafeResource.ToString(); break; case ClientError.UnsupportedScheme: TextError += ErrorUnsupportedAuthScheme.ToString(); break; case ClientError.Io: TextError += ErrorIo.ToString(); break; } OnPageEventReceivedError?.Invoke(view, request, error, TextError); } catch (Exception e) { Crashes.TrackError(e); } }