11package selfupdate
22
33import (
4+ "archive/tar"
5+ "compress/gzip"
46 "encoding/json"
57 "fmt"
68 "io"
@@ -34,7 +36,7 @@ func LatestVersion() (string, error) {
3436
3537// Update 下载最新版本替换自身
3638func 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