Home >Backend Development >Golang >Why do my sockets hang with 502 in Postman and nginX while Gin-Gonic returns StatusOk in both cases?

Why do my sockets hang with 502 in Postman and nginX while Gin-Gonic returns StatusOk in both cases?

王林
王林forward
2024-02-09 20:27:09376browse

为什么我的 Postman 和 nginX 中的 502 上的套接字挂起,而 Gin-Gonic 在这两种情况下都返回 StatusOk?

php editor Yuzi will answer a common question for everyone in this article: "Why does the socket on 502 in my Postman and nginX hang, and Gin- Gonic returns StatusOk in both cases?" This question involves differences in the behavior of different network frameworks and servers. We will analyze the reasons and give solutions to help readers solve similar problems.

Question content

To simplify my problem, I have a very long route that can take up to 2 minutes to return a response. Now here is my sample http handler:

func GetHealth(svc *service.Hotel) gin.HandlerFunc {
   return func(c *gin.Context) {
      time.Sleep(30 * time.Second)
      c.JSON(200, gin.H{})
   }
}

Now when I call [GET] /health route postman returns Error: Socket hung At the exact time the response comes back from gin-gonic, ## is logged #200 Ok:

[GIN] 2024/01/24 - 11:10:58 | 200 | 200 30.084587215s | ::1 |Get "/health"

Now, with the same project behind nginX as a reverse proxy, I get a 502 nginX error on the API response when my service logs a

200 Ok.

The question is Why am I getting an error on the client side even though gin-gonic has successfully returned a response? How can I solve this problem?

I used the

github.com/gin-contrib/timeout library because I thought it was related to routing timeouts, but without success.

Workaround

In

gin-gonic you can set WriteTimeout on http.Server to prevent socket hangs or nginx 502.

Interestingly, even if it times out, it always logs 200, but the client gets the error:

srv := &http.Server{
        Addr: ":9000",
        // Good practice to set timeouts to avoid Slowloris attacks.
        WriteTimeout: time.Second * 120, // THIS TIMEOUT NEEDS TO BE SET
        ReadTimeout:  time.Second * 15,
        IdleTimeout:  time.Second * 60,
        Handler:      router,
    }

The above is the detailed content of Why do my sockets hang with 502 in Postman and nginX while Gin-Gonic returns StatusOk in both cases?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete