通过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作为响应发送的所有内容并对其进行处理并保留信息。 怎么办?
答案 0 :(得分:0)
使用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}'