An HTTP line is larger than 4096

2019-12-31  本文已影响0人  红色的飞猪

异常背景

  1. httpserver 使用的是netty实现
  2. httpclient 采用get请求,其中一个参数为content,content在一定情况下会有超长内容的情况
  3. debug 跟进代码确认完整异常如下:
io.netty.handler.codec.TooLongFrameException: An HTTP line is larger than 4096 bytes.

debug源码

   入口 --   ch.pipeline().addLast(new HttpRequestDecoder());
  主要代码执行过程:
    >> io.netty.handler.codec.http.HttpRequestDecoder
     >> io.netty.handler.codec.http.HttpObjectDecoder#HttpObjectDecoder()
            >>io.netty.handler.codec.http.HttpObjectDecoder.LineParser#parse()
               >>io.netty.handler.codec.http.HttpObjectDecoder.HeaderParser#parse()
                  >>io.netty.handler.codec.http.HttpObjectDecoder.HeaderParser#process()
LineParser

结论

  1. 完整请求uri字节流-bytebuffer
  2. HeaderParser 完成bytebuffer中二进制到字符的解码,在解码过程中,会将char 扔到AppendableCharSequence里面。
    3.在放char append过程中校验最大字符值,因此当大于4096抛出异常。

解决方案

httpclient 将get请求调整为post 请求.

上一篇下一篇

猜你喜欢

热点阅读