Node.js Nodejs:在OS X中将分块HTTP数据管道传输到文件时出现意外行为
在OSX中,从HTTP向文件传输分块数据时,我遇到了一个奇怪的问题 当触发启动下载的GET HTTP请求时,我的服务器会用以下标题进行响应:Node.js Nodejs:在OS X中将分块HTTP数据管道传输到文件时出现意外行为,node.js,express,Node.js,Express,在OSX中,从HTTP向文件传输分块数据时,我遇到了一个奇怪的问题 当触发启动下载的GET HTTP请求时,我的服务器会用以下标题进行响应: < content-disposition: attachment; filename="resin-Rpi2-0.1.0-0.0.12.img" < content-encoding: gzip < content-type: application/octet-stream < date: Wed, 06 May 2015 19
< content-disposition: attachment; filename="resin-Rpi2-0.1.0-0.0.12.img"
< content-encoding: gzip
< content-type: application/octet-stream
< date: Wed, 06 May 2015 19:03:33 GMT
< X-Frame-Options: DENY
< x-powered-by: Express
< transfer-encoding: chunked
< Connection: keep-alive
如果我运行该脚本,我会正确地获得初始数据块(对应于大约10MB的数据),但是连接会突然终止,并且不会从任何流触发任何其他事件(close、end等)
更奇怪的是注释掉gzip:true
会导致期望的行为(在这种情况下,我当然会得到一个*.img.gz文件),如果保持gzip:true
并将管道连接到进程.stdout
而不是一个文件,它也会像预期的那样工作
还要注意,这个问题在Ubuntu上是不可复制的。这似乎只发生在OSX和Windows中
cURL
也能正常工作:
$ curl -H "Authorization: Bearer [token]" "https://dashboard.resin.io/download?network=ethernet&wifiSsid=&wifiKey=&appId=[appid]" -o image.img
我已经开始分析数据包通信():
我可以看到我的IP突然发送ACK/FIN,而服务器仍在向我发送数据块:
Id = 2984
Source = 192.168.0.16
Destination = 52.4.102.97
Captured Length = 66
Packet Length = 66
Protocol = TCP
Date Received = 2015-05-06 18:11:36 +0000
Time Delta = 10.27246999740601
Information = 52264 -> 443 ([ACK, FIN], Seq=2137874087, Ack=3255859962, Win=10407)
然后是RST和ACK的长循环:
...
192.168.0.16 -> 52.4.102.97, 52264 -> 443 RST
52.4.102.97 -> 192.168.0.16, 443 -> 52264 ACK
...
最后双方达成一致意见
我做错了什么?使用
节点请求
和Express
公开/使用分块HTTP数据的正确方法是什么?我可以使用节点0.12.2
和0.11.16
,重现您的问题,但是在0.10.38
中,您的代码工作得非常好。希望这能有所帮助。@AndrewLavers感谢您抽出时间进行测试,非常感谢。我可以通过手动将块写入目标流(使用destination.write(data)
在data
监听器中)而不是管道来实现,但我仍然在寻找解释。我认为这值得一个githubissue@AndrewLavers我在此处创建了一个问题:。
...
192.168.0.16 -> 52.4.102.97, 52264 -> 443 RST
52.4.102.97 -> 192.168.0.16, 443 -> 52264 ACK
...