gitee.com/sasukebo/go-micro/v4@v4.7.1/util/kubernetes/api/response.go (about)

     1  package api
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  	"io"
     8  	"net/http"
     9  )
    10  
    11  // Errors ...
    12  var (
    13  	ErrNotFound = errors.New("kubernetes: resource not found")
    14  	ErrDecode   = errors.New("kubernetes: error decoding")
    15  	ErrUnknown  = errors.New("kubernetes: unknown error")
    16  )
    17  
    18  // Status is an object that is returned when a request
    19  // failed or delete succeeded.
    20  type Status struct {
    21  	Kind    string `json:"kind"`
    22  	Status  string `json:"status"`
    23  	Message string `json:"message"`
    24  	Reason  string `json:"reason"`
    25  	Code    int    `json:"code"`
    26  }
    27  
    28  // Response ...
    29  type Response struct {
    30  	res *http.Response
    31  	err error
    32  
    33  	body []byte
    34  }
    35  
    36  // Error returns an error
    37  func (r *Response) Error() error {
    38  	return r.err
    39  }
    40  
    41  // StatusCode returns status code for response
    42  func (r *Response) StatusCode() int {
    43  	return r.res.StatusCode
    44  }
    45  
    46  // Into decode body into `data`
    47  func (r *Response) Into(data interface{}) error {
    48  	if r.err != nil {
    49  		return r.err
    50  	}
    51  
    52  	defer r.res.Body.Close()
    53  	decoder := json.NewDecoder(r.res.Body)
    54  	if err := decoder.Decode(&data); err != nil {
    55  		return fmt.Errorf("%v: %v", ErrDecode, err)
    56  	}
    57  
    58  	return r.err
    59  }
    60  
    61  func (r *Response) Close() error {
    62  	if r.res != nil {
    63  		return r.res.Body.Close()
    64  	}
    65  	return nil
    66  }
    67  
    68  func newResponse(res *http.Response, err error) *Response {
    69  	r := &Response{
    70  		res: res,
    71  		err: err,
    72  	}
    73  
    74  	if err != nil {
    75  		return r
    76  	}
    77  
    78  	if r.res.StatusCode == http.StatusOK ||
    79  		r.res.StatusCode == http.StatusCreated ||
    80  		r.res.StatusCode == http.StatusNoContent {
    81  		// Non error status code
    82  		return r
    83  	}
    84  
    85  	if r.res.StatusCode == http.StatusNotFound {
    86  		r.err = ErrNotFound
    87  		return r
    88  	}
    89  
    90  	b, err := io.ReadAll(r.res.Body)
    91  	if err == nil {
    92  		r.err = errors.New(string(b))
    93  		return r
    94  	}
    95  
    96  	r.err = ErrUnknown
    97  
    98  	return r
    99  }