遇到了http响应头中的Server字段为空的“灵异事件“

前言

祖传代码坑多是众所周知的事!这不,前段时间就遇到了一个坑,即手撸的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的响应报文

在这里插入图片描述

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值