为什么Rebol Raw Http Head请求获取远程文件大小与信息相比非常慢?功能

时间:2010-12-05 22:59:51

标签: rebol

回复信息?非常快:

i: info? http://cdimage.ubuntu.com/daily/current/natty-alternate-i386.iso
i/size

使用http head请求可能需要10倍的时间?

port: open tcp://cdimage.ubuntu.com:80
insert port "HEAD /daily/current/natty-alternate-i386.iso HTTP/1.1 ^/"
insert port "Host: cdimage.ubuntu.com ^/^/"
out: copy ""
while [data: copy port][append out data]
block: parse out rejoin [": " newline]
select block "Content-Length"

1 个答案:

答案 0 :(得分:2)

在这种情况下,端口模式是负责任的。在哪里使用等待模式的缓冲I / O(默认情况下是打开的)。

在http中,当您读取所有服务器字节时,客户端负责关闭端口。

由于您基本上使用tcp直接使用插入端口,因此您还负责检测请求的结束并在有足够的字节到达时关闭端口。这只能在执行低级别的tcp乐趣时在/ lines或/ no-wait中完成。

阅读和信息的东西?为你做。

while [data:copy port] [追加数据]

在超时发生之前不会终止(在REBOL中默认为30秒)。

另外,您的请求似乎有误......

试试这个:

port: open/lines tcp://cdimage.ubuntu.com:80
insert port {HEAD /daily/current/natty-alternate-i386.iso HTTP/1.0
Accept: */*
Connection: close
User-Agent: REBOL View 2.7.7.3.1
Host: cdimage.ubuntu.com
}
out: form copy port
block: parse out none ;rejoin [": ^/"]
probe select block "Content-Length:"

这里似乎添加/行将阻止等待。它可能与http方案在open上处理行模式的方式有关。

在文档和网络上查看REBOL端口模式,它在各处得到了很好的解释。

如果你使用了trace / net,你就会意识到收到的所有数据包和解释器还在等待。顺便说一句,你的代码实际上在我的测试中返回了错误400.