libhv
libhv copied to clipboard
websocket在回复101时Content-Length为0导致连接被关闭
使用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);
}
}
}
只改第二处就可以了,
另外应该是if (content_length != 0 || (type == HTTP_RESPONSE && !IsUpgrade())
content_length不等于0,无论如何都需要设置Content-Length头部