Tomcat7正在响应一个curl POST,其中有一个显式但空的Expect标头,其中417 Expectation Failed。
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,但是公共域中的产品(无法修改)总是会添加这些空标题。
有没有办法配置Tomcat7接受这些空的Expect标头?
答案 0 :(得分:2)
不幸的是,没有办法配置Tomcat7并禁用Expect
标头检查。禁用它的唯一方法是修改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
标头检查。要解决您的问题,应删除这些代码。
Tomcat7的这种行为是设计使用的,遵循HTTP标准。它是在Tomcat 7.0.55(https://tomcat.apache.org/tomcat-7.0-doc/changelog.html)中发布的:&#34;如果请求包含无法识别的Expect标头,则根据RFC2616第14.20章,以错误417(期望失败)进行响应。 &#34;