2

我有一个已经用 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 是出于历史原因——当时这个嵌入式平台上没有太多其他语言选项。
  • 提前收集所有 URL 并传递给 wget 并不容易。
  • 在 perl/python 等中重新实现不是一个快速的解决方案。
  • 我已经研究过尝试将 url 传送到命名管道并进入 wget -i - ,但这是行不通的。数据被缓冲,并且 unbuffer 不可用 - 我认为 wget 在处理之前收集所有 URL 直到 EOF。
  • 数据很小,因此缺乏压缩不是问题。
4

1 回答 1

2

连接重用的问题来自 HTTP 1.0 标准,而不是 gawk。要重用连接,您必须使用 HTTP 1.1 或尝试其他一些 HTTP 1.0 的非标准解决方案。不要忘记Host:在您的 HTTP/1.1 请求中添加标头,因为它是强制性的。

在阅读响应正文时,您对缺乏稳健性的看法是正确的。对于面向线路的协议,这不是问题。此外,即使在使用 HTTP 1.1 时,如果您的脚本在不应该等待更多数据时锁定等待更多数据,服务器将再次由于不活动而关闭连接。

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

于 2012-04-06T00:25:44.627 回答