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?

王林
Release: 2024-02-09 20:27:09
forward
379 people have browsed it

为什么我的 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{})
   }
}
Copy after login

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,
    }
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template