HTTP/2: support for large responses (#4284)

This commit is contained in:
Julien Maffre 2022-09-29 14:14:13 +01:00 коммит произвёл GitHub
Родитель 22b7574685
Коммит af47b3f85f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 13 добавлений и 12 удалений

Просмотреть файл

@ -1,4 +1,4 @@
___ ___ ___ _^_
(o o) (o <) (o o) (^ ^)
( V ) ( V ) ( V ) ( V )
/--m-m- /--m-m- /--m-m- /--m-m-

Просмотреть файл

@ -37,21 +37,22 @@ namespace http2
LOG_TRACE_FMT("http2::read_callback: {}", length); LOG_TRACE_FMT("http2::read_callback: {}", length);
auto* stream_data = get_stream_data(session, stream_id); auto* stream_data = get_stream_data(session, stream_id);
auto& response_body = stream_data->response_body; auto& response_body = stream_data->response_body;
size_t to_read =
std::min(response_body.size() - stream_data->current_offset, length);
if (response_body.size() > 0) if (response_body.size() > 0)
{ {
if (length < response_body.size())
{
throw std::runtime_error("Read too large");
}
// Note: Explore zero-copy alternative (NGHTTP2_DATA_FLAG_NO_COPY) // Note: Explore zero-copy alternative (NGHTTP2_DATA_FLAG_NO_COPY)
memcpy(buf, response_body.data(), response_body.size()); memcpy(buf, response_body.data() + stream_data->current_offset, to_read);
stream_data->current_offset += to_read;
}
if (stream_data->current_offset >= response_body.size())
{
*data_flags |= NGHTTP2_DATA_FLAG_EOF;
stream_data->current_offset = 0;
response_body.clear();
} }
*data_flags |= NGHTTP2_DATA_FLAG_EOF;
if (!stream_data->trailers.empty()) if (!stream_data->trailers.empty())
{ {
@ -76,7 +77,7 @@ namespace http2
} }
} }
return response_body.size(); return to_read;
} }
static ssize_t read_callback_client( static ssize_t read_callback_client(