示例#1
0
文件: Http.cs 项目: markrendle/FluxUv
        private static WindowsBufferStruct AllocBuffer(IntPtr data, int size)
        {
            var ptr = Pointers.Alloc(size);
            var buf = Lib.uv_buf_init(ptr, (uint)size);

            return(buf);
        }
示例#2
0
        public void CanCreateBuffer()
        {
            const int size = 1024;
            var       ptr  = Pointers.Alloc(size);
            var       buf  = Lib.uv_buf_init(ptr, size);

            Assert.Equal(size, (int)buf.length);
        }
示例#3
0
        public void CanCreateTcpServer()
        {
            var loop   = Lib.uv_default_loop();
            var server = Pointers.Alloc(Lib.uv_handle_size(HandleType.UV_TCP));
            int error  = -1;

            Assert.DoesNotThrow(() =>
                                error = Lib.uv_tcp_init(loop, server));
            Assert.Equal(0, error);
            Pointers.Free(server);
        }
示例#4
0
        private void StartTimer()
        {
            _timer = Pointers.Alloc(Lib.uv_handle_size(HandleType.UV_TIMER));
            int error;

            if ((error = Lib.uv_timer_init(_loop, _timer)) != 0)
            {
                throw new FluxUvException("uv_timer_init fail " + error);
            }
            if ((error = Lib.uv_timer_start(_timer, _timerCallback, 100, 10)) != 0)
            {
                throw new FluxUvException("uv_timer_start fail " + error);
            }
            _requestDispatcher = new RequestDispatcher(_app, _responses, _cts.Token, 8);
            _requestDispatcher.Start();
        }
示例#5
0
        private void StartListen()
        {
            _server = Pointers.Alloc(Lib.uv_handle_size(HandleType.UV_TCP));
            int error;

            if ((error = Lib.uv_tcp_init(_loop, _server)) != 0)
            {
                throw new FluxUvException("uv_tcp_init fail " + error);
            }

            var sockaddr = Lib.uv_ip4_addr(_ipAddress.ToString(), _port);

            if ((error = Lib.uv_tcp_bind(_server, sockaddr)) != 0)
            {
                throw new FluxUvException("uv_tcp_bind fail " + error);
            }

            if ((error = Lib.uv_listen(_server, 128, _listenCallback)) != 0)
            {
                throw new FluxUvException("uv_listen fail " + error);
            }
        }
示例#6
0
        public unsafe void SimpleHttpResponse()
        {
            IntPtr server;
            IntPtr client   = IntPtr.Zero;
            string received = null;

            int listenStatus = 0;
            var cts          = new CancellationTokenSource();
            var loop         = Lib.uv_loop_new();

            server = Pointers.Alloc(Lib.uv_handle_size(HandleType.UV_TCP));
            Assert.Equal(0, Lib.uv_tcp_init(loop, server));
            var sockaddr = Lib.uv_ip4_addr(IPAddress.Loopback.ToString(), Port);

            Assert.Equal(0, Lib.uv_tcp_bind(server, sockaddr));
            Assert.Equal(0, Lib.uv_listen(server, 128, (srv, status) =>
            {
                if (status < 0)
                {
                    listenStatus = status;
                    return;
                }
                var http = new Http(loop, server, HttpCallback, null);
                http.Run();
            }));
            var runTask = Task.Run(() => Lib.uv_run(loop, uv_run_mode.UV_RUN_DEFAULT), cts.Token);

            SendHttpRequest();

            SpinWait.SpinUntil(() => _stopped, 1000);

            Lib.uv_stop(loop);
            cts.Cancel();

            Pointers.Free(server);

            Trace.WriteLine("Result: " + _result);
            Assert.Equal(Body, _result);
        }
