From 286f010346a715e3423632410065eac6dfabf777 Mon Sep 17 00:00:00 2001 From: loveuer Date: Sat, 13 Jan 2024 18:54:23 +0800 Subject: [PATCH] feat: if report http server close err as run err --- app.go | 7 ++++++- nf.go | 12 ++++++++---- readme.md | 2 +- xtest/quit/main.go | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 xtest/quit/main.go diff --git a/app.go b/app.go index b0ce6a0..dd4c7e4 100644 --- a/app.go +++ b/app.go @@ -48,7 +48,12 @@ func (a *App) run(ln net.Listener) error { fmt.Println(banner + "nf serve at: " + ln.Addr().String() + "\n") } - return a.server.Serve(ln) + err := a.server.Serve(ln) + if !errors.Is(err, http.ErrServerClosed) || a.config.ErrServeClose { + return err + } + + return nil } func (a *App) Run(address string) error { diff --git a/nf.go b/nf.go index 527541f..d37a6ee 100644 --- a/nf.go +++ b/nf.go @@ -8,10 +8,14 @@ type Map map[string]interface{} type Config struct { // Default: 4 * 1024 * 1024 - BodyLimit int64 `json:"-"` - DisableBanner bool `json:"-"` - DisableLogger bool `json:"-"` - DisableRecover bool `json:"-"` + BodyLimit int64 `json:"-"` + + // if report http.ErrServerClosed as run err + ErrServeClose bool `json:"-"` + + DisableBanner bool `json:"-"` + DisableLogger bool `json:"-"` + DisableRecover bool `json:"-"` } var ( diff --git a/readme.md b/readme.md index 871e9b2..3142e52 100644 --- a/readme.md +++ b/readme.md @@ -50,7 +50,7 @@ func handlePost(c *nf.Ctx) error { var ( err error req = Req{} - reqMap = make(map[string]any) + reqMap = make(map[string]any) ) if err = c.BodyParser(&req); err != nil { diff --git a/xtest/quit/main.go b/xtest/quit/main.go new file mode 100644 index 0000000..4ea9671 --- /dev/null +++ b/xtest/quit/main.go @@ -0,0 +1,49 @@ +package main + +import ( + "context" + "github.com/loveuer/nf" + "log" + "time" +) + +func main() { + app := nf.New() + quit := make(chan bool) + + app.Get("/name", handleGet) + + go func() { + err := app.Run(":7383") + log.Print("run with err=", err) + }() + + go func() { + time.Sleep(5 * time.Second) + err := app.Shutdown(context.TODO()) + log.Print("quit with err=", err) + quit <- true + }() + + <-quit + + log.Print("quited") +} + +func handleGet(c *nf.Ctx) error { + type Req struct { + Name string `query:"name"` + Addr []string `query:"addr"` + } + + var ( + err error + req = Req{} + ) + + if err = c.QueryParser(&req); err != nil { + return nf.NewNFError(400, err.Error()) + } + + return c.JSON(nf.Map{"req_map": req}) +}