Почтовый запрос curl не работает с опцией --http2, но отлично работает, когда я использую --http2-prior-knowledge

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

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

мой файл application.property

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

и файл конфигурации

@Bean
    public WebServerFactoryCustomizer tomcatCustomizer() {
        return (container) -> {
            if (container instanceof TomcatServletWebServerFactory) {
                ((TomcatServletWebServerFactory) container)
                        .addConnectorCustomizers((connector) -> {
                            connector.addUpgradeProtocol(new Http2Protocol());
                        });
            }
        };
    }
  1. for curl -vvv --http2 -H 'Тип содержимого: application/json' -H 'управление кешем: без кеша' -XPOST http://локальный:8080/сохранить -d '{"xyz":"xyz"}' журналы 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
  1. curl -vvv --http2-prior-knowledge -H 'Тип содержимого: application/json' -H 'Токен почтальона: 52e0708b-ce97-4baa-a567-2dabc675f3dd' -H 'управление кешем: без кеша' - XPOST http://локальный:8080/сохранить -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%
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
2 204
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете использовать метод 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.

Хотя это принятый ответ и очень верно, на самом деле это дефект. Спецификация http2 не требует GET запросов на h2c обновления. Таким образом, обновление с первоначального запроса POST совершенно нормально и то, чего ожидают разработчики приложений (и это работает с нетти ).

jek 20.05.2019 12:03

Другие вопросы по теме