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  }