gawk通过管道读取最后一位二进制数据而没有超时?

时间:2012-04-05 23:13:34

标签: http awk wget gawk

我有一个已经用gawk编写的程序,可以从互联网上下载大量的小信息。 (媒体扫描仪和索引器)

目前它启动wget以获取信息。这很好,但我想简单地重用调用之间的连接。它可能运行程序可能会对相同的api服务进行200-2000次调用。

我刚刚发现gawk可以建立联网并找到geturl 然而,该页面底部的建议得到了很好的注意,我找不到一种简单的方法来读取最后一行并保持连接打开。

由于我主要阅读JSON数据,我可以设置RS =“}”并在体长达到预期的内容长度时退出。这可能会破坏任何尾随的空白区域。我想要一个更强大的方法。有没有人有更好的方法在awk中实现零星的http请求,以保持连接打开。目前我有以下结构...

con="/inet/tcp/0/host/80";

send_http_request(con);

RS="\r\n";

read_headers();

# now read the body - but do not close the connection...
RS="}"; # for JSON
while ( con |& getline bytes ) {
    body = body bytes RS;
    if (length(body) >= content_length) break;
    print length(body);
}
# Do not close con here - keep open

遗憾的是,这一件小事似乎在破坏这里的所有潜力。如果有人问:) ..

  • awk最初是出于历史原因选择的 - 当时这个嵌入式平台上没有太多其他语言选项。
  • 提前收集所有网址并传递到wget并不容易。
  • 在perl / python等中重新实现并不是一个快速的解决方案。
  • 我已经看过尝试将网址管道传输到命名管道并进入wget -i - 这不起作用。数据被缓冲,unbuffer不可用 - 我认为wget会在处理之前收集所有URL,直到EOF。
  • 数据很小,因此不存在压缩问题。

1 个答案:

答案 0 :(得分:2)

连接重用的问题来自HTTP 1.0标准,而不是gawk。要重复使用该连接,您必须use HTTP 1.1 or try some other non-standard solutions for HTTP 1.0。不要忘记在HTTP / 1.1请求中添加Host:标头,因为它是必需的。

在阅读回复正文时,你是否正确缺乏稳健性。对于面向行的协议,这不是问题。此外,即使使用HTTP 1.1,如果脚本在不应该等待更多数据时锁定,服务器也会因为不活动而再次关闭连接。

作为最后的手段,你可以在你喜欢的任何语言中编写自己的HTTP检索器,它重用连接(都是我假设的同一个远程主机),并为你插入一个特殊的记录分隔符。然后,您可以控制它from the awk script