Закройте клиентское соединение http2 после каждого запроса - PullRequest
0 голосов
/ 13 октября 2019

Я хочу закрывать клиентское соединение http2 после каждого запроса (например, отключение соединения keep-alive в http1.1). Я попытался добавить заголовок Connection: close, но это дает http2: ошибка клиента не может быть использована ошибка.

Я попытался использовать request.Close = true, как указано в документе, но все равно получаю ошибку.

Ниже приведен фрагмент кода, который я использую:

func main() {

    enableCompression := false

    transport2 := &http2.Transport{
        DisableCompression: !enableCompression,
        AllowHTTP:          true,
        DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) {
            return net.Dial(network, addr)
        },
    }

    // Create http client
    client := http.Client{
        Transport: transport2,
        Timeout:   time.Duration(1 * time.Second),
    }

    var err error
    var request *http.Request
    if request, err = createRequest(); err == nil {
        request.Close = true
        var response *http.Response

        if response, err = client.Do(request); err == nil {
            fmt.Println(response)
        } else {
            fmt.Println("error: ", err)
        }
    }
}

func createRequest() (request *http.Request, err error) {
    if request, err = http.NewRequest("GET", "http://0.0.0.0:1010/hello/sayHello", nil); err == nil {
        fmt.Println(request)
    }
    return
}

Это выдает ошибку: http2: клиент не может использоваться (превышено значение Client.Timeout при ожидании заголовков)

Чего мне не хватает?

1 Ответ

0 голосов
/ 13 октября 2019

HTTP / 2 не допускает такого поведения.

https://httpwg.org/specs/rfc7540.html#rfc.section.8.1.2

8.1.2.2. Поля заголовка для конкретного соединения

HTTP / 2 не использует поле заголовка соединения для указания полей заголовка для конкретного соединения;в этом протоколе специфичные для соединения метаданные передаются другими средствами. [...]

[...]

Это означает, что посредник, преобразующий сообщение HTTP / 1.x в HTTP / 2, должен будет удалить все поля заголовка, назначенные Соединениемполе заголовка вместе с самим полем заголовка соединения. Таким посредникам СЛЕДУЕТ также удалять другие специфичные для соединения поля заголовков, такие как Keep-Alive, Proxy-Connection, Transfer-Encoding и Upgrade, даже если они не назначены полем заголовка Connection.

см. также

...