21
21
package connection
22
22
23
23
import (
24
- "compress/gzip"
25
24
"compress/zlib"
25
+ "fmt"
26
26
"io"
27
27
28
- "github.com/pkg/errors"
29
-
30
28
"github.com/arangodb/go-driver/v2/log"
31
29
)
32
30
@@ -40,35 +38,67 @@ type compression struct {
40
38
}
41
39
42
40
func newCompression (config * CompressionConfig ) Compression {
43
- return & compression {
44
- config : config ,
41
+ if config == nil {
42
+ return noCompression {}
43
+ } else if config .CompressionType == "gzip" {
44
+ return gzipCompression {config : config }
45
+ } else if config .CompressionType == "deflate" {
46
+ return deflateCompression {config : config }
47
+ } else {
48
+ log .Error (fmt .Errorf ("unknown compression type: %s" , config .CompressionType ), "" )
49
+ return noCompression {config : config }
45
50
}
46
51
}
47
52
48
- func (g compression ) ApplyRequestHeaders (r Request ) {
53
+ type gzipCompression struct {
54
+ config * CompressionConfig
55
+ }
56
+
57
+ func (g gzipCompression ) ApplyRequestHeaders (r Request ) {
49
58
if g .config != nil && g .config .ResponseCompressionEnabled {
50
59
if g .config .CompressionType == "gzip" {
51
60
r .AddHeader ("Accept-Encoding" , "gzip" )
52
- } else if g .config .CompressionType == "deflate" {
53
- r .AddHeader ("Accept-Encoding" , "deflate" )
54
61
}
55
62
}
56
63
}
57
64
58
- func (g compression ) ApplyRequestCompression (r * httpRequest , rootWriter io.Writer ) (io.WriteCloser , error ) {
65
+ func (g gzipCompression ) ApplyRequestCompression (r * httpRequest , rootWriter io.Writer ) (io.WriteCloser , error ) {
59
66
config := g .config
60
67
61
68
if config != nil && config .RequestCompressionEnabled {
62
- if config .CompressionType == "gzip " {
63
- r .headers ["Content-Encoding" ] = "gzip "
69
+ if config .CompressionType == "deflate " {
70
+ r .headers ["Content-Encoding" ] = "deflate "
64
71
65
- gzipWriter , err := gzip .NewWriterLevel (rootWriter , config .RequestCompressionLevel )
72
+ zlibWriter , err := zlib .NewWriterLevel (rootWriter , config .RequestCompressionLevel )
66
73
if err != nil {
67
- log .Errorf (err , "error creating gzip writer" )
74
+ log .Errorf (err , "error creating zlib writer" )
68
75
return nil , err
69
76
}
70
- return gzipWriter , nil
71
- } else if config .CompressionType == "deflate" {
77
+
78
+ return zlibWriter , nil
79
+ }
80
+ }
81
+
82
+ return nil , nil
83
+ }
84
+
85
+ type deflateCompression struct {
86
+ config * CompressionConfig
87
+ }
88
+
89
+ func (g deflateCompression ) ApplyRequestHeaders (r Request ) {
90
+ if g .config != nil && g .config .ResponseCompressionEnabled {
91
+ if g .config .CompressionType == "deflate" {
92
+ r .AddHeader ("Accept-Encoding" , "deflate" )
93
+ }
94
+ }
95
+ }
96
+
97
+ func (g deflateCompression ) ApplyRequestCompression (r * httpRequest , rootWriter io.Writer ) (io.WriteCloser , error ) {
98
+ config := g .config
99
+
100
+ if config != nil && config .RequestCompressionEnabled {
101
+ if config .CompressionType == "deflate" {
72
102
r .headers ["Content-Encoding" ] = "deflate"
73
103
74
104
zlibWriter , err := zlib .NewWriterLevel (rootWriter , config .RequestCompressionLevel )
@@ -78,10 +108,19 @@ func (g compression) ApplyRequestCompression(r *httpRequest, rootWriter io.Write
78
108
}
79
109
80
110
return zlibWriter , nil
81
- } else {
82
- return nil , errors .Errorf ("unsupported compression type: %s" , config .CompressionType )
83
111
}
84
112
}
85
113
86
114
return nil , nil
87
115
}
116
+
117
+ type noCompression struct {
118
+ config * CompressionConfig
119
+ }
120
+
121
+ func (g noCompression ) ApplyRequestHeaders (r Request ) {
122
+ }
123
+
124
+ func (g noCompression ) ApplyRequestCompression (r * httpRequest , rootWriter io.Writer ) (io.WriteCloser , error ) {
125
+ return nil , nil
126
+ }
0 commit comments