Читается после EOF UB? - PullRequest
       51

Читается после EOF UB?

3 голосов
/ 01 июля 2019

Я пытаюсь объединить Poco и boost :: iostreams :: filtering_stream, и я обнаружил две проблемы:

  1. Poco::Net::HTTPChunkedStreamBuf::underflow возвращает EOF только один раз после закрытия сессии.
  2. 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, то замораживания нет.

...