Как получить порцию ответа по curl? - PullRequest
0 голосов
/ 18 мая 2019

Получение url по curl вызывает неограниченный отклик.Когда я открываю URL в браузере, начинается бесконечная загрузка файла.URL принадлежит камере, которая сообщает о событиях, которые происходят на камере, таких как обнаружение движения и так далее.Но это не в форме одного запроса / одного ответа.Это в форме одного запроса / неограниченного ответа.Для этого мне нужно обрезать вывод, чтобы получить только сегмент между «--boundary».В дополнение к описанию я привожу пример:

--boundary
Content-Type: application/xml; charset="UTF-8"
Content-Length: 480

<EventNotificationAlert version="2.0" xmlns="http://www.std-cgi.com/ver20/XMLSchema">
<ipAddress>192.168.14.227</ipAddress>
<portNo>80</portNo>
<protocol>HTTP</protocol>
<macAddress>b8:41:5f:02:81:45</macAddress>
<channelID>1</channelID>
<dateTime>2019-05-18T17:15:02+03:30</dateTime>
<activePostCount>0</activePostCount>
<eventType>videoloss</eventType>
<eventState>inactive</eventState>
<eventDescription>videoloss alarm</eventDescription>
</EventNotificationAlert>
--boundary
Content-Type: application/xml; charset="UTF-8"
Content-Length: 480

<EventNotificationAlert version="2.0" xmlns="http://www.std-cgi.com/ver20/XMLSchema">
<ipAddress>192.168.14.227</ipAddress>
<portNo>80</portNo>
<protocol>HTTP</protocol>
<macAddress>b8:41:5f:02:81:45</macAddress>
<channelID>1</channelID>
<dateTime>2019-05-18T17:15:02+03:30</dateTime>
<activePostCount>0</activePostCount>
<eventType>videoloss</eventType>
<eventState>inactive</eventState>
<eventDescription>videoloss alarm</eventDescription>
</EventNotificationAlert>
--boundary

После этого введения моя проблема: как использовать curl, чтобы получить только первую границу и не ждать окончания ответа, потому чтоэто никогда не заканчивается?Мне нужно резать всякий раз, когда я вижу первый «--ограничный».Другое решение вместо вырезания - определить функцию обратного вызова для извлечения всего, что URL-адрес отправляет в качестве ответа, обработки его и сохранения информации.Как сделать оба?

1 Ответ

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

Использование libcurl

Настройка обратного вызова записи с помощью CURLOPT_WRITEFUNCTION . Эта функция должна проанализировать входящие данные для строки границы и сохранить состояние. Когда он получает вторую граничную строку, он возвращает ошибку, и curl остановит передачу.

Код Psuedo:

write_callback
{
   store_incoming_data(downloaded);
   num_boundaries = boundary_count(downloaded);
   if (num_boundaries >= 2 ) {
      /* we have enough, end it here */
      return error;
   }
   return success; /* continue */
}

Использование инструмента curl

Подсчитайте полученные граничные строки и прекратите чтение после второй. Мой пример здесь использует awk, но вы также можете использовать любой другой инструмент, который вы предпочитаете:

curl https://example.com | awk '/^--boundary/ {a++; if(a>1) exit;} {print $0}'
...