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(),
    }