1
// Copyright 2019+ Klaus Post. All rights reserved.
2
// License information can be found in the LICENSE file.
12
// ZipMethodWinZip is the method for Zstandard compressed data inside Zip files for WinZip.
13
// See https://www.winzip.com/win/en/comp_info.html
14
const ZipMethodWinZip = 93
16
// ZipMethodPKWare is the original method number used by PKWARE to indicate Zstandard compression.
17
// Deprecated: This has been deprecated by PKWARE, use ZipMethodWinZip instead for compression.
18
// See https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.3.9.TXT
19
const ZipMethodPKWare = 20
21
var zipReaderPool sync.Pool
23
// newZipReader cannot be used since we would leak goroutines...
24
func newZipReader(r io.Reader) io.ReadCloser {
25
dec, ok := zipReaderPool.Get().(*Decoder)
29
d, err := NewReader(r, WithDecoderConcurrency(1), WithDecoderLowmem(true))
35
return &pooledZipReader{dec: dec}
38
type pooledZipReader struct {
39
mu sync.Mutex // guards Close and Read
43
func (r *pooledZipReader) Read(p []byte) (n int, err error) {
47
return 0, errors.New("Read after Close")
49
dec, err := r.dec.Read(p)
54
func (r *pooledZipReader) Close() error {
59
err = r.dec.Reset(nil)
60
zipReaderPool.Put(r.dec)
66
type pooledZipWriter struct {
67
mu sync.Mutex // guards Close and Read
72
func (w *pooledZipWriter) Write(p []byte) (n int, err error) {
76
return 0, errors.New("Write after Close")
81
func (w *pooledZipWriter) Close() error {
93
// ZipCompressor returns a compressor that can be registered with zip libraries.
94
// The provided encoder options will be used on all encodes.
95
func ZipCompressor(opts ...EOption) func(w io.Writer) (io.WriteCloser, error) {
97
return func(w io.Writer) (io.WriteCloser, error) {
98
enc, ok := pool.Get().(*Encoder)
103
enc, err = NewWriter(w, opts...)
108
return &pooledZipWriter{enc: enc, pool: &pool}, nil
112
// ZipDecompressor returns a decompressor that can be registered with zip libraries.
113
// See ZipCompressor for example.
114
func ZipDecompressor() func(r io.Reader) io.ReadCloser {
115
return func(r io.Reader) io.ReadCloser {
116
d, err := NewReader(r, WithDecoderConcurrency(1), WithDecoderLowmem(true))
120
return d.IOReadCloser()