http2的Spring Boot Netty服务器结果为413

问题描述 投票:0回答:1

对于具有数据正文的任何​​方法,对于具有数据正文的任何​​方法,[[Spring boot 2.2,使用具有默认netty的curl --http2作为服务器],即使正文只是{"A":"B"},服务器也会对大型实体响应413。虽然我没有身体尝试过,但效果很好。这是一个错误吗?

$ curl --http2 -X POST -v http://172.27.12.61:8889/a \
>   -H 'content-type: application/json' \
>   -d '{
>   "A": "B"
> }
> '
Note: Unnecessary use of -X or --request, POST is already inferred.
* timeout on name lookup is not supported
*   Trying 172.27.12.61...
* TCP_NODELAY set
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to 172.27.12.61 (172.27.12.61) port 8889 (#0)
> POST /a HTTP/1.1
> Host: 172.27.12.61:8889
> User-Agent: curl/7.51.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAAQAAP__
> content-type: application/json
> Content-Length: 15
>
} [15 bytes data]
* upload completely sent off: 15 out of 15 bytes
< HTTP/1.1 413 Request Entity Too Large
< content-length: 0
<
* Curl_http_done: called premature == 0
100    15    0     0  100    15      0    483 --:--:-- --:--:-- --:--:--   483
* Connection #0 to host 172.27.12.61 left intact
spring-boot http2
1个回答
0
投票

由于您指定了http方案(而不是https),并要求curl使用HTTP / 2,所以curl将尝试执行从HTTP / 1.1升级到HTTP / 2的操作从日志中看到。

典型的HTTP / 1.1升级是使用GET而不是POST进行的,特别是HTTP / 1.1到WebSocket的升级。

服务器似乎不准备接受带有正文的POST作为升级尝试,并由于不希望出现正文而回复413。

如果您尝试不带主体的GET,则可能会成功。

或者,如果您知道端口8889接受先验知识的明文HTTP / 2(即,您可以直接向该端口发送HTTP / 2字节,而不必执行HTTP / 1.1升级),则可以尝试:

curl --http2-prior-knowledge -X POST http://172.27.12.61:8889/a ...

如果使用https方案,则将通过ALPN协商HTTP / 2协议,并且不会进行HTTP / 1.1升级,可能是继POST请求之后。

© www.soinside.com 2019 - 2024. All rights reserved.