libhv icon indicating copy to clipboard operation
libhv copied to clipboard

websocket在回复101时Content-Length为0导致连接被关闭

Open linxiaoyan opened this issue 1 year ago • 1 comments

使用nginx代理websocket时发现hv在回复101时Content-Length为0,导致nginx将连接关闭。 做了两处修改,请 @ithewei 帮忙review下 1、 文件:HttpMessage.h 代码:

size_t ContentLength() {
    if (content_length == 0) {
        FillContentLength();
    }
    return content_length;
}

改为:

size_t ContentLength() {
    if (content_length == 0 && !IsUpgrade()) {
        FillContentLength();
    }
    return content_length;
}

2、 文件:HttpMessage.cpp 代码:

void HttpMessage::FillContentLength() {
    auto iter = headers.find("Content-Length");
    if (iter != headers.end()) {
        content_length = atoll(iter->second.c_str());
    }
    if (content_length == 0) {
        DumpBody();
        content_length = body.size();
    }
    if (iter == headers.end() && !IsChunked() && content_type != TEXT_EVENT_STREAM) {
        if (content_length != 0 || type == HTTP_RESPONSE) {
            headers["Content-Length"] = hv::to_string(content_length);
        }
    }
}

改为:

void HttpMessage::FillContentLength() {
    auto iter = headers.find("Content-Length");
    if (iter != headers.end()) {
        content_length = atoll(iter->second.c_str());
    }
    if (content_length == 0) {
        DumpBody();
        content_length = body.size();
    }
    if (iter == headers.end() && !IsChunked() && content_type != TEXT_EVENT_STREAM) {
        if ((content_length != 0 || type == HTTP_RESPONSE) && !IsUpgrade()) {
            headers["Content-Length"] = hv::to_string(content_length);
        }
    }
}

linxiaoyan avatar Jun 13 '24 08:06 linxiaoyan

只改第二处就可以了, 另外应该是if (content_length != 0 || (type == HTTP_RESPONSE && !IsUpgrade()) content_length不等于0,无论如何都需要设置Content-Length头部

ithewei avatar Jun 13 '24 08:06 ithewei