Changeset 70 in code for trunk/cmd


Ignore:
Timestamp:
Feb 12, 2024, 2:42:11 AM (16 months ago)
Author:
yakumo.izuru
Message:

PixivFEからいくつか輸入しました

リクエストリミッターを構成可能にする
マニュアルページを更新する
エラーページを改善する
GoFiber v2.52.0 へのアップデート

Signed-off-by: Izuru Yakumo <yakumo.izuru@…>

Location:
trunk/cmd/mai
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/cmd/mai/main.go

    r68 r70  
    33import (
    44        "bytes"
    5         "fmt"
     5        "errors"
     6        "log"
    67        "net/http"
    78        "net/url"
     
    910        "time"
    1011        "runtime"
     12        "strings"
    1113        "syscall"
    1214
     
    1820        "github.com/gofiber/fiber/v2/middleware/logger"
    1921        "github.com/gofiber/fiber/v2/middleware/limiter"
     22        "github.com/gofiber/fiber/v2/middleware/recover"
    2023        "github.com/gofiber/template/html/v2"
    2124)
     
    2629)
    2730var conf struct {
     31        danmaku int
    2832        listen string
    2933        staticpath string
    3034        tmplpath string
    3135}
     36func MaiSkipLimiter(c *fiber.Ctx) bool {
     37        // Paths listed here are not considered for rate limiting
     38        path := c.Path()
     39        return strings.HasPrefix(path, "/static") ||
     40                strings.HasPrefix(path, "/docs")
     41}
    3242func main() {
    3343        parseFlags()
     
    3848
    3949        // Default settings
     50        conf.danmaku = 10
    4051        conf.listen = "127.0.0.1:5000"
    4152        conf.staticpath = "./static"
     
    4556                uid, gid, err := usergroupids(username, groupname)
    4657                if err != nil {
    47                         fmt.Println(err)
    48                         os.Exit(1)
     58                        log.Fatal(err)
    4959                }
    5060                syscall.Setuid(uid)
     
    5565        engine.AddFunc("inc", func(i int) int { return i + 1 })
    5666
    57         app := fiber.New(
     67        server := fiber.New(
    5868                fiber.Config{
    5969                        AppName: "Mai",
     
    6272                        ServerHeader: "Mai (using Fiber v2.x)",
    6373                        Views: engine,
    64         })
    65 
    66         app.Use(favicon.New(
     74                        ErrorHandler: func(c *fiber.Ctx, err error) error {
     75                                code := fiber.StatusInternalServerError
     76                                err = c.Status(code).Render("pages/error", fiber.Map{"Title": "Error", "Error": err})
     77                                if err != nil {
     78                                        return c.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
     79                                }
     80                                return nil
     81                        },
     82                })
     83
     84        server.Use(recover.New())
     85
     86        server.Use(favicon.New(
    6787                favicon.Config{
    6888                        File: conf.staticpath + "/favicon.ico",
     
    7090        ))
    7191
    72         app.Use(logger.New(
     92        server.Use(logger.New(
    7393                logger.Config{
    7494                        Format: "==> ${ip}:${port} ${status} - ${method} ${path}\n",
    7595                        DisableColors: true,
    7696                        Output: os.Stdout,
     97                        Next: MaiSkipLimiter,
    7798                },
    7899        ))
    79100
    80         app.Use(limiter.New(limiter.Config{
    81                 Max: 10,
    82                 Expiration: 180 * time.Second,
     101        server.Use(limiter.New(limiter.Config{
     102                Next: MaiSkipLimiter,
     103                Max: conf.danmaku,
     104                Expiration: 30 * time.Second,
     105                LimiterMiddleware: limiter.SlidingWindow{},
    83106                LimitReached: func(c *fiber.Ctx) error {
    84                         return c.SendStatus(429)
    85                         return c.SendFile(conf.tmplpath + "/429.html")
     107                        log.Println("Limit reached!")
     108                        return errors.New("You're firing way too many danmaku really fast!")
    86109                },
    87110        }))
    88111
    89         app.All("/", func(c *fiber.Ctx) error {
     112        server.All("/", func(c *fiber.Ctx) error {
    90113                engine := c.Cookies("engine")
    91114                if c.Query("engine") != "" {
     
    186209        })
    187210
    188         app.All("/api/translate", func(c *fiber.Ctx) error {
     211        server.All("/api/translate", func(c *fiber.Ctx) error {
    189212                from := ""
    190213                to := ""
     
    217240        })
    218241
    219         app.Get("/api/source_languages", func(c *fiber.Ctx) error {
     242        server.Get("/api/source_languages", func(c *fiber.Ctx) error {
    220243                engine := c.Query("engine")
    221244                if _, ok := engines.Engines[engine]; !ok || engine == "" {
     
    229252        })
    230253
    231         app.Get("/api/target_languages", func(c *fiber.Ctx) error {
     254        server.Get("/api/target_languages", func(c *fiber.Ctx) error {
    232255                engine := c.Query("engine")
    233256                if _, ok := engines.Engines[engine]; !ok || engine == "" {
     
    241264        })
    242265
    243         app.Get("/api/tts", func(c *fiber.Ctx) error {
     266        server.Get("/api/tts", func(c *fiber.Ctx) error {
    244267                engine := c.Query("engine")
    245268                if _, ok := engines.Engines[engine]; !ok || engine == "" {
     
    268291                }
    269292        })
    270         app.Get("/robots.txt", func(c *fiber.Ctx) error {
     293
     294        server.Get("/robots.txt", func(c *fiber.Ctx) error {
    271295                return c.SendString("User-Agent: *\nDisallow: /\n")
    272296        })
    273         app.Get("/version", func(c *fiber.Ctx) error {
     297
     298        server.Get("/toomanyrequests", func(c *fiber.Ctx) error {
     299                return c.SendFile(conf.tmplpath + "/429.html")
     300                return c.SendStatus(429)
     301        })
     302
     303        server.Get("/version", func(c *fiber.Ctx) error {
    274304                return c.JSON(fiber.Map{
    275305                        "fiberversion": fiber.Version,
     
    278308                })
    279309        })
    280         app.Post("/switchlanguages", func(c *fiber.Ctx) error {
     310
     311        server.Post("/switchlanguages", func(c *fiber.Ctx) error {
    281312                if c.Cookies("from") != "" {
    282313                        fromCookie := new(fiber.Cookie)
     
    295326                return c.Redirect("/")
    296327        })
    297         app.Static("/static", conf.staticpath, fiber.Static{
     328        server.Static("/static", conf.staticpath, fiber.Static{
    298329                Compress: true,
    299330                ByteRange: true,
    300331                Browse: true,
    301332        })
    302         app.Static("/docs", "./docs", fiber.Static{})
    303         app.Listen(conf.listen)
     333
     334        server.Static("/docs", "./docs", fiber.Static{})
     335
     336        server.Listen(conf.listen)
    304337}
  • trunk/cmd/mai/readconf.go

    r67 r70  
    1111                return err                                             
    1212        }
     13        conf.danmaku, _ = cfg.Section("mai").Key("danmaku").Int()
    1314        conf.listen = cfg.Section("mai").Key("listen").String()
    1415        conf.staticpath = cfg.Section("mai").Key("static").String()
Note: See TracChangeset for help on using the changeset viewer.