登录
首页 >  Golang >  Go问答

如果请求在 http.Server 中超时,为什么在 Firefox 中会无限期地重复?

来源:stackoverflow

时间:2024-04-06 20:06:36 471浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《如果请求在 http.Server 中超时,为什么在 Firefox 中会无限期地重复?》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我正在 golang 中设置一个带有超时的简单服务器。当运行的处理程序花费的时间超过超时时间时,如果我使用 firefox 请求,该请求将无限期地重复。但是,如果我使用 postman 或curl,则 reuqest 不会重复。我想防止浏览器中出现重复循环。

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

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: %s\n", r.URL.Path)
        time.Sleep(time.Second * 2)
        fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)
    })
    s := http.Server{
        Addr:         ":8080",
        Handler:      http.DefaultServeMux,
        ReadTimeout:  1 * time.Second,
        WriteTimeout: 1 * time.Second,
    }
    s.ListenAndServe()
}

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


解决方案


据我了解,您面临的问题是服务器超时突然关闭底层 tcp conn 而没有编写正确的 http 响应,同时,当 firefox 检测到突然关闭的 conn 时,它似乎决定重试 n 次,可能因为它假设遇到连接问题。

我认为解决方案是使用 http.Handler 来控制处理程序处理持续时间,并在超时到期时返回正确的 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: %s\n", r.URL.Path)
        time.Sleep(time.Second * 2)
        fmt.Fprintf(w, "Hello, you've requested: %s\n", 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()
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>