- Timestamp:
- Feb 12, 2024, 2:42:11 AM (16 months ago)
- Location:
- trunk/cmd/mai
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/cmd/mai/main.go
r68 r70 3 3 import ( 4 4 "bytes" 5 "fmt" 5 "errors" 6 "log" 6 7 "net/http" 7 8 "net/url" … … 9 10 "time" 10 11 "runtime" 12 "strings" 11 13 "syscall" 12 14 … … 18 20 "github.com/gofiber/fiber/v2/middleware/logger" 19 21 "github.com/gofiber/fiber/v2/middleware/limiter" 22 "github.com/gofiber/fiber/v2/middleware/recover" 20 23 "github.com/gofiber/template/html/v2" 21 24 ) … … 26 29 ) 27 30 var conf struct { 31 danmaku int 28 32 listen string 29 33 staticpath string 30 34 tmplpath string 31 35 } 36 func 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 } 32 42 func main() { 33 43 parseFlags() … … 38 48 39 49 // Default settings 50 conf.danmaku = 10 40 51 conf.listen = "127.0.0.1:5000" 41 52 conf.staticpath = "./static" … … 45 56 uid, gid, err := usergroupids(username, groupname) 46 57 if err != nil { 47 fmt.Println(err) 48 os.Exit(1) 58 log.Fatal(err) 49 59 } 50 60 syscall.Setuid(uid) … … 55 65 engine.AddFunc("inc", func(i int) int { return i + 1 }) 56 66 57 app:= fiber.New(67 server := fiber.New( 58 68 fiber.Config{ 59 69 AppName: "Mai", … … 62 72 ServerHeader: "Mai (using Fiber v2.x)", 63 73 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( 67 87 favicon.Config{ 68 88 File: conf.staticpath + "/favicon.ico", … … 70 90 )) 71 91 72 app.Use(logger.New(92 server.Use(logger.New( 73 93 logger.Config{ 74 94 Format: "==> ${ip}:${port} ${status} - ${method} ${path}\n", 75 95 DisableColors: true, 76 96 Output: os.Stdout, 97 Next: MaiSkipLimiter, 77 98 }, 78 99 )) 79 100 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{}, 83 106 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!") 86 109 }, 87 110 })) 88 111 89 app.All("/", func(c *fiber.Ctx) error {112 server.All("/", func(c *fiber.Ctx) error { 90 113 engine := c.Cookies("engine") 91 114 if c.Query("engine") != "" { … … 186 209 }) 187 210 188 app.All("/api/translate", func(c *fiber.Ctx) error {211 server.All("/api/translate", func(c *fiber.Ctx) error { 189 212 from := "" 190 213 to := "" … … 217 240 }) 218 241 219 app.Get("/api/source_languages", func(c *fiber.Ctx) error {242 server.Get("/api/source_languages", func(c *fiber.Ctx) error { 220 243 engine := c.Query("engine") 221 244 if _, ok := engines.Engines[engine]; !ok || engine == "" { … … 229 252 }) 230 253 231 app.Get("/api/target_languages", func(c *fiber.Ctx) error {254 server.Get("/api/target_languages", func(c *fiber.Ctx) error { 232 255 engine := c.Query("engine") 233 256 if _, ok := engines.Engines[engine]; !ok || engine == "" { … … 241 264 }) 242 265 243 app.Get("/api/tts", func(c *fiber.Ctx) error {266 server.Get("/api/tts", func(c *fiber.Ctx) error { 244 267 engine := c.Query("engine") 245 268 if _, ok := engines.Engines[engine]; !ok || engine == "" { … … 268 291 } 269 292 }) 270 app.Get("/robots.txt", func(c *fiber.Ctx) error { 293 294 server.Get("/robots.txt", func(c *fiber.Ctx) error { 271 295 return c.SendString("User-Agent: *\nDisallow: /\n") 272 296 }) 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 { 274 304 return c.JSON(fiber.Map{ 275 305 "fiberversion": fiber.Version, … … 278 308 }) 279 309 }) 280 app.Post("/switchlanguages", func(c *fiber.Ctx) error { 310 311 server.Post("/switchlanguages", func(c *fiber.Ctx) error { 281 312 if c.Cookies("from") != "" { 282 313 fromCookie := new(fiber.Cookie) … … 295 326 return c.Redirect("/") 296 327 }) 297 app.Static("/static", conf.staticpath, fiber.Static{328 server.Static("/static", conf.staticpath, fiber.Static{ 298 329 Compress: true, 299 330 ByteRange: true, 300 331 Browse: true, 301 332 }) 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) 304 337 } -
trunk/cmd/mai/readconf.go
r67 r70 11 11 return err 12 12 } 13 conf.danmaku, _ = cfg.Section("mai").Key("danmaku").Int() 13 14 conf.listen = cfg.Section("mai").Key("listen").String() 14 15 conf.staticpath = cfg.Section("mai").Key("static").String()
Note:
See TracChangeset
for help on using the changeset viewer.