@@ -26,26 +26,47 @@ type compressor struct {
26
26
pool sync.Pool
27
27
}
28
28
29
+ var (
30
+ gZipCompressor = & compressor {}
31
+ snappyCompressor = & compressor {}
32
+ zstdCompressor = & compressor {}
33
+ zlibCompressor = & compressor {}
34
+ _ writeCloserReset = (* gzip .Writer )(nil )
35
+ _ writeCloserReset = (* snappy .Writer )(nil )
36
+ _ writeCloserReset = (* zstd .Encoder )(nil )
37
+ _ writeCloserReset = (* zlib .Writer )(nil )
38
+ )
39
+
29
40
// writerFactory defines writer field in CompressRoundTripper.
30
41
// The validity of input is already checked when NewCompressRoundTripper was called in confighttp,
31
42
func newCompressor (compressionType configcompression.TypeWithLevel ) (* compressor , error ) {
32
- // compressionType, compressionLevel := getCompression(compressionType)
33
-
34
43
switch compressionType .Type {
35
44
case configcompression .TypeGzip :
36
- var _ writeCloserReset = (* gzip .Writer )(nil )
37
- return & compressor {pool : sync.Pool {New : func () any { w , _ := gzip .NewWriterLevel (nil , int (compressionType .Level )); return w }}}, nil
45
+ if gZipCompressor .pool .Get () == nil {
46
+ gZipCompressor .pool = sync.Pool {New : func () any { w , _ := gzip .NewWriterLevel (nil , int (compressionType .Level )); return w }}
47
+ return gZipCompressor , nil
48
+ }
49
+ return gZipCompressor , nil
38
50
case configcompression .TypeSnappy :
39
- var _ writeCloserReset = (* snappy .Writer )(nil )
40
- return & compressor {pool : sync.Pool {New : func () any { return snappy .NewBufferedWriter (nil ) }}}, nil
51
+ if snappyCompressor .pool .Get () == nil {
52
+ snappyCompressor .pool = sync.Pool {New : func () any { return snappy .NewBufferedWriter (nil ) }}
53
+ return snappyCompressor , nil
54
+ }
55
+ return snappyCompressor , nil
41
56
case configcompression .TypeZstd :
42
- var _ writeCloserReset = (* zstd .Encoder )(nil )
43
- compression := zstd .EncoderLevelFromZstd (int (compressionType .Level ))
44
- encoderLevel := zstd .WithEncoderLevel (compression )
45
- return & compressor {pool : sync.Pool {New : func () any { zw , _ := zstd .NewWriter (nil , zstd .WithEncoderConcurrency (1 ), encoderLevel ); return zw }}}, nil
57
+ if zstdCompressor .pool .Get () == nil {
58
+ compression := zstd .EncoderLevelFromZstd (int (compressionType .Level ))
59
+ encoderLevel := zstd .WithEncoderLevel (compression )
60
+ zstdCompressor .pool = sync.Pool {New : func () any { zw , _ := zstd .NewWriter (nil , zstd .WithEncoderConcurrency (1 ), encoderLevel ); return zw }}
61
+ return zstdCompressor , nil
62
+ }
63
+ return zstdCompressor , nil
46
64
case configcompression .TypeZlib , configcompression .TypeDeflate :
47
- var _ writeCloserReset = (* zlib .Writer )(nil )
48
- return & compressor {pool : sync.Pool {New : func () any { w , _ := zlib .NewWriterLevel (nil , int (compressionType .Level )); return w }}}, nil
65
+ if zlibCompressor .pool .Get () == nil {
66
+ zlibCompressor .pool = sync.Pool {New : func () any { w , _ := zlib .NewWriterLevel (nil , int (compressionType .Level )); return w }}
67
+ return zlibCompressor , nil
68
+ }
69
+ return zlibCompressor , nil
49
70
}
50
71
return nil , errors .New ("unsupported compression type" )
51
72
}
0 commit comments