可利用 https://github.com/andybalholm/brotli 加个简单判断就支持br压缩 😀。

go 语言 http 默认未传递Accept-Encoding参数会自动支持gzip压缩,

😱 一旦修改此标记所有解码都需要自己来处理,我选用https://github.com/klauspost/compress解压。

🌰 例子

已经支持gzip, deflate, br三种解码。

👻 brotli.NewReader 需要加个pool优化下!

 1package main
 2
 3import (
 4	"fmt"
 5	"io/ioutil"
 6	"log"
 7	"net/http"
 8
 9	"github.com/andybalholm/brotli"
10	"github.com/klauspost/compress/flate"
11	"github.com/klauspost/compress/gzip"
12
13	"github.com/zc310/headers"
14)
15
16func main() {
17
18	b, err := GetByte("https://zc310.tech/blog/")
19	if err != nil {
20		log.Fatal(err)
21	}
22	fmt.Println(string(b))
23
24}
25func GetByte(url string) ([]byte, error) {
26	var (
27		err  error
28		req  *http.Request
29		resp *http.Response
30	)
31
32	if req, err = http.NewRequest("GET", url, nil); err != nil {
33		return nil, err
34	}
35	req.Header.Set(headers.AcceptEncoding, "gzip, deflate, br")
36	if resp, err = http.DefaultClient.Do(req); err != nil {
37		return nil, err
38	}
39	if resp != nil {
40		defer resp.Body.Close()
41	}
42
43	switch resp.Header.Get(headers.ContentEncoding) {
44	case "br":
45		return ioutil.ReadAll(brotli.NewReader(resp.Body))
46	case "gzip":
47		gr, err := gzip.NewReader(resp.Body)
48		if err != nil {
49			return nil, err
50		}
51		return ioutil.ReadAll(gr)
52	case "deflate":
53		zr := flate.NewReader(resp.Body)
54		defer zr.Close()
55		return ioutil.ReadAll(zr)
56
57	default:
58		return ioutil.ReadAll(resp.Body)
59	}
60}

🍭 参考