System.ServiceModel.Http2Protocol.Http2Protocol.CreateSocketByUri C# (CSharp) Method

CreateSocketByUri() private method

private CreateSocketByUri ( Uri uri ) : SecureSocket
uri Uri
return SecureSocket
        private SecureSocket CreateSocketByUri(Uri uri)
        {
            if (!String.Equals(uri.Scheme, "http", StringComparison.OrdinalIgnoreCase) &&
                !String.Equals(uri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
                throw new InvalidOperationException("Unrecognized scheme: " + uri.Scheme);

            SecurityOptions options;
            var extensions = new ExtensionType[] { ExtensionType.Renegotiation, ExtensionType.ALPN };
            if (!String.Equals(uri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
            {
                options = new SecurityOptions(SecureProtocol.None, null, ConnectionEnd.Client);
            }
            else
            {
                options = new SecurityOptions(SecureProtocol.Tls1, extensions, ConnectionEnd.Client);
            }

            options.Entity = ConnectionEnd.Client;
            options.CommonName = uri.Host;
            options.VerificationType = CredentialVerification.None;
            options.Certificate = Org.Mentalis.Security.Certificates.Certificate.CreateFromCerFile(@"certificate.pfx");
            options.Flags = SecurityFlags.Default;
            options.AllowedAlgorithms = SslAlgorithms.RSA_AES_128_SHA | SslAlgorithms.NULL_COMPRESSION;

            var s = new SecureSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp, options);
            s.OnClose += SocketOnClose;

            try
            {
                if (String.Equals(uri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
                {
                    s.OnHandshakeFinish += this.HandshakeFinishedHandler;
                }

                s.Connect(new Net.DnsEndPoint(uri.Host, uri.Port));

                if (String.Equals(uri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
                {

                    this.handshakeFinishedEventRaised.WaitOne(60000);

                    if (!s.IsNegotiationCompleted)
                    {
                        throw new Exception("Handshake failed");
                    }

                    if (!s.Connected)
                    {
                        throw new Exception("Connection was lost!");
                    }

                    s.OnHandshakeFinish -= this.HandshakeFinishedHandler;

                    this.ApplyProtocolSelectionResults(options.GetSelectedProtocol());
                }
            }
            catch (Exception ex)
            {
                s.Close();
                // Emitting protocol error. It will emit session OnError
                if (OnError != null)
                    this.OnError(this, new ProtocolErrorEventArgs(ex));

                throw;
            }

            return s;
        }