Ошибка Fasthttp при чтении заголовков запроса: неверный ключ заголовка "http / 1.1 \ r \ nuser-Agent" - PullRequest
0 голосов
/ 13 января 2020

Я только начал изучать Go, и этот вопрос застрял. Попытка проверить обработку запросов на локальном хосте в веселом тестировании c с использованием github.com/valyala/fasthttp. Сначала запускается сервер, как в 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)
}

, затем, если я запускаю запрос fun c (FastRequest (строка URL)) из той же функции тестирования, он работает нормально ...

Fasthttp fun fun c:

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
            }
        }
    }
}

Но мне действительно нужно проверить отправку запроса от моего объекта, который реализует тот же метод FastRequest в goroutine. И здесь у меня появляется это сообщение об ошибке:

 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 не может разобрать свой собственный заголовок? или что происходит?

=========================================== ==================================== Кроме того, я должен был добавить, что в первом случае я использовал 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"

И, наконец, проблема была в добавлении "/ n" в конце URL, который работает на реальных серверах , мой маленький локальный сервер не мог справиться с этим.

1 Ответ

1 голос
/ 14 января 2020
... 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-запрос, но, скорее всего, он запутался.

...