Description
https://gin-gonic.com/docs/examples/graceful-restart-or-stop/
Based on the example above,i enable h2c but it is not working.
How to enable h2c and "graceful restart or stop"?
How to reproduce
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/gin-gonic/gin"
)
// base https://gin-gonic.com/docs/examples/graceful-restart-or-stop/
// add h2c enable
func main() {
router := gin.Default()
router.UseH2C = true // <------- enable h2c
router.GET("/", func(c *gin.Context) {
time.Sleep(5 * time.Second)
c.String(http.StatusOK, "Welcome Gin Server")
})
srv := &http.Server{
Addr: ":8080",
Handler: router,
}
go func() {
// service connections
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}()
// Wait for interrupt signal to gracefully shutdown the server with
// a timeout of 5 seconds.
quit := make(chan os.Signal)
// kill (no param) default send syscanll.SIGTERM
// kill -2 is syscall.SIGINT
// kill -9 is syscall. SIGKILL but can"t be catch, so don't need add it
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Shutdown Server ...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server Shutdown:", err)
}
// catching ctx.Done(). timeout of 5 seconds.
select {
case <-ctx.Done():
log.Println("timeout of 5 seconds.")
}
log.Println("Server exiting")
}
Expectations
$ curl -v --http2 http://localhost:8080
...
HTTP/2 200
...
Actual result
$ curl -v --http2 http://localhost:8080
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
>
< HTTP/1.1 200 OK
< Content-Type: text/plain; charset=utf-8
< Date: Mon, 09 Jan 2023 09:52:22 GMT
< Content-Length: 18
<
* Connection #0 to host localhost left intact
Welcome Gin Server* Closing connection 0
Environment
- go version: 1.19
- gin version (or commit ref): v1.8.2
- operating system: Mac
Comment From: appleboy
I will take it.
Comment From: appleboy
srv := &http.Server{
Addr: ":8080",
- Handler: router,
+ Handler: router.Handler(),
}