gpt4 book ai didi

curl - net/http vs curl - 为什么在 curl 不超时的情况下超时?

转载 作者:数据小太阳 更新时间:2023-10-29 03:42:17 29 4
gpt4 key购买 nike

我有一段代码检查 http/s 端点的状态和加载时间。然后我会为每个顶级页面检查 1 级 href,以检查页面引用的所有内容是否也加载了 200。

(我查了50个顶级页面,每个顶级页面平均有8个链接)

我通过一些 goroutines (25) 和 WaitGroup 检查顶级页面。对于 1 级页面,我尝试了另一个 gouroutines+waitgroup,然后是一个直接的 forloop(只是为了比较)。

在这些 1 级页面上,我收到了很多“CLient.Timeout exceeded while waiting headers”错误。当我抓取这样一个 url,并立即使用 curl 重试时,它会完美加载(带有 curl)

页眉超时的页面是js、png、gif、html的混合体。当我手动 curl 它时,常规的东西可以完美地工作,但不知何故失败了很多时间。

下面是我调用以获取页面内容的函数。

func (t Target) getContents(timeout int64) (string, string, string) {
var contents []byte
statusCode := "0"
errorLabel := "no_error"

tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
// Dial: (&net.Dialer{
// Timeout: 15 * time.Second,
// KeepAlive: 15 * time.Second,
// }).Dial,
TLSHandshakeTimeout: 10 * time.Second,
ResponseHeaderTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
}

client := &http.Client{Transport: tr, Timeout: time.Duration(timeout) * time.Second}

url := t.getPageURL()
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Error("Error while creating the request| ", err)
errorLabel = "cant_create_request"
} else {
//req.Header.Add("cache-control", "no-cache")
if t.Agent != "" {
req.Header.Set("User-Agent", t.Agent)
}
if t.SourceIP != "" {
req.Header.Set("X-Forwarded-For", t.SourceIP)
}
if t.Host != "" {
req.Header.Set("Host", t.Host)
req.Host = t.Host
}
response, err := client.Do(req)
if err != nil {
log.Error("Error while doing the request| ", err.Error())
errorLabel = "cant_do_request"
} else {
defer response.Body.Close()
statusCode = strconv.Itoa(response.StatusCode)
contents, err = ioutil.ReadAll(response.Body)
if err != nil {
log.Error("Error while reading the response| ", err)
errorLabel = "cant_read_response"

}
}
}
return string(contents), statusCode, errorLabel
}

最佳答案

这应该是评论而不是答案,但我没有足够的评论点:(

也许你应该尽量不要在每个请求上定义 tr 和 client。

如果您同时在一个目标上启动大量并行请求,则可能会出现问题,具体取决于您的目标服务器和客户端系统。这可以解释为什么单个测试请求之后就可以了。

最后,我不是专家,但我认为你应该避免使用 nil 的 if/else:

req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Error("Error while creating the request| ", err)
errorLabel = "cant_create_request"
} else {
...
}
return string(contents), statusCode, errorLabel

不应该是:

req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Error("Error while creating the request| ", err)
return string(contents), statusCode, "cant_create_request" //return nil instead ?
}
...
return string(contents), statusCode, errorLabel

太多的“if levels”很难阅读并且容易出错。

关于curl - net/http vs curl - 为什么在 curl 不超时的情况下超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47590994/

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