encoding_wrappers.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package fetcher // import "miniflux.app/v2/internal/reader/fetcher"
  4. import (
  5. "compress/gzip"
  6. "io"
  7. "github.com/andybalholm/brotli"
  8. )
  9. type brotliReadCloser struct {
  10. body io.ReadCloser
  11. brotliReader io.Reader
  12. }
  13. func NewBrotliReadCloser(body io.ReadCloser) *brotliReadCloser {
  14. return &brotliReadCloser{
  15. body: body,
  16. brotliReader: brotli.NewReader(body),
  17. }
  18. }
  19. func (b *brotliReadCloser) Read(p []byte) (n int, err error) {
  20. return b.brotliReader.Read(p)
  21. }
  22. func (b *brotliReadCloser) Close() error {
  23. return b.body.Close()
  24. }
  25. type gzipReadCloser struct {
  26. body io.ReadCloser
  27. gzipReader io.Reader
  28. gzipErr error
  29. }
  30. func NewGzipReadCloser(body io.ReadCloser) *gzipReadCloser {
  31. return &gzipReadCloser{body: body}
  32. }
  33. func (gz *gzipReadCloser) Read(p []byte) (n int, err error) {
  34. if gz.gzipReader == nil {
  35. if gz.gzipErr == nil {
  36. gz.gzipReader, gz.gzipErr = gzip.NewReader(gz.body)
  37. }
  38. if gz.gzipErr != nil {
  39. return 0, gz.gzipErr
  40. }
  41. }
  42. return gz.gzipReader.Read(p)
  43. }
  44. func (gz *gzipReadCloser) Close() error {
  45. return gz.body.Close()
  46. }