如果请求在http中超时,为什么会在Firefox中无限期重复.服务器



我正在golang中设置一个带有超时的简单服务器。当运行一个比超时时间更长的处理程序时,如果我用Firefox请求,请求会无限期重复。然而,如果我使用Postman或curl,那么重用就不会重复。我想防止浏览器中出现重复循环。

我曾尝试手动关闭请求主体或检查上下文是否已取消,但这些方法都不起作用。

package main
import (
"fmt"
"net/http"
"time"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
fmt.Printf("Hello, you've requested: %sn", r.URL.Path)
time.Sleep(time.Second * 2)
fmt.Fprintf(w, "Hello, you've requested: %sn", r.URL.Path)
})
s := http.Server{
Addr:         ":8080",
Handler:      http.DefaultServeMux,
ReadTimeout:  1 * time.Second,
WriteTimeout: 1 * time.Second,
}
s.ListenAndServe()
}

我希望处理程序退出,不再重复。

据我所知,您面临的问题是,服务器超时会突然关闭底层tcp连接,而没有编写正确的http响应。与此同时,当firefox检测到连接突然关闭时,它似乎决定重试N次,可能是因为它认为自己遇到了连接问题。

我认为解决方案是使用http。控制处理程序处理持续时间的处理程序,并在超时时返回正确的HTTP响应。

服务器超时应该更长,并用于防止异常客户端行为,而不是处理程序的缓慢。

标准HTTP包为此提供了TimeoutHandler函数。

package main
import (
"fmt"
"net/http"
"time"
)
func main() {
slowHandler := func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
fmt.Printf("Hello, you've requested: %sn", r.URL.Path)
time.Sleep(time.Second * 2)
fmt.Fprintf(w, "Hello, you've requested: %sn", r.URL.Path)
}
http.HandleFunc("/", slowHandler)
var handler http.Handler = http.DefaultServeMux
handler = http.TimeoutHandler(handler, time.Second, "processing timeout")
s := http.Server{
Addr:    ":8080",
Handler: handler,
// ReadTimeout:  1 * time.Second,
// WriteTimeout: 1 * time.Second,
}
s.ListenAndServe()
}

相关内容

  • 没有找到相关文章

最新更新