transport.go 901 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package http
  2. import (
  3. "io"
  4. "net/http"
  5. "github.com/andybalholm/brotli"
  6. "github.com/klauspost/compress/gzhttp"
  7. )
  8. type Transport struct {
  9. base http.RoundTripper
  10. }
  11. func NewTransport() *Transport {
  12. return &Transport{
  13. base: gzhttp.Transport(http.DefaultTransport, gzhttp.TransportAlwaysDecompress(true)),
  14. }
  15. }
  16. type brotliReadCloser struct {
  17. io.Reader
  18. closer io.Closer
  19. }
  20. func (b *brotliReadCloser) Close() error {
  21. return b.closer.Close()
  22. }
  23. func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
  24. resp, err := t.base.RoundTrip(req)
  25. if err != nil {
  26. return nil, err
  27. }
  28. if resp.Header.Get("Content-Encoding") == "br" {
  29. resp.Body = &brotliReadCloser{
  30. Reader: brotli.NewReader(resp.Body),
  31. closer: resp.Body,
  32. }
  33. resp.Header.Del("Content-Encoding")
  34. resp.Header.Del("Content-Length")
  35. resp.ContentLength = -1
  36. resp.Uncompressed = true
  37. }
  38. return resp, nil
  39. }