示例#7
0
        public unsafe void SimpleHttpResponse()
        {
            IntPtr server;
            IntPtr client   = IntPtr.Zero;
            string received = null;
            bool   stopped  = false;

            int listenStatus = 0;
            var cts          = new CancellationTokenSource();
            var loop         = Lib.uv_loop_new();

            server = Pointers.Alloc(Lib.uv_handle_size(HandleType.UV_TCP));
            Assert.Equal(0, Lib.uv_tcp_init(loop, server));
            var sockaddr = Lib.uv_ip4_addr(IPAddress.Loopback.ToString(), Port);

            Assert.Equal(0, Lib.uv_tcp_bind(server, sockaddr));
            Assert.Equal(0, Lib.uv_listen(server, 128, (srv, status) =>
            {
                if (status < 0)
                {
                    listenStatus = status;
                    return;
                }

                client    = Pointers.Alloc(Lib.uv_handle_size(HandleType.UV_TCP));
                int error = Lib.uv_tcp_init(loop, client);

                error = Lib.uv_accept(server, client);
                if (error == 0)
                {
                    Lib.uv_read_start_win(client, AllocBuffer, (stream, size, buffer) =>
                    {
                        received = Marshal.PtrToStringAnsi(buffer.@base, size);
                        Pointers.Free(buffer.@base);
                        string response  = CreateResponse();
                        var responsePtr  = Marshal.StringToHGlobalAnsi(response);
                        var buf          = Lib.uv_buf_init(responsePtr, (uint)response.Length + 1);
                        var bufs         = new[] { buf };
                        var writeRequest = Pointers.Alloc(Lib.uv_req_size(RequestType.UV_WRITE));
                        Lib.uv_write_win(writeRequest, client, bufs, 1, (req, i) => {
                            Lib.uv_close(client, null);
                            Lib.uv_stop(loop);
                            stopped = true;
                        });
                    });
                }
                else
                {
                    Lib.uv_close(client, null);
                    Lib.uv_stop(loop);
                    stopped = true;
                }
            }));
            var runTask = Task.Run(() => Lib.uv_run(loop, uv_run_mode.UV_RUN_DEFAULT), cts.Token);

            SendHttpRequest();

            SpinWait.SpinUntil(() => stopped, 1000);

            if (!stopped)
            {
                Lib.uv_stop(loop);
            }
            cts.Cancel();

            Pointers.Free(client);
            Pointers.Free(server);

            Trace.WriteLine("Result: " + _result);
            Assert.Equal(Body, _result);
        }
示例#8
0
        public void TcpServerCanListen()
        {
            IntPtr server;
            IntPtr client   = IntPtr.Zero;
            string received = null;
            bool   stopped  = false;

            int listenStatus = 0;
            var cts          = new CancellationTokenSource();
            var loop         = Lib.uv_loop_new();

            server = Pointers.Alloc(Lib.uv_handle_size(HandleType.UV_TCP));
            Assert.Equal(0, Lib.uv_tcp_init(loop, server));
            var sockaddr = Lib.uv_ip4_addr(IPAddress.Loopback.ToString(), Port);

            Assert.Equal(0, Lib.uv_tcp_bind(server, sockaddr));
            Assert.Equal(0, Lib.uv_listen(server, 128, (srv, status) =>
            {
                if (status < 0)
                {
                    listenStatus = status;
                    return;
                }

                client    = Pointers.Alloc(Lib.uv_handle_size(HandleType.UV_TCP));
                int error = Lib.uv_tcp_init(loop, client);

                error = Lib.uv_accept(server, client);
                if (error == 0)
                {
                    Lib.uv_read_start_win(client, AllocBuffer, (stream, size, buffer) =>
                    {
                        received = Marshal.PtrToStringAnsi(buffer.@base, size);
                        Pointers.Free(buffer.@base);
                        Lib.uv_close(client, null);
                        Lib.uv_stop(loop);
                        stopped = true;
                    });
                }
                else
                {
                    Lib.uv_close(client, null);
                    Lib.uv_stop(loop);
                    stopped = true;
                }
            }));
            var runTask = Task.Run(() => Lib.uv_run(loop, uv_run_mode.UV_RUN_DEFAULT), cts.Token);

            SendString("Hello.");

            SpinWait.SpinUntil(() => stopped, 1000);

            if (!stopped)
            {
                Lib.uv_stop(loop);
            }
            cts.Cancel();

            Pointers.Free(client);
            Pointers.Free(server);

            Assert.Equal("Hello.", received);
        }