读取请求 headers 时出现 Fasthttp 错误:无效的 header 键“http/1.1\r\nuser-Agent”
Fasthttp error when reading request headers: invalid header key " http/1.1\r\nuser-Agent"
刚开始学围棋,这个问题让我卡住了。
尝试使用 github.com/valyala/fasthttp 在测试 func 时测试本地主机上的请求处理。
首先 运行 像 https://github.com/valyala/fasthttp/blob/master/server_example_test.go:
一样连接服务器
ln, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalf("error in net.Listen: %s", err)
}
requestHandler := func(ctx *fasthttp.RequestCtx) {
fmt.Println(ctx, "Requested path is")
}
if err := fasthttp.Serve(ln, requestHandler); err != nil {
log.Fatalf("error in Serve: %s", err)
}
然后如果我 运行 来自同一个测试函数的请求 func (FastRequest(url string)) 它工作正常...
Fasthttp 请求功能:
func FastRequest(url string) error {
Request := &fasthttp.Request{}
Response := &fasthttp.Response{}
FastHTTPClient := &fasthttp.Client{}
Request.SetRequestURI(url)
for {
err := FastHTTPClient.DoTimeout(Request, Response, time.Minute)
switch err {
case fasthttp.ErrTimeout, fasthttp.ErrDialTimeout:
<-time.After(time.Minute * 2)
continue
case fasthttp.ErrNoFreeConns:
<-time.After(time.Minute * 2)
continue
case nil:
return nil
default:
if strings.Contains(err.Error(), "connection reset by peer") {
<-time.After(time.Minute * 2)
continue
} else {
return err
}
}
}
}
但我真正需要测试的是从我的 object 发送请求,它在 goroutine 中实现了相同的 FastRequest 方法。
在这里我收到了这条错误消息:
error when serving connection ":8080"<->":51325": error when reading request headers: invalid header key " http/1.1\r\nuser-Agent". Buffer size=206, contents: "GET here_is_request_url \n http/1.1\r\nuser-Agent: fasthttp\r\nHost: localhost:8080\r\n\r\n"
在 FastRequest 中我没有指定任何用户代理,函数 FastRequest() 是相同的。只是调用函数的地方不一样。是否在goroutine中调用无关紧要
所以,fasthttp.RequestCtx 无法解析它自己的 header?或者发生了什么事?
============================================= =============================
另外,我应该补充说,在第一种情况下,我使用了 fasthttp v1.6.0,当我将其更改为 1.8.0 时,错误是:
error when serving connection ":8080"<->":57093": error when reading request headers: invalid header name. Buffer size=215, contents: "GET here_is_request_url\n HTTP/1.1\r\nUser-Agent: fasthttp\r\nHost: localhost:8080\r\n\r\n"
最后,问题出在 url 末尾添加的“/n”中,它适用于真实服务器,我的小型本地主机服务器无法处理它。
... contents: "GET here_is_request_url \n http/1.1\r\n ...
^^^^^^^^^^^^^
WRONG!
您在代码中使用的 URL 可能有一个换行符 (\n
) 仍在末尾,因为它包含在 HTTP 版本之前的请求中,因此弄乱了 HTTP 请求.真正的 URL 应该没有白色的 space,其中包括 space 和换行符。
此外,HTTP 版本应该全部大写 HTTP/1.1
,即您的小写 http/1.1
也是错误的。您没有显示如何创建 HTTP 请求,但很可能搞砸了。
刚开始学围棋,这个问题让我卡住了。 尝试使用 github.com/valyala/fasthttp 在测试 func 时测试本地主机上的请求处理。 首先 运行 像 https://github.com/valyala/fasthttp/blob/master/server_example_test.go:
一样连接服务器ln, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalf("error in net.Listen: %s", err)
}
requestHandler := func(ctx *fasthttp.RequestCtx) {
fmt.Println(ctx, "Requested path is")
}
if err := fasthttp.Serve(ln, requestHandler); err != nil {
log.Fatalf("error in Serve: %s", err)
}
然后如果我 运行 来自同一个测试函数的请求 func (FastRequest(url string)) 它工作正常...
Fasthttp 请求功能:
func FastRequest(url string) error {
Request := &fasthttp.Request{}
Response := &fasthttp.Response{}
FastHTTPClient := &fasthttp.Client{}
Request.SetRequestURI(url)
for {
err := FastHTTPClient.DoTimeout(Request, Response, time.Minute)
switch err {
case fasthttp.ErrTimeout, fasthttp.ErrDialTimeout:
<-time.After(time.Minute * 2)
continue
case fasthttp.ErrNoFreeConns:
<-time.After(time.Minute * 2)
continue
case nil:
return nil
default:
if strings.Contains(err.Error(), "connection reset by peer") {
<-time.After(time.Minute * 2)
continue
} else {
return err
}
}
}
}
但我真正需要测试的是从我的 object 发送请求,它在 goroutine 中实现了相同的 FastRequest 方法。 在这里我收到了这条错误消息:
error when serving connection ":8080"<->":51325": error when reading request headers: invalid header key " http/1.1\r\nuser-Agent". Buffer size=206, contents: "GET here_is_request_url \n http/1.1\r\nuser-Agent: fasthttp\r\nHost: localhost:8080\r\n\r\n"
在 FastRequest 中我没有指定任何用户代理,函数 FastRequest() 是相同的。只是调用函数的地方不一样。是否在goroutine中调用无关紧要
所以,fasthttp.RequestCtx 无法解析它自己的 header?或者发生了什么事?
============================================= ============================= 另外,我应该补充说,在第一种情况下,我使用了 fasthttp v1.6.0,当我将其更改为 1.8.0 时,错误是:
error when serving connection ":8080"<->":57093": error when reading request headers: invalid header name. Buffer size=215, contents: "GET here_is_request_url\n HTTP/1.1\r\nUser-Agent: fasthttp\r\nHost: localhost:8080\r\n\r\n"
最后,问题出在 url 末尾添加的“/n”中,它适用于真实服务器,我的小型本地主机服务器无法处理它。
... contents: "GET here_is_request_url \n http/1.1\r\n ...
^^^^^^^^^^^^^
WRONG!
您在代码中使用的 URL 可能有一个换行符 (\n
) 仍在末尾,因为它包含在 HTTP 版本之前的请求中,因此弄乱了 HTTP 请求.真正的 URL 应该没有白色的 space,其中包括 space 和换行符。
此外,HTTP 版本应该全部大写 HTTP/1.1
,即您的小写 http/1.1
也是错误的。您没有显示如何创建 HTTP 请求,但很可能搞砸了。