Ejemplo n.º 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);
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        private void StartServer(object parameter)
        {
            AddressInfo info = (AddressInfo)parameter;

            Log(Category, "Starting Http Reporting");

            try
            {
                _newPeerAceptingsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                {
                    SendTimeout       = 5000,
                    ReceiveTimeout    = 5000,
                    SendBufferSize    = 8192,
                    ReceiveBufferSize = 8192,
                    Blocking          = false
                };

                _newPeerAceptingsocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ExclusiveAddressUse, true);
                _newPeerAceptingsocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
                _newPeerAceptingsocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, false);
                _newPeerAceptingsocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

                _newPeerAceptingsocket.Bind(new IPEndPoint(info.Address, info.Port));
                _newPeerAceptingsocket.Listen(10);
            }
            catch (Exception e)
            {
                LogError(Category, String.Format("Unable to bind Http Server to {0}:{1}", info.Address, info.Port));
                LogError(Category, e.ToString());
                return;
            }

            while (true)
            {
                _reset.Reset();

                HttpSocketState state = new HttpSocketState()
                {
                    Socket = _newPeerAceptingsocket
                };

                _newPeerAceptingsocket.BeginAccept(AcceptCallback, state);
                _reset.WaitOne();
            }
        }
Ejemplo n.º 4
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)
            {
                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);
        }
Ejemplo n.º 5
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);
        }
Ejemplo n.º 6
0
        private void HandleApiRequest(HttpRequest request, MemoryStream ms, ref HttpSocketState state)
        {
            var fullPath = request.Url.Substring(5);

            var fullPathSplit = fullPath.Split('?');

            var path            = fullPathSplit[0];
            var parametersPairs = fullPathSplit.ElementAtOrDefault(1)?.Split('&');
            NameValueCollection parameters;

            if (parametersPairs != null)
            {
                parameters = new NameValueCollection(parametersPairs.Length);

                for (int i = 0; i < parametersPairs.Length; i++)
                {
                    var split = parametersPairs[i].Split('=');

                    if (split.Length == 2)
                    {
                        parameters[split[0]] = split[1];
                    }
                    else
                    {
                        parameters[split[0]] = string.Empty;
                    }
                }
            }


            if (request.Method == "GET")
            {
                if (path == "lastnews")
                {
                    var lastNews = Database.MainDBInstance.GetLastNews(3);

                    var lastNewsDTOs = lastNews.Select(x => new NewsItemDTO()
                    {
                        Id          = x.Id,
                        Author      = x.Author,
                        CreatedDate = x.CreatedDate,
                        EditedDate  = x.EditedDate,
                        ImageBase64 = x.ImageBase64,
                        ImagePath   = x.ImagePath,
                        NewsType    = x.NewsType,

                        English = Convert(x.English),
                        Russian = Convert(x.Russian)
                    }).ToArray();

                    var bytes = lastNewsDTOs.AsJson().ToUTF8Bytes();
                    ms.Write(bytes, 0, bytes.Length);
                    return;
                }

                if (path == "allnews")
                {
                    return;
                }

                return;
            }

            if (request.Method == "POST")
            {
                if (path == "news")
                {
                    return;
                }

                return;
            }
        }