55 lines
1 KiB
Go
55 lines
1 KiB
Go
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()
|
|
}
|