Skip to content

TCP分包时Http1Parser对于header解析有误 #737

Closed
@chaojizhuoge

Description

@chaojizhuoge

发送的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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions