gpt4 book ai didi

http - gawk 在没有超时的情况下通过管道读取最后一位二进制数据?

转载 作者:可可西里 更新时间:2023-11-01 16:34:42 25 4
gpt4 key购买 nike

我有一个已经用 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。
  • 数据很小,因此缺少压缩不是问题。

最佳答案

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

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

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

关于http - gawk 在没有超时的情况下通过管道读取最后一位二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10037301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com