【C语言】Socket发送HTTP-TCP请求,数据有字符串插入
问题描述:
场景:编写Socket接口,向LOKI发送POST请求查询数据
BUG发现位置:通过cJSON读取时间戳,发现被截断。
现象:通过read()去读取返回的数据,数据行中被插入字符;如下
connPool-\u003ecurSize: 1."],["1637041
8000
205908200000","2021-11-16 13:40:05.908200 [debug ]:[cs:] [createConnection:1831] [DBC] [0x9ca5b70-DB_MYSQL] connPool-\u003ecurSize: 2."],
时间戳:1637041205908200000被截断。
过程:
- 看read()返回的数据是否正常 结果:异常
- read()的上下文是否出现内存溢出等。 结果:没有内存溢出
- 抓包,看获取的初始报文是否异常。 结果:异常
- postman发送请求,看获取的报文是否异常。 结果:正常
- 考虑是否是请求头出错。比对和postman的请求头。 结果:两者请求头一致
- 分析报文。收到的报文以data-chunk 分块。查看响应头。有Transfer-Encoding: "chunked",而没有content-Length: ""
百度:socket chunked。
解决方案:
- 对socket的inputstream做chunked解析。
- 将HTTP版本降为HTTP 1.0,HTTP 1.0的版本不支持chunked的传输方式。
chunked简单介绍:
格式:
head
\r\n // 这是响应头和响应体之间的分隔
length\r\n // 接下来的消息块长度length
body\n
length\r\n
body\n
- Transfer-Encoding: "chunked"和content-Length: ""是互斥的。
- chunked的方式会在每个块的头部加上分隔符(块长度),并且解析的时候要注意计算上第一个\r\n的长度。