public static DuplexStream GetHandshakedDuplexStream(string address, bool allowHttp2Communication = true, bool useMock = false)
        {
            string selectedProtocol = null;

            var extensions = new[] { ExtensionType.Renegotiation, ExtensionType.ALPN };
            var useHandshake = ConfigurationManager.AppSettings["handshakeOptions"] != "no-handshake";

            var protocols = new List<string> { Protocols.Http1 };
            if (allowHttp2Communication)
            {
                protocols.Add(Protocols.Http2);
            }

            var options = UseSecurePort
                              ? new SecurityOptions(SecureProtocol.Tls1, extensions, protocols,
                                                    ConnectionEnd.Client)
                              : new SecurityOptions(SecureProtocol.None, extensions, protocols,
                                                    ConnectionEnd.Client);

            options.VerificationType = CredentialVerification.None;
            options.Certificate = Org.Mentalis.Security.Certificates.Certificate.CreateFromCerFile(@"certificate.pfx");
            options.Flags = SecurityFlags.Default;
            options.AllowedAlgorithms = SslAlgorithms.RSA_AES_256_SHA | SslAlgorithms.NULL_COMPRESSION;

            var sessionSocket = new SecureSocket(AddressFamily.InterNetwork, SocketType.Stream,
                                                ProtocolType.Tcp, options);

            using (var monitor = new ALPNExtensionMonitor())
            {
                monitor.OnProtocolSelected += (sender, args) => { selectedProtocol = args.SelectedProtocol; };

                var uri = new Uri(GetAddress() + address);

                sessionSocket.Connect(new DnsEndPoint(uri.Host, uri.Port), monitor);

                if (useHandshake)
                {
                    sessionSocket.MakeSecureHandshake(options);
                }
            }

            //SendSessionHeader(sessionSocket);

            return useMock ? new Mock<DuplexStream>(sessionSocket, true).Object : new DuplexStream(sessionSocket, true);
        }
 public ConfigurationAdapter(Cfg.Configuration configuration)
 {
     this.configuration = configuration;
 }