当Expect标头为空时,Tomcat7拒绝POSTS

时间:2017-03-08 06:21:06

标签: http tomcat

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标头?

1 个答案:

答案 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;