summaryrefslogtreecommitdiff
path: root/internal/reader/fetcher/encoding_wrappers.go
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <f@miniflux.net> 2024-04-18 21:44:55 -0700
committerGravatar Frédéric Guillot <f@miniflux.net> 2024-04-19 10:50:46 -0700
commit771f9d2b5fe40a034d206e166db0f040ac24fb22 (patch)
tree4d4fb97a9b9fea195eeca647626e4609df3c62b8 /internal/reader/fetcher/encoding_wrappers.go
parent647c66e70af50cf7ca786eba51d4fdb67b89fecc (diff)
downloadv2-771f9d2b5fe40a034d206e166db0f040ac24fb22.tar.gz
v2-771f9d2b5fe40a034d206e166db0f040ac24fb22.tar.zst
v2-771f9d2b5fe40a034d206e166db0f040ac24fb22.zip
reader/fetcher: add brotli content encoding support
Diffstat (limited to 'internal/reader/fetcher/encoding_wrappers.go')
-rw-r--r--internal/reader/fetcher/encoding_wrappers.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/internal/reader/fetcher/encoding_wrappers.go b/internal/reader/fetcher/encoding_wrappers.go
new file mode 100644
index 00000000..41820341
--- /dev/null
+++ b/internal/reader/fetcher/encoding_wrappers.go
@@ -0,0 +1,55 @@
+package fetcher
+
+import (
+ "compress/gzip"
+ "io"
+
+ "github.com/andybalholm/brotli"
+)
+
+type brotliReadCloser struct {
+ body io.ReadCloser
+ brotliReader io.Reader
+}
+
+func NewBrotliReadCloser(body io.ReadCloser) *brotliReadCloser {
+ return &brotliReadCloser{
+ body: body,
+ brotliReader: brotli.NewReader(body),
+ }
+}
+
+func (b *brotliReadCloser) Read(p []byte) (n int, err error) {
+ return b.brotliReader.Read(p)
+}
+
+func (b *brotliReadCloser) Close() error {
+ return b.body.Close()
+}
+
+type gzipReadCloser struct {
+ body io.ReadCloser
+ gzipReader io.Reader
+ gzipErr error
+}
+
+func NewGzipReadCloser(body io.ReadCloser) *gzipReadCloser {
+ return &gzipReadCloser{body: body}
+}
+
+func (gz *gzipReadCloser) Read(p []byte) (n int, err error) {
+ if gz.gzipReader == nil {
+ if gz.gzipErr == nil {
+ gz.gzipReader, gz.gzipErr = gzip.NewReader(gz.body)
+ }
+ if gz.gzipErr != nil {
+ return 0, gz.gzipErr
+ }
+ }
+
+ return gz.gzipReader.Read(p)
+}
+
+func (gz *gzipReadCloser) Close() error {
+ return gz.body.Close()
+}