记一次Nginx配置错误导致tomcat服务无法解析text/xml请求

       事件的背景是这样,Y项目进行公司的nettyHttp(公司自研发封装)服务框架转回tomcat,其中有一个微信事件消息的接收类Controller,在解析微信服务端推送的事件text/xml消息时,解析报错,Premature end of file(文件提前结束)。

        经过多次排查,在微信后台如果配置的是后端直接暴露的接口地址,那么微信推送的消息是可以正常解析的,而实际生产,中间环节还有一处nginx的反向代理,所以灵机一动,开始检查nginx的相关配置。


1  location ~ /openapi {
2         //省略部分代码
3         proxy_set_header Content-type application/x-wwww-form-urlencoded;
4         proxy_pass http://xxx.com;
5  }

        似乎是第三行配置的问题,然后注释此行配置,至此解析得以成功。

       接着就开始思考,可能是tomcat对这个做了处理,从而拉取tomcat源码进行分析。发现公司封装的nettyHttp框架,针对此类型的Content-type没有做特殊处理,所以可以正常解析微信服务端推送事件消息。以下是tomcat部分代码。

package org.apache.catalina.connector;

public class Request implements HttpServletRequest {

    protected void parseParameters() {

        //省略部分代码,微信推送消息为text/xml,所以这里直接返回了
        if (!("application/x-www-form-urlencoded".equals(contentType))) {
            success = true;
            return;
        }
        //application/x-www-form-urlencoded 类型请求做如下处理
        int len = getContentLength();    
        if (len > 0) {
            
            int maxPostSize = connector.getMaxPostSize();
            //判断是否超过post请求最大值   参数在server.xml的connector标签添加
            if ((maxPostSize >= 0) && (len > maxPostSize)) {
                Context context = getContext();
                if (context != null && context.getLogger().isDebugEnabled()) {
                    context.getLogger().debug(
                            sm.getString("coyoteRequest.postTooLarge"));
                }
                checkSwallowInput();
                parameters.setParseFailedReason(FailReason.POST_TOO_LARGE);
                return;
            }
            byte[] formData = null;
            if (len < CACHED_POST_LEN) {
                if (postData == null) {
                    postData = new byte[CACHED_POST_LEN];
                }
                formData = postData;
            } else {
                formData = new byte[len];
            }
            try {
                if (readPostBody(formData, len) != len) {
                    parameters.setParseFailedReason(FailReason.REQUEST_BODY_INCOMPLETE);
                    return;
                }
            } catch (IOException e) {
                // Client disconnect
                Context context = getContext();
                if (context != null && context.getLogger().isDebugEnabled()) {
                    context.getLogger().debug(
                            sm.getString("coyoteRequest.parseParameters"),
                            e);
                }
                parameters.setParseFailedReason(FailReason.CLIENT_DISCONNECT);
                return;
            }
            //处理parameters
            parameters.processParameters(formData, 0, len);
        } //省略else if

    }


}

        以上仅仅是自己的一些分析,不够深入,如有错误,还请各位同学指正。

转载于:https://my.oschina.net/chae/blog/1824145

你可能感兴趣的:(记一次Nginx配置错误导致tomcat服务无法解析text/xml请求)