Skip to content

Commit c0dea72

Browse files
committed
fix: 修复 selfupdate 下载 404,适配 tar.gz 格式
1 parent ff6167c commit c0dea72

1 file changed

Lines changed: 25 additions & 2 deletions

File tree

internal/selfupdate/update.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package selfupdate
22

33
import (
4+
"archive/tar"
5+
"compress/gzip"
46
"encoding/json"
57
"fmt"
68
"io"
@@ -34,7 +36,7 @@ func LatestVersion() (string, error) {
3436

3537
// Update 下载最新版本替换自身
3638
func Update(version string) error {
37-
url := fmt.Sprintf("https://github.com/%s/releases/download/%s/cftunnel_%s_%s",
39+
url := fmt.Sprintf("https://github.com/%s/releases/download/%s/cftunnel_%s_%s.tar.gz",
3840
repo, version, runtime.GOOS, runtime.GOARCH)
3941

4042
resp, err := http.Get(url)
@@ -46,6 +48,27 @@ func Update(version string) error {
4648
return fmt.Errorf("下载失败: HTTP %d", resp.StatusCode)
4749
}
4850

51+
// 解压 tar.gz 提取 cftunnel 二进制
52+
gr, err := gzip.NewReader(resp.Body)
53+
if err != nil {
54+
return fmt.Errorf("解压失败: %w", err)
55+
}
56+
defer gr.Close()
57+
58+
tr := tar.NewReader(gr)
59+
for {
60+
hdr, err := tr.Next()
61+
if err == io.EOF {
62+
return fmt.Errorf("tar.gz 中未找到 cftunnel 二进制")
63+
}
64+
if err != nil {
65+
return fmt.Errorf("解压失败: %w", err)
66+
}
67+
if hdr.Name == "cftunnel" {
68+
break
69+
}
70+
}
71+
4972
exe, err := os.Executable()
5073
if err != nil {
5174
return err
@@ -55,7 +78,7 @@ func Update(version string) error {
5578
if err != nil {
5679
return err
5780
}
58-
if _, err := io.Copy(f, resp.Body); err != nil {
81+
if _, err := io.Copy(f, tr); err != nil {
5982
f.Close()
6083
os.Remove(tmp)
6184
return err

0 commit comments

Comments
 (0)