summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-05-21 11:14:47 +0800
committerruki <[email protected]>2022-05-21 11:14:47 +0800
commit6b90b7481d63f5d0c6d9211c1be1ed8dd05ed99e (patch)
treec098a23f1a5e47f3467b0494ac56da2e8e1e9a8a
parent6eb2c52ef4085dfe1244b2b9f23bdc3a8e52ec28 (diff)
improve stream
-rw-r--r--xmake/modules/private/service/stream.lua35
1 files changed, 22 insertions, 13 deletions
diff --git a/xmake/modules/private/service/stream.lua b/xmake/modules/private/service/stream.lua
index 78527927f..c8f58efad 100644
--- a/xmake/modules/private/service/stream.lua
+++ b/xmake/modules/private/service/stream.lua
@@ -356,23 +356,32 @@ function stream:recv_file(filepath)
if size == 0 then
return size
end
+ local result
+ local tmpfile = os.tmpfile({ramdisk = false})
if bit.band(flags, HEADER_FLAG_COMPRESS_LZ4) == HEADER_FLAG_COMPRESS_LZ4 then
- return self:_recv_compressed_file(lz4.decompress_stream(), filepath, size)
- end
- local buff = self._BUFF
- local recv = 0
- local file = io.open(filepath, "wb")
- while recv < size do
- local data = self:recv(buff, math.min(buff:size(), size - recv))
- if data then
- file:write(data)
- recv = recv + data:size()
+ result = self:_recv_compressed_file(lz4.decompress_stream(), tmpfile, size)
+ else
+ local buff = self._BUFF
+ local recv = 0
+ local file = io.open(tmpfile, "wb")
+ while recv < size do
+ local data = self:recv(buff, math.min(buff:size(), size - recv))
+ if data then
+ file:write(data)
+ recv = recv + data:size()
+ end
+ end
+ file:close()
+ if recv == size then
+ result = recv
end
end
- file:close()
- if recv == size then
- return recv
+ if result then
+ os.mv(tmpfile, filepath)
+ else
+ os.tryrm(tmpfile)
end
+ return result
end
end