diff options
Diffstat (limited to 'internal/reader/fetcher/encoding_wrappers.go')
-rw-r--r-- | internal/reader/fetcher/encoding_wrappers.go | 55 |
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() +} |