首页 > 解决方案 > 强制 tomcat 仅使用 HTTP 1.0 或忽略 except 标头

问题描述

是否有可能强制 tomcat 忽略“Expect”标头或仅使用 HTTP 1.0?

我正在发送 curl 请求curl POST -vv 'http://127.0.0.1:8080/test' -d "@requests/test.xml" -H "SOAPAction: abc/test" -H "Content-Type: text/xml; charset=UTF-8",并且 curl 默认添加了“Expect”标头,这会导致服务器等待另一个永远不会到来的请求。

技术栈:Springboot 2.1.3.RELEASE、Tomcat 9.0.16

我不能修改客户和他们的请求空标题“期望:”。

标签: javaspring-boottomcatcurlhttp-headers

解决方案


我认为没有办法让 Tomcat 只响应 HTTP 1.0 响应。那将是违反协议的。如果服务器收到 HTTP 1.1 请求,它必须要么以兼容 HTTP 1.1 的响应进行响应,要么以错误信号表示它不能505 HTTP Version Not Supported

同样,我认为没有办法让 Tomcat 忽略(格式正确/非空)Expect 标头。这也将违反协议。

(虽然理论上服务器可能违反规范,但我找不到配置 Tomcat 的方法来做到这一点。显然你可以下载 Tomcat 源代码并修改它,但是你有维护你的问题“叉子”。)


那么有哪些替代方案:

  1. HTTP 规范规定服务器必须忽略 HTTP 1.0 请求中的 Expect 标头。因此,您可以将--http1.0选项添加到curl命令中。

  2. curl命令使用默认文件 -~/.curlrc来获取各种事物的默认覆盖。您可以将 Expect 标头的空默认值添加到此文件中;请参阅如何为 curl 设置默认的“Expect”标头

但是,我认为您可能会过度担心:

  1. 如果您担心这会减慢客户端 ( curl),请不要这样做。默认情况下,它只等待 1 秒的100 Continue响应。(而且我认为这不是你在说的......)

  2. 如果您担心这可能会占用服务器端资源(在 Tomcat 中),我看不出这有多重要。如果没有活动,Tomcat 服务器将超时并关闭客户端连接。这应该处理curl发送初始请求但不跟进的命令。


推荐阅读