запрос отправки сообщения curl не работает с параметром --http2, но он работает нормально, когда я использую --http2-prior-знание - PullRequest
0 голосов
/ 28 марта 2019

Я создал приложение весенней загрузки с tomcat 9.0.16, весенней загрузкой 2.1.3.RELEASE, JDK1.8.Когда я делаю запрос записи curl с помощью --http2, он говорит: «curl: (56) Ошибка восстановления: сброс соединения по одноранговому узлу».

, но когда я использую --http-prior-Knowledge, он работает нормально.

мой файл application.property

server.port=8080
server.http2.enabled=true

и файл congif

@Bean
    public WebServerFactoryCustomizer tomcatCustomizer() {
        return (container) -> {
            if (container instanceof TomcatServletWebServerFactory) {
                ((TomcatServletWebServerFactory) container)
                        .addConnectorCustomizers((connector) -> {
                            connector.addUpgradeProtocol(new Http2Protocol());
                        });
            }
        };
    }
  1. для curl -vvv --http2 -H 'Content-Type: application /json '-H' cache-control: no-cache '-XPOST http://localhost:8080/save -d' {"xyz": "xyz"} 'logs curl ->
*   Trying ::1...
* TCP_NODELAY set
* Expire in 150000 ms for 3 (transfer 0x7fc78a808a00)
* Expire in 200 ms for 4 (transfer 0x7fc78a808a00)
* Connected to localhost (::1) port 8080 (#0)
> POST /save HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
> Content-Type: application/json
> Postman-Token: 52e0708b-ce97-4baa-a567-2dabc675f3dd
> cache-control: no-cache
> Content-Length: 702
>
* upload completely sent off: 702 out of 702 bytes
< HTTP/1.1 101
< Connection: Upgrade
< Upgrade: h2c
< Date: Wed, 27 Mar 2019 12:29:18 GMT
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Connection state changed (MAX_CONCURRENT_STREAMS == 200)!
* Recv failure: Connection reset by peer
* Failed receiving HTTP2 data
* Send failure: Broken pipe
* Failed sending HTTP2 data
* Connection #0 to host localhost left intact
curl: (56) Recv failure: Connection reset by peer
curl -vvv --http2-prior-Knowledge -H 'Content-Type: application / json' -H 'Почтальон-токен: 52e0708b-ce97-4baa-a567-2dabc675f3dd' -H 'контроль кэша: нет-кэш '-XPOST http://localhost:8080/save -d' {"xyz": "xyz"} '
* Expire in 0 ms for 6 (transfer 0x7fc5c0808a00)
*   Trying ::1...
* TCP_NODELAY set
* Expire in 150000 ms for 3 (transfer 0x7fc5c0808a00)
* Expire in 200 ms for 4 (transfer 0x7fc5c0808a00)
* Connected to localhost (::1) port 8080 (#0)
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7fc5c0808a00)
> POST /save HTTP/2
> Host: localhost:8080
> User-Agent: curl/7.64.0
> Accept: */*
> Content-Type: application/json
> Postman-Token: 52e0708b-ce97-4baa-a567-2dabc675f3dd
> cache-control: no-cache
> Content-Length: 702
>
* We are completely uploaded and fine
* Connection state changed (MAX_CONCURRENT_STREAMS == 200)!
< HTTP/2 200
< content-type: application/json;charset=UTF-8
< date: Wed, 27 Mar 2019 12:32:26 GMT
<
* Connection #0 to host localhost left intact
true%

1 Ответ

1 голос
/ 29 марта 2019

Вы не можете использовать метод POST для обновления HTTP / 1.1, поэтому Tomcat, вероятно, задыхается от вашего первого запроса (curl --http2 ...) по этой причине.

Я являюсь разработчиком HTTP / 2 в Jetty, и в этом случае Jetty также не обновляется до HTTP / 2, хотя отвечает на запрос HTTP / 1.1 200, а не задыхается.

Преобразуя первый запрос в GET без содержимого, обновление выполняется в Jetty с ответом HTTP / 1.1 101, как и ожидалось.

Второй запрос - это не обновление HTTP / 1.1, а запрос HTTP / 2 предыдущего уровня; нет обновления и, следовательно, нет ограничений в отношении того, какой метод HTTP вы можете использовать, поэтому запрос выполняется как в Jetty, так и в Tomcat.

...