前言

祖传代码坑多是众所周知的事!这不,前段时间就遇到了一个坑,即手撸的httpclient模块遇到响应报文中的响应头中某个字段值为空时就出现“解析”异常,导致没有响应回调到上层业务!这个httpclient是用c++来写的,用tcp创建连接后发http请求与处理http server的响应。出现该异常时收到的响应报名中Server的值竟然是空值!跟服务器开发以及运维同事排查不是web server配置问题后,判断是用户网络链路的某个网关或网络代理搞的鬼—偷偷的追加了Server但该值为空。记得以前刚工作那会(08年)搞浏览器研发的时候,就经常遇到有些移动网关会更换或增加http的请求头与响应头的内容!

响应头中的Server字段

quarkus Restclient 请求头注解 请求头中client信息为空_响应报文


如上规范的描述上提到网络代理是不能修改该字段的值的,但规范是规范实际实现又是另一回事了呀!还有就是该字段是是由web服务器(如ngix等)配置的,不是由web应用是设置的!

quarkus Restclient 请求头注解 请求头中client信息为空_响应报文_02

http的实现

首先,http是基于tcp来实现的,即我们需要使用tcp跟web服务器建立一个长连接。然后,双方基于http规范去收发数据(去交互一来一回)。通平情况一个tcp长连接处理一个http请求和处理http响应后就会close连接。只有在支持keep-alive(在keep-alive的工作模式下)一个tcp长连接实例(一般是一个域名对应一个实例)在他的生命周期内会处理多次http的请求与响应。

http的报文格式

  • 报文是于行为小单位为组织来组织的,其中一个空行把一次完整的报文为分两个部份,一个是报文头部跟报文主体。
  • 报文分为请求报文跟响应报文,名符其实,请求报文是请求方组织与发送出去的。响应报文当然是响应方组织与回复的。这两种报名主要区别在于报文首行的内容组织。

http的请求报名

quarkus Restclient 请求头注解 请求头中client信息为空_http_03


注意:当请求方法为get方法,url的值是path + query参数的,所以url很长的get请求是危险的事。要不就是httpclient(httpp的实现者)没有处理好这个url的长度,或htpp代码或网关没有对get请求的url的长度有限制等等都会达到请求失败!

http的响应报文

quarkus Restclient 请求头注解 请求头中client信息为空_c++_04

参考资料