前言
祖传代码坑多是众所周知的事!这不,前段时间就遇到了一个坑,即手撸的httpclient模块遇到响应报文中的响应头中某个字段值为空时就出现“解析”异常,导致没有响应回调到上层业务!这个httpclient是用c++来写的,用tcp创建连接后发http请求与处理http server的响应。出现该异常时收到的响应报名中Server的值竟然是空值!跟服务器开发以及运维同事排查不是web server配置问题后,判断是用户网络链路的某个网关或网络代理搞的鬼—偷偷的追加了Server但该值为空。记得以前刚工作那会(08年)搞浏览器研发的时候,就经常遇到有些移动网关会更换或增加http的请求头与响应头的内容!
响应头中的Server字段
如上规范的描述上提到网络代理是不能修改该字段的值的,但规范是规范实际实现又是另一回事了呀!还有就是该字段是是由web服务器(如ngix等)配置的,不是由web应用是设置的!
http的实现
首先,http是基于tcp来实现的,即我们需要使用tcp跟web服务器建立一个长连接。然后,双方基于http规范去收发数据(去交互一来一回)。通平情况一个tcp长连接处理一个http请求和处理http响应后就会close连接。只有在支持keep-alive(在keep-alive的工作模式下)一个tcp长连接实例(一般是一个域名对应一个实例)在他的生命周期内会处理多次http的请求与响应。
http的报文格式
- 报文是于行为小单位为组织来组织的,其中一个空行把一次完整的报文为分两个部份,一个是报文头部跟报文主体。
- 报文分为请求报文跟响应报文,名符其实,请求报文是请求方组织与发送出去的。响应报文当然是响应方组织与回复的。这两种报名主要区别在于报文首行的内容组织。
http的请求报名
注意:当请求方法为get方法,url的值是path + query参数的,所以url很长的get请求是危险的事。要不就是httpclient(httpp的实现者)没有处理好这个url的长度,或htpp代码或网关没有对get请求的url的长度有限制等等都会达到请求失败!
http的响应报文
参考资料