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

LeoReentry:

我正在使用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: %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()
}

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

MH碳

以我的理解,您面临的问题是服务器超时突然关闭了底层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()
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

HTTP请求中的无限重定向循环

如果同时发送多个http请求,如何设置ThreadPoolTaskExecutor?

如果请求通过值传递,则http请求值为空

goroutine和Http请求中的超时

如何在Spring Boot中无限期地创建请求

Kotlin中的HTTP请求

TypeScript中的Http请求

IIS Web请求上的Owin无限期挂起

如果从iframe发送HTTP请求,iframed站点从哪里看到请求?

git:如果http请求失败,请重试

stenciljs中的http请求

如果jmeter中有HTTP请求,则在请求URL和主体中传递自动递增变量

python请求使连接无限期保持活动状态

如果对HTTP持久连接的请求花费很长时间,客户端会超时吗?

如果Cypress中的HTTP请求失败,则测试失败

如果价格非常便宜,为什么不能无限期地部分支持旧发行版?

如果初始连接是HTTPS,则将HTTP请求定向到HTTPS,但如果不是HTTP,则将HTTP请求定向到HTTPS

如果已激活HTTPS,Laravel请求HTTP

.htaccess中的“如果请求”?

Chrome无限期地“正在发送请求...”

Mikrotik:如果来自主机的HTTP请求过多,则禁止主机

浏览器缓存-如果缓存了JavaScript文件,为什么我看到重复的http请求?

如果是PUT或DELETE请求,则在任何http请求上都会发生“连接重置”

如果 GET 请求中未指定 http 版本,为什么服务器不等待 http 标头?

记录 http 请求正文,如果发生异常

如果为空,则删除 HTTP 请求路径变量

为什么这个 node.js http 请求会无限期挂起?

HTTP 请求中的 XPath

如果在 Flutter 中失败,Future 可以在内部重试 http 请求吗?