Я пытаюсь объединить Poco и boost :: iostreams :: filtering_stream, и я обнаружил две проблемы:
Poco::Net::HTTPChunkedStreamBuf::underflow
возвращает EOF только один раз после закрытия сессии.
boost::iostreams::detail:indirect_streambuf::underflow
: возвращаемое значение зависит от количества успешно прочитанных символов.
Должен ли Poco::Net::HTTPChunkedStreamBuf::underflow
возвращать EOF несколько раз после закрытия сессии или возвращаемое значение в этом случае не определено?
Правильно ли возвращать EOF из boost::iostreams::detail::indirect_streambuf::underflow
, только если он читает 0 символов из streambuf
или должен проверить sgetc()
для EOF и вернуть EOF в этом случае?
class Handler : public HTTPRequestHandler {
public:
void handleRequest(HTTPServerRequest &request,
HTTPServerResponse &response) {
response.setKeepAlive(request.getKeepAlive());
response.setChunkedTransferEncoding(true);
auto &stream = request.stream();
boost::iostreams::filtering_stream<boost::iostreams::input> teeStream;
teeStream.push(boost::iostreams::tee(std::cout));
teeStream.push(stream);
std::string payload;
teeStream >> payload;
std::cerr << payload;
std::cerr << "handleRequest end" << std::endl;
auto &ostr = response.send();
ostr << "12345";
}
};
Я замерзаю, если я запускаю это:
curl 'http://localhost:5959/' -H 'Transfer-Encoding: chunked' -d '1234'
Я обнаружил, что если размер буфера потока фильтрации равен 0, то замораживания нет.