gpt4 book ai didi

go - 如何根据请求路径创建自定义超时处理程序?

转载 作者:IT王子 更新时间:2023-10-29 02:11:03 24 4
gpt4 key购买 nike

我写了一个超时中间件。在这个超时中间件中,我创建了一个 goroutine 来处理 next 处理程序,但是在发生超时两秒钟后,响应返回 408 超时状态代码,但 goroutine 在后台运行并执行处理程序链中的下一个处理程序。 那么如何编写一个正确的超时中间件呢?

超时中间件:

type TimeoutHandler struct {
Next http.Handler
}

func (handler *TimeoutHandler) ServeHTTP(responseWriter http.ResponseWriter, request *http.Request) {
/*if nil 'Next' handler.*/
if handler.Next == nil {
/*delegate to default serve mux.*/
handler.Next = http.DefaultServeMux
}

/*context with timeout.*/
requestContext := request.Context()
timeoutContext, cancelFunction := context.WithTimeout(requestContext, 2*time.Second)
defer cancelFunction()

/*request with new context.*/
request = request.WithContext(timeoutContext)
chanDone := make(chan bool)

go func() {
/*delegate request to `Next` handler*/
handler.Next.ServeHTTP(responseWriter, request)
chanDone <- true
}()

select {
case <-timeoutContext.Done():
/*status 408 request timeout.*/
responseWriter.WriteHeader(http.StatusRequestTimeout)
case <-chanDone:
return
}
}

这些是我遇到的问题:

  1. 超时后,无论如何都会运行下一个处理程序。
  2. 如果我在超时中间件后使用更多处理程序,则会出现警告“http: multiple response.WriteHeader calls”。

最佳答案

我在一个论坛上找到了更好的解决方案,我希望这个解决方案可以帮助其他新手。

/**
*
*/
type TimeoutHandler struct {
Next http.Handler
}

/**
*
*/
func (h *TimeoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
/*nil 'Next' handler.*/
if h.Next == nil {
/*delegate to default serve mux.*/
h.Next = http.DefaultServeMux
}

/*delegate request to new timeout handler.*/
timeoutHandler := http.TimeoutHandler(h.Next, 4 * time.Second, `Request Timeout.`)
timeoutHandler.ServeHTTP(w, r)
}

关于go - 如何根据请求路径创建自定义超时处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47218400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com