Как реализовать потоковую передачу http с помощью libcurl - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь использовать CURL для реализации потоковых уведомлений Microsoft EWS, т. Е. Потоковой передачи HTTP, когда запрос отправляется один раз, а сервер отвечает заголовком «Transfer Encoding: chunked».Сервер отправит несколько пакетов поддержки активности или уведомлений перед окончательным пакетом.Чанки завершаются с помощью cr lf.

Если я создаю стандартный клиент CURL, то curl_easy_perform не вернется, пока не будет получен окончательный чанк, тогда как мне нужно curl_easy_perform для возврата после получения каждого чанка, после чего приложение будет обрабатывать полученныйchunk и вызов curl_easy_perform для ожидания следующего чанка.

Я понимаю, что могу обработать чанк в обратном вызове CURLOPT_WRITEFUNCTION, но архитектура приложения этого не допускает (это плагин GSOAP)

Есть ли какие-либо предложения, кроме перехода на CURLOPT_CONNECT_ONLY и обработки записи всех последующих операций чтения с помощью curl_easy_send и curl_easy_recv?Который кажется позором, поскольку мне придется дублировать форматирование и синтаксический анализ CURL.

Alan

1 Ответ

0 голосов
/ 19 мая 2019

curl_easy_perform является полностью синхронным и вернется только после завершения всей передачи. На самом деле нет никакого способа обойти это (вы уже упомянули CURLOPT_CONNECT_ONLY, и я бы не рекомендовал этого) с этим API.

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

Используя этот интерфейс, curl_multi_perform будет делать только столько, сколько может, без блокировки и возврата управления обратно к вашей функции. Однако он возлагает на ваш код ответственность за ожидание активности сокетов и повторный вызов libcurl, когда он есть.

(Извините, но я не знаю, какие ограничения есть у "плагина GSOAP", и вы не указали их здесь, так что, возможно, это все дерьмо)

...