前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >再聊HttpClient的NoHttpResponseException

再聊HttpClient的NoHttpResponseException

原创
作者头像
code4it
发布2024-04-28 13:09:29
1690
发布2024-04-28 13:09:29
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下抛出NoHttpResponseException的调用链

异常堆栈

HttpRequestExecutor.execute

org/apache/http/protocol/HttpRequestExecutor.java

doSendRequest返回null,则执行doReceiveResponse,这里会抛出NoHttpResponseException

doReceiveResponse

org/apache/http/protocol/HttpRequestExecutor.java

这里conn.receiveResponseHeader()会抛出NoHttpResponseException

receiveResponseHeader

org/apache/http/impl/DefaultBHttpClientConnection.java

DefaultBHttpClientConnection的receiveResponseHeader方法在执行responseParser.parse()的时候会抛出NoHttpResponseException

parse

org/apache/http/impl/io/AbstractMessageParser.java

AbstractMessageParser的parse方法执行parseHead会抛出NoHttpResponseException

parseHead

org/apache/http/impl/conn/DefaultHttpResponseParser.java

DefaultHttpResponseParser的parseHead在通过sessionBuffer.readLine(this.lineBuf)读取为-1且count=0时抛出NoHttpResponseException

doSendRequest

org/apache/http/protocol/HttpRequestExecutor.java

doSendRequest在request的header指定需要expect且是http1.1的时候才会通过conn.receiveResponseHeader()去接收response,否则response会返回null;这里先conn.sendRequestHeader(request),针对post等执行conn.sendRequestEntity,接着flush把等待发送的数据发送出去

小结

HttpRequestExecutor.execute方法,doSendRequest返回null,则执行doReceiveResponse,这里会抛出NoHttpResponseException;doSendRequest先执行conn.sendRequestHeader(request),针对post等执行conn.sendRequestEntity,接着flush把等待发送的数据发送出去,针对需要expect且是http1.1的这里的response才可能有值。

单纯从HttpRequestExecutor.execute代码上看抛出NoHttpResponseException时,不法断定服务端是否接收到请求

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异常堆栈
  • HttpRequestExecutor.execute
  • doReceiveResponse
  • receiveResponseHeader
  • parse
  • parseHead
  • doSendRequest
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档