`
fredlong
  • 浏览: 132970 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

不规范的Http 204应答触发Apache的Http协议解析失败

阅读更多

今天在Server发现一个错误日志:

 

写道
ParseException#Not a valid protocol version: ""HTTP/1.1 201 Created#org.apache.http.ParseException: Not a valid protocol version: ""HTTP/1.1 201 Created
org.apache.http.message.BasicLineParser.parseProtocolVersion(BasicLineParser.java:147)
org.apache.http.message.BasicLineParser.parseStatusLine(BasicLineParser.java:365)
org.apache.http.impl.nio.codecs.DefaultHttpResponseParser.createMessage(DefaultHttpResponseParser.java:114)
org.apache.http.impl.nio.codecs.DefaultHttpResponseParser.createMessage(DefaultHttpResponseParser.java:51)

 

找到对应的代码:

 

 

    public ProtocolVersion parseProtocolVersion(final CharArrayBuffer buffer,
                                                final ParserCursor cursor) throws ParseException {
        Args.notNull(buffer, "Char array buffer");
        Args.notNull(cursor, "Parser cursor");
        final String protoname = this.protocol.getProtocol();
        final int protolength  = protoname.length();

        final int indexFrom = cursor.getPos();
        final int indexTo = cursor.getUpperBound();

        skipWhitespace(buffer, cursor);

        int i = cursor.getPos();

        // long enough for "HTTP/1.1"?
        if (i + protolength + 4 > indexTo) {
            throw new ParseException
                ("Not a valid protocol version: " +
                 buffer.substring(indexFrom, indexTo));
        }

        // check the protocol name and slash
        boolean ok = true;
        for (int j=0; ok && (j<protolength); j++) {
            ok = (buffer.charAt(i+j) == protoname.charAt(j));
        }
        if (ok) {
            ok = (buffer.charAt(i+protolength) == '/');
        }
        if (!ok) {
            throw new ParseException
                ("Not a valid protocol version: " +
                 buffer.substring(indexFrom, indexTo));
        }

 

 

说明协议栈在读取buffer.substring(indexFrom, indexTo)的时候读到的是""HTTP/1.1 201 Created,前面有两个双引号。抓包发现,在同一个长连接上出现这种情况:

 

写道
GET /check HTTP/1.1
Host: abc.com
Connection: keep-alive
Cache-Control: max-age=0
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6


HTTP/1.1 204 OK
Date: Sat, 12 Nov 2016 04:41:29 GMT
Content-Length: 2

""Get /creat HTTP/1.1
Host: abc.com
Connection: keep-alive
Cache-Control: max-age=0
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6

HTTP/1.1 201 Created
Date: Sat, 12 Nov 2016 04:41:29 GMT
Content-Length: 2

...
 
大家注意我标红的这个应答,返回的是204,却标明了Content-Length: 2,这个应答是不符合HTTP协议定义的:
https://tools.ietf.org/html/rfc7230#section-3.3.1

3.3.3. Message Body Length

   The length of a message body is determined by one of the following
   (in order of precedence):

   1.  Any response to a HEAD request and any response with a 1xx
       (Informational), 204 (No Content), or 304 (Not Modified) status
       code is always terminated by the first empty line after the
       header fields, regardless of the header fields present in the
       message, and thus cannot contain a message body.

问题定位:

 

在一条长连接上返回的两个应答中,第一个应答返回的应答码是204,却在body中带了两个引号,违反了HTTP1.1的规范,导致遵守了该规范的Apache的读取第一个应答的线程没有从流中读出最后两个引号,而读取第二个应答的时候发现前两个字节是两个双引号,不是HTTP/1.1,直接抛出异常。

 

 

结论,204的应答一定要遵守规范,不能再body中写数据,否则会污染流中的数据,影响长连接上对下个数据包的读取。

分享到:
评论

相关推荐

    【原创示例代码】JAVA解析GBT32960协议 - (第一部分)数据包结构

    本资源内,包含原创代码如下: 1、Command_0x02.java 运行主类mian()方法类 ...以上通过JAVA实现报文协议解析的原创代码,即十六进制报文解析的示例代码。【注:可关注本作者关于报文解析,该系列的示例源码和文章】

    代理服务器sock5协议解析

    1.介绍 2.现有的协议 3.基于TCP协议的客户 4.请求 5.地址 6.应答 7.基于UDP协议的客户 8. 安全性考虑 9. 参考书目

    HTTP协议详解.pdf

    HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系 统。它于1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW 中使用的是HTTP/1.0 的第六版,...

    HTTP应答码

    HTTP应答码 各种类型的应答码以及对应的描述 方便查阅

    Arp地址解析协议

    地址解析协议(Address Resolution Protocol,ARP)就是用来确定这些映象的协议。 ARP工作时发出包含希望IP地址的以太网广播数据包,收到ARP请求包的主机用自己的IP地址与希望IP地址做对比,一致则回复一份包含IP地址...

    Sip协议 SIP协议应答码

    注意1xx应答并不是可靠传输的。他们不会导致客户端传送一个ACK应答。临时性质的(1xx)应答可以包含消息体,包含会话描述。 1.1 100 Trying 这个应答表示下一个节点的服务器已经接收到了这个请求并且还没有执行这...

    智能卡复位应答ATR解析

    智能卡ATR解析工具。输入的是ATR,通过解析TA、TB、TC、TD,打印出7816通信协议相关信息

    HTTP协议详解(真的很经典)

    引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善...另一方面,在服务器不需要先前信息时它的应答就较快。

    http协议详解

    1.支持客户/服务器模式。 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的...另一方面,在服务器不需要先前信息时它的应答就较快。

    易语言Smtp协议应答机制

    易语言Smtp协议应答机制源码,Smtp协议应答机制,数据到达,上线事件,取中间,pq完整解码,十六进制文本到字节集,UTF8转GBK,BASE64解码

    16个经典面试问题与应答思路解析

    16个经典面试问题与应答思路解析!希望对大家有帮助!

    串口中断即时解析用户自定义通讯协议的编程实现-协议内带数据长度及接收应答处理

    串口中断即时解析用户自定义通讯协议的编程实现-协议内带数据长度及接收应答处理

    蓝牙BLE部分协议中文版 - 史上最全分析

    PARTA物理层规范1、简介 2、频率带宽和信道分配 3、发送特性 3.1调制特性 4、接收特性 4.2干扰性能 5、附录 6附录B-工作条件PARTB链路层规范 1、一般性描述 2、空中接口数据包 2.1数据包格式 3、位流处理 4、空中...

    技术规范书及应答.doc

    技术规范书及应答.doc

    技术规范书与应答.doc

    技术规范书与应答.doc

    SOAP协议规范(中文版).doc

    该SOAP协议规范,不是很完整,此中文文档只是帮助理解,内容并不详细!具体请参照英文文档!此文档目录如下: 目录 1. SOAP简介 2 1.1 SOAP1.2基本内容 2 1.2 符号约定 3 1.3 SOAP消息举例 3 2. SOAP消息交换模型 4 ...

    Web应用安全:HTTP协议的由来.pptx

    首先传输协议就说明http首先是一套协议,是一套法则,是计算机与计算机之间使用的一种合约,而传输指的就是在请求方和应答方之间传输信息,也就是数据包,这种传输是双向的,也就是同一台主机可以做为请求方也可以做...

    初级人工智能训练师考试答案补充版.pdf

    初级人工智能训练师考试答案补充版.pdf

    HTTP协议详解

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和...另一方面,在服务器不需要先前信息时它的应答就较快。

Global site tag (gtag.js) - Google Analytics