http - 当 Expect header 为空时,Tomcat7 拒绝 POSTS

标签 http tomcat

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/

相关文章:

javascript - 如何在 JSP 中返回 302 HTTP 响应?

http - 如何从 WSO2 ESB 中的响应中删除 http header

html - 是否可以将servlet返回的网页保存在服务器上,以便再次访问?

java - 在 IntelliJ 中通过 Tomcat 打包

java - Tomcat JNDI : Data Source fails to initialize

java - 无法访问我的 API,我的 URL 有误吗?

jsp - 使用jsp将地标添加到 map

http - S-maxage和maxage的区别

php - 保护HTTP请求不被别人调用

api - angular2 http.get() 不向服务器发送请求