如何通过curl获得部分响应?

时间:2019-05-18 12:56:20

标签: curl libcurl

通过curl获取URL会引起无限响应。当我在浏览器中打开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 :(得分:0)

使用libcurl

使用CURLOPT_WRITEFUNCTION设置写回调。该函数需要解析边界字符串的传入数据并保持状态。收到第二个边界字符串时,它将返回错误,并且curl将停止传输。

伪代码:

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 */
}

使用卷曲工具

计算接收到的边界字符串,并在第二秒后停止读取。我的示例在这里使用awk,但您也可以使用喜欢的任何其他工具:

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