@@ -190,7 +190,7 @@ func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts HandlerO
190
190
}
191
191
rsp .Header ().Set (contentTypeHeader , string (contentType ))
192
192
193
- w , encodingHeader , closeWriter , err := NegotiateEncodingWriter (req , rsp , opts . DisableCompression , compressions )
193
+ w , encodingHeader , closeWriter , err := negotiateEncodingWriter (req , rsp , compressions )
194
194
if err != nil {
195
195
if opts .ErrorLog != nil {
196
196
opts .ErrorLog .Println ("error getting writer" , err )
@@ -199,16 +199,7 @@ func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts HandlerO
199
199
encodingHeader = string (Identity )
200
200
}
201
201
202
- if closeWriter != nil {
203
- defer func () {
204
- err := closeWriter ()
205
- if err != nil {
206
- if opts .ErrorLog != nil {
207
- opts .ErrorLog .Println ("error closing writer:" , err )
208
- }
209
- }
210
- }()
211
- }
202
+ defer closeWriter ()
212
203
213
204
rsp .Header ().Set (contentEncodingHeader , encodingHeader )
214
205
@@ -440,41 +431,35 @@ func httpError(rsp http.ResponseWriter, err error) {
440
431
// selects the right compression based on an allow-list of supported
441
432
// compressions. It returns a writer implementing the compression and an the
442
433
// correct value that the caller can set in the response header.
443
- func NegotiateEncodingWriter (r * http.Request , rw io.Writer , disableCompression bool , compressions []string ) (_ io.Writer , encodingHeaderValue string , closeWriter func () error , _ error ) {
444
- w := rw
445
-
446
- if disableCompression {
447
- return w , string (Identity ), nil , nil
434
+ func negotiateEncodingWriter (r * http.Request , rw io.Writer , compressions []string ) (_ io.Writer , encodingHeaderValue string , closeWriter func (), _ error ) {
435
+ if len (compressions ) == 0 {
436
+ return rw , string (Identity ), func () {}, nil
448
437
}
449
438
450
439
// TODO(mrueg): Replace internal/github.com/gddo once https://github.com/golang/go/issues/19307 is implemented.
451
- compression := httputil .NegotiateContentEncoding (r , compressions )
440
+ selected := httputil .NegotiateContentEncoding (r , compressions )
452
441
453
- switch compression {
442
+ switch selected {
454
443
case "zstd" :
455
444
// TODO(mrueg): Replace klauspost/compress with stdlib implementation once https://github.com/golang/go/issues/62513 is implemented.
456
445
z , err := zstd .NewWriter (rw , zstd .WithEncoderLevel (zstd .SpeedFastest ))
457
446
if err != nil {
458
- return nil , "" , nil , err
447
+ return nil , "" , func () {} , err
459
448
}
460
449
461
- z .Reset (w )
462
- w = z
463
-
464
- return w , compression , z .Close , nil
450
+ z .Reset (rw )
451
+ return z , selected , func () { _ = z .Close () }, nil
465
452
case "gzip" :
466
453
gz := gzipPool .Get ().(* gzip.Writer )
467
454
defer gzipPool .Put (gz )
468
455
469
- gz .Reset (w )
470
-
471
- w = gz
472
- return w , compression , gz .Close , nil
456
+ gz .Reset (rw )
457
+ return gz , selected , func () { _ = gz .Close (); gzipPool .Put (gz ) }, nil
473
458
case "identity" :
474
459
// This means the content is not compressed.
475
- return w , compression , nil , nil
460
+ return rw , selected , func () {} , nil
476
461
default :
477
462
// The content encoding was not implemented yet.
478
- return nil , "" , nil , fmt .Errorf ("content compression format not recognized: %s. Valid formats are: %s" , compression , defaultCompressionFormats )
463
+ return nil , "" , func () {} , fmt .Errorf ("content compression format not recognized: %s. Valid formats are: %s" , selected , defaultCompressionFormats )
479
464
}
480
465
}
0 commit comments