Beispiel #1
0
        public void Test16()
        {
            // 1 single write with headers + body (size > 8kB)
            _listener = CreateAndStartListener("http://127.0.0.1:9000/test16/");
            MyNetworkStream ns = CreateNS(9000);
            StringBuilder   sb = new StringBuilder();

            sb.Append("POST /test16/ HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 8888\r\n\r\n");
            string eights = new string ('b', 8888);

            sb.Append(eights);
            string data = sb.ToString();

            Send(ns, data);
            HttpListenerContext c   = _listener.GetContext();
            HttpListenerRequest req = c.Request;

            using (StreamReader r = new StreamReader(req.InputStream)) {
                read_to_end = r.ReadToEnd();
            }
            Assert.AreEqual(read_to_end.Length, read_to_end.Length, "Wrong length");
            Assert.IsTrue(eights == read_to_end, "Wrong data");
            c.Response.Close();
            ns.Close();
        }
        public void Test14()
        {
            _listener = NetworkHelpers.CreateAndStartHttpListener("http://127.0.0.1:", out var port, "/test14/");
            MyNetworkStream ns = CreateNS(port);

            Send(ns, "POST /test14/ HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
            HttpListenerContext c = _listener.GetContext();

            test14_request = c.Request;
            test_evt       = new ManualResetEvent(false);
            Thread thread = new Thread(ReadToEnd);

            thread.Start();
            if (test_evt.WaitOne(3000, false) == false)
            {
#if MONO_FEATURE_THREAD_ABORT
                thread.Abort();
#else
                thread.Interrupt();
#endif
                test_evt.Close();
                Assert.IsTrue(false, "Timed out");
            }
            test_evt.Close();
            c.Response.Close();
            ns.Close();
            Assert.AreEqual("123", read_to_end, "Did not get the expected input.");
        }
Beispiel #3
0
        protected override void Open()
        {
            bool isUnix = Settings.ConnectionProtocol == MySqlConnectionProtocol.Unix ||
                          Settings.ConnectionProtocol == MySqlConnectionProtocol.UnixSocket;

            _stream = MyNetworkStream.CreateStream(Settings.Server, Settings.ConnectTimeout, Settings.Keepalive, Settings.Port, isUnix);
            if (_stream == null)
            {
                throw new MySqlException(ResourcesX.UnableToConnect);
            }
            _reader  = new XPacketReaderWriter(_stream);
            _writer  = new XPacketReaderWriter(_stream);
            protocol = new XProtocol(_reader, _writer);

            Settings.CharacterSet = String.IsNullOrWhiteSpace(Settings.CharacterSet) ? "utf8mb4" : Settings.CharacterSet;

            var encoding = Encoding.GetEncoding(String.Compare(Settings.CharacterSet, "utf8mb4", true) == 0 ? "UTF-8" : Settings.CharacterSet);

            SetState(SessionState.Connecting, false);

            GetAndSetCapabilities();

            // Validates use of TLS.
            if (Settings.SslMode != MySqlSslMode.None)
            {
                if (serverSupportsTls)
                {
                    new Ssl(
                        Settings.Server,
                        Settings.SslMode,
                        Settings.CertificateFile,
                        Settings.CertificateStoreLocation,
                        Settings.CertificatePassword,
                        Settings.CertificateThumbprint,
                        Settings.SslCa,
                        Settings.SslCert,
                        Settings.SslKey)
                    .StartSSL(ref _stream, encoding, Settings.ToString());
                    _reader = new XPacketReaderWriter(_stream);
                    _writer = new XPacketReaderWriter(_stream);
                    protocol.SetXPackets(_reader, _writer);
                }
                else
                {
                    // Client requires SSL connections.
                    string message = String.Format(Resources.NoServerSSLSupport,
                                                   Settings.Server);
                    throw new MySqlException(message);
                }
            }

            Authenticate();

            SetState(SessionState.Open, false);
        }
Beispiel #4
0
		public void Test13 ()
		{
			// 0.9
			_listener = CreateAndStartListener ("http://127.0.0.1:9000/test13/");
			MyNetworkStream ns = CreateNS (9000);
			Send (ns, "GEt /test13/ HTTP/0.9\r\nHost: 127.0.0.1\r\n\r\n");
			ns.GetSocket ().Shutdown (SocketShutdown.Send);
			string input = Receive (ns, 512);
			ns.Close ();
			Assert.IsTrue (input.StartsWith ("HTTP/1.1 400"));
		}
		public void Test12 ()
		{
			// 0.9
			_listener = NetworkHelpers.CreateAndStartHttpListener ("http://127.0.0.1:", out var port, "/test12/");
			MyNetworkStream ns = CreateNS (port);
			Send (ns, "POST /test12/ HTTP/0.9\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
			ns.GetSocket ().Shutdown (SocketShutdown.Send);
			string input = Receive (ns, 512);
			ns.Close ();
			Assert.IsTrue(input.StartsWith ("HTTP/1.1 400"));
		}
Beispiel #6
0
 public void Test12()
 {
     // 0.9
     using (HttpListener listener = CreateAndStartListener("http://127.0.0.1:9000/test12/")) {
         MyNetworkStream ns = CreateNS(9000);
         Send(ns, "POST /test12/ HTTP/0.9\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
         ns.GetSocket().Shutdown(SocketShutdown.Send);
         string input = Receive(ns, 512);
         ns.Close();
         Assert.IsTrue(input.StartsWith("HTTP/1.1 400"));
     }
 }
Beispiel #7
0
		public void Test10 ()
		{
			// Same as Test9, but now we shutdown the socket for sending.
			_listener = CreateAndStartListener ("http://127.0.0.1:9000/test10/");
			MyNetworkStream ns = CreateNS (9000);
			Send (ns, "POST /test10/ HTTP/1.0\r\nHost: 127.0.0.1\r\nTransfer-Encoding: chunked\r\n\r\n3\r\n123\r\n0\r\n\r\n");
			ns.GetSocket ().Shutdown (SocketShutdown.Send);
			bool timeout;
			string response = ReceiveWithTimeout (ns, 512, 1000, out timeout);
			ns.Close ();
			Assert.IsFalse (timeout);
			Assert.IsTrue (response.StartsWith ("HTTP/1.1 411"));
		}
Beispiel #8
0
        public void Test11()
        {
            var port = NetworkHelpers.FindFreePort();

            // 0.9
            _listener = CreateAndStartListener("http://127.0.0.1:" + port + "/test11/");
            MyNetworkStream ns = CreateNS(port);

            Send(ns, "POST /test11/ HTTP/0.9\r\nHost: 127.0.0.1\r\n\r\n123");
            ns.GetSocket().Shutdown(SocketShutdown.Send);
            string input = Receive(ns, 512);

            ns.Close();
            Assert.IsTrue(input.StartsWith("HTTP/1.1 400"));
        }
        private Stream CreateSocketStream(IPAddress ip, bool unix)
        {
            EndPoint endPoint;

            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && unix)
            {
                endPoint = new Mono.Unix.UnixEndPoint(hostList);
            }
            else
            {
                endPoint = new IPEndPoint(ip, (int)port);
            }

            Socket socket = unix ?
                            new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP) :
                            new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            if (keepalive > 0)
            {
                SetKeepAlive(socket, keepalive);
            }
            IAsyncResult ias = socket.BeginConnect(endPoint, null, null);

            if (!ias.AsyncWaitHandle.WaitOne((int)timeOut * 1000))
            {
                socket.Dispose();
                return(null);
            }
            try
            {
                socket.EndConnect(ias);
            }
            catch (Exception)
            {
                socket.Dispose();
                throw;
            }
            MyNetworkStream stream = new MyNetworkStream(socket, true);

            GC.SuppressFinalize(socket);
            GC.SuppressFinalize(stream);
            return(stream);
        }
Beispiel #10
0
		public void Test15 ()
		{
			// 2 separate writes -> 2 packets. Body size > 8kB
			_listener = CreateAndStartListener ("http://127.0.0.1:9000/test15/");
			MyNetworkStream ns = CreateNS (9000);
			Send (ns, "POST /test15/ HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 8888\r\n\r\n");
			Thread.Sleep (800);
			string data = new string ('a', 8888);
			Send (ns, data);
			HttpListenerContext c = _listener.GetContext ();
			HttpListenerRequest req = c.Request;
			using (StreamReader r = new StreamReader (req.InputStream)) {
				read_to_end = r.ReadToEnd ();
			}
			Assert.AreEqual (read_to_end.Length, data.Length, "Wrong length");
			Assert.IsTrue (data == read_to_end, "Wrong data");
			c.Response.Close ();
			ns.Close ();
		}
Beispiel #11
0
		public void Test14 ()
		{
			_listener = CreateAndStartListener ("http://127.0.0.1:9000/test14/");
			MyNetworkStream ns = CreateNS (9000);
			Send (ns, "POST /test14/ HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
			HttpListenerContext c = _listener.GetContext ();
			test14_request = c.Request;
			test_evt = new ManualResetEvent (false);
			Thread thread = new Thread (ReadToEnd);
			thread.Start ();
			if (test_evt.WaitOne (3000, false) == false) {
				thread.Abort ();
				test_evt.Close ();
				Assert.IsTrue (false, "Timed out");
			}
			test_evt.Close ();
			c.Response.Close ();
			ns.Close ();
			Assert.AreEqual ("123", read_to_end, "Did not get the expected input.");
		}
		private Stream CreateSocketStream(IPAddress ip, bool unix)
		{
			EndPoint endPoint;
			if (!Platform.IsWindows() && unix)
				endPoint = CreateUnixEndPoint(hostList);
			else
				endPoint = new IPEndPoint(ip, (int)port);

			Socket socket = unix ?
				new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP) :
				new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
			if (keepalive > 0)
			{
				SetKeepAlive(socket, keepalive);
			}
			IAsyncResult ias = socket.BeginConnect(endPoint, null, null);
			if (!ias.AsyncWaitHandle.WaitOne((int)timeOut * 1000, false))
			{
				socket.Close();
				return null;
			}
			try
			{
				socket.EndConnect(ias);
			}
			catch (Exception)
			{
				socket.Close();
				throw;
			}
			MyNetworkStream stream = new MyNetworkStream(socket, true);
			GC.SuppressFinalize(socket);
			GC.SuppressFinalize(stream);
			return stream;
		}
Beispiel #13
0
        protected override void Open()
        {
            if (Settings.ConnectionProtocol == MySqlConnectionProtocol.Tcp && Settings.IsSshEnabled())
            {
                _sshHandler = new Ssh(
                    Settings.SshHostName,
                    Settings.SshUserName,
                    Settings.SshPassword,
                    Settings.SshKeyFile,
                    Settings.SshPassphrase,
                    Settings.SshPort,
                    Settings.Server,
                    Settings.Port,
                    true);
                _sshHandler.StartClient();
            }

            bool isUnix = Settings.ConnectionProtocol == MySqlConnectionProtocol.Unix ||
                          Settings.ConnectionProtocol == MySqlConnectionProtocol.UnixSocket;

            _stream = MyNetworkStream.CreateStream(
                Settings.Server == "127.0.0.1" || Settings.Server == "::1"
            ? "localhost"
            : Settings.Server,
                Settings.ConnectTimeout,
                Settings.Keepalive,
                Settings.Port,
                isUnix);
            if (_stream == null)
            {
                throw new MySqlException(ResourcesX.UnableToConnect);
            }

            _reader  = new XPacketReaderWriter(_stream);
            _writer  = new XPacketReaderWriter(_stream);
            protocol = new XProtocol(_reader, _writer);

            Settings.CharacterSet = string.IsNullOrWhiteSpace(Settings.CharacterSet) ? "utf8mb4" : Settings.CharacterSet;

            var encoding = Encoding.GetEncoding(string.Compare(Settings.CharacterSet, "utf8mb4", true) == 0 ? "UTF-8" : Settings.CharacterSet);

            SetState(SessionState.Connecting, false);

            try
            {
                GetAndSetCapabilities();
            }
            catch (Exception)
            {
                if (Settings.ConnectionProtocol == MySqlConnectionProtocol.Tcp && Settings.IsSshEnabled())
                {
                    _sshHandler?.StopClient();
                }

                throw;
            }

            // Validates use of TLS.
            if (Settings.SslMode != MySqlSslMode.None)
            {
                if (serverSupportsTls)
                {
                    new Ssl(
                        Settings.Server,
                        Settings.SslMode,
                        Settings.CertificateFile,
                        Settings.CertificateStoreLocation,
                        Settings.CertificatePassword,
                        Settings.CertificateThumbprint,
                        Settings.SslCa,
                        Settings.SslCert,
                        Settings.SslKey,
                        Settings.TlsVersion)
                    .StartSSL(ref _stream, encoding, Settings.ToString());

                    if (_readerCompressionController != null && _readerCompressionController.IsCompressionEnabled)
                    {
                        _reader = new XPacketReaderWriter(_stream, _readerCompressionController);
                        _writer = new XPacketReaderWriter(_stream, _writerCompressionController);
                    }
                    else
                    {
                        _reader = new XPacketReaderWriter(_stream);
                        _writer = new XPacketReaderWriter(_stream);
                    }

                    protocol.SetXPackets(_reader, _writer);
                }
                else
                {
                    // Client requires SSL connections.
                    string message = String.Format(Resources.NoServerSSLSupport,
                                                   Settings.Server);
                    throw new MySqlException(message);
                }
            }
            else if (_readerCompressionController != null && _readerCompressionController.IsCompressionEnabled)
            {
                _reader = new XPacketReaderWriter(_stream, _readerCompressionController);
                _writer = new XPacketReaderWriter(_stream, _writerCompressionController);
                protocol.SetXPackets(_reader, _writer);
            }

            Authenticate();

            SetState(SessionState.Open, false);
        }
Beispiel #14
0
        protected override void Open()
        {
            bool isUnix = Settings.ConnectionProtocol == MySqlConnectionProtocol.Unix ||
                          Settings.ConnectionProtocol == MySqlConnectionProtocol.UnixSocket;

            _stream = MyNetworkStream.CreateStream(Settings, isUnix);
            if (_stream == null)
            {
                throw new MySqlException(ResourcesX.UnableToConnect);
            }
            _reader  = new XPacketReaderWriter(_stream);
            _writer  = new XPacketReaderWriter(_stream);
            protocol = new XProtocol(_reader, _writer);

            Settings.CharacterSet = String.IsNullOrWhiteSpace(Settings.CharacterSet) ? "utf8mb4" : Settings.CharacterSet;

            var encoding = Encoding.GetEncoding(String.Compare(Settings.CharacterSet, "utf8mb4", true) == 0 ? "UTF-8" : Settings.CharacterSet);

            SetState(SessionState.Connecting, false);

            GetAndSetCapabilities();

            // validates TLS use
            if (Settings.SslMode != MySqlSslMode.None)
            {
                if (serverSupportsTls)
                {
                    new Ssl(Settings).StartSSL(ref _stream, encoding, Settings.ToString());
                    _reader = new XPacketReaderWriter(_stream);
                    _writer = new XPacketReaderWriter(_stream);
                    protocol.SetXPackets(_reader, _writer);
                }
                else
                {
                    // Client requires SSL connections.
                    string message = String.Format(Resources.NoServerSSLSupport,
                                                   Settings.Server);
                    throw new MySqlException(message);
                }
            }

            // Default authentication
            if (Settings.Auth == MySqlAuthenticationMode.Default)
            {
                if ((Settings.SslMode != MySqlSslMode.None && serverSupportsTls) || Settings.ConnectionProtocol == MySqlConnectionProtocol.Unix)
                {
                    Settings.Auth = MySqlAuthenticationMode.PLAIN;
                    AuthenticatePlain();
                }
                else
                {
                    Settings.Auth = MySqlAuthenticationMode.MYSQL41;
                    AuthenticateMySQL41();
                }
            }
            // User defined authentication
            else
            {
                switch (Settings.Auth)
                {
                case MySqlAuthenticationMode.PLAIN:
                    AuthenticatePlain();
                    break;

                case MySqlAuthenticationMode.MYSQL41:
                    AuthenticateMySQL41();
                    break;

                case MySqlAuthenticationMode.EXTERNAL:
                    AuthenticateExternal();
                    break;
                }
            }

            SetState(SessionState.Open, false);
        }