github.com/Mrs4s/go-cqhttp@v1.2.0/internal/selfupdate/update_others.go (about) 1 //go:build !windows 2 3 package selfupdate 4 5 import ( 6 "archive/tar" 7 "bytes" 8 "compress/gzip" 9 "crypto/sha256" 10 "errors" 11 "io" 12 "net/http" 13 ) 14 15 // update go-cqhttp自我更新 16 func update(url string, sum []byte) error { 17 resp, err := http.Get(url) 18 if err != nil { 19 return err 20 } 21 defer resp.Body.Close() 22 wc := writeSumCounter{ 23 hash: sha256.New(), 24 } 25 rsp, err := io.ReadAll(io.TeeReader(resp.Body, &wc)) 26 if err != nil { 27 return err 28 } 29 if !bytes.Equal(wc.hash.Sum(nil), sum) { 30 return errors.New("文件已损坏") 31 } 32 gr, err := gzip.NewReader(bytes.NewReader(rsp)) 33 if err != nil { 34 return err 35 } 36 tr := tar.NewReader(gr) 37 for { 38 header, err := tr.Next() 39 if err != nil { 40 return err 41 } 42 if header.Name == "go-cqhttp" { 43 err, _ := fromStream(tr) 44 if err != nil { 45 return err 46 } 47 return nil 48 } 49 } 50 }