Не читает все данные из разъема boost :: asio - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь tp получить список электронных писем через IMAP, используя сокет boost :: asio синхронно. Моя реализация

std::string cmail::ImapClient::execute(const std::string &cmd)
{
    boost::system::error_code error;
    boost::asio::write(socket, boost::asio::buffer(cmd), error);
    if(error)
    {
        spdlog::error("Failed to dispatch command " + cmd + " because " + error.message());
        return ""; 
    }

    boost::asio::streambuf buffer;
    boost::asio::read_until(socket, buffer, '\n', error);
    if(error)
    {
        spdlog::error("Failed to receive response for command " + cmd + " because " + error.message());
        return "";
    }

    boost::asio::streambuf::const_buffers_type data = buffer.data();
    std::string response(boost::asio::buffers_begin(data), boost::asio::buffers_begin(data) + buffer.size());
    if(spdlog::default_logger()->level() == spdlog::level::trace)
    {
        std::string s = response;
        s.pop_back();
        spdlog::trace("S: " + s);
    }

    return response;
}

Фактический cmd Я передаю этот метод A002 FETCH 1:* (BODY.PEEK[HEADER.FIELDS (DATE FROM SUBJECT)] FLAGS). В почтовом ящике 5 писем. Так что 1.* должен получить 5 писем. Однако я получаю только полную информацию электронной почты для писем 1 и 2 и только поле «От» 3-го письма.

Если я изменю команду на A002 FETCH 2:5 (BODY.PEEK[HEADER.FIELDS (DATE FROM SUBJECT)] FLAGS), я снова получу ожидаемый контент для писем 2 и 3, в то время как response не содержит ничего после поля «От» 4-го числа.

РЕДАКТИРОВАТЬ:

Я проверяю, что в папке «Входящие» есть 5 писем, выдав команда A001 SEARCH SINCE 10-Apr-2020, на которую сервер отвечает * SEARCH 1 2 3 4 5.

Что касается того, как я проверяю, что сервер ответил данными для 5 электронных писем, согласно протоколу spe c, сервер должен завершить sh ответ с A002 OK ..., A002 NO ... или A002 BAD .... Ответ, который я получаю, не отправляет это завершающее предложение. Кроме того, в обоих случаях, которые выглядят так, будто полезная нагрузка усекается, размер ответа составляет 512 символов. Не уверен, насколько строгой является эта проверка, но число байтов в 512, кажется, указывает на некоторое ограничение размера где-то ...

...