github.com/mongodb/grip@v0.0.0-20240213223901-f906268d82b9/send/error_handler.go (about)

     1  package send
     2  
     3  import (
     4  	"io"
     5  	"log"
     6  	"net/http"
     7  
     8  	"github.com/mongodb/grip/message"
     9  	"github.com/pkg/errors"
    10  )
    11  
    12  // ErrorHandler is a function that you can use define how a sender
    13  // handles errors sending messages. Implementations of this type
    14  // should perform a noop if the err object is nil.
    15  type ErrorHandler func(error, message.Composer)
    16  
    17  func ErrorHandlerFromLogger(l *log.Logger) ErrorHandler {
    18  	return func(err error, m message.Composer) {
    19  		if err == nil {
    20  			return
    21  		}
    22  
    23  		l.Println("logging error:", err.Error(), "\n", m.String())
    24  	}
    25  }
    26  
    27  // ErrorHandlerFromSender wraps an existing Sender for sending error messages.
    28  func ErrorHandlerFromSender(s Sender) ErrorHandler {
    29  	return func(err error, m message.Composer) {
    30  		if err == nil {
    31  			return
    32  		}
    33  
    34  		s.Send(message.WrapError(err, m))
    35  	}
    36  }
    37  
    38  func handleHTTPResponseError(resp *http.Response) error {
    39  	if resp == nil {
    40  		return nil
    41  	}
    42  	defer resp.Body.Close()
    43  
    44  	if resp.StatusCode >= 200 && resp.StatusCode < 300 {
    45  		return nil
    46  	}
    47  
    48  	data, err := io.ReadAll(resp.Body)
    49  	if err != nil {
    50  		return errors.Wrapf(err, "received HTTP status '%d' but failed to read response body", resp.StatusCode)
    51  	}
    52  	return errors.Errorf("received HTTP status '%d' with response '%s'", resp.StatusCode, string(data))
    53  }