可利用 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}