@@ -190,7 +190,7 @@ func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts HandlerO
190190 }
191191 rsp .Header ().Set (contentTypeHeader , string (contentType ))
192192
193- w , encodingHeader , closeWriter , err := NegotiateEncodingWriter (req , rsp , opts . DisableCompression , compressions )
193+ w , encodingHeader , closeWriter , err := negotiateEncodingWriter (req , rsp , compressions )
194194 if err != nil {
195195 if opts .ErrorLog != nil {
196196 opts .ErrorLog .Println ("error getting writer" , err )
@@ -199,16 +199,7 @@ func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts HandlerO
199199 encodingHeader = string (Identity )
200200 }
201201
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 ()
212203
213204 rsp .Header ().Set (contentEncodingHeader , encodingHeader )
214205
@@ -440,41 +431,35 @@ func httpError(rsp http.ResponseWriter, err error) {
440431// selects the right compression based on an allow-list of supported
441432// compressions. It returns a writer implementing the compression and an the
442433// 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
448437 }
449438
450439 // 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 )
452441
453- switch compression {
442+ switch selected {
454443 case "zstd" :
455444 // TODO(mrueg): Replace klauspost/compress with stdlib implementation once https://github.com/golang/go/issues/62513 is implemented.
456445 z , err := zstd .NewWriter (rw , zstd .WithEncoderLevel (zstd .SpeedFastest ))
457446 if err != nil {
458- return nil , "" , nil , err
447+ return nil , "" , func () {} , err
459448 }
460449
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
465452 case "gzip" :
466453 gz := gzipPool .Get ().(* gzip.Writer )
467454 defer gzipPool .Put (gz )
468455
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
473458 case "identity" :
474459 // This means the content is not compressed.
475- return w , compression , nil , nil
460+ return rw , selected , func () {} , nil
476461 default :
477462 // 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 )
479464 }
480465}
0 commit comments