public CouchbaseLiteTcpListener(Manager manager, ushort port, CouchbaseLiteTcpOptions options, string realm, X509Certificate2 sslCert)
        {
            _manager  = manager;
            _listener = new HttpListener();
            _usesTLS  = options.HasFlag(CouchbaseLiteTcpOptions.UseTLS);
            string prefix = _usesTLS ? String.Format("https://*:{0}/", port) :
                            String.Format("http://*:{0}/", port);

            _listener.Prefixes.Add(prefix);
            _listener.AuthenticationSchemeSelector = SelectAuthScheme;
            HttpListener.DefaultServerString       = "Couchbase Lite " + Manager.VersionString;
            _listener.Realm  = realm;
            _allowsBasicAuth = options.HasFlag(CouchbaseLiteTcpOptions.AllowBasicAuth);

            _listener.UserCredentialsFinder = GetCredential;
            if (options.HasFlag(CouchbaseLiteTcpOptions.UseTLS))
            {
                _listener.SslConfiguration.EnabledSslProtocols       = SslProtocols.Tls12;
                _listener.SslConfiguration.ClientCertificateRequired = false;
                if (sslCert == null)
                {
                    Log.To.Listener.I(TAG, "Generating X509 certificate for listener...");
                    sslCert = X509Manager.GenerateTransientCertificate("Couchbase-P2P");
                }

                Log.To.Listener.I(TAG, "Using X509 certificate {0} (issued by {1})",
                                  sslCert.Subject, sslCert.Issuer);
                _listener.SslConfiguration.ServerCertificate = sslCert;
            }
        }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="manager">The manager to use for opening DBs, etc</param>
        /// <param name="port">The port to listen on</param>
        /// <param name="options">The options to use when configuring the listener</param>
        /// <param name="realm">The realm to use when sending challenges</param>
        /// <param name="sslCert">The certificate to use when serving the listener over https</param>
        public CouchbaseLiteTcpListener(Manager manager, ushort port, CouchbaseLiteTcpOptions options, string realm, X509Certificate2 sslCert)
        {
            _manager  = manager;
            _listener = new HttpListener();
            _usesTLS  = options.HasFlag(CouchbaseLiteTcpOptions.UseTLS);
            string prefix = _usesTLS ? String.Format("https://*:{0}/", port) :
                            String.Format("http://*:{0}/", port);

            _listener.Prefixes.Add(prefix);
            _listener.AuthenticationSchemeSelector = SelectAuthScheme;
            HttpListener.DefaultServerString       = "Couchbase Lite " + Manager.VersionString;
            _listener.Realm  = realm;
            _allowsBasicAuth = options.HasFlag(CouchbaseLiteTcpOptions.AllowBasicAuth);

            _listener.UserCredentialsFinder = GetCredential;
            if (options.HasFlag(CouchbaseLiteTcpOptions.UseTLS))
            {
                #if NET_3_5
                throw new InvalidOperationException("TLS Listener not supported on .NET 3.5");
                #else
                _listener.SslConfiguration.EnabledSslProtocols       = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12;
                _listener.SslConfiguration.ClientCertificateRequired = false;
                if (sslCert == null)
                {
                    Log.To.Listener.I(TAG, "Generating X509 certificate for listener...");
                    sslCert = X509Manager.GenerateTransientCertificate("Couchbase-P2P");
                }

                Log.To.Listener.I(TAG, "Using X509 certificate {0} (issued by {1})",
                                  sslCert.Subject, sslCert.Issuer);
                _listener.SslConfiguration.ServerCertificate = sslCert;
                #endif
            }

            _listener.Log.Level  = WebSocketSharp.LogLevel.Trace;
            _listener.Log.Output = (data, msg) =>
            {
                switch (data.Level)
                {
                case WebSocketSharp.LogLevel.Fatal:
                    Log.To.Listener.E("HttpServer", data.Message);
                    break;

                case WebSocketSharp.LogLevel.Error:
                case WebSocketSharp.LogLevel.Warn:
                    Log.To.Listener.W("HttpServer", data.Message);
                    break;

                case WebSocketSharp.LogLevel.Info:
                    Log.To.Listener.I("HttpServer", data.Message);
                    break;

                case WebSocketSharp.LogLevel.Trace:
                case WebSocketSharp.LogLevel.Debug:
                    Log.To.Listener.V("HttpServer", data.Message);
                    break;
                }
            };
        }
        public CouchbaseLiteTcpListener(Manager manager, ushort port, CouchbaseLiteTcpOptions options, string realm = "Couchbase")
        {
            _manager  = manager;
            _realm    = realm;
            _listener = new HttpListener();
            string prefix = String.Format("http://*:{0}/", port);

            _listener.Prefixes.Add(prefix);
            _allowBasicAuth = options.HasFlag(CouchbaseLiteTcpOptions.AllowBasicAuth);
        }
 public CouchbaseLiteTcpListener(Manager manager, ushort port, CouchbaseLiteTcpOptions options, string realm = "Couchbase")
 {
     _manager = manager;
     _realm = realm;
     _listener = new HttpListener();
     string prefix = options.HasFlag(CouchbaseLiteTcpOptions.UseTLS) ? String.Format("https://*:{0}/", port) :
         String.Format("http://*:{0}/", port);
     _listener.Prefixes.Add(prefix);
     _allowBasicAuth = options.HasFlag(CouchbaseLiteTcpOptions.AllowBasicAuth);
 }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="manager">The manager to use for opening DBs, etc</param>
        /// <param name="port">The port to listen on</param>
        /// <param name="options">The options to use when configuring the listener</param>
        /// <param name="realm">The realm to use when sending challenges</param>
        /// <param name="sslCert">The certificate to use when serving the listener over https</param>
        public CouchbaseLiteTcpListener(Manager manager, ushort port, CouchbaseLiteTcpOptions options, string realm, X509Certificate2 sslCert)
        {
            _manager = manager;
            _listener = new HttpListener();
            _usesTLS = options.HasFlag(CouchbaseLiteTcpOptions.UseTLS);
            string prefix = _usesTLS ? String.Format("https://*:{0}/", port) :
                String.Format("http://*:{0}/", port);
            _listener.Prefixes.Add(prefix);
            _listener.AuthenticationSchemeSelector = SelectAuthScheme;
            HttpListener.DefaultServerString = "Couchbase Lite " + Manager.VersionString;
            _listener.Realm = realm;
            _allowsBasicAuth = options.HasFlag(CouchbaseLiteTcpOptions.AllowBasicAuth);

            _listener.UserCredentialsFinder = GetCredential;
            if (options.HasFlag(CouchbaseLiteTcpOptions.UseTLS)) {
                #if NET_3_5
                throw new InvalidOperationException("TLS Listener not supported on .NET 3.5");
                #else
                _listener.SslConfiguration.EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12;
                _listener.SslConfiguration.ClientCertificateRequired = false;
                if (sslCert == null) {
                    Log.To.Listener.I(TAG, "Generating X509 certificate for listener...");
                    sslCert = X509Manager.GenerateTransientCertificate("Couchbase-P2P");
                }

                Log.To.Listener.I(TAG, "Using X509 certificate {0} (issued by {1})",
                    sslCert.Subject, sslCert.Issuer);
                _listener.SslConfiguration.ServerCertificate = sslCert;
                #endif
            }

            _listener.Log.Level = WebSocketSharp.LogLevel.Trace;
            _listener.Log.Output = (data, msg) =>
            {
                switch(data.Level) {
                    case WebSocketSharp.LogLevel.Fatal:
                        Log.To.Listener.E("HttpServer", data.Message);
                        break;
                    case WebSocketSharp.LogLevel.Error:
                    case WebSocketSharp.LogLevel.Warn:
                        Log.To.Listener.W("HttpServer", data.Message);
                        break;
                    case WebSocketSharp.LogLevel.Info:
                        Log.To.Listener.I("HttpServer", data.Message);
                        break;
                    case WebSocketSharp.LogLevel.Trace:
                    case WebSocketSharp.LogLevel.Debug:
                        Log.To.Listener.V("HttpServer", data.Message);
                        break;
                }
            };
        }