コード例 #1
0
ファイル: Server.cs プロジェクト: Ekwav/HypixelSkyblock
        public async Task AnswerGetRequest(RequestContext context)
        {
            var path = context.path.Split('?')[0];


            if (path == "/stats" || path.EndsWith("/status") || path.Contains("show-status"))
            {
                PrintStatus(context);
                Console.WriteLine(DateTime.Now);
                return;
            }

            if (path.StartsWith("/command/"))
            {
                await HandleCommand(context);
                return;
            }

            if (path == "/low")
            {
                var relevant = Updater.LastAuctionCount.Where(a => a.Value > 0 && a.Value < 72);
                await context.WriteAsync(JSON.Stringify(relevant));
                return;
            }

            if (context.HostName.StartsWith("skyblock") && !Program.LightClient)
            {
                context.Redirect("https://sky.coflnet.com" + path);
                return;
            }

            if (path == "/" || path.IsNullOrEmpty())
            {
                path = "index.html";
            }

            if (path == "/players")
            {
                await PrintPlayers(context);
                return;
            }
            if (path == "/items")
            {
                await PrintItems(context);
                return;
            }

            if (path == "/api/items/bazaar")
            {
                await PrintBazaarItems(context);
                return;
            }
            if (path == "/api/items/search")
            {
                await SearchItems(context);
                return;
            }



            byte[] contents;
            var relativePath = $"files/{path}";

            if (path.StartsWith("/static/skin"))
            {
                GetSkin(relativePath);
            }

            if (path.StartsWith("/static/icon"))
            {
                await IconResolver.Instance.Resolve(context, path);
                return;
            }


            if (!FileController.Exists(relativePath))
            {
                //res.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
                //return;
                // vue.js will handle it internaly
                relativePath = $"files/index.html";
            }


            try
            {
                contents = FileController.ReadAllBytes(relativePath);
            }
            catch (Exception)
            {
                await context.WriteAsync("File not found, maybe you fogot to upload the fronted");
                return;
            }

            context.SetContentType("text/html");
            //context.ContentEncoding = Encoding.UTF8;

            if (relativePath == "files/index.html" && !path.EndsWith(".js") && !path.EndsWith(".css"))
            {
                var watch = Stopwatch.StartNew();
                await HtmlModifier.ModifyContent(path, contents, context);

                if (context is WebsocketRequestContext httpContext)
                    if (path.StartsWith("/static"))
                        TrackingService.Instance.TrackPage(httpContext.original.Request?.Url?.ToString(),
                                                    "",
                                                    null,
                                                    null,
                                                    watch.Elapsed);
                    else
                        TrackingService.Instance.TrackPage(httpContext.original.Request?.Url?.ToString(),
                                "",
                                httpContext.original.Request?.UrlReferrer?.ToString(),
                                httpContext.original.Request?.UserAgent,
                                watch.Elapsed);
                return;
            }



            if (path.EndsWith(".png") || path.StartsWith("/static/skin"))
            {
                context.SetContentType("image/png");
            }
            else if (path.EndsWith(".css"))
            {
                context.SetContentType("text/css");
            }
            if (path.EndsWith(".js") || path.StartsWith("/static/js"))
            {
                context.SetContentType("text/javascript");
            }
            if (relativePath == "files/index.html")
            {
                context.AddHeader("cache-control", "private");
                context.SetStatusCode(404);
                await context.WriteAsync("/* This file was not found. Retry in a few miniutes :) */");
                return;
            }

            context.AddHeader("cache-control", "public,max-age=" + (3600 * 24 * 30));

            context.WriteAsync(contents);
        }