首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取请求标头时出现Fasthttp错误:标头键“http/1.1\r\nuser-Agent”无效

读取请求标头时出现Fasthttp错误:标头键“http/1.1\r\nuser-Agent”无效
EN

Stack Overflow用户
提问于 2020-01-14 04:12:09
回答 1查看 1.2K关注 0票数 0

我刚刚开始学习围棋,这个问题让我卡住了。尝试使用github.com/valyala/fasthttp在测试函数中测试本地主机上的请求处理。首先像在https://github.com/valyala/fasthttp/blob/master/server_example_test.go中一样运行服务器

代码语言:javascript
复制
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)
}

然后,如果我从相同的测试函数运行请求函数(FastRequest(url string)),它工作得很好……

Fasthttp请求函数:

代码语言:javascript
复制
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
            }
        }
    }
}

但我真正需要测试的是从我的对象发送一个请求,它在goroutine中实现了相同的FastRequest方法。这里我得到了这个错误信息:

代码语言:javascript
复制
 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不能解析它自己的报头吗?或者这是怎么回事?

此外,我应该补充说,在第一种情况下,我使用的是==== v1.6.0,当我将其更改为1.8.0时,错误是:

代码语言:javascript
复制
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“,它适用于真正的服务器,因为我的小型本地主机服务器无法处理它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-14 05:31:17

代码语言:javascript
复制
... contents: "GET here_is_request_url \n http/1.1\r\n ...
                                     ^^^^^^^^^^^^^
                                         WRONG! 

您在代码中使用的URL很可能在末尾仍然有一个换行符(\n),因为它包含在HTTP版本之前的请求中,因此会使HTTP请求变得混乱。真正的URL不应该有空格,包括空格和换行符。

此外,HTTP版本应该是全大写的HTTP/1.1,即您的小写http/1.1也是错误的。您没有展示如何创建HTTP请求,但它很可能是乱七八糟的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59723515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档