Closed
Description
发送的HTTP请求如果发生TCP分包,且截断在HTTP header_field部分,会导致解析出错
例如
GET /test HTTP/1.1
Host: localhost
User-Agent: split-test
Connection: keep-alive
tenantid: 65536
userid: 12324
如果在截断在tenantid中间,解析出来的header如下:
Accept: */*
Connection: keep-alive
Host: localhost
nantid: 65536
te:
User-Agent: split-test
userid: 12324
测试代码:
#!/bin/bash
# 配置参数
TARGET="127.0.0.1"
PORT="8080"
URLPATH="/test"
HOST="localhost"
# 构造完整的HTTP请求
HTTP_REQ="GET $URLPATH HTTP/1.1\r\nHost: $HOST\r\nUser-Agent: split-test\r\nConnection: keep-alive\r\ntenantid: 65536\r\nuserid: 12324\r\n\r\n"
echo $HTTP_REQ
PART1="${HTTP_REQ:0:95}" #在te处截断, 只要在:前截断都有问题
PART2="${HTTP_REQ:95}"
echo "$PART1"
echo "$PART2"
(
printf "%b" "$PART1"
sleep 1
printf "%b" "$PART2"
sleep 3
) | socat -t 10 - TCP:$TARGET:$PORT,keepalive
#main.cpp
#include <iostream>
#include "hv/HttpServer.h"
using namespace hv;
int main(int argc, char **argv) {
HttpServer server;
HttpService service;
service.GET("/test", [](HttpRequest* req, HttpResponse* res) {
for (const auto &header : req->headers)
{
std::cout << header.first << ": " << header.second << std::endl;
}
res->body = "Hello libhv!";
return 200;
});
server.registerHttpService(&service);
server.setHost();
server.setPort(8080);
server.run();
return 0;
}
Metadata
Metadata
Assignees
Labels
No labels