transport.go 976 B

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