Beispiel #1
0
        void AcceptCallback(IAsyncResult ar)
        {
            HttpSocketState state = (HttpSocketState)ar.AsyncState;

            try
            {
                Socket client = state.Socket.EndAccept(ar);

                Thread.Sleep(1);

                _reset.Set();

                state.Socket = client;
            }
            catch (NullReferenceException)
            {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            }
            catch (SocketException e)
            {
                Logger.Error(e, $"Error accepting client. SocketErrorCode: {e.SocketErrorCode}");
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return;
            }

            WaitForData(ref state);
        }
        private void WaitForData(ref HttpSocketState state)
        {
            Thread.Sleep(10);

            try
            {
                state.Socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, OnDataReceived, state);
            }
            catch (NullReferenceException)
            {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            }
            catch (ObjectDisposedException)
            {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            }
            catch (SocketException e)
            {
                if (e.SocketErrorCode == SocketError.NotConnected)
                {
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;
                }

                if (e.SocketErrorCode != SocketError.ConnectionAborted &&
                    e.SocketErrorCode != SocketError.ConnectionReset)
                {
                    LogError(Category, "Error receiving data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                }
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return;
            }
        }
        void AcceptCallback(IAsyncResult ar)
        {
            HttpSocketState state = (HttpSocketState)ar.AsyncState;

            try
            {
                Socket client = state.Socket.EndAccept(ar);

                Thread.Sleep(1);

                _reset.Set();

                state.Socket = client;
            }
            catch (NullReferenceException)
            {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            }
            catch (SocketException e)
            {
                LogError(Category, "Error accepting client");
                LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return;
            }

            WaitForData(ref state);
        }
Beispiel #4
0
        private void OnDataReceived(IAsyncResult async)
        {
            HttpSocketState state = (HttpSocketState)async.AsyncState;

            if (state == null || state.Socket == null)
            {
                return;
            }

            try
            {
                int received = state.Socket.EndReceive(async);
                if (received == 0)
                {
                    return;
                }

                HttpRequest request;

                using (var ms = new MemoryStream(state.Buffer, 0, received))
                    request = HttpHelper.GetRequest(ms);

                Logger.Info("Data received: " + Encoding.UTF8.GetString(state.Buffer, 0, received).Replace('\n', ' ').Replace('\r', ' '));


                using (var ms = new MemoryStream(state.Buffer))
                {
                    if (request.Url.EndsWith("news.txt"))
                    {
                        HttpHelper.WriteResponse(ms, HttpResponceBuilder.File("Resources/Files/Russiandow_news.txt", Encoding.Unicode));
                        goto END;
                    }

                    if (request.Url.StartsWith("/motd/motd"))
                    {
                        HttpHelper.WriteResponse(ms, HttpResponceBuilder.File("Resources/Files/Russiandow_news.txt", Encoding.Unicode));
                        goto END;
                    }

                    if (request.Url.StartsWith("/motd/vercheck"))
                    {
                        //HttpHelper.WriteResponse(ms, HttpResponceBuilder.Text(@"\newver\1\newvername\1.4\dlurl\http://127.0.0.1/NewPatchHere.exe"));
                        HttpHelper.WriteResponse(ms, HttpResponceBuilder.Text(@"\newver\0"));
                        goto END;
                    }

                    if (request.Url.EndsWith("LobbyRooms.lua"))
                    {
                        HttpHelper.WriteResponse(ms, HttpResponceBuilder.File("Resources/Files/LobbyRooms.lua", Encoding.ASCII));
                        goto END;
                    }

                    if (request.Url.EndsWith("AutomatchDefaultsSS.lua") || request.Url.EndsWith("AutomatchDefaultsDXP2Fixed.lua"))
                    {
                        HttpHelper.WriteResponse(ms, HttpResponceBuilder.File("Resources/Files/AutomatchDefaults.lua", Encoding.ASCII));
                        goto END;
                    }

                    if (request.Url.EndsWith("homepage.php.htm"))
                    {
                        if (StatsResponce == null || (DateTime.Now - _lastStatsUpdate).TotalMinutes > 5)
                        {
                            StatsResponce = BuildTop10StatsResponce();
                        }

                        HttpHelper.WriteResponse(ms, StatsResponce);
                        goto END;
                    }

                    if (request.Url.StartsWith("/all"))
                    {
                        HttpHelper.WriteResponse(ms, BuildAllStatsResponce());
                        goto END;
                    }

                    HttpHelper.WriteResponse(ms, HttpResponceBuilder.NotFound());

END:                // Завершение отправки
                    var length  = (int)ms.Position;
                    ms.Position = 0;

                    state.Socket.Send(state.Buffer, 0, length, SocketFlags.None);
                    state.Dispose();
                }
            }
            catch (ObjectDisposedException)
            {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return;
            }
            catch (SocketException e)
            {
                switch (e.SocketErrorCode)
                {
                case SocketError.ConnectionReset:
                case SocketError.Disconnecting:
                case SocketError.NotConnected:
                case SocketError.TimedOut:
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;

                default:
                    Logger.Error(e, $"Error receiving data. SocketErrorCode: {e.SocketErrorCode}");
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;
                }
            }
            catch (Exception e)
            {
                Logger.Error(e, $"Error receiving data");
            }

            // and we wait for more data...
            CONTINUE : WaitForData(ref state);
        }