@@ -22,6 +22,8 @@ package connection
2222
2323import (
2424 "bytes"
25+ "compress/gzip"
26+ "compress/zlib"
2527 "context"
2628 "crypto/tls"
2729 "io"
@@ -248,7 +250,7 @@ func (j *httpConnection) stream(ctx context.Context, req *httpRequest) (*httpRes
248250 ctx = context .Background ()
249251 }
250252
251- reader := j .bodyReadFunc (j .Decoder (j .contentType ), req . body , j .streamSender )
253+ reader := j .bodyReadFunc (j .Decoder (j .contentType ), req , j .streamSender )
252254 r , err := req .asRequest (ctx , reader )
253255 if err != nil {
254256 return nil , nil , errors .WithStack (err )
@@ -263,9 +265,19 @@ func (j *httpConnection) stream(ctx context.Context, req *httpRequest) (*httpRes
263265 log .Debugf ("(%s) Response received: %d" , id , resp .StatusCode )
264266
265267 if b := resp .Body ; b != nil {
266- var body = resp .Body
268+ var resultBody io.ReadCloser
269+
270+ respEncoding := resp .Header .Get ("Content-Encoding" )
271+ switch respEncoding {
272+ case "gzip" :
273+ resultBody , err = gzip .NewReader (resp .Body )
274+ case "deflate" :
275+ resultBody , err = zlib .NewReader (resp .Body )
276+ default :
277+ resultBody = resp .Body
278+ }
267279
268- return & httpResponse {response : resp , request : req }, body , nil
280+ return & httpResponse {response : resp , request : req }, resultBody , nil
269281
270282 }
271283
@@ -289,8 +301,8 @@ func getDecoderByContentType(contentType string) Decoder {
289301
290302type bodyReadFactory func () (io.Reader , error )
291303
292- func (j * httpConnection ) bodyReadFunc (decoder Decoder , obj interface {} , stream bool ) bodyReadFactory {
293- if obj == nil {
304+ func (j * httpConnection ) bodyReadFunc (decoder Decoder , req * httpRequest , stream bool ) bodyReadFactory {
305+ if req . body == nil {
294306 return func () (io.Reader , error ) {
295307 return nil , nil
296308 }
@@ -299,21 +311,64 @@ func (j *httpConnection) bodyReadFunc(decoder Decoder, obj interface{}, stream b
299311 if ! stream {
300312 return func () (io.Reader , error ) {
301313 b := bytes .NewBuffer ([]byte {})
302- if err := decoder .Encode (b , obj ); err != nil {
303- log .Errorf (err , "error encoding body - OBJ: %v" , obj )
314+ compressedWriter , err := newCompression (j .config .Compression ).ApplyRequestCompression (req , b )
315+ if err != nil {
316+ log .Errorf (err , "error applying compression" )
304317 return nil , err
305318 }
306319
307- return b , nil
320+ if compressedWriter != nil {
321+ defer func (compressedWriter io.WriteCloser ) {
322+ errCompression := compressedWriter .Close ()
323+ if errCompression != nil {
324+ log .Error (errCompression , "error closing compressed writer" )
325+ if err == nil {
326+ err = errCompression
327+ }
328+ }
329+ }(compressedWriter )
330+
331+ err = decoder .Encode (compressedWriter , req .body )
332+ } else {
333+ err = decoder .Encode (b , req .body )
334+ }
335+
336+ if err != nil {
337+ log .Errorf (err , "error encoding body - OBJ: %v" , req .body )
338+ return nil , err
339+ }
340+ return b , err
308341 }
309342 } else {
310343 return func () (io.Reader , error ) {
311344 reader , writer := io .Pipe ()
345+
346+ compressedWriter , err := newCompression (j .config .Compression ).ApplyRequestCompression (req , writer )
347+ if err != nil {
348+ log .Errorf (err , "error applying compression" )
349+ return nil , err
350+ }
351+
312352 go func () {
313353 defer writer .Close ()
314354
315- if err := decoder .Encode (writer , obj ); err != nil {
316- log .Errorf (err , "error encoding body (stream) - OBJ: %v" , obj )
355+ var encErr error
356+ if compressedWriter != nil {
357+ defer func (compressedWriter io.WriteCloser ) {
358+ errCompression := compressedWriter .Close ()
359+ if errCompression != nil {
360+ log .Errorf (errCompression , "error closing compressed writer - stream" )
361+ writer .CloseWithError (err )
362+ }
363+ }(compressedWriter )
364+
365+ encErr = decoder .Encode (compressedWriter , req .body )
366+ } else {
367+ encErr = decoder .Encode (writer , req .body )
368+ }
369+
370+ if encErr != nil {
371+ log .Errorf (err , "error encoding body stream - OBJ: %v" , req .body )
317372 writer .CloseWithError (err )
318373 }
319374 }()
0 commit comments