Асинхронный WinHTTP с чанковыми данными - читать весь чанк - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь прочитать поток потоковых уведомлений EWS в асинхронном режиме в WinHTTP, но у меня возникают проблемы при чтении всего фрагмента - не меньше, не больше.

Если я использую обратный вызов WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE, я получаю меньше данных, чем сервер отправляет в чанке, и WinHttpReadData запускает обратный вызов WINHTTP_CALLBACK_STATUS_READ_COMPLETE только с запрошенными мной данными.Если я запрашиваю больше (например, фиксированный размер буфера 8 КБ), WINHTTP_CALLBACK_STATUS_READ_COMPLETE не срабатывает, пока не будет возвращен весь буфер, что означает, что он будет ждать следующего уведомления (всякий раз, когда оно придет), прежде чем возвращать какие-либо данные.

Я действительно не хочу прибегать к чтению одного байта за раз, пока не получу хорошо отформатированный XML;Я хочу получить данные на уровне WinHTTP без знания его формата.

Подробнее:

  1. Когда срабатывает обратный вызов WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE, я звоню WinHttpReceiveResponseчтобы начать прослушивание ответа с сервера.

  2. Когда срабатывает WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE, я проверяю код состояния HTTP и вызываю WinHttpQueryDataAvailable.

  3. WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE запускает и сообщает мне, сколько данных доступно.Я звоню WinHttpReadData, указывая, что размер данных

  4. WINHTTP_CALLBACK_STATUS_READ_COMPLETE срабатывает и выдает мне запрошенные данные.

Что мне делать дальше?Звоните WinHttpQueryDataAvailable снова?Но как я узнаю, какой размер порции?Есть ли способ запросить запрос, чтобы выяснить размер текущего чанка?

...