Tomcat7 正在响应带有显式但空的 Expect header 和 417 Expectation Failed 的 curl POST。
curl -v -H "Expect;" <URL>
tomcat 响应
> POST <...> HTTP/1.1
> Host: <...>
> User-Agent: curl/7.53.0
> Accept: */*
> Expect:
>
< HTTP/1.1 417 Expectation Failed
< Server: Apache-Coyote/1.1
< Transfer-Encoding: chunked
但是,Tomcat6接受了这个POST。我显然正在尝试升级到 Tomcat7,但在公共(public)领域(无法修改)中有产品总是添加这些空 header 。
有没有办法配置 Tomcat7 来接受这些空的 Expect header ?
最佳答案
不幸的是,没有办法配置 Tomcat7 和禁用 Expect
header 检查。禁用它的唯一方法是修改 Tomcat7 的源代码并重建您自己的版本。
相关代码位于apache-tomcat-7.0.75-src/java/org/apache/coyote/http11/AbstractHttp11Processor.java
:
MessageBytes expectMB = null;
if (http11) {
expectMB = headers.getValue("expect");
}
if (expectMB != null) {
if (expectMB.indexOfIgnoreCase("100-continue", 0) != -1) {
getInputBuffer().setSwallowInput(false);
expectation = true;
} else {
response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
setErrorState(ErrorState.CLOSE_CLEAN, null);
}
}
似乎没有禁用 Expect
header 检查的配置选项。要解决您的问题,应删除这些代码。
Tomcat7 的这种行为是设计使然,遵循 HTTP 标准。它在 Tomcat 7.0.55 ( https://tomcat.apache.org/tomcat-7.0-doc/changelog.html ) 中发布:“如果请求包含无法识别的 Expect header ,则根据 RFC2616 第 14.20 章响应错误 417(Expectation Failed)。”
关于http - 当 Expect header 为空时,Tomcat7 拒绝 POSTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42664311